Ethernet-Shield

Lese­zeit: 6 Minu­ten

Das Ethernet-Shield ist eine Pla­ti­ne, die ein­fach auf den Ardui­no auf­ge­steckt wird. Auf ihr befin­det sich ein LAN-Anschluss (RJ45). Alle digi­ta­len und ana­lo­gen Anschlüs­se ste­hen auch wei­ter­hin zur Verfügung.

An zwei Bei­spie­len sol­len die Varia­blen und Funk­ti­onn der Biblio­thek Ether­net erläu­tert werden. 

Es wird eine Test­sei­te erstellt und der von der Test­sei­te gesen­de­te Buch­sta­be ange­zeigt. Du musst die im Seri­el­len Moni­tor ange­zeigt IP in der Adress­zei­le des Brow­sers ein­ge­ben, anschlie­ßend fügst du ein / und den Buch­sta­ben hinzu.

So sieht es aus:

Benö­tig­te Biblio­thek:

oder: Sketch -> Biblio­thek ein­bin­den -> Biblio­the­ken verwalten

Bin­de die Biblio­thek ein und defi­nie­re die benö­tig­ten Varia­blen. Der "Schal­ter" fest­eIP ent­schei­det, ob eine IP über DHCP ver­ge­ben wird oder eine sta­ti­sche IP fest­ge­legt wird.

Für die Ver­ga­be eine fes­ten IP kannst du die bereits beleg­ten Adres­sen mit dem Pro­gramm arp herausfinden:

Win­dows:
Öff­ne zuerst eine Eingabeaufforderung.

Mit dem Befehl arp -a

kannst du die IP-Adressen und die MAC-Adressen aller in dei­nem Netz­werk vor­han­de­nen Gerä­te herausfinden.

Auch Linux kennt den Befehl arp.

# include <Ethernet.h>

// MAC-Adresse und IP definieren
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// festeIP = false -> IP-Adresse über DHCP vergeben
bool festeIP = true;

// feste IP
IPAddress ip(192, 168, 1, 200);

// Name des Servers vergeben
EthernetServer Server(80);

Der setup-Teil ver­gibt die IP, star­tet den Ser­ver und zeigt die ver­ge­be­ne IP an.

void setup()
{
  // Ethernet starten feste IP
  if (festeIP) Ethernet.begin(mac, ip);

  // Ethernet starten DHCP
  else Ethernet.begin(mac);

  // Server starten
  Server.begin();

  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // zur Kontrolle IP-Adresse anzeigen
  // localIP -> Adresse, die im Browser eingegeben wird
  Serial.print(F("IP Adresse: "));
  Serial.println(Ethernet.localIP());
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  String Auswertung = "";
  // auf Klienten warten ...
  EthernetClient client = Server.available();

  // neue Anfrage
  if (client)
  {
    // solange der client verbunden ist ...
    while (client.connected())
    {
      if (client.available())
      {
        // Zeichen vom clienten lesen
        char Zeichen = client.read();

        // String "zusammenbauen"
        // += ist die Kurzform von Auswertung = Auswertung + Zeichen;
        Auswertung += Zeichen;

        // \n = Seite vom clienten vollständig geladen
        if (Zeichen == '\n')
        {
          // HTTP-Anforderung senden
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));

          // Leerzeile zwingend erforderlich
          client.println();

          /*
            HTML-Seite aufbauen
            die folgenden Anweisungen müssen
            mit print oder println gesendet werden
            println "verschönert" den Quelltext
            (jede Anweisung in einer eigenen Zeile)
          */
          client.println(F("<!doctype html>"));
          client.println(F("<html>"));
          client.println(F("<body>"));
          client.println(F("<h1>Testseite</h1>"));
          client.println(F("<b>Gelesenes Zeichen: </b>"));
          client.println(Auswertung);

          /*
            ein Zeichen hinter der IP nach dem /
            erzeugt eine GET-Anweisung in der Form
            GET /a HTTP/1.1 -> a auswerten
            GET /b HTTP/1.1 -> b auswerten
            indexOf durchsucht den String nach diesen Zeichen
            (> 0 = Zeichen gefunden)
          */
          if (Auswertung.indexOf("a") > 0)
          {
            client.println(F("<hr>Der Buchstabe a wurde eingegeben!"));
          }
          if (Auswertung.indexOf("b") > 0)
          {
            client.println(F("<hr>Der Buchstabe b wurde eingegeben!"));
          }

          // IPs anzeigen
          client.print(F("<hr><b>Eigene IP: "));
          client.print(client.remoteIP());
          client.println(F("<br>"));
          client.println(F("IP des Ethernet-Shields: "));
          client.print(Ethernet.localIP());
          client.println(F("</b>"));
          client.println(F("</body>"));
          client.println(F("</html>"));

          // Zeit, um die Antwort zu übertragen
          delay(1);
          
          // Verbindung beenden
          client.stop();
        }
      }
    }
  }
}

But­tons kön­nen auf die glei­che Wei­se aus­ge­wer­tet werden:

# include <Ethernet.h>

// MAC-Adresse und IP definieren
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// festeIP = false -> IP-Adresse über DHCP vergeben
bool festeIP = true;

// feste IP
IPAddress ip(192, 168, 1, 200);

// Name des Servers vergeben
EthernetServer Server(80);

void setup()
{
  // Ethernet starten feste IP
  if (festeIP) Ethernet.begin(mac, ip);

  // Ethernet starten DHCP
  else Ethernet.begin(mac);

  // Server starten
  Server.begin();
  Serial.begin(9600);
  
  // auf serielle Verbindung warten
  while (!Serial) {;}
 
  // zur Kontrolle IP-Adresse anzeigen
  // localIP -> Adresse, die im Browser eingegeben wird
  Serial.print(F("IP des Ethernet-Shields: "));
  Serial.println(Ethernet.localIP());
}

void loop()
{
  String Auswertung = "";

  // auf Klienten warten ...
  EthernetClient client = Server.available();

  // neue Anfrage
  if (client)
  {
    // solange der client verbunden ist ...
    while (client.connected())
    {
      if (client.available())
      {
        // Zeichen vom clienten lesen
        char Zeichen = client.read();

        Auswertung += Zeichen;
        // entspricht:
        // Auswertung = Auswertung + Zeichen;

        // \n = Seite vom clienten vollständig geladen
        if (Zeichen == '\n')
        {
          // HTTP-Anforderung senden
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));

          // Leerzeile zwingend erforderlich
          client.println();

          /*
            HTML-Seite aufbauen
            die folgenden Anweisungen müssen
            mit print oder println gesendet werden
            println "verschönert" den Quelltext
            (jede Anweisung in einer eigenen Zeile)
          */
          client.println(F("<!doctype html>"));
          client.println(F("<html>"));
          client.println(F("<body>"));
          client.println(F("<h1>Testseite mit Buttons</h1>"));

          // Button rot
          client.print(F("<input style='background-color:red;cursor:pointer'"));
          client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          client.print(F(" type='button'"));
          client.println(F(" onClick=\"location.href='rot'\""));
          client.println(F(" value='rot'>"));

          // Button gelb
          client.print(F("<input style='background-color:yellow;cursor:pointer'"));
          client.print(F(" border-radius:5px;border: 2px solid black;'"));
          client.print(F(" type='button'"));
          client.println(F(" onClick=\"location.href='gelb'\""));
          client.println(F(" value='gelb'>"));

          // Button grün
          client.print(F("<input type='button' style='background-color:#92F099;cursor:pointer'"));
          client.print(F(" border-radius:5px;border: 2px solid black;'"));
          client.print(F(" type='button'"));
          client.println(F(" onClick=\"location.href='gruen'\""));
          client.println(F(" value='gr&uuml;n'>"));
          client.println(F("<br><hr>"));

          client.println(F("<b>Gelesenes Zeichen: </b>"));
          client.println(Auswertung);

          /*
            ein Zeichen hinter der IP nach dem /
            erzeugt eine GET-Anweisung in der Form
            GET /grau HTTP/1.1 -> Button grau auswerten
            GET /gelb HTTP/1.1 -> Button gelb auswerten
            indexOf durchsucht den String nach diesen Zeichen (> 0 = Zeichen gefunden)
          */
          if (Auswertung.indexOf("rot") > 0)
          {
            client.println(F("<hr>Der Button rot wurde gedr&uuml;ckt!"));
          }

          if (Auswertung.indexOf("gelb") > 0)
          {
            client.println(F("<hr>Der Button gelb wurde gedr&uuml;ckt!"));
          }

          if (Auswertung.indexOf("gruen") > 0)
          {
            client.println(F("<hr>Der Button gr&uuml;n wurde gedr&uuml;ckt!"));
          }

          // IPs anzeigen
          client.print(F("<hr><b>Eigene IP: "));
          client.print(client.remoteIP());
          client.println(F("<br>"));
          client.println(F("IP des Ethernet-Shields: "));
          client.print(Ethernet.localIP());

          client.println(F("</b>"));
          client.println(F("</body>"));
          client.println(F("</html>"));

          // Zeit, um die Antwort zu übertragen
          delay(1);

          // Verbindung beenden
          client.stop();
        }
      }
    }
  }
}

Letzte Aktualisierung: 30. Aug 2022 @ 11:10