Ampel mit einem Ethernet-Shield schalten

Lese­zeit: 9 Minu­ten
Lösung
Seite als PDF
Navi­ga­ti­on

Das Pro­gramm "baut" eine HTML-Seite mit der zunächst eine LED und anschlie­ßend eine Ampel geschal­tet wer­den kann.

Ethernet-Shield

Für die­se Anlei­tung benö­tigst du ein soge­nann­tes „Shield“, 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.

Benö­tig­te Bauteile:

  • 3 LEDs (rot, gelb, grün)
  • 3 Wider­stän­de > 100 Ω
  • Ethernet-Shield
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Für das Pro­gramm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in dei­nem loka­len Netz­werk.
Im Regel­fall befin­det sich in einem loka­len Netz­werk ein DHCP-Server, der jedem Gerät im Netz­werk auto­ma­tisch eine IP-Adresse zuteilt. Im Pro­gramm wird eine über DHCP ver­ge­be­ne Adres­se verwendet.

Bei­spiel:

Das Pro­gramm schal­tet die rote LED ein und aus.
So sieht das Pro­gramm im Brow­ser aus:

Benö­tig­te Biblio­thek:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Bin­de die benö­tig­te Biblio­thek ein und defi­nie­re die Variablen.

# include <Ethernet.h>
 
int ROT = 5;
int GELB = 6;
int GRUEN = 7;

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

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

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

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

// SchaltungLesen beinhaltet den Befehl zum Schalten der LED
String SchaltungLesen;

Der setup-Teil. Beach­te die Kommentare.

void setup()
{
  Serial.begin(9600);
  pinMode(ROT, OUTPUT);
  pinMode(GELB, OUTPUT);
  pinMode(GRUEN, OUTPUT);

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

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

  // Server starten
  Server.begin();

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

Im Seri­el­len Moni­tor wird die IP des Ethernet-Shields ange­zeigt. Die­se Adres­se wird in einem Brow­ser eingegeben.

Download

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // auf Clienten warten ...
  EthernetClient Client = Server.available();

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

        // ... und dem String hinzufügen
        // SchaltungLesen beinhaltet den Befehl zum Schalten der LED
        SchaltungLesen += Zeichen;

        // return gesendet
        if (Zeichen == '\n')
        {
          /*
            HTML-Seite aufbauen
            die folgenden Anweisungen müssen
            mit print oder println gesendet werden
            println "verschönert" den Quelltext
            (erzeugt einen Zeilenumbruch im Quelltext)
            " müssen mit \ maskiert werden " -> \"
          */
          Client.println(F("HTTP/1.1 200 OK"));
          Client.println(F("Content-Type: text/html"));

          // Leerzeile zwingend erforderlich
          Client.println();

          Client.println(F("<!doctype html>"));
          Client.println(F("<html>"));

          Client.println(F("<body>"));
          Client.println(F("<h2>Ampel mit Ethernet-Shield schalten</h2>"));
          Client.println(F("<hr />"));

          Client.println(F("<table><tr>"));

          // Button rot ein
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:#FF6565;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='RotEin'\""));
          Client.println(F(" value='rot einschalten'>"));
          Client.println(F("</td>"));

          // Button rot aus
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='RotAus'\""));
          Client.println(F(" value='rot ausschalten'>"));
          Client.println(F("</td></tr>"));

          // Button gelb ein
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:#FFFB65;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='GelbEin'\""));
          Client.println(F(" value='gelb einschalten'>"));
          Client.println(F("</td>"));

          // Button gelb aus
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='GelbAus'\""));
          Client.println(F(" value='gelb ausschalten'>"));
          Client.println(F("</td></tr>"));

          // Button grün ein
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:#76FA5F;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='GruenEin'\""));
          Client.println(F(" value='gr&uuml;n einschalten'>"));
          Client.println(F("</td>"));

          // Button grün aus
          Client.print(F("<td><input style='font-size:14pt;"));
          Client.print(F("font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;'"));
          Client.print(F(" type='button'"));
          Client.println(F(" onClick=\"location.href='GruenAus'\""));
          Client.println(F(" value='gr&uuml;n ausschalten'>"));
          Client.println(F("</td></tr>"));
          Client.println(F("</table>"));

          Client.println(F("<hr />"));

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

          delay(1);

          Client.stop();

          /*
            ein Klick auf einen der Buttons 
            erzeugt eine GET-Anweisung in der Form
            GET /RotEin HTTP/1.1 -> Button rot ein auswerten
            GET /RotAus HTTP/1.1 -> Button rot aus auswerten
            indexOf durchsucht den String nach diesen Zeichen 
            (> 0 = Zeichen gefunden)
          */
          if (SchaltungLesen.indexOf("RotEin") > 0) digitalWrite(ROT, HIGH);
          if (SchaltungLesen.indexOf("RotAus") > 0) digitalWrite(ROT, LOW);
          if (SchaltungLesen.indexOf("GelbEin") > 0) digitalWrite(GELB, HIGH);
          if (SchaltungLesen.indexOf("GelbAus") > 0) digitalWrite(GELB, LOW);
          if (SchaltungLesen.indexOf("GruenEin") > 0) digitalWrite(GRUEN, HIGH);
          if (SchaltungLesen.indexOf("GruenAus") > 0) digitalWrite(GRUEN, LOW);

          // String SchaltungLesen leeren
          SchaltungLesen = "";
        }
      }
    }
  }
}

Das Pro­gramm wird mit den übri­gen But­tons ergänzt. So soll es im Brow­ser aussehen:

Die Defi­ni­ti­on der Varia­blen und der setup-Teil:

# include <Ethernet.h>

int ROT = 5;
int GELB = 6;
int GRUEN  = 7;

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

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

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

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

// SchaltungLesen beinhaltet den Befehl zum Schalten der LED
String SchaltungLesen;

void setup()
{
  Serial.begin(9600);

  pinMode(ROT, OUTPUT);
  pinMode(GELB, OUTPUT);
  pinMode(GRUEN, OUTPUT);

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

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

  // Server starten
  Server.begin();

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

Der loop-Teil

void loop()
{
  // auf Clienten warten ...
  EthernetClient Client = Server.available();

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

        // ... und dem String hinzufügen
        // SchaltungLesen beinhaltet den Befehl zum Schalten der LED
        SchaltungLesen += Zeichen;

        // return gesendet
        if (Zeichen == '\n')
        {
          /*
            HTML-Seite aufbauen
            die folgenden Anweisungen müssen
            mit print oder println gesendet werden
            println "verschönert" den Quelltext
            (erzeugt einen Zeilenumbruch im Quelltext)
            " müssen mit \ maskiert werden " -> \"
          */
          Client.println(F("HTTP/1.1 200 OK"));
          Client.println(F("Content-Type: text/html"));
          Client.println("Connection: close");

          // Leerzeile zwingend erforderlich
          Client.println();

          Client.println(F("<!doctype html>"));
          Client.println(F("<html>"));

          Client.println(F("<body>"));
          Client.println(F("<h2>Ampel mit Ethernet-Shield schalten</h2>"));
          Client.println(F("<hr />"));

          Client.println(F("<table><tr>"));

          // Button rot ein
          Client.print(F("<td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:#FF6565;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='RotEin'\""));
          Client.println(F(" value='rot einschalten'>"));
          Client.println(F("</td>"));

          // Button rot aus
          Client.print(F("<td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='RotAus'\""));
          Client.println(F(" value='rot ausschalten'>"));
          Client.println(F("</td></tr>"));

          // Button gelb ein
          Client.print(F("<tr><td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:#FFFB65;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='GelbEin'\""));
          Client.println(F(" value='gelb einschalten'>"));
          Client.println(F("</td>"));

          // Button gelb aus
          Client.print(F("<td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='GelbAus'\""));
          Client.println(F(" value='gelb ausschalten'>"));
          Client.println(F("</td></tr>"));

          // Button grün ein
          Client.print(F("<tr><td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:#76FA5F;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='GruenEin'\""));
          Client.println(F(" value='gr&uuml;n einschalten'>"));
          Client.println(F("</td>"));

          // Button grün aus
          Client.print(F("<td><input style='font-size:14pt; font-weight:bold;"));
          Client.print(F(" background-color:white;"));
          Client.print(F(" width:200px; cursor:pointer;"));
          Client.print(F(" border-radius:5px;border: 2px solid black;' type='button'"));
          Client.println(F(" onClick=\"location.href='GruenAus'\""));
          Client.println(F(" value='gr&uuml;n ausschalten'>"));
          Client.println(F("</td></tr>"));
          Client.println(F("</table>"));

          Client.println(F("<hr />"));

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

          delay(1);

          Client.stop();

          /*
            ein Klick auf einen der Buttons erzeugt eine GET-Anweisung in der Form
            GET /RotEin HTTP/1.1 -> Button rot ein auswerten
            GET /RotAus HTTP/1.1 -> Button rot aus auswerten
            indexOf durchsucht den String nach diesen Zeichen (> 0 = Zeichen gefunden)
          */
          if (SchaltungLesen.indexOf("RotEin") > 0) digitalWrite(ROT, HIGH);
          if (SchaltungLesen.indexOf("RotAus") > 0) digitalWrite(ROT, LOW);
          if (SchaltungLesen.indexOf("GelbEin") > 0) digitalWrite(GELB, HIGH);
          if (SchaltungLesen.indexOf("GelbAus") > 0) digitalWrite(GELB, LOW);
          if (SchaltungLesen.indexOf("GruenEin") > 0) digitalWrite(GRUEN, HIGH);
          if (SchaltungLesen.indexOf("GruenAus") > 0) digitalWrite(GRUEN, LOW);

          // String SchaltungLesen leeren
          SchaltungLesen = "";
        }
      }
    }
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 26. Jul 2021 @ 10:19