Verschiedenfarbige LEDs sollen mit Hilfe des UDP-Protokolls im lokalen Netzwerk geschaltet werden. Das User Datagramm Protokoll (UDP) dient dazu, Nachrichten in einem Netzwerk zu verschicken.
Hierzu muss die IP-Adresse des Empfängers und der verwendete Anschluss bekannt sein.
Die Daten werden mit einem entsprechendem Programm oder über eine App übertragen.
Software und Apps für UDP
Apps | UDP/TCP/Rest Network Utility (iOS) TCP-UDP Client (iOS) UDP-Terminal (iOS Kostenpflichtig) UDP-Sender (Android) |
Software | Packet Sender (Windows, Linux, Mac) 🔗 Packetsender |
Das Programm Packet Sender:
Die App TCP-UDP Client:
Art der Verbindung wählen | Befehl senden |
Für diese Anleitung benötigst du ein sogenanntes „Shield“, eine Platine, die einfach auf den Arduino aufgesteckt wird. Auf ihr befindet sich ein LAN-Anschluss (RJ45).
Benötigte Bauteile:
- 5 LEDs
- Ethernet-Shield
- 3 Widerstände 220 Ω (gelbe, rote und grüne LED)
- 2 Widerstände 100 Ω (blaue und weiße LED)
- Leitungsdrähte
Beachte die ⇒Vorwiderstände verschiedener LEDs
Für das Programm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in deinem lokalen Netzwerk.
Im Regelfall befindet sich in einem lokalen Netzwerk ein DHCP-Server, der jedem Gerät im Netzwerk automatisch eine IP-Adresse zuteilt. Im Programm wird eine über DHCP vergebene Adresse verwendet.
Im Seriellen Monitor werden die Schaltbefehle angezeigt:
Benötigte Bibliothek:
Binde die benötigten Bibliotheken ein und definiere 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 setup-Teil. Beachte 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. Beachte 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 fehlen noch die Funktionen UDPAbfragen(), Lauflicht(), 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;
}
}
Verwandte Anleitungen:
- Ampel mit einem Ethernet-Shield schalten
- DHT11/DHT22 - Wetterstation LAN
- Lottozahlen mit einem Ethernet-Shield
- DHT11/DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: