Ethernet-Shield

Lese­zeit: 6 Minu­ten
Ethernet-Shield

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 Metho­den 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:
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.

# 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, 201);

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

Wenn du eine ➨sta­ti­sche IP ver­wen­den willst:

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);

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

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  String Auswertung = "";

  // auf Clienten 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, 201);

// 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);

  // 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 Clienten 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;width:100px' 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;width:100px'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='gelb'\""));
          Client.println(F(" value='gelb'>"));

          // Button grün
          Client.print(F("<input style='background-color:green;cursor:pointer'"));
          Client.print(F(" border-radius:5px;border: 2px solid black;width:100px'"));
          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: 11. Mrz 2021 @ 8:41