Webserver - Einfache Wertübergabe zwischen mehreren Arduinoboards

Hallo zusammen,

ich programmiere gerade mein Hausautomationssystem und habe dazu mehrere Arduino Mega 2560 verwendet mit Ethernetshield.

Ich habe jeweils ein Board für Licht, Steckdosen und Eingänge. Die Boards hängen über einen Switch alle im gleichen Netzwerk.

Per Webbrowser kann ich dann einfach die Lampen mit einem Hyperlink einschalten:
http://192.168.111.103/?light1on

Oder ausschalten mit
http://192.168.111.103/?light1off

Der Code dazu sieht wie folgt aus:

//Beginn HTML

client.println(" <HTML> ");
             client.println(" <HEAD> ");
             client.println(" <meta name='apple-mobile-web-app-capable' cuptent='yes' /> ");
             client.println(" <meta name='apple-mobile-web-app-status-bar-style' cuptent='black-translucent' /> ");

        client.println(F("<I><font size=5px>Wohnzimmer:</font></I>



"));
        client.println(F("<a class=\"button4\" href=\"/?light1on\"\">Ein</a>&nbsp;&nbsp;&nbsp;"));
        client.println(F("<a class=\"button5\" href=\"/?light1off\"\">Aus</a>

 
"));   

        client.println(F("</BODY>"));
        client.println(F("</HTML>"));

// Ende HTML


// Licht 1 Wohnzimmer
           if (readString.indexOf("?light1on") >0){
               digitalWrite(relais5, Ein);
           }
           if (readString.indexOf("?light1off") >0){
               digitalWrite(relais5, AUS);
           }

Nun habe ich draußen einen LDR zur Helligkeitsbestimmung verbaut , den ich über einen Analogeingang einlese und dazu nutzen möchte, dass wenn es draußen dunkel wird das Licht angeht.

Nur wie bekomme ich jetzt den Analogwert per HTML einfach zu dem Licht Arduino Board übertragen? Ich hatte schon daran überlegt den Wert in eine TXT Datei zu speichern und dann diese auszulesen.

Das hätte den Scharm, dass ich die TXT Datei auch einfach im Browser aufrufen kann und mir die Werte ansehen kann.

Ziel soll es sein, das Ganze so einfach wie möglich zu halten.
Wenn ich das Ganze per UDP mache geht der Webserverscharmverloren. Ähnlich wäre es bei AJAX.
Die Werte in ein XML File zu schreiben setzen dann ja wieder einen XML Parser veraus, der zuviele Reccourcen des Controllers frisst?!

Habt ihr eine einfache Lösung für mich?

Vielen Dank!

LG

Wenn dir udp nicht gefällt, kannst du doch auch per tcp pollen. Wobei ich die Einfachheit von udp schätze

naja wenn da eh schon ein webserver drauf läuft, was hindert dich daran, auf einem anderen Arduino einen WebClient zu installieren und diesen Resourcen vom Webserver holen zu lassen bzw. Werte an den Webserver zu posten?

Ich hab sowas für ESP's mal ausführlicher beschrieben, aber sinngemäß gilt das auch für Unos/Megas ... geht halt nicht so komfortabel:

ESP8266 Webserver - Webclient - Kommunikation zwischen zwei ESP - aber die Grundidee bleibt die gleiche vom Webclient zum Webserver!

Und bezüglich Ajax und Resourcen - da irrst du gewaltig. Ajax läuft in deinem Browser, das braucht nur die Resourcen für die Datenübertragung am Arduino - und wenn man das als CSV oder JSON macht ist das in der Regel wesentlich weniger Resourcen-fressend als ein Reload einer ganzen HTML Seite die wesentlich mehr Byte übertragen wird mit dem ganzen Markup!

Bei m2m Kommunikation muss ich ja kein html nehmen. Da kann man per tcp übertragen was man will, und der Server parst es halt

Dann schon lieber UDP. Das hat weniger Overhead.

Gruß Tommy

Tommy56:
Dann schon lieber UDP.

Meine Rede, Post #1

Nimm einen weiteren Arduino mit Ethernetshield oder einen ESP im WLAN, der als Web-Client (nicht Server) der den LDR misst und einfach den passenden Request an deinen Licht-Mega sendet. Diesem ist es doch egal, ob er den Request von deinem Browser oder von irgend einer anderen Quelle bekommt.

Wenn du vom Clienten statt "lighton" und "lightoff" einen anderen Request z.B. in der Art wie "light=80%" sendest, kannst du den im Mega temporär ablegen und irgendwie logisch in andere Entscheidungen einbeziehen ohne sofort einen Schaltbefehl auszuführen ...

Ich sende von den Sensoren immer alle paar Sekunden ein eindeutiges Datentelegramm auf Broadcast per udp. Bei Änderung des Messwertes immer sofort.
Ggf. kann ein Senden des Wertes auch per udp Empfang von jedem beliebigen Device ein aktuelles Datentelegramm angefordert werden.
Sind alles nur wenige Zeilen Code.

Hätte da jemand ein Beispiel wie das mit UDP funktioniert?
In meinem fall möchte ich nur die Temperatur vom BME 280 am ESP8266 über wlan an den Mega2560 mit W5100 shield senden und dort bei einer bestimmten Temperatur etwas schalten.
Abrufen kann ich die Daten schon via Webseite auf dem ESP.

Wie ich nun die Strings vom ESP zum MEGA 2560 senden könnte fehlt mir halt noch.

Hallo,

@Gala30 eigendlich hast Du ja hier jetzt ein neues Thema angefangen.

hir mal ein Link

UDP

Beispiel

ich ab dir mal aus meiner Bastelkiste einen Schnipsel rausgesucht.

//-------------- send UDP Daten----------------
void sendUDP() {
  sprintf(sendPack, "%4d;%4.2f;%4.2f;%4.2f;%4.2f", devAdress, temp, hum, pres, Vcc);
  int len = strlen(sendPack);
  // Serial.println(len);
  Serial.print("local Port :"); Serial.println(localPort);
  Serial.print("host Port :"); Serial.println(hostPort);
  Serial.println(sendPack);

  Udp.begin(localPort);
  Udp.beginPacket(hostIP, hostPort);
  Udp.write(sendPack, len);
  Udp.endPacket();
  Udp.stop();

}

Wobei UDP durch den Verzicht auf Overhead eher für die Übertragung von binären Daten prädestiniert ist, da die ebenfalls einen geringeren Overhead als menschenlesbare (Text)Daten haben.

Für 2 ESP8266 habe ich hier ab #32 eine Prinzipstudie gezeigt und für die Steuerung eines NANO/UNO vom ESP hier.
Das Prinzip kann man auch zwischen anderen Prozessoren anwenden.Evtl. sind die unterschiedlichen Größen der Datentypen bei verschiedenen Architekturen zu beachten.

Gruß Tommy

Vielen dank für die Hinweise, da werde ich mich dem Thema mal widmen.

Hab meinen Code mal auf die Cloud geladen:

link entfernt

vielleicht kann mir da einer nen Tip geben wie ich zumindest einen Temperaturwert vom ESP zum Mega bekomme.

:frowning:

----> hab ein neues Thema eröffnet

Hi

Beide TXT-Files passen in einen (eigenen) Post - in zwei Jahren hast Du diese Cloud nicht mehr oder 'besseres' damit im Sinn - dann ist dieser Thread hier tot.

Entweder zeigst Du, was Du hast hier - dann bleibt Es der Nachwelt auch erhalten, oder Du behältst, was Du hast und gut ist's.

MfG

ich bleib bei meiner November Antwort: wenns schon client und server in den Sketchen gibt, dann reuse das auch für die Maschine-Maschine Kommunikation. Auf Grund deiner Sketche gehe ich davon aus, dass du diese HTTP Kommunikation kennst und du dir das damit einfacher erarbeiten kannst.

Am Mega fragst eh schon Parameter ab.
Ergänze halt unten einen Parameter den dir der ESP sendet.

quasi ein

          if(buffer.indexOf("GET /?bmp=")>=0){
              Serial.println("ESP hat was geschickt");
              //usw
              }

Die Unschönheit, dass du dann den Wert mittels GET sendest, kann man sich dann anschauen, wenn es mit GET geklappt hat.

Außerdem gäbe es für den ESP einen schönen ESP8266Webserver | HelloServer
Und für die ganzen statischen Texte, gäbe es das F-Makro