LEDs mit Ether­net-Shield und UDP

# 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;

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());
}
  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:
      Serial.print("gesendeter Befehl: ");
      Serial.print(Schalten);
      Serial.println(" -> alle einschalten");
      AlleAn();
      break;

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

    default:
      break;
  }

  // Schaltbefehl löschen
  Schalten = 0;
}

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

    // Schalten = atoi(Pakete);

    // 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));

    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;
  }
}

Letzte Aktualisierung: 25. Jul 2023 @ 19:01