ESP8266 - input 4 Variable eingeben (WebSerial) ?

Hi,

ich bin totaler Anfänger in dem Metier ... ersuche um Mithilfe zur Lösung folgenden Problems. Ein Test-Sketch mit WiFi-Anbindung + eine Eingabe mittels WebSerial hab' ich schon hier gefunden + zum Laufen gebracht (auch die Abfrage eines Temperatursensors) - der Code, der den Input im Testprojekt anfodert, ist:

void recvMsg(uint8_t *data, size_t len){
  WebSerial.println("Received Data...");
  String d = "";
  for(int i=0; i < len; i++){
    d += char(data[i]);
  }
  WebSerial.println(d);
  if (d == "ON"){
    digitalWrite(LED, LOW);
  }
  if (d=="OFF"){
    digitalWrite(LED, HIGH);
  }
}

Ich möchte zu Beginn meines regelungstechnischen Programms via WebSerial insgesamt 4 Variable eingeben lassen:

float StartTemp = 27
float ZeitDauer = 18
float EndTemp = 22.5
float Abweichg = 1

Frage: Wie baut man das elegant zusammen, dass ich vor dem loop die 4 Werte per Smartphone eingeben kann (ich kann die ersten Zeilen des o.g. Codes nicht so richtig entschlüsseln, was die tun)?

Zusatzfrage: wie mache ich es elegant, wenn ich später im loop mit der Zeit rechnen möchte, also z.B. alle 30 Sekunden die Temperatur checken und entscheiden, ob geheizt werden soll (oder nicht). D.h. wie speichere ich die Zeit vernünftig?

Thx

wie schaut dein ganzer Sketch aus.

Im Arduino Framework gibt es eine Laufzeit namens millis() ... das wäre ein einfacher Weg.
Auch einfach ist es am ESP zu einer echten Uhrzeit mittels SNTP zu kommen. Dann hast du einen echten Zeitstempel in Sekunden. Aber in der Regel reicht millis()

Übrigens, "elegant" wäre wohl ein ESP8266WebServer und die Daten mittels einem HTML Formular eingeben zu lassen.

Den Sketch habe ich gerade erst begonnen ... habe den verlinkten Sketch aus #1 genommen und versuche den umzubauen. Derzeitiger Status:

/*
Regelung ... Erklärungstext ...
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <WebSerial.h>

//Variable setzen
float StartTemp = 27
float ZeitDauer = 18
float EndTemp = 22.5
float Abweichg = 1

//der Ausgang - vorlaeufig LED, spaeter Relais; IO14 = D5 am Board
#define LED 14

AsyncWebServer server(80);

const char* ssid = "mySSID";          // Your WiFi SSID
const char* password = "**********";  // Your WiFi Password

// Set your Static IP address
IPAddress local_IP(192, 168, 0, 139);
IPAddress gateway(192, 168, 0, 111);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(195, 3, 96, 67);   //optional
IPAddress secondaryDNS(195, 3, 96, 68); //optional

void recvMsg(uint8_t *data, size_t len){
  WebSerial.println("Received Data...");
  String d = "";
  for(int i=0; i < len; i++){
    d += char(data[i]);
  }
  WebSerial.println(d);
  if (d == "ON"){
    digitalWrite(LED, LOW);
  }
  if (d=="OFF"){
    digitalWrite(LED, HIGH);
  }
}


void setup() {
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) Serial.println("STA Failed to configure");
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.printf("WiFi Failed!\n");
    return;
  }
  Serial.println("IP Address: ");
  Serial.println(WiFi.localIP());
  // WebSerial is accessible at "<IP Address>/webserial" in browser
  WebSerial.begin(&server);
  WebSerial.msgCallback(recvMsg);
  server.begin();
}

void loop() {
  WebSerial.println("Hello!");
  delay(20000);
}

D.h. ich hab' mal

  • vorne meine Variablen definiert,
  • ihnen auch gleich einen Defaultwert zugewiesen.
  • das WiFi zum Laufen gebracht...

... jetzt geht es um die Sektion "void recvMsg...." - wie gehört das jetzt gebaut, damit mir das Sketch nacheinander jede der 4 Variabeln zur Eingabe/Änderung ans Smartphone schickt? D.h.

  • erst mal die StartTemp mit Wert '27' ans Handy per WebSerial prompten,
  • entweder mit OK den selben Wert wieder zuück oder mit neuem Wert überschreiben, dann erst zurück und als geänderte StartTemp abspeichern...
  • ... und das dann für die rsetlichen 3 Variablen auch.

Oder ist das mit dem HTML-Webformular einfacher?

Wenn die Eingabe der 4 Variabeln läuft, versuche ich die Temperatuabfrage des Sensors hier einzubauen. Und danach die Logik im loop.

nein ist auch Umfangreich.. Auch da musst du dich einlesen wie das geht.
Aber am Ende hat man dann ein vernünftiges Eingabeformular wo man seine Daten eingeben kann und nicht ein großes Input Feld wo man mehrere Werte eingeben muss.

Wobei es zu HTML mehr Beispiele und Tutorials (z.B. Selfhtml) gibt.

Gruß Tommy

Hallo

schau mal hier gibts jede Menge Beispiele für einen Webserver.

Fips

rothschopf

Heinz

1 Like

Danke - dann werde ich mich mal in HTML-Formular einlesen ... hätte da hier bei randomnerdtutorials etwas gefunden (die Libraries hätte ich schon im Sketch) ... vielleicht gelingt es mir das so anzupassen, dass es mir die Defaultwerte promptet und mit einem Button alle 4 Werte übermittelt.

Ist in einem HTML-Formular kein Problem.

Gruß Tommy

ja das geht.
Oben wurde eh auch auf meine HP verwiesen.
Ich hab mal auf die schnelle mehrere Beispiele zusammengestellt.

https://werner.rothschopf.net/microcontroller/202310_esp_webserver_maxi_en.htm

Das Beispiel im tab server40 wäre so etwas aus meiner Sicht (zwei Felder - ein Button)

@ Werner: wie komme ich zu dem Code, der hinter tab server40 steckt?

Thx

Download as ZIP: ESP Webserver Examples (maxi)

unten bei den Links?!?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.