Einen Webserver mit Arduino erstellen

15

In diesem Artikel möchte ich kurz erläutern, wie Sie mithilfe eines Arduino Entwicklungsboards einen Webserver erstellen können. Dazu benötigen Sie sowohl ein beliebiges Arduino-Board sowie das zusätzliche Ethernet-Shield. Auf diesem Shield befinden sich im Wesentlichen ein Netzwerkchip und eine Ethernet-Buchse, mit deren Hilfe der Arduino mit einem Netzwerk verbunden werden kann.

1) Arduino mit dem Netzwerk verbinden

Vor dem Programmieren des Servers muss das Ethernet-Shield auf das Arduino-Board aufgesteckt werden. Hierzu werden keine weiteren Kabel und keine zusätzliche Stromversorgung benötigt.

Arduino-Board mit aufgestecktem Ethernet-Shield.

Arduino-Board mit aufgestecktem Ethernet-Shield.

Anschließend verbinden Sie die USB-Buchse des Arduinos mit dem PC und die Ethernet-Schnittstelle mit einem Router. Sollten Sie keine Möglichkeit haben, das Ethernet-Shield mit einem Router zu verbinden, weil dieser beispielsweise in einem anderen Raum steht, gibt es eine weitere Möglichkeit, den Arduino mit dem Netzwerk zu verbinden. Hierzu schließen Sie das Ethernet-Shield über ein LAN-Kabel an die Ethernet-Buchse Ihres mit dem Internet verbundenen PCs an. Das setzt natürlich voraus, dass Ihr PC über mindestens zwei entsprechende LAN-Buchsen vefügt oder per WLAN mit dem Netzwerk verbunden ist. Nun kann eine Netzwerkbrücke zwischen den beiden LAN-Schnittstellen bzw. zwischen der LAN-Buchse und dem WLAN-Adapter des PCs erstellt werden.

Sofern Sie Windows 7 nutzen, öffnen Sie hierfür zunächst die Systemsteuerung und hier das “Netzwerk- und Freigabecenter”. Anschließend klicken Sie auf den Link “Adaptereinstellungen ändern”, der sich in der linken Seitenleiste befindet. Hier sollten nun unter anderem die beiden entsprechenden LAN-Ports bzw. der LAN-Port und der WLAN-Adapter aufgeführt werden. Um die Netzwerkbrücke zu erstellen, markieren Sie die beiden Netzwerkadapter (“Strg”-Taste gedrückt halten und beide anklicken). Nun steht im Kontexktmenü, das Sie über einen Rechtsklick erreichen, die Option “Zu Brücke hinzufügen” zur Verfügung.

Erstellen einer Netzwerkbrücke

Erstellen einer Netzwerkbrücke

Nach dem Ausführen der Option sollte ein neuer Eintrag “Netzwerkbrücke” in der Liste erscheinen. Die Verbindung ist nun abgeschlossen und das Arduino-Board sollte mit dem Netzwerk verbunden sein.

2) Programmieren des Webservers

Um zu testen, ob der Arduino erfolgreich mit dem Netzwerk verbunden wurde, kann nun die Arduino Entwicklungsumgebung gestartet werden. Anschließend gehen Sie in der Menüleiste auf “Datei” -> “Beispiele” -> “Ethernet” -> “WebServer”.

Öffnen des Beispiel-Sketches

Öffnen des Beispiel-Sketches

Es sollte sich nun der folgende Sketch öffnen. Besondere Aufmerksamkeit sollten Sie Zeile 25 schenken, in der die IP-Adresse festgelegt wird. Diese muss mit der Maske der lokalen IP übereinstimmen. Verwenden Sie in Ihrem Netzwerk beispielsweise die lokale IP 192.168.2.xxx, dann müssen Sie in Zeile 25 eine IP-Adresse eintragen, die beispielsweise 192.168.2.105 lautet. Achten Die darauf, dass keinem anderen Gerät im lokalen Netzwerk diese IP zugewiesen wurde. Wenn Sie sich nicht sicher sind, welche IP-Maske sie nutzen, sollten Sie diese in Ihrem Router nachgucken.

/*
  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
 
 */

#include <SPI.h>
#include <Ethernet.h>

// 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,1, 177);

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

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  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);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // 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("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          // output the value of each analog input pin
          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("<br />");       
          }
          client.println("</html>");
          break;
        }
        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");
  }
}

Wenn sie die passende IP-Adresse eingetragen haben, klicken Sie in der Entwicklungsumgebung auf den zweiten Button von links “Upload”. Jetzt wird der Sketch geparst und in den Maschinencode umgewandelt und auf den AtMega, der sich auf dem Board befindet, geflasht.

Jetzt sollte der Webserver einsatzbereit sein. Öffnen Sie Ihren Browser und tippen Sie die zuvor im Sketch angegebene IP-Adresse in die Adresszeile ein. In meinem Fall ist das die IP 192.168.2.107. Nun sollten Sie die Ausgabe sehen, die auf dem Bild unten dargestellt ist.

Ausgabe des Webservers

Ausgabe des Webservers

Das Beispielprogramm dient dazu, die Messwerte der sechs Analog-Digital-Wandler des Arduinos auf der Website anzuzeigen. Wenn Sie an die entsprechenden Anschlüsse auf dem Board eine analoge Spannung im Bereich zwischen 0 und 5 Volt anlegen, sollte sich der entsprechende Wert des AD-Wandlers ändern. Ein Messwert von 0 entspricht dabei einer Spannung von 0 Volt, während ein Messwert von 1024 (2^10) einer Spannung von 5 volt entspricht.

Mithilfe des Serial-Monitors (Button auf der rechten Seite der Menüleiste in der IDE) können Sie außerdem einige Informationen zum Web-Client, also Ihrem Browser, sowie die IP, unter der der Server zur Verfügung steht, abrufen.

Serial-Monitor der IDE

Serial-Monitor der Arduino IDE

3) Fazit

Wie man sehen kann, ist es mit verhältnismäßig geringem Aufwand möglich, den Arduino als Webserver zu betreiben. Natürlich ist die Verwendung nicht auf die im Beispiel-Sketch gezeigte Anwenung beschränkt. Denkbar wäre eine Web-Oberfläche, mit deren Hilfe man beispielsweise Pins des Arduinos schalten könnte, an die entsprechende Verbraucher angeschlossen sind. So könnte man zum Beispiel in Abwesenheit über ein Smartphone schonmal die Kaffeemaschine zu Hause einschalten, usw. Der Kreativität sind hier kaum Grenzen gesetzt.
Ich werde hier mit Sicherheit auch das ein oder andere Projekt veröffentlichen, das auf Basis des Ethernet-Shields arbeitet.

Hinterlasse einen Kommentar zu Stefan Antworten abbrechen

Ihre Email-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert.

*

Kommentare umschalten

15 Kommentare zu "Einen Webserver mit Arduino erstellen"

  • Thomas sagt:

    Warum müllen so viele dummen Leute das Internet mit halbherzig nichts nutzigen Blogs und Beiträgen zu?

    So ein SCHEISS – Zu schade für den Stromverbrauch !

    Viel Erfolg noch mit diesem SCHROTT-Beitrag für die Menschheit Herr Lukas Bommes

    • Lukas Bommes sagt:

      Danke für das solide Feedback.^^ Gibt es denn Verbesserungsvorschläge von Ihrer Seite?

      P.S. Ein etwas freundlicherer Umgangston hätte es aber auch getan.

      • Stefan sagt:

        Ich bin Neuling in der Arduinowelt und danke Dir für den anschaulichen und verständlichen Artikel.
        Sobald mein Arduino Uno eintrifft, werde ich das gleich ausprobieren. Ich finde es gut, dass es endlich mal eine Erklärung auf deutsch gibt. Weiter so!

        • Lukas Bommes sagt:

          Vielen Dank für das Lob, Stefan. Ich wünsche dir viel Spaß mit dem Arduino. Die Möglichkeiten, die man mit dem Teil hat, sind (von einigen hardwareseitigen Einschränkungen einmal abgesehen) ja wirklich nahezu unbegrenzt. :D

  • Volker sagt:

    Hallo erstmal,
    vielen Dank für den wirklich nützlichen Beitrag/Einführung. Lass dich durch dumme Kommentare nicht abschrecken.

    @ Thomas
    Nicht jeder der sich im Internet umsieht kann alles schon, sonst bräuchte er ja nicht suchen. Aber auf Kommentare wie deinem, kann wirklich jeder verzichten !!!

    • Lukas Bommes sagt:

      Keine Angst, so schnell lasse ich mich schon nicht beeindrucken. Generell habe ich ja auch gar nichts gegen Kritik, allerdings sollte sie schon konstruktiv sein. Andernfalls artet das Ganze in sinnlosem Hating und Flaming aus. Das kennt man ja von YouTube, etc. zur Genüge.
      Die Tatsache, dass es momentan nicht wirklich weiter geht, hat vielmehr damit zu tun, dass ich zurzeit arbeite und mich langsam aber sicher auch schon einmal auf mein Studium vorbereite. ;)

  • Matthias sagt:

    Ich finde das Tutorial super. Doch sollte erwähnt sein, dass man noch #include hinzufügen muss. Sonst bekommt man viele Fehler angezeigt. Und Ethernet->Webserver gibt es bei mir nicht, ich musste: Sketch->Library Importieren->Ethernet aufrufen.

    Webserver läuft bei mir mit einem Duemilanove.

    Lustig ist der schneller Erfolg der sich einstellt… so kann man schön schnell experimentieren.

    Danke.

    Ps.: Ich würde den Hater-Eintrag löschen, der hat hier nichts zu suchen. Das hat auch nichts mit Meinungsfreiheit zu tun. Hater sollten reflektiert bekommen, dass so etwas menschenverachtend ist.

    • Lukas Bommes sagt:

      Hallo Matthias,
      vielen Dank für das positive Feedback. Welches inlcude meinst du genau? Am Anfang werden die SPI.h und Ethernet.h doch bereits über einen include eingebunden. Und den Unterscheid in der Menüführung vermute ich mal ganz einfach in unterschiedlichen Versionen der Software. Das Tutorial ist ja nun auch schon knapp ein dreiviertel Jahr alt. In dieser Zeit kann sich bei Software eine ganze Menge ändern.
      Ja, das schnelle Erfolgserlebnis ist in der Tat ein großer Vorteil der Arduino-Plattform im Vergleich zur direkten Programmierung von Microcontrollern, wo man die Firmware erst zehnmal flashen muss, bis man trotz Blick in das 1000-seitige Handbuch mal die richtigen Bits im richtigen Register gesetzt hat und der Controller das macht, was man von ihm wollte. ;) Und schlussendlich ist der Arduino-Code auch wesentlich übersichtlicher als ein direkt in AVRGCC geschriebener Code.

  • Niclas sagt:

    Hi,
    ich hab mir auch ein Ethernet-Shield gekauft um einen webserver zu erstellen. Es gibt da jedoch ein Problem ich denke dass es an der IP liegt. Also woher weiß ich wie diese aussehen muss bzw. welche noch zur Verfügung stehen?

    Würde mich sehr über eine Antwort freuen

  • Josef sagt:

    Hallo Lukas,

    erst einmal danke für das leicht verständliche Tutorial.

    Ich bin gerade auf der Suche nach einer Möglichkeit meinen Arduino eine CSV-Datei an den PC oder ans Smartphone senden zu lassen bzw. auch umgekehrt.

    Der Hintergrund ist das der Arduino sozusagen ein Logbuch anfertigen soll welches ich dann bequem in Excel begutachten kann. Gleichzeitig möchte ich dem Arduino auf diesem Weg auch Einstellwerte übergeben. Gibt es eine Möglichkeit eine solche Datei über einen solchen Server herunterzuladen bzw. hochzuladen?

    Grüße
    Josef

  • Hans sagt:

    Prima Sache, funktioniert so weit, vielen Dank!

    Ich habe noch ein Problem, da ich einen Arduino zum Schalten von Steckdosen benutzen will. Ich habe eine App, bei der ich einen virtuellen Knopf mit einer URL verknüpfen kann. Gibt es eine Möglichkeit, irgendwelche Parameter beim Aufruf der IP an den Server zu übergeben? 1 Byte würde ja schon reichen.

    Die üblicherweise verwendete Webseite zum Schalten möchte ich gern vermeiden, es müßte nur ein einziges Byte beim direkten Aufruf auf dem Server landen, aber der normale Standardrequest sieht ja wohl nicht vor, daß man irgendwelche konfigurierbaren Daten übergeben kann.

    UDP geht leider nicht, da ich UDP nicht über einen HTTP-Aufruf versenden kann. Es wäre toll, Lukas, wenn Du da eine Idee hättest.

  • Gerd sagt:

    Danke für den Weg zu einem schnellen Einstieg

  • Jürgen sagt:

    Hallo Lukas,

    Deine Beiträge sind super.

    Ich möchte 2 Arduinos über Netzwerk verbinden und Daten in beide Richtungen austauschen.

    Wie muss ich das antellen? Hast Du hierfür eine Lösung?

    Ich wünsche Dir für das Studium alles Gute und hoffentlich hast Du noch genügend Zeit zum experimentieren.

    Mit freundlichem Gruss
    Jürgen

  • Uli sagt:

    Toller Bericht!
    Kannst Du auch mal zeigen wie man den neueren Chip “W5500″ an den Arduino anschließt und betreibt?
    Die Arduinosoft betreibt momentan nur den (hier gezeigten) W5100!

    Danke!

    • Lukas Bommes sagt:

      Hallo Uli,

      danke für das Lob.
      An sich würde ich gerne etwas experimentieren, allerdings fehlt mir dazu die Zeit, da ich momentan meine Bachelorarbeit schreibe.
      Frag doch am besten mal hier nach: forum.arduino.cc

      Ansonsten noch viel Spaß beim Basteln und Programmieren!

      Viele Grüße
      Lukas