Arduino Ethernet w5100 Probleme mit DHCP

Wer einen Arduino mit Ethernet Shield w5100 betreibt kann in die Situation kommen das bei DHCP durch den Router keine IP vergeben wird.  

Ein Auslesen per seriellen Monitor gibt oft die Meldung IP 0.0.0.0 zurück.

Einer der häufigsten Fehler der mir unter die Finger kommt, sind Router oder Switch die nicht mir der Arduino MAC klar kommen.

Mehr hierzu gibt es wie üblich in der Wiki.

Der Arduino und das Ethernet Shield

Inhaltsverzeichnis WordPress

Von Haus aus kommt der Arduino Uno ohne eine Netzwerklösung daher. Dies kann man recht einfach mit einem Arduino Ethernet Shield aendern. Einfach aufstecken und der Arduino hat eine LAN Anschluss.

Damit nun der Arduino in deinem Netzwerk funktioniert bedarf es noch einem Sketch.

Dank dem gut Dokumentierten Arduino Projekt gibt es auch gute Ethernet Libray’s.

Arduino LAN Sketch

/*
 Web Server
  */
 
// Diese beide Libraries sind erforderlich
#include <SPI.h>
#include <Ethernet.h>
 
/*
Hier die MAC Adresse des Shields eingeben
Meistens gibt es einen Aufkleber auf der Rückseite des Shields
*/
byte mac[] = { 
 0x90, 0xA2, 0xDA, 0x00, 0xFB, 0x80 };
 
/*
Nun noch eine freie IP auf aus deinem Netzwerk angeben. Dazu
ist es am einfachsten die IP des Rechners auszulesen.
ifconfig ist hier das Stichwort.
*/ 
IPAddress ip(192,168,1,177);
 
// Ethernet Library als Server initialisieren
// Verwendet IPAdress und den Port 80 für http
EthernetServer server(80);
 
void setup() {
 /*
Serielle Kommunikation starten 
*/
 Serial.begin(9600);
 
 // Ethernet Verbindung und Server starten
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.print("Server gestartet. IP: ");
 // IP des Arduino-Servers ausgeben
 Serial.println(Ethernet.localIP());
}
 
 
void loop() {
/*
server.available() schaut, ob ein Client verfügbar ist und Daten
an den Server schicken möchte. Gibt dann eine Client-Objekt zurück, sonst false
*/
 EthernetClient client = server.available();
 
// Wenn es einen Client gibt, dann...
 if (client) {
 Serial.println("Neuer Client");

/*
Jetzt solange Zeichen lesen, bis eine leere Zeile empfangen wurde
HTTP Requests enden immer mit einer leeren Zeile 
*/
 boolean currentLineIsBlank = true;
 // Solange Client verbunden 
 while (client.connected()) {
 // client.available() gibt die Anzahl der Zeichen zurück, die zum Lesen
 // verfügbar sind
 if (client.available()) {
 // Ein Zeichen lesen und am seriellen Monitor ausgeben
 char c = client.read();
 Serial.write(c);
 // In currentLineIsBlank merken wir uns, ob diese Zeile bisher leer war.
/*
Wenn die Zeile leer ist und ein Zeilenwechsel (das \n) kommt,
dann ist die Anfrage zu Ende und wir können antworten
*/
 if (c == '\n' && currentLineIsBlank) {
 // HTTP Header 200 an den Browser schicken
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Connection: close"); // Verbindung wird nach Antwort beendet
 client.println("Refresh: 2"); // Seite alle 25 Sekunden neu abfragen
 client.println();
 // Ab hier berginnt der HTML-Code, der an den Browser geschickt wird
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 client.print("Analogpin 0: <b>");
 client.print(analogRead(A0));
 client.println("</b><br />"); 
 client.println("</html>");
 break;
 }
 if (c == '\n') {
 // Zeilenwechsel, also currentLineIsBlack erstmal auf True setzen
 currentLineIsBlank = true;
 } 
 else if (c != '\r') {
 // Zeile enthält Zeichen, also currentLineIsBlack auf False setzen
 currentLineIsBlank = false;
 }
 }
 }
 // Kleine Pause
 delay(1);
 // Verbindung schliessen
 client.stop();
 Serial.println("Verbindung mit Client beendet.");
 Serial.println("");
 }
}