LEDs mit dem UDP-Pro­to­koll über WLAN im loka­len Netz­werk schalten

Lese­zeit: 7 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

Benö­tig­te Bauteile:

  • 5 LEDs
  • 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

Vor­be­rei­tun­gen:

Instal­lie­re mit dem Board­ver­wal­ter das pas­sen­de Board:

Benö­tig­te Bibliothek:

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

Für das Pro­gramm brauchst du eine freie IP-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:

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

// UNO WiFi Rev2, Nano 33 IoT, MKR WiFi 1010
# include "WiFiNINA.h"

// UNO R4 WiFi
// # include "WiFiS3.h"

# include "WiFiUdp.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 };

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

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

// Netzwerkstatus
int status = WL_IDLE_STATUS;

// Router: Name des Routers
// Passwort: WLAN-Passwort
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// lokaler Port
int Port = 9000;

// char-Array für die empfangenen Paket
char Pakete[255];

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

WiFiUDP Udp;

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

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

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

  if (festeIP) WiFi.config(ip);

  // Verbindung aufbauen
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println(F("Verbindungsaufbau gescheitert!"));
  }

  Serial.print("Verbindung aufbauen mit ");
  Serial.println(Router);

  while (status != WL_CONNECTED) {
    status = WiFi.begin(Router, Passwort);

    // Zeit für den Verbindungsaufbau
    // wenn die Verbindung nicht zustandekommt -> Zeit vergrößern
    delay(500);
  }

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

  // IP des Servers/des verbunden Computers anzeigen
  Serial.print("Server: ");
  Serial.println(WiFi.SSID());

  // IP des Arduinos anzeigen
  if (festeIP) Serial.print("Statische IP Adresse Arduino: ");
  else Serial.print("IP Adresse Arduino DHCP: ");
  Serial.println(WiFi.localIP());

  Udp.begin(Port);
}

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, 255);
    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();

    // alternativ: Schalten = atoi(Pakete);
    // IP des Senders/Port anzeigen
    Serial.print("Sender: ");
    Serial.println(Udp.remoteIP());

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

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

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 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 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 Aufgaben:


Letzte Aktualisierung: 8. Okt 2023 @ 15:53