Arduino (Nodemcu) PHP LEDs und Piepser ansteuern

Hallo,

habe viele interesannte Sachen gefunden aber nix verstanden.

z.B. Esp8266 UDP Spezial

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "Netzwerkname";                       // Darf bis zu 32 Zeichen haben.
const char* password = "PasswortvomNetzwerk";            // Mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen.

constexpr uint16_t PORT = 8266;                          // Lokaler UDP Port.
char packetBuffer[21];                                   // Puffer für eingehendes Paket.

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n",
                (__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println("\nVerbunden! Esp8266 IP: " + WiFi.localIP().toString());
  Serial.printf("UDP Server lauscht am Port: %d\n\n", PORT);
  Udp.begin(PORT);
}

void loop() {
  uint16_t packetSize = Udp.parsePacket();              // Eingehende UDP-Pakete empfangen.
  if (packetSize) {                                     // Prüfen ob UDP-Pakete empfangen wurden.
    Udp.read(packetBuffer, sizeof(packetBuffer));       // Einlesen des UDP Paket in den Bufffer.
    packetBuffer[packetSize] = 0;                       // String Ende hinzufügen.
    Serial.println(packetBuffer);                       // Visualisierung des empfangenen Packets.
  }
}

Ich denke das ich das wo ich suche.

OK ich plane 3 Leds und Piepser über PHP anzusteuern ( Der Webserver ist nicht auf dem Arduino ).

Ich habe auf meinen Webserver verschiende Scripte zur verfügung, je nach bedarf, eines davon soll mir 3 LEDs und 1 Piepser ansteuern. Ich fand herraus das es mit UDP gehen würde, vieles ist nur mit Schalter ( Mausklick ) gelöst ich möchte aber über Fehlermedlungen das ganze lösen.

Mein Gedanke dahin ist:

Wenn alles auf Warten steht soll LED1 leuchten.

Wenn Daten an PHP gesendet werden soll LED1 aus sein LED2 ein sein.

Wenn alles OK dann soll LED 1 ein sein.

Wenn nun Fehler1 kommt dann soll LED2 aus sein und LED3 ein sein.

Wenn aber Fehler2 kommt dann soll LED2 ein sein und LED3 ein sein.

Die Anzahl von Piepstöne ist kein problem die variiren je nach Meldung.

Nun zu meinen Fragen:

Liege ich richtig mit UDP und dem vorhaben ?

Wenn ja, mein gedanke ist das ich eine Zahl für je nach Meldung zurück sende.

Wie stelle ich es an diese Zahl und LEDs umzusetzen ?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Dan ist nach meiner Meinung UDP nicht geeignet. lese mal was so UDP macht z.B
https://www.cloudflare.com/de-de/learning/ddos/glossary/user-datagram-protocol-udp/

Wer ist "alles"?

Soll heißen mir ist aus deiner Erklärung nicht klar bei welcher Zustandsänderung (am Webserver?!?) du welche Information an den NodeMCU schicken willst.

ob du vom Webserver mit UDP, TCP oder HTTP schickst ist imho egal.
UDP hätte halt den Vorteil dass du ein Broadcast schicken könntest falls du den genauen Addressaten nicht festlegen willst.
Bei TCP könntest du überprüfen, dass die Nachricht am ESP angekommen ist
und HTTP würde sich halt anbieten, wenn du eh auf einem webserver bist...

Ja, UDP ist durchaus dafür geeignet und auch die einfachste Lösung für deine Verwendung.

Ich habe verschiedene Schalter (( Taster ) je eine eigene Nummer ), sowie ein Schalter (Taster) bestätigt wird, soll diese Information in eine tabelle (tabelle_a) ein getragen werden, wird mein vorhabern erweitert um einige Schalter ( Taster ) sollen diese in eine anderen tabelle (tabelle_b) eingetragen werden aber ohne einen Wert ( ich nenne es Fehler_A), wird nun so ein Schalter (Taster) betätigt soll das als Fehler_B laufen. Bei genügent Einträge wird da ganze ausgewertet für ein Projekt ( eine Art Dartscheibe für Luftgewehr schützen aber mit spezieller Anordnung.

Meine Aufgabe ist es nur vorab je nach Fall LEDs anzusteuern.

Im Kopf gehen mir viele Dinge rum, z-B. jeder Fall nach ausführung eine Zahl (10, 50, 90) an Arduino zurück gibt und mit dieser Zahl dan die LEDs zu steuern.

Paralell dazu habe ich etwas wo 1 Taster und 4 Positionsabfragen dort will ich für jede Pos. auch wieder eine LED ansteuern. aber das ist leichter für mich als wie das obere.

Der Webserver ist nicht auf den ESP sondern getrennt, der Webserver hat für mich noch weitere funktionen wobei viele kleine Anwedungen Zentral gespeichert werden da ich viel Daeten jedes mal auf jede DB spielen will. Ich habe viele Scripte unter PHP auf dem Server laufen einige Scripte wie oben sollen bei Bedarf dann Info an ESP senden für Visuele Anzeigen ( LEDs ).

Ich denke ich muß heraus finden wie PHP Daten an ESP übergeben kann für Ausgaben.

Leider habe ich nichts gefunden bis auf UDP aber da werde ich auch nicht schlauer.

Hat jemand dazu eine Lösung oder weiß jemand wo ich solch ein Code finde ?

Bin etwas weiter gekommen:

https://hartmut-waller.info/arduinoblog/leds-mit-dem-udp-protokoll-ueber-wlan-im-lokalen-netzwerk-schalten/

auf dieser seite ist erklärt wie per udp ich leds schalten kann.

wie ich auch gelesen habe gehört eine app dazu welche ich nicht habe,

ist das was woich behmen kann ?

Noch habe ich dazu viele lücken im kopf wie das funktionieren soll

du hast oben geschrieben du willst vom Webserver aus was an den ESP senden.
Auf der Seite ist beschrieben

und jetzt beantworte dir selber, was davon könnte auf deinem Webserver laufen?

Aus meiner Sicht bist du am Holzweg.

Du brauchst einen Request von deinem Webserver zum ESP.
Wenn du mit PHP am Webserver arbeiten willst und du dich warum auch immer auf UDP eingeschossen hast, dann solltest du dir Seiten suchen, die zeigen wie man mit PHP einen UDP Client macht.

Du brauchst keine App sondern arbeitest mit einer Website.
Und wie das funktionieren kann, siehst du auf der Seite von fips.

Nachtrag: Das funktioniert so nur wenn der Webserver auf dem ESP ist.
Mit einem externen wurde von fips nichts gezeigt.

Soweit hae ich ich mal gelesen ich lande bei unicast oder multicast

ich denke unicast würde reichen.

WiFiUDP Unicast;

char unicastBuffer[255];                                      // Puffer für eingehendes Paket.

void setupUdpUnicast() {
  Unicast.begin(1042);                                        // Lokaler UDP Port.
}

void sendUnicast(const String &message) {
  IPAddress receiverIP(192, 168, 178, 43);                    // Senden an diese IP
  constexpr uint16_t PORT = 1043;                             // und diesem UDP Port.
  Unicast.beginPacket(receiverIP, PORT);
  Unicast.print(message);
  Unicast.endPacket();
}

void unicastServer() {
  uint16_t packetSize = Unicast.parsePacket();                // Eingehende UDP-Pakete empfangen.
  if (packetSize) {                                           // Prüfen ob UDP-Pakete empfangen wurden.
    Unicast.read(unicastBuffer, sizeof(unicastBuffer));       // Einlesen des UDP Paket in den Bufffer.
    // hier der Empfang aber was wird empfangen ?
    //bzw. code f&uuml;r led ansteuern
    unicastBuffer[packetSize] = 0;                            // String Ende hinzufügen.
    Serial.println(unicastBuffer);                            // Visualisierung des empfangenen Packets.
  }
}

wie zu sehen vermute an einen Punkt mein code für LED

eine sende code wäre so zum beispiel:

<?php
$address = '127.0.0.1';
$port = 20010;
$beat_period = 1;

$fp = stream_socket_client("udp://$address:$port", $errno, $errstr);
if (!$fp) {
 die("ERROR: $errno - $errstr");
}

while (true) {
 $message = sprintf(
 '%s send: %s'. PHP_EOL,
 100,
 rand(0, 1000000)
 );
 fwrite($fp, $message);
 echo $message;

 sleep($beat_period);
}
?>

Zahl 100 wäre Einrückgabe Wert für angabe welche LED. Weiter wäre dann 300, 500 und 700.

Wenn:

 Unicast.read(unicastBuffer, sizeof(unicastBuffer));
100, 300, 500 oder 700

einliest, ist das so richtig wie ich es verstehe ? BZW es gibt ja noch eine Zufallszahl welche entfallen kann.