LEDs mit dem UDP-Pro­to­koll im LAN schalten

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Ver­schie­den­far­bi­ge LEDs sol­len mit Hil­fe des UDP-Pro­to­kolls im loka­len Netz­werk geschal­tet wer­den. Das User Data­gramm Pro­to­koll (UDP) dient dazu, Nach­rich­ten in einem Netz­werk zu ver­schi­cken.
Hier­zu muss die IP-Adres­se des Emp­fän­gers und der ver­wen­de­te Anschluss bekannt sein.

Die Daten wer­den mit einem ent­spre­chen­dem Pro­gramm oder über eine App übertragen.

Soft­ware und Apps für UDP

AppsUDP/TCP/Rest Net­work Uti­li­ty (iOS)
TCP-UDP Cli­ent (iOS)
UDP-Ter­mi­nal (iOS Kostenpflichtig)
UDP-Sen­der (Android)
Soft­warePacket Sen­der (Win­dows, Linux, Mac)
🔗 Packetsender

Das Pro­gramm Packet Sender:

Die App TCP-UDP Client:

Art der Ver­bin­dung wählenBefehl sen­den

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

Benö­tig­te Bauteile:

  • 5 LEDs
  • Ether­net-Shield
  • 3 Wider­stän­de 220 Ω (gel­be, rote und grü­ne LED)
  • 2 Wider­stän­de 100 Ω (blaue und wei­ße LED)
  • Lei­tungs­dräh­te

Beach­te die ⇒Vor­wi­der­stän­de ver­schie­de­ner LEDs

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

Im Seri­el­len Moni­tor wer­den die Schalt­be­feh­le angezeigt:

Benö­tig­te Bibliothek:

Bin­de die benö­tig­ten Biblio­the­ken ein und defi­nie­re die Variablen:

#include "Ethernet.h"
#include "EthernetUdp.h"

// die LEDs
enum Farben
{
  GRUEN = 3,
  WEISS,
  ROT,
  BLAU,
  GELB
};

// Status bestimmt, ob die jeweilige LED an oder aus ist
// alle LEDS beim Start aus
bool Status[5] = {0,  0,  0,  0, 0};

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

/*
  Schalter für die Vergabe der IP
  true -> feste IP
  false IP über DHCP
*/
bool festeIP = false;

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

// lokaler Port
int Port = 9000;

// char-Array für die empfangenen Pakete 
// UDP_TX_PACKET_MAX_SIZE = maximale Größe (24)
char Pakete[UDP_TX_PACKET_MAX_SIZE];

// Variable für den Befehl des Schaltvorgangs
byte Schalten;

// Name für UDP
EthernetUDP Udp;

Der set­up-Teil. Beach­te die Kommentare.

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

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

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

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

  // UDP starten
  Udp.begin(Port);

  // pinMode: Startwert ⇒ GRUEN, Endwert ⇒ GELB
  for (int i = GRUEN; i <= GELB; i++)
  {
    pinMode(i, OUTPUT);
  }
  delay(500);

  if (festeIP) Serial.print("feste IP-Adresse: ");
  else Serial.print("IP-Adresse DHCP: ");
  Serial.println(Ethernet.localIP());
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // gesendete Pakete abfragen
  UDPAbfragen();

  // Schalten enthält die Anweisung welche LEDs geschaltet werden sollen
  switch (Schalten)
  {
    case 10:
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      Serial.println(" -> Lauflicht");
      Lauflicht();
      break;

    case 11:
      // grüne LED
      Status[0] = !Status[0];
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      if (!Status[0])
      {
        Serial.println(" -> gr\u00fcne LED ausschalten");
      }
      else Serial.println(" -> gr\u00fcne LED einschalten");
      digitalWrite(GRUEN, Status[0]);
      break;

    case 12:
      // weiße LED
      Status[1] = !Status[1];
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      if (!Status[1])
      {
        Serial.println(" -> wei\u00dfe LED ausschalten");
      }
      else Serial.println(" -> wei\u00dfe LED einschalten");
      digitalWrite(WEISS, Status[1]);
      break;

    case 13:
      // rote LED
      Status[2] = !Status[2];
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      if (!Status[2])
      {
        Serial.println(" -> rote LED ausschalten");
      }
      else Serial.println(" -> rote LED einschalten");
      digitalWrite(ROT, Status[2]);
      break;

    case 14:
      // blaue LED
      Status[3] = !Status[3];
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);

      if (!Status[3])
      {
        Serial.println(" -> blaue LED ausschalten");
      }
      else Serial.println(" -> blaue LED einschalten");
      digitalWrite(BLAU, Status[3]);
      break;

    case 15:
      // gelbe LED
      Status[4] = !Status[4];
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      if (!Status[4])
      {
        Serial.println(" -> gelbe LED ausschalten");
      }
      else Serial.println(" -> gelbe LED einschalten");
      digitalWrite(GELB, Status[4]);
      break;

    case 16:
      // alle einschalten
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      Serial.println(" -> alle einschalten");
      AlleAn();
      break;

    case 17:
      // alle ausschalten 
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      Serial.println("-> alle ausschalten");
      AlleAus();
      break;

    default:
      break;
  }

  // Schaltbefehl löschen
  Schalten = 0;
}

Jetzt feh­len noch die Funk­tio­nen UDPAb­fra­gen(), Lauf­licht(), AlleAn() und AlleAus():

void UDPAbfragen()
{
  // Daten abfragen
  int PaketGroesse = Udp.parsePacket();

  // wenn Daten empfangen wurden ...
  if (PaketGroesse)
  {
    // Daten lesen
    Udp.read(Pakete, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("-----------------------");
  
    /*
      gesendetes Paket zu int umwandeln
      char-Array in String umwandeln
      zu int umwandeln
      alternativ mit atoi:
      Schalten = atoi(Pakete);
    */
    String SchaltWert = String(Pakete);
    Schalten = SchaltWert.toInt();

    // IP des Senders/Port anzeigen
    Serial.print("Sender: ");
    Serial.println(Udp.remoteIP());

    // IP und Port des Ethernet-Shields
    Serial.print("Adressat: ");
    Serial.print(Ethernet.localIP());
    Serial.println(" Port: " + String(Port));

    // Paket senden
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write("OK");
    Udp.endPacket();
  }
  delay(10);
}

void Lauflicht()
{
  AlleAus();
  for (int i = GRUEN; i <= GELB; i++)
  {
    // aktuelle LED i einschalten
    digitalWrite(i, HIGH);
    delay(200);

    // aktuelle LED i ausschalten
    digitalWrite(i, LOW);
  }

  for (int i = GELB; i >= GRUEN; i--)
  {
    // aktuelle LED i einschalten
    digitalWrite(i, HIGH);
    delay(200);

    // aktuelle LED i ausschalten
    digitalWrite(i, LOW);
  }
}

void AlleAn()
{
  for (int i = GRUEN; i <= GELB; i ++)
  {
    // aktuelle LED i ausschalten
    digitalWrite(i, HIGH);
  }

  // Status für alle LEDs auf 1 setzen
  for (int i = 0; i < sizeof(Status); i++)
  {
    Status[i] = 1;
  }
}

void AlleAus()
{
  for (int i = GRUEN; i <= GELB; i ++)
  {
    // aktuelle LED i ausschalten
    digitalWrite(i, LOW);
  }

  // Status für alle LEDs auf 0 setzen
  for (int i = 0; i < sizeof(Status); i++)
  {
    Status[i] = 0;
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Anleitungen:


Letzte Aktualisierung: 11. Mai 2024 @ 9:31