Ungewollter Reset bei Aufruf von sender.begin

Huhu.

Ich bastel ja an einer Webserver Steuerung für einen Wemos D1 Mini. Dazu wurde mir hier schon sehr geholfen. ESP8266Webserver HTML refresh - Deutsch - Arduino Forum

Jetzt wollte ich über den Webserver einen anderen Wemos D1 Mini Steuern. Dieser hat ein Relaismodul und soll eine Stehlampe an/ausschalten.

Wenn ich den Wemos D1 Mini mit dem RelaisModul direkt über den Browser steuer, funktioniert er einwandfrei.

Wenn ich den Wemos D1 Mini mit dem RelaisModul über den Webserver des ersten Wemos D1 Mini steuern will, stürzt der Wemos D1 Mini mit dem Webserver ab und bootet neu.

Über den Seriellen Monitor konnte ich die Stelle wo er Absturzstelle ziemlich genau ausmachen.

      sender.begin("http://192.168.0.102/state"); // Status des anderen ESP abrufen (ESP mit Relais)

Eine Serielle Ausgabe direkt davor kommt noch im Monitor an. Eine Serielle Ausgabe direkt danach kommt nicht mehr im Monitor an.

Alles anderen Aktionen auf dem Webserver führen zu keinem Absturz und Reset. Dies habe ich getestet. Nur wenn ich in folgende If Abfrage gehe gibt es einen Absturz und Reset.

   if (server.arg("relay") == String(0)) {
      Serial.println("Befehl Relais kommt von Webseite");
      sender.begin("http://192.168.0.102/state"); // Status des anderen ESP abrufen (ESP mit Relais)
      sender.GET();
      String empf_state = sender.getString();     // Empfanger Status wird der Varible übergeben
      if(empf_state == "1") {
        sender.begin("http://192.168.0.102/relay_off");
        sender.GET();
        sendstring = "r1off";
      }
      if(empf_state == "0") {
        sender.begin("http://192.168.0.102/relay_on");
        sender.GET();
        sendstring = "r1on";
      }
      sender.end();
    }
Serial.println("Befehl Relais kommt von Webseite");

kommt noch problemlos auf dem Seriellen Monitor an.

Folgende Meldung kommt im Seriellen Monitor bei Absturz.

19:30:14.616 -> Befehl Relais kommt von Webseite
19:30:15.631 -> 
19:30:15.631 -> Exception (9):
19:30:15.631 -> epc1=0x40209d2c epc2=0x00000000 epc3=0x40101118 excvaddr=0x0000017a depc=0x00000000
19:30:15.665 -> 
19:30:15.665 -> >>>stack>>>
19:30:15.665 -> 
19:30:15.665 -> ctx: cont
19:30:15.665 -> sp: 3ffffc70 end: 3fffffc0 offset: 01a0
19:30:15.665 -> 3ffffe10:  00000001 13bc045c 3ffee864 40205578  
19:30:15.665 -> 3ffffe20:  3ffe8774 3ffee858 3ffee864 402062c8  
19:30:15.665 -> 3ffffe30:  0000001d 3fff02d4 3ffee864 4020665c  
19:30:15.665 -> 3ffffe40:  3ffee864 0000001d 3ffffe70 40206fd4  
19:30:15.665 -> 3ffffe50:  3ffffe70 3ffffe70 3ffe8774 4020700a  
19:30:15.665 -> 3ffffe60:  3ffee864 3ffee858 3ffee758 4020366e  
19:30:15.699 -> 3ffffe70:  3fff0354 001d001f 00ffff18 616c0030  
19:30:15.699 -> 3ffffe80:  3ffe0079 81fee77c 3ffee758 40206e10  
19:30:15.699 -> 3ffffe90:  00000001 3ffee77c 3ffee758 402030c5  
19:30:15.699 -> 3ffffea0:  00000000 00000001 3ffee954 00000001  
19:30:15.699 -> 3ffffeb0:  3ffffef0 3ffefb9c 00000000 40201d28  
19:30:15.699 -> 3ffffec0:  00000001 00000001 3ffefb74 40209ac2  
19:30:15.699 -> 3ffffed0:  00000001 4020107c 3ffefb74 401000e1  
19:30:15.733 -> 3ffffee0:  3ffefb74 3ffee798 3ffefb74 40201d5e  
19:30:15.733 -> 3ffffef0:  3ffe0000 3fff0000 80fee9a0 80000030  
19:30:15.733 -> 3fffff00:  3ffefb74 3ffee798 3ffee758 402037da  
19:30:15.733 -> 3fffff10:  0000002f 80000000 81fefe00 0000008f  
19:30:15.733 -> 3fffff20:  8000616c 0ecb4dca 40100200 0001bb3d  
19:30:15.733 -> 3fffff30:  3ffee798 00000001 00000001 40100170  
19:30:15.733 -> 3fffff40:  00000001 00000000 00000000 3ffee9a0  
19:30:15.733 -> 3fffff50:  00000001 3ffee77c 3ffee758 3ffee9a0  
19:30:15.767 -> 3fffff60:  00000001 3ffee77c 3ffee758 40203a94  
19:30:15.767 -> 3fffff70:  40235533 00000000 00001388 feefeffe  
19:30:15.767 -> 3fffff80:  3ffef30c 40204380 00000001 40100170  
19:30:15.767 -> 3fffff90:  3fffdad0 00000000 3ffee960 40203b38  
19:30:15.767 -> 3fffffa0:  3fffdad0 00000000 3ffee960 40208088  
19:30:15.767 -> 3fffffb0:  feefeffe feefeffe 3ffe8504 40100c01  
19:30:15.767 -> <<<stack<<<
19:30:15.801 -> 
19:30:15.801 ->  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
19:30:15.801 -> 
19:30:15.801 -> load 0x4010f000, len 1384, room 16 
19:30:15.801 -> tail 8
19:30:15.801 -> chksum 0x2d
19:30:15.801 -> csum 0x2d
19:30:15.835 -> vffffffff
19:30:15.835 -> ~ld
19:30:15.835 -> ⸮cd`;⸮glph* ESP Gestartet
19:30:15.869 -> 
19:30:15.869 -> 
19:30:15.869 -> * Verbindung zu ***
19:30:16.378 -> .
19:30:16.378 -> * WLAN verbunden
19:30:16.378 -> * IP: 192.168.0.101
19:30:16.378 -> HTTP Server gestartet

Die Fehler Meldung variert aber auch ab und zu. Es gibt Exception (9) wie auch Exception (29).

Wenn ich das richtig verstanden habe passiert dort etwas unerwartetes im Cache.

Das Fehlermeldung Übersetzungstoll konnte ich irgendwie nicht richtig installieren. Das erscheint nach dem Neustart der Arduino IDE nicht im Werkzeug Reiter.

Die kompletten Codes habe ich mal angehangen.

Weis jemand warum der Wemos D1 mini an dieser Stelle aussteigt?
Kann jemand die Fehlermeldung übersetzen?
Habe ich eine Fehler im Code?
Was kann ich tun, damit es funktioniert?

Danke

mein_webschalter.ino (5.53 KB)

index_html.h (8.73 KB)

Relay.ino (2.21 KB)

Wer/Was ist sender? begin ist mit Sicherheit keine Methode, um den Status eines anderen MC abzufragen.

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

sender.begin ist eine Funktion der Bibliothek #include <ESP8266HTTPClient.h>

Wird in diesem Video gezeigt - YouTube

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include "index_html.h"                                         // In dieser Datei befindet sich die Steuerung Webseite

HTTPClient sender;

const char* ssid = "****";                               // WLAN-Name,
const char* password = "****";                          // WLAN-Passwort
const char* HOSTNAME = "LEDcenter";

String sendstring;

int LED[] = {4, 5, 12, 13, 14, 15};
/*
   0 = D3  intern 12k Pull Up
   1 = D10 TX / Mit TX funzt nicht :(
   2 = D4  interne LED, intern 12k Pull UP
   3 = D9  RX
   4 = D2
   5 = D1     RELAIS MODUL Ansteuerung
  12 = D6
  13 = D7
  14 = D5
  15 = D8  intern 12k Pull Down
  16 = D0  kein PWM
  A0 = A0  kein PWM
*/
const int LEDanzahl = 6;
int LEDstate[LEDanzahl];

int active_low = 0;                                             // "0" Relais schaltet bei +5V , "1" Relais beim schaltet bei 0V

ESP8266WebServer server(80);                                    // Serverport  hier einstellen
int val = 0;                                            // Hier wird der Schaltzustand gespeichert

void Ereignis_Index() {                                         // Wird ausgeführt wenn "http://<ip address>/" aufgerufen wurde
  if (server.args() > 0) {                                      // wenn Argumente im GET Anfrage vorhanden sind z.B http://<ip address>/?zustand=r
    for (int y = 0; y < LEDanzahl; y++) {
      if (server.arg("ch") == String(y)) {                      // prüfen ob welcher Chanel geschalten wird
        Serial.println("Umschalten PIN " + String(LED[y]) + " auf " + String(LEDstate[y]));
        if (LEDstate[y] == 0) {
          for (int fadeValue = 0 ; fadeValue <= 1024; fadeValue++) {
            analogWrite(LED[y], fadeValue);
            delayMicroseconds(200);
          }
        }
        if (LEDstate[y] == 1) {
          for (int fadeValue = 1024 ; fadeValue >= 0; fadeValue --) {
            analogWrite(LED[y], fadeValue);
            delayMicroseconds(200);
          }
        }
        LEDstate[y] = !LEDstate[y];
        sendstring = String(y * 2 + LEDstate[y]);
      }
    }
    if (server.arg("gr1") == String(1)) {
      sendstring = "gr1on";
      for (int y = 0; y < LEDanzahl; y++) {
        if (LEDstate[y] == 0) {
          LEDstate[y] = !LEDstate[y];
          for (int fadeValue = 0 ; fadeValue <= 1024; fadeValue++) {
            analogWrite(LED[y], fadeValue);
            delayMicroseconds(200);
          }
        }
      }
    }
    if (server.arg("gr1") == String(0)) {
      sendstring = "gr1off";
      for (int y = 0; y < LEDanzahl; y++) {
        if (LEDstate[y] == 1) {
          LEDstate[y] = !LEDstate[y];
          for (int fadeValue = 1024 ; fadeValue >= 0; fadeValue --) {
            analogWrite(LED[y], fadeValue);
            delayMicroseconds(200);
          }
        }
      }
    }
    if (server.arg("relay") == String(0)) {
      Serial.println("Befehl Relais kommt von Webseite");
      sender.begin("http://192.168.0.102/state"); // Status des anderen ESP abrufen (ESP mit Relais)
      sender.GET();
      String empf_state = sender.getString();     // Empfanger Status wird der Varible übergeben
      if (empf_state == "1") {
        sender.begin("http://192.168.0.102/relay_off");
        sender.GET();
        sendstring = "r1off";
      }
      if (empf_state == "0") {
        sender.begin("http://192.168.0.102/relay_on");
        sender.GET();
        sendstring = "r1on";
      }
      sender.end();
    }
    server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    server.sendHeader("pragma", "no-cache");
    server.sendHeader("Expires", "-1");
    server.sendHeader("Access-Control-Allow-Origin", "*");          // wichtig! damit Daten nicht aus dem Browser cach kommen
    server.send(200, "application/json", sendstring);
  }
  else  {                                                       // wenn keine Argumente im GET Anfrage
    Serial.println("Sende Index.html");
    server.send(200, "text/html", indexHTML);                   //dann Index Webseite senden (sehe Datei "index_html.h")
  }
}

void handleNotFound() {
  server.send(404, "text/plain", "404: Not found");             // Send HTTP status 404 (Not Found)
}

void WiFiStart() {
  Serial.println();
  Serial.println();
  Serial.print("* Verbindung zu ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("* WLAN verbunden");

  Serial.print("* IP: ");
  Serial.println(WiFi.localIP());
}

void setup() {

  for (int x = 0; x < LEDanzahl; x++) {
    pinMode(LED[x], OUTPUT);
    digitalWrite(LED[x], active_low);
    digitalWrite(LEDstate[x], active_low);
  }

  Serial.begin(115200);
  delay(1);
  Serial.println("* ESP Gestartet");

  IPAddress ip(192, 168, 0, 101);
  IPAddress gateway(192, 168, 0, 1);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 0, 1);
  WiFi.config(ip, dns, gateway, subnet);

  WiFi.mode(WIFI_STA);
  WiFi.hostname(HOSTNAME);
  WiFiStart();

  server.on("/", Ereignis_Index);
  server.onNotFound ( handleNotFound );

  server.begin();                                          // Starte den Server
  Serial.println("HTTP Server gestartet");
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFiStart();
  }

  server.handleClient();
}

Schau Dir mal die Lib genau an. Die Funktionen mit der URL sind deprecated, die solltest Du also nicht mehr verwenden.

Gruß Tommy

OK

Nach dem ich googeln musste was deprecated (veraltet) bedeuted ^^.

Das Video ist vom 31.08.2019 :o

Wie kann man Bibliotheken anschauen?

Was kann man sonnst verwenden, um mit einem ESP einen anderen zu steuern? Ich war froh eine deutsche Anleitung gefunden zu haben. hach.

Mit einem beliebigen Texteditor, z.B. Notepad++.
Z.B. über UDP. Ich habe das hier ab #32 mal zwischen 2 NodeMCU (einer als AP) gemacht. Das geht natürlich auch, wenn beide am lokalen Netz hängen.

Gruß Tommy

Danke. Das Problem war eher das finden der ESP8266HTTPClient.h -.-

C:\Users...\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\libraries\ESP8266HTTPClient\src

Angeschaut habe ich sie mir. Aber verstehe natürlich nur Bahnhof.

Plumps:
Danke. Das Problem war eher das finden der ESP8266HTTPClient.h -.-

C:\Users...\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\libraries\ESP8266HTTPClient\src

Suchmaschine deiner Wahl -> "esp8266 github" eingeben.

Oder hier Klick.

Gruß Fips

Tommy56:
...
Z.B. über UDP. Ich habe das hier ab #32 mal zwischen 2 NodeMCU (einer als AP) gemacht. Das geht natürlich auch, wenn beide am lokalen Netz hängen.

Gruß Tommy

Super, danke. UDP Funktioniert. :smiley:

in einem anderen Forum hast du es sehr gut beschrieben:

Ein Frage hätte ich dennoch. Wie kann ich den Schaltzustand vom Relay des ESP-Slave vom ESP-Master abfragen? Gibt es da ein Befehl zum Senden vom Slave zum Master wenn der Master etwas zum Slave gesendet hat?

Oder kann ich im Slave Sketch auch einfach

Udp.write();

und im Master auch einfach

  packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Empfangen "); Serial.print(packetSize);
    Serial.print(" von IP "); Serial.print(Udp.remoteIP());
    Serial.print(" Port "); Serial.println(Udp.remotePort());
    len = Udp.read(befehl, 10);

nutzen?

Edit:
Wenn ich das richtig verstanden habe, sollte ich mit

    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacket);
    Udp.endPacket();

an den Master zurückschicken können. Wobei replyPacket das ist was zurück geschickt wird.

Natürlich muss man im Master auch

  packetSize = Udp.parsePacket();
  if (packetSize){
      len = Udp.read(befehl, 10); 
...

um das vom Slave kommende in befehl zu speichern.

Was ich noch nicht ganz verstanden habe.
Udp.read speichert seinen Inhalt in befehl.
Maximal auf 10 Werte in einem Array.
Aber was wird len zugewiesen? Die Anzahl der Übermittelten Werte?

Edit2:
Herum experimentieren mit dem Serial Monitor erbrachte die entsprechenden Erkenntnisse.
len = Udp.read(befehl, 10);
"len" werden die anzahl der byte/char übergeben.
"befehl" wird der Wert der einzeln byte/char übergeben in ein Array.
Die 10 begrenzt das lesen auf 10 stellen. Also gibt werden auch nur die ersten 10 Positionen des Arrays "befehl" beschrieben.

Danke für eure Hilfe :smiley:

Der "Master" muss natürlich auch Listen.

Gruß Tommy