Aug 102010
 

Das heutige Kurz-Projekt zeigt, wie auf dem Arduino ein kleiner Websever arbeitet. Mit einigen Demo-Codes und Hilfen aus dem Internet (HTML Codes) entstand folgender Server:

Nach dem Aufspielen des Codes kann man über eine Webseite (im Beispiel durch Aufruf der IP-Adresse 192.168.178.222 im Browser) die beiden Ausgänge (3 und 4) schalten.

Mit dem Wissen aus diesem Test können nun weitere Ideen und Projekte umgesetzt werden. Ich habe da auch schon eine für das nächste Frühjahr: Eine automatische Bewässerung im Mini-Gewächshaus mit Web-Interface zum Beispiel 😉 Das Ganze natürlich mit einem Passwort abgesichert.

  54 Responses to “Arduino als Webserver”

  1. hi an alle
    habe mich der webseite mal angenommen ohne zu lesen das es probleme gibt
    gott sei dank ;D
    die seite läuft fast problemlos habe sie auf 10 erweitert
    also ein aus schalten funktioniert absolut problemlos nur die statusabfrage hinten ist etwas verwirrt weil nicht immer die an sind die ich auch angeschaltet habe die ersten 4 gehen ohne probleme danach geht immer die jeweilige nächste an
    kann mir da einer ein tipp geben was ich falsch gemacht habe???

  2. Sehr schöne Vorlage, ich benutze sie immer wieder um andere Projekte aufzubauen.
    Danke für den Code!
    Grüße, Springer

  3. Hallo Poldi,

    vielen Dank für den Code. Der Webserver hat bei mir auf Anhieb geklappt.

  4. Moin Poldi,
    vielen vielen Dank fuer diesen Code. Das ist genau das, was ich wollte 🙂

  5. hi alle yusammen also als erstes poldi sch;ne website 😀
    ich hab da mal so ne frage zu dem webserver ich hab gerade alle der oberen codes ausprobiert und keiner hat funktioniert ich kenn mich zwar auch nich so suoer gut mit arduino aus aber irgendwie funktioniert das alles nicht kann mir da vielleicht einer von euch profis helfen

  6. Hallo Leute
    Ist es normal das die geschalteten Ausgänge blinken ?

  7. Nachtrag II

    Oh, oh … die HTML-Textanteile werden nicht dargestellt.

    Kann hier runtergeladen werden. Als *.ino abspeichern.

    http://www.lompe.de/M1/WebServer.txt

  8. Nachtrag:

    Die Idee war ja ganz gut, aber schlampig gemacht und unzureichend erklärt.

    Auf einem Duemilanove läuft das so wie dargestellt definitiv nicht, weil sich die Variablen ins Gehege kommen. Dafür ist der Speicher zu klein. Auf einem Mega habe ich es nicht probiert (hab keinen zur Hand).

    Man sollte also immer dazuschreiben, unter welchem System man das geprüft hat.

    Der HTML-Code hatte auch ein paar Fehler (waren aber nicht der Grund für die Probleme) und die Textzeilen sind zu lang und belegen unnötig den Speicherplatz der Variablen beim Verabeiten im Print-Befehl.

    (Wenn ich es richtig verstanden habe, behält eine Stringvariable immer die größte ihr jemals zugewiesene Länge, auch wenn sie irgendwann einmal nur noch aus einem Zeichen besteht. Da wird’s im Speicherraum schnell eng!)

    Die ‚Ende‘-Bedingung ist wohl auch nicht richtig übernommen worden, die Leerzeile ist wichtig. Die Definition von ReadString String(100) legt mitnichten einen 100 Byte langen String fest (Referenz lesen!), der wird erst in der If … <100 Schleife erzeugt, … usw

    Ich habe unten mal einen auch auf dem Duemilanove funktionierenden Code angehängt, der auch noch die Elemente des Original Sketch-Beispiels mit der Ausgabe der Analoganschlüsse enthält und um Poldis Eingabeseite erweitert wurde.

    Getestet auf Firefox, IE 8 und IE 10.

    /* ———————————————————————————————————————————-
    Web Server

    A simple web server that shows the value of the analog input pins.
    using an Arduino Wiznet Ethernet shield.

    Circuit:
    * Ethernet shield attached to pins 10, 11, 12, 13
    * Analog inputs attached to pins A0 through A5 (optional)

    created 18 Dec 2009
    by David A. Mellis
    modified 9 Apr 2012
    by Tom Igoe

    ergänzt um Poldis interaktiven Webserver am 19.4.2013 von A. Lompe

    */

    #include
    #include

    // Enter a MAC address and IP address for your controller below.
    // The IP address will be dependent on your local network:
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    //IPAddress ip(192,168,0, 177);
    byte ip[] = { 192, 168, 0, 222 };
    byte gateway[] = { 192, 168, 0, 1 };
    byte subnet[] = { 255, 255, 255, 0 };

    // Initialize the Ethernet server library
    // with the IP address and port you want to use
    // (port 80 is default for HTTP):
    EthernetServer server(80);

    int temp = 0;
    int Pin2 = 2; // Pin 2 statt 4 falls die SD-Karte verwendet werden soll
    int Pin3 = 3;
    boolean flag = true; //damit nur bei Änderungen die Seite geladen wird (kann ggf. entfallen)

    String Meldung = String(„“); // string for fetching data from address
    boolean Pin2ON = false;
    boolean Pin3ON = false; // Status flag

    void setup() {
    pinMode(Pin3, OUTPUT);
    pinMode(Pin2, OUTPUT);

    // Open serial communications and wait for port to open:
    Serial.begin(115200); // geht auch langsamer
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
    }

    // start the Ethernet connection and the server:
    Ethernet.begin(mac, ip, gateway, subnet);
    server.begin();
    Serial.print(„server is at „);
    Serial.println(Ethernet.localIP());
    }

    void loop() {
    // listen for incoming clients
    EthernetClient client = server.available();
    if (client) {
    Serial.println(„new client“);
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
    if (client.available()) {
    char c = client.read();
    Serial.write(c);
    //————————————————————————————–
    //read char by char HTTP request
    if (Meldung.length() -1) {
    digitalWrite(Pin2, HIGH);
    Serial.println(„Pin 2 eingeschaltet!“);
    Pin2ON = true;
    flag = true;
    }
    if(Meldung.indexOf(„2=aus“) > -1){
    digitalWrite(Pin2, LOW);
    Serial.println(„Pin 2 ausgeschaltet!“);
    Pin2ON = false;
    flag = true;
    }
    if(Meldung.indexOf(„3=ein“) > -1) {
    digitalWrite(Pin3, HIGH);
    Serial.println(„Pin 3 eingeschaltet!“);
    Pin3ON = true;
    flag = true;
    }
    if(Meldung.indexOf(„3=aus“) > -1){
    digitalWrite(Pin3, LOW);
    Serial.println(„Pin 3 ausgeschaltet!“);
    Pin3ON = false;
    flag = true;
    }

    if(Meldung.indexOf(„all=Al“) > -1){
    digitalWrite(Pin2, LOW);
    digitalWrite(Pin3, LOW);
    Serial.println(„Alles ausgeschaltet!“);
    Pin2ON = false;
    Pin3ON = false;
    flag = true;
    }
    //———————————————————————————————–*/
    Meldung=““;
    // send a standard http response header
    client.println(„HTTP/1.1 200 OK“);
    client.println(„Content-Type: text/html“);
    client.println(„Connnection: close“);
    client.println();
    client.println(„“);
    client.println(„“);
    client.print(„“);
    client.print(„Arduino Webserver“);
    // add a meta refresh tag, so the browser pulls again every 5 seconds:

    // Diese Zeile für den automatischen Abruf wieder einfügen; simuliert dann aber einen Mausklick auf das erste input-Feld.
    // kann man sicher ändern, ich weiß aber im Moment nicht wie.
    // client.println(„“);
    // output the value of each analog input pin
    client.println(„“);
    client.print(„“);
    for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
    int sensorReading = analogRead(analogChannel);
    client.print("analog input ");
    client.print(analogChannel);
    client.print(" is ");
    client.print(sensorReading);
    client.println("“);
    }
    //————————–HTML————————
    if (flag) {

    //—Überschrift—
    client.println(„“);
    client.print(„“);
    client.print(„Arduino Webserver 1.“);
    client.print(temp);
    client.println(„“);
    client.println(„“);
    //—Überschrift—

    //—Ausgänge schalten—
    client.println(„“);
    client.print(„“);
    client.println(„Ausgänge schalten:“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.print(„“);
    client.print(„“);
    client.println(„Ausgang 2“);

    client.print(„“);
    client.print(„“);
    client.print(„“);
    client.println(„“);
    client.print(„“);
    client.print(„“);
    client.print(„“);
    client.println(„“);
    client.print(„“);

    if (Pin2ON) {
    client.print(„ON“);
    } else {
    client.print(„OFF“);
    }
    client.println(„“);
    client.println(„“);
    client.print(„“);
    client.print(„“);
    client.println(„Ausgang 3“);
    client.print(„“);
    client.println(„“);
    client.print(„“);
    client.println(„“);
    client.print(„“);

    if (Pin3ON) {
    client.print(„ON“);
    } else {
    client.print(„OFF“);
    }
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.print(„“);
    client.print(„“);
    client.println(„“); //*/
    client.println(„“);
    } // Ende von: if (flag)
    //—Ausgänge schalten—

    //——————————————————————————————–
    client.println(„“); //*/
    temp = temp +1; // Damit sich auch was bewegt auf dem Bildschirm
    break; //wozu?
    }
    if (c == ‚\n‘) {
    // you’re starting a new line
    currentLineIsBlank = true;
    }
    else if (c != ‚\r‘) {
    // you’ve gotten a character on the current line
    currentLineIsBlank = false;
    }
    }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println(„client disonnected“);
    }
    }

    Wer‘ also noch mal probieren will – viel Spaß!

  9. Nicht nur ‚Server‘ muß in ‚EthernetServer‘ gändert werden, sondern auch ‚Client‘ in ‚EthernetClient‘ – dann geht das Aufspielen unter IDE 1.0.1 – hat D wohl inzwischen auch schon gemerkt.

    Aber: der Arduino hängt sich auf, wenn ich ‚einschalten‘ bzw. ‚ausschalten‘ anklicke
    Warten 192..168.0.222…

    Läßt sich erst durch ‚Reset‘ und neu laden der Webadresse beseitigen.

    Was läuft da falsch? Wer hat eine Tip?

  10. Hallo,
    bin noch völlig unschuldig in Sachen Arduino. Mir gefällt der Webserver Aufbau mit der Prog Struktur super.
    Stehe jetzt allerdings vor dem Problem, dass ich über den Arduino Mega 2560 mit Werbserver 1 bzw. 10 Eingänge an die Html Seite senden möchte. Also Eingange vom Mega 2560 logisch senden zur Webseite, die dann mit Variablen dargestellt werden können. Ich bekomme eine bidirektionale Kommunikation nicht hin.
    Evtl. gibt es Hilfe würde mich tierisch freuen.

  11. Hallo Poldi und Co,
    ich suche einen Webserver der einen Grundgerüst Code beinhaltet und seine Hauptseiten
    von der SD Karte sich läd. So das man nicht immer den Code im Arduino anpassen muss,
    sondern nur den HTML Code, ich habe das Web schon durch, aber sowas gibt es leider nicht(oder nichts gefunden).
    Mein Problem ist das wenn ich den GET (Switch #1 on) sende (LED.htm)
    steht im Browser der String „http://IP/LED.htm?1-on“
    und mein Script im Ardunino senden mir DATEI nicht gefunden.

    Habe mal den Script hier angehangen. Leist auch aus Unterverzeichnisse

    #include
    #include
    #include
    #include
    // LCD Treiber
    #include //Arduino’s lcd library
    //static char baseurl[]=“http://192.168.0.177/“;
    //***********
    boolean reading = false;
    //**********
    uint8_t bufindex;
    const uint8_t maxbyte=255;
    uint8_t buf[maxbyte];

    uint32_t count=0; //Hit Count, as a long
    uint32_t difcount=1; //Differencial Count. Makes lcd screen refresh only when there is a new hit.
    LiquidCrystal lcd(2,3,5,6,7,8); //Initializes the lcd screen, lcd.

    byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
    byte ip[] = { 192,168,0,177};
    byte gateway[] = { 192,168,0,1 };
    byte broadcast[] = { 255,255,255, 0 };
    EthernetServer server(80);

    char rootFileName[] = „index.htm“;

    Sd2Card card;
    SdVolume volume;
    SdFile root;
    SdFile file;

    #define error(s) error_P(PSTR(s))
    void error_P(const char* str) {
    lcd.print(„SD Error“); //If there is a card error, the lcd displays: SD Error
    PgmPrint(„error: „);
    SerialPrintln_P(str);
    if (card.errorCode()) {
    PgmPrint(„SD error: „);
    Serial.print(card.errorCode(), HEX);
    Serial.print(‚,‘);
    Serial.println(card.errorData(), HEX);
    }
    while(1);
    }

    void setup() {

    pinMode(9, OUTPUT);
    pinMode(8, OUTPUT);

    Serial.begin(19200);
    lcd.begin(16,2); //starts the lcd. This one is 16 characters by 2 lines. Ajust accordingly.
    PgmPrint(„Free RAM: „);
    Serial.println(FreeRam());
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    if (!card.init(SPI_FULL_SPEED, 4)) error(„card.init failed!“);
    if (!volume.init(&card)) error(„vol.init failed!“);
    PgmPrint(„Volume is FAT“);
    Serial.println(volume.fatType(),DEC);
    Serial.println();
    if (!root.openRoot(&volume)) error(„openRoot failed“);
    PgmPrintln(„Files found in root:“);
    root.ls(LS_DATE | LS_SIZE);
    Serial.println();
    PgmPrintln(„Files found in all dirs:“);
    root.ls(LS_R);
    Serial.println();
    PgmPrintln(„Done“);
    Ethernet.begin(mac, ip);
    server.begin();
    lcd.setCursor(1,0);
    lcd.print(„WEBServer_DNYDNS v1“);
    }
    #define BUFSIZ 100

    void loop()
    {
    char clientline[BUFSIZ];
    char *filename;
    int index = 0;
    int image = 0;
    EthernetClient client = server.available();
    if (client) {
    boolean current_line_is_blank = true;

    index = 0;

    while (client.connected()) {
    if (client.available()) {
    char c = client.read();

    if (c != ‚\n‘ && c != ‚\r‘) {
    clientline[index] = c;
    index++;
    if (index >= BUFSIZ)
    index = BUFSIZ -1;

    if(reading && c == ‚ ‚) reading = false;
    /// Ab hier Pin ein aus
    if(c == ‚?‘) reading = true;
    if(reading){
    Serial.print(c);

    if(c == ‚1-on‘) {
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH);
    Serial.println(„PIN 9 LOW“);
    }
    if(c == ‚1-off‘) {
    digitalWrite(9, HIGH);
    digitalWrite(8, LOW);
    Serial.println(„PIN 9 HIGH“);
    }
    }
    /// hier pin Ende

    continue;
    }

    clientline[index] = 0;
    filename = 0;
    Serial.println(clientline);
    if (strstr(clientline, „GET / „) != 0) {
    filename = rootFileName;
    }
    if (strstr(clientline, „GET /“) != 0) {
    if (!filename) filename = clientline + 5;
    (strstr(clientline, “ HTTP“))[0] = 0;
    Serial.println(filename);
    if (! file.open(&root, filename, O_READ)) {
    client.println(„HTTP/1.1 404 Not Found“);
    client.println(„Content-Type: text/html“);
    client.println();
    client.println(„Anfrage nicht gefunden!“);
    break;
    }
    Serial.println(„Oeffne Datei!“);
    client.println(„HTTP/1.1 200 OK“);
    if (strstr(filename, „.htm“) != 0){
    client.println(„Content-Type: text/html“);
    count++; //the hit count only increments when an html document loads
    }
    else if (strstr(filename, „.css“) != 0)
    client.println(„Content-Type: text/css“);
    else if (strstr(filename, „.png“) != 0)
    client.println(„Content-Type: image/png“);
    else if (strstr(filename, „.jpg“) != 0)
    client.println(„Content-Type: image/jpeg“);
    else if (strstr(filename, „.gif“) != 0)
    client.println(„Content-Type: image/gif“);
    else if (strstr(filename, „.3gp“) != 0)
    client.println(„Content-Type: video/mpeg“);
    else if (strstr(filename, „.pdf“) != 0)
    client.println(„Content-Type: application/pdf“);
    else if (strstr(filename, „.js“) != 0)
    client.println(„Content-Type: application/x-javascript“);
    else if (strstr(filename, „.xml“) != 0)
    client.println(„Content-Type: application/xml“);
    else
    client.println(„Content-Type: text“);
    client.println();
    int16_t c;
    bufindex=0;
    while ((c = file.read()) >= 0) {
    buf[bufindex++]=((char)c);
    if(bufindex==maxbyte)
    {
    client.write(buf, maxbyte);
    bufindex=0;
    }
    }
    file.close();
    if(bufindex>0)
    {
    client.write(buf, bufindex);
    }
    bufindex=0;
    }
    else {
    client.println(„HTTP/1.1 404 Not Found“);
    client.println(„Content-Type: text/html“);
    client.println();
    client.println(„File nicht gefunden-!“);
    }
    break;
    }

    }
    delay(1);
    client.stop();
    }

    }

    /ENDE

  12. Vielen Dank!

  13. Hallo zusammen ich habe das Board seit einem Tag und wollte den Sketch von Poldi eben mal testen. Ich habe den Ethernetserver string Syntax geändert, allerdings kommt bei mir beim Prüfen folgende Meldung:cannot allocate an object of abstract type „Client“.
    Kann mir jemand sagen was ich individuell abändern muß? Muß ich da irgendwo meine dyndns Adresse eintragen oder ist das nur ein falscher Syntax welchen vielleicht meine Version 1.0.2 nicht kennt?

    vielen Dank für weitere Tipps – vielleicht kann auch jemand ja mal den kompletten überarbeiten Sketch posten (incl welche individuellen Änderungen erforderlich sind).

    tausend Dank D

  14. Hi,

    unter Arduino 1.0.1 folgende Änderungen durchführen dann klappt es auch mit der neuen Version:

    1) Statt „Server server(80);“ „EthernetServer server(80);“ einsetzen
    2) Die If Abfrage if (Pin3|4ON) … scheint mir etwas fehlerhaft zu sein da fehlen geschweifte Klammern.
    Mag sein das die neue Version etwas stringenter ist oder das nur ein Typo war.

    Zur Anmerkung: Einzelne Variablen gehen auch man muss halt nur den Suchstring mittels …IndexOf anpassen.

    Vielen Dank an Poldi für dieses schöne Basiswerk. Spart immens Zeit.

    Gruß
    Ben

  15. Hallo Poldi,

    hab vielen Dank für diese tolle Anleitung!
    Ich bin absoluter Anfänger und habe mir grade das Board und jede Menge anderen Kram gekauft.
    Bis zur Lieferung arbeite ich mich schon mal ein 🙂

    Meine Frage ist, ob man auch Variablen übergeben kann.
    Über HTML ist funktioniert die Übergabe wie folgt:

    http://meinedomain.de?variable1=wert1&variable2?wert2

    Nun möchte ich z.B. eine bestimmte LED mit einer bestimmten Helligkeit ansteuern:

    http://meinedomain.de?led=3&helligkeit=200

    In Deinem Beispiel wird ja immer auf den gesamten String abgefragt.

    Vielen Dank
    itsy

  16. Hallo Miteinander….

    Bekomme die Source zwar unter arduino-0021 aber nicht unter arduino-1.0.1 zum laufen….
    Ich denke die Ethernet.h hat sich geändert…..
    Hat schon jemand Erfahrungen

    lg
    voni

  17. Hey, super Entwicklung hast da gemacht!
    Habe eine Frage: Kann die Lösung auch irgendwie anzeigen, ob ein Taster an einem Pin gedrückt ist?
    Also zB soll bei einer geschlossenen Tür ein Taster im Web anzeigen, ob die Tür offen oder zu ist. Da könnte sich zB eine Schriftfarbe ändern oder sowas…
    Das wär sehr praktisch.
    Viele Grüße,
    Alex

  18. Hallo,
    der Code aus Beitrag Nr. 18 funktionier bei mir leider nicht.
    Die Webseite bleibt weiß. Die HTML Tags wurden natürlich eingefügt.
    Der Code wurde aber Problemlos geuploadet.
    Hat jemand das gleiche Problem? bzw. Kann mir jemand helfen?

    VIelen Dank vorab und für die Hilfe.
    Gruß
    Sebastian

  19. Hi Poldi
    letzte meldung 2010 haben jetzt 2012 geht dein code auf dem neuen Arduino uno m3 ?
    werd es mal versuchen aber
    wo finde ich die MAC adresse von meinem Ethernet schild.
    lg und Danke

  20. Hallo Poldi,
    irgendwie habe ich mit der 1.0er Version Schwierigkeiten. Die Seite ist zwar aus der Wolke zu erreichen, macht aber bei der Erkennung der empfangenen Daten Schwierigkeiten. Muss da noch zusätzlich etwas modifiziert werden?

    Initialisierung klappt. Einschalten des Ausganges 3 klappt nicht, Die Verbindung kopmmt nicht mehr zustande. Alles andere klappt auch nicht. das Forum zielt auf eine ältere Version ab. Gibt es Vorschläge? Oder soll ich ins Forum damit?
    Gruß
    Eberhard

  21. Zu „Peter says: 21. September 2011 at 23:47“
    Problem ist gelöst. Spannungspegel am Reset\ pin war nicht definiert genug.
    Separate 5V Stromversorgung + definierter Reset am Reset\ pin solange Spannung unter 4V ist brachte das System sicher zum laufen.

  22. Hallo,
    klasse Anleitung für den Gebrauch eines Arduino als Webserver.
    Euer Code hat mir sehr geholfen, das Thema zu verstehen.

    Ich habe aber noch zwei Fragen:

    Und zwar gibt es in den Kommentaren eine Lösung für die Speicherung des Codes im Flash Speicher. Wie würde die Lösung aussehen wenn ich den Code auf einer SD Karte im Shield speichern bzw abrufen würde?

    Zweite Frage: Wie kann ich eine Passwortkontrolle realisieren? Hat jemand ein Beispiel?

    Vielen Dank, lg
    Lorenz

  23. Hallo,
    habe einen Arduino Webserver via EthernetShield in Betrieb, den ich über eine FritzBox und einen DynDNS Service am Internet haben möchte, sobald die Fritzbox sich eingeloggt hat.

    Mit Standard Webserver Beispiel-Code laut Arduino Beispielen.

    Als Stromversorgung des Arduino Boards habe ich das Board einfach an den USB-Port der FritzBox angeschlossen.

    Nun habe ich folgendes Problem:

    Falls die Arduino SW den Server initialisiert bevor eine stabile Ethernet Verbindung zwischen Fritzbox und Arduino-Board besteht, antwortet der Server nicht.

    Mache ich dann auf dem Board einen Reset bei eingeschalteter Stromversorgung klappt der Zugriff auf den Arduino Server gut.


    Akt. Lösung:

    Um 1min nach Reset verzögerte Initialisierung des Webservers. Aber das ist natürlich nichts sauberes.

    Woran kann’s liegen, dass keine Verbindung zustande kommt?

    Oder was muß ich ändern damit es richtig funktioniert?

  24. Hallo,

    ich finde dieses Thema hochinteressant, eine Anwendung wäre für mich eine Premiere. Aus Sicht der Profis habe ich eine wahrscheinlich banale Frage: Wie sieht die Angelegenheit „Arduino als Webserver“ eigentlich Hardwareseitig aus (z. B. wo gehen die am Arduino angeschlossenen Kabel hin und wie sieht die Verbindung zum Web aus) ?

    Vergeblich habe ich auch nach einer Möglichkeit gesucht, mich auf dieser Seite als neuer Benutzer einzutragen. Anmelden geht ja, aber nur wenn man bereits eingetragen ist.

    Vielen Dank schon an dieser Stelle und viele Grüße aus Schweden,

    alstermo

  25. @RaKa

    Hallo,

    könntest Du den Code nochmal ohne Fehler posten, ich habe es versucht, bekomme ihn aber nicht zum Laufen.

    Gruß Andreas

  26. Hallo,

    da habe ich Dich wohl missverstanden. Ich dachte „beim Einschalten“ meint das Einschalten vom Arduino… aber klar geht das. Einfach die Routine mit den Zeilen aus meinem Beispiel erweitern 😉

    LG
    Poldi

  27. Hi! Wieso hat das denn nichts mit dem Webserver zu tun? Ich schalte doch über die Webseite den Ausgang, z.B. 3, und möchte nun, dass er von selbst nach ner Weile wieder auf off geht. So kann der Ausgang beim nächsten Mal wieder neu aktiviert werden. Das soll für einen Türöffner fungieren.
    Danke noch für dein Programm!

    Grüßle

  28. Hallo,

    klar kann man das. Hat aber nix mit dem Thema Webserver zu tun! Dabei hilft wohl eher ein Blick auf die Arduino-Seite (http://arduino.cc/en/Reference/HomePage).

    Ich habe mal das in der Software enthaltene Beispiel „Blink“ angepasst. Damit etwas dem Einschalten abgearbeitet wird und danach nicht mehr, schreibt man es ins Setup:
    /*
    Blink
    Turns on an LED on for one second, then off for one second, repeatedly.

    This example code is in the public domain.
    */

    void setup() {
    // initialize the digital pin as an output.
    // Pin 13 has an LED connected on most Arduino boards:
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
    delay(3000);
    digitalWrite(13, LOW);
    }

    void loop() {

    }

  29. Hallo!
    Gibt es auch eine Möglichkeit, dass der Zustand HIGH beim Einschalten, z.B. von Ausgang 3, nach einer bestimmten Zeit wieder zurückgesetzt wird? Also so, dass kein Button dafür gedrückt werden muss? Wäre für jede Hilfe dankbar!

    LG

  30. Hi, wollte nur mal kundtun, dass sich unteres Problem erledigt hat. Allerdings erkennt der Server bei mir nur eine Bitfolge, er erkennt die Datei also nicht richtig. Als Meldung erscheint dann, dass ich ein application octet-stream speichern oder öffnen soll. Mal sehen wie ich das nun ausbügle.

    LG

  31. Danke noch für den Hinweis, aber dennoch macht das Programm Probleme. 🙁
    Contains ist bei mir kein „member of class String“ und mit substring erhalte ich folgende Fehlermeldung:
    invalid conversion from ‚const char*‘ to ‚unsigned int‘.
    Was ist da faul, da ich das Programm ansonsten doch übernommen habe?

    Danke im voraus!

    LG

  32. Hallo 😉

    Bitte immer auch die Kommentare lesen. Beitrag Nummer zehn enthält einen Link mit der Lösung.

    LG
    Poldi

  33. Hallo Poldi,

    mir macht beim Ausprobieren des Programms der Zusatz indexOF Probleme. Die Fehlermeldung besagt, dass indexOF kein Member in der Klasse String wäre. Liegt das an meiner neuen Version der IDE oder an was? Hast du eine Idee?

    Grüßle

  34. Hallo RaKa!

    Vielen Dank für den Code. Leider habe ich im Moment kein freies Ethernet-Shield.

    Werde den Code aber baldmöglichst mal testen 😉

    Lieben Gruß
    Poldi

  35. ahhgggrrrrr. Es wurden die HTML Tag im Programm gelöscht. Bei Interesse schicke ich es per Mail.

  36. Ich habe dein Script mal für die FLASH Library angepasst. Gut lesbar und spart Speicher!

    /*

    http://jleopold.de/2010/08/10/arduino-als-webserver/

    Original Version by Poldi
    modified by Katsu
    the functions readString.append() and readString.contains() where replaced

    modified by RaKa 2011 for FLASH Library (PROGMEM) to save RAM
    */

    #include // insert by Katsu
    #include
    #include // Mikal Hart PROGMEM Library, http://arduiniana.org/libraries/flash/
    //I use the F() macro (F for “Flash”)

    byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
    byte ip[] = { 192, 168, 1, 222 }; // IP-Adresse
    byte gateway[] = { 192, 168, 1, 1 }; // Gateway
    byte subnet[] = { 255, 255, 255, 0 };

    Server server(80);

    int Pin3 = 3;
    int Pin4 = 4;
    int Pin5 = 5;
    int Pin6 = 6;

    String readString = String(100); // string for fetching data from address
    boolean Pin3ON = false; // Status flag
    boolean Pin4ON = false;

    void setup()
    {
    Ethernet.begin(mac, ip, gateway, subnet);
    server.begin();
    pinMode(Pin3, OUTPUT);
    pinMode(Pin4, OUTPUT);

    Serial.begin(9600);

    }

    void loop()
    {

    // Create a client connection
    Client client = server.available();
    if (client) {
    while (client.connected())
    {
    if (client.available())
    {
    char c = client.read();

    //read char by char HTTP request
    if (readString.length() -1 by Katsu
    // indexOf locates a character or String within another String.
    // Returns the index of val within the String, or -1 if not found.
    if(readString.indexOf(„3=einschalten“) > -1)
    {
    digitalWrite(Pin3, HIGH);
    Serial.println(„Pin 3 eingeschaltet!“);
    Pin3ON = true;
    }

    if(readString.indexOf(„3=ausschalten“) > -1)
    {
    digitalWrite(Pin3, LOW);
    Serial.println(„Pin 3 ausgeschaltet!“);
    Pin3ON = false;
    }

    if(readString.indexOf(„4=einschalten“) > -1)
    {
    digitalWrite(Pin4, HIGH);
    Serial.println(„Pin 4 eingeschaltet!“);
    Pin4ON = true;
    }

    if(readString.indexOf(„4=ausschalten“) > -1)
    {
    digitalWrite(Pin4, LOW);
    Serial.println(„Pin 4 ausgeschaltet!“);
    Pin4ON = false;
    }

    if(readString.indexOf(„all=Alles+aus“) > -1)
    {
    digitalWrite(Pin3, LOW);
    digitalWrite(Pin4, LOW);
    Serial.println(„Alles ausgeschaltet“);
    Pin3ON = false;
    Pin4ON = false;
    }

    //————————–HTML————————
    client << F("HTTP/1.1 200 OK\n");

    client << F("Content-Type: text/html\n\n");

    client << F("“);

    client << F("Arduino Webserver“);

    client << F("\n“);

    client << F("“);

    //—Überschrift—
    client << F("\n“);

    client << F("Arduino Webserver 1.0 by Poldi RaKa Version\n“);

    client << F("\n“);
    //—Überschrift—

    //—Ausgänge schalten—
    client << F("Ausgänge schalten:\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("Ausgang 3\n“);

    client << F("\n“);

    client << F("\n“);

    if (Pin3ON)
    client << F("ON\n“);
    else
    client << F("OFF\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("Ausgang 4\n“);

    client << F("\n“);

    client << F("\n“);

    if (Pin4ON)
    client << F("ON\n“);
    else
    client << F("OFF\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("\n“);

    client << F("\n“);

    //—Ausgänge schalten—

    //clearing string for next read
    readString=““;

    //stopping client
    client.stop();
    }
    }
    }
    }
    }

  37. Jungs ich hab den Fehler gefunden warum man das nicht erweitern kann…:)
    es liegt an dem Speicher… er ist voll….

    ihr könnt die Überschriften weglassen bzw. Schriftarten löschen also alles unnötige raus.. dann klappts…

    ist es vielleicht möglich alles auf die Micro sd zu schreiben? dass der da alles ausliest?

  38. Hallo zusammen,

    ich habe die selben Probleme mit dem Quellcode, wie ihr alle zusammen auch! Und da ich Elektroniker und nicht Programmierer bin, kann ich leider noch nicht sagen, woran es liegt. Habe einen befreundeten Programmierer gefragt. Dieser wird sich die Sache mal anschauen. Ich werde berichten!

    Für alle, die aber gerne zuverlässig Dinge (angeschlossen am Arduino) über das Web steuern möchte, kann meinen Beitrag „Arduino via Internet mit dem Android-Phone steuern“ lesen. Das Prinzip ist ähnlich (Steuerung mit Codes wie „GET /?out=4&status=1“), das Arduino-Board enthält allerdings keine komplette Webseite, sondern gibt nur eine kurze Status-Rückmeldung.

  39. Hallo Poldi,

    ich habe Dein Beispiel im Forum gefunden und gleich ausprobiert, Änderungen wegen neuer Arduino-Version0021 vorgenommen und klappt wunderbar. Aber wehe, ich nehme eine Änderung vor, dann spinnt das HTML Ergebnis im Firefox.
    Ich sitze seit zwei Tagen dran und habe mein Problem jetzt einkreisen können, weiß aber nicht weiter. Ich hoffe, Du kannst mein Hirn auf Trapp bringen.
    Ich wollte zwei weitere Ausgänge hinzufügen und das HTML-Script lief nicht mehr. Ich habe zuletzt alle font, color, size anderen Zusätze rausgenommen und es ging. Also wollte wissen, was es ist.

    Dann habe ich in Deinem Code die Zeile „Client.println(……Ausgänge schalten……..)“ komplett kopiert und direkt darunter eingefügt. Klappt super, Firefox zeigt zweimal die Zeile und alles funktioniert, dann habe ich in der neuen Zeile nur das Wort „Test“ vor „Ausgänge schalten“ gesetzt, also „TestAusgänge schalten“ und die Buttons machen nichts mehr??
    Schreibe ich aber stattdessen das „Test“ in der Originalzeile vor „Ausgände schalten“, geht alles????
    Ich glaube, ich spinne — ich kriegs nicht raus. Bitte HILF!!!

    Gruß Andreas

    Arduino0021, seeeduino 326, Ethernet-Shield ganz neu von Watterott, WinXP, Firefox 3.6.13

  40. Aah, endlich was vernünftiges gefunden, Danke (=

    Aber irgendwie funktioniert der Code nur ein mal, danach muss man resetten um die seite wieder erreichen zu können.

    Hat das problem auch jemand?

  41. Wenn ich o.g. Beispiel um 2 oder 4 weitere Reihen erweiter, funktioniert es nicht mehr.
    Wo liegt das Problem, ich finde keinen Wert/Variable die die Anzahl der Reihen begrenzt.

    Danke Ben

  42. Hallo Sascha,

    auch Dir danke ich für Dein Interesse an meiner Webseite.

    Das Thema wird gerade im Arduino-Forum ausführlich besprochen. Dort gibt es auch schon einen Lösungsvorschlag.

    Magst Du mal unter schauen!? Hoffe das ist es, was Dir Sorgen macht

    LG
    Poldi

  43. Hi Poldi,
    irgendwie funktioniert es bei mir nicht mit deinem code ? Wenn ich ein beispiel von arduino uploade kann ich die seite erreichen. An was könnte es denn bei deinem Beispiel liegen ?

    Grüße Sascha

  44. Hallo Katsu,

    vielen Dank für Deine Mithilfe. Der Code im Anhang wurde geändert. Ich habe Deine Kommentare drin gelassen 😉

    Gruß
    Poldi

  45. Hallo Poldi,

    dein Programmcode hat mir sehr geholfen. Vielen Dank!
    Das Problem das dieser Code nicht auf den neueren Versionen läuft, konnte ich beheben.
    Ich sende Dir Deinen modifizierten Programmcode über das Arduino Forum, da ich hier leider
    keine eMail-Adresse gefunden habe und ich nicht weiß ob webmaster… oder info… ankommt.

    Gruß, Katsu

  46. Hallo Werner,

    Danke für Dein Interesse an diesem Projekt. Welche IP-Adresse hat denn der Rechner, von dem aus der Zugriff erfolgen soll? Er müsste (bei Verwendung des Beispiels) auch eine Adresse im Raum 192.168.178.*** haben. Sollte der PC eine andere haben, bitte die Adresse im Arduino-Code anpassen.
    Viel Erfolg.
    LG
    Poldi

  47. hallo,

    tolles Beispiel. Habe es mal versucht aber bei mir gehts nicht. Der PC hat eine feste IP und ist mit dem Shield über einen Switch verbunden. Ping zeigt das keine Verbindung zu Arduino besteht. Was kann da noch falsch sein?

    gruß
    Werner

  48. Hi Poldi,
    wollte nur noch mal eben danke sagen für das Code-Beispiel – war ein wichtiger Hinweis für mein Projekt:

    und jede viertel Stunde, die ich mich damit beschäftige kommen neue Ideen hinzu…
    Gruß
    Jan

  49. Danke Poldi !!

  50. Moin Poldi,
    es wäre super wenn du den Programmcode wieder hochladen könntest. Ich denke er würde mir riesig helfen.
    Tausend Dank!

Sorry, the comment form is closed at this time.