Ether­net-Shield

Lese­zeit: 7 Minu­ten

Das Ether­net-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­tio­nen 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 Variablen.

# include "Ethernet.h"

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

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

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

void setup()
{
  // Ethernet starten DHCP
  Ethernet.begin(mac);

  // Server starten
  WebServer.begin();
  Serial.begin(9600);

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

  // 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 = WebServer.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();
        }
      }
    }
  }
}

Das voll­stän­di­ge Programm:

# include "Ethernet.h"

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

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

void setup()
{
  // Ethernet starten DHCP
  Ethernet.begin(mac);

  // Server starten
  WebServer.begin();
  Serial.begin(9600);

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

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

void loop()
{
  String Auswertung = "";

  // auf Klienten warten ...
  EthernetClient Client = WebServer.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};

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

void setup()
{
  // Ethernet starten DHCP
  Ethernet.begin(mac);

  // Server starten
  WebServer.begin();
  Serial.begin(9600);

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

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

void loop()
{
  String Auswertung = "";

  // auf Klienten warten ...
  EthernetClient Client = WebServer.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ü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ückt!"));
          }

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

          if (Auswertung.indexOf("gruen") > 0)
          {
            Client.println(F("<hr>Der Button grün wurde gedrü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: 10. Nov 2023 @ 9:53