LEDs mit dem UDP-Protokoll über WLAN im loka­len Netz­werk schalten

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

Ver­schie­den­far­bi­ge LEDs sol­len mit Hil­fe des UDP-Protokolls 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-Adresse des Emp­fän­gers und der ver­wen­de­te Anschluss bekannt sein.

Für die­se Anlei­tung benö­tigst du einen Ardui­no WiFi Rev2.

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-Terminal (iOS Kostenpflichtig)
UDP-Sender (Android)
Soft­warePacket Sen­der (Win­dows, Linux, Mac)
https://​packet​sen​der​.com/​d​o​w​n​l​oad

Das Pro­gramm Packet Sender:

Die App TCP-UDP Client:

Art der Ver­bin­dung wählen

Befehl sen­den

Benö­tig­te Bauteile:

  • 5 LEDs
  • Wider­stän­de > 100 Ω
  • Lei­tungs­dräh­te

Vor­be­rei­tun­gen:

Board instal­lie­ren:
Werk­zeu­ge → Board → Board­ver­wal­ter
Board mega­AVR auswählen

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

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

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

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

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

# include <WiFiNINA.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[] = "FRITZ!Box";
char Passwort[] = "xxxxxxxx";

// lokaler Port
int Port = 9000;

// char - Array für die empfangenen Paket
// 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;

WiFiUDP Udp;

Der setup-Teil. Beach­te die Kommentare.

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

  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(2000);
  }

  // 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 Metho­den 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("Empf\u00e4nger: ");
    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 Aufgaben:


Letzte Aktualisierung: 31. Aug 2021 @ 12:10