Student und AI wissen nicht mehr weiter - Watchdog Reset ESP8266

Hi :slight_smile:
ich habe folgende Exception, aber wirklich 0 Ahnung, was sie bedeutet. Ich bin studierender und arbeitender Softwareentwickler, dementsprechend eigentlich Ahnung von Code, aber in diesem Falle leider nicht ._.

sp: 3ffffde0 end: 3fffffd0 offset: 0190
3fffff70: 4 0202f44 3ffe8892 3ffee654 3ffee6f8
3fffff80: 3ffee654 00000001 00000005 401002bc
3fffff90: 00000030 00000033 3ffee614 402010ac
3fffffa0: 3fffdad0 3ffee5a8 00000004 402011f9
3fffffb0: 3fffdad0 00000000 3ffee6cc 40203e98
3fffffc0: feefeffe feefeffe 3fffdab0 40100dc9
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v000452d0
~ld

Könnt ihr mir büdde weiterhelfen?
Ich habe noch -1 Tage Zeit für dieses Projekt (Freundin - Lampe als Geschenk)
...bevor der Spruch kommt: Ja, ich habe definitiv früh genug angefangen, aber die Zeit deutlichst unterschätzt und meine Ahnung von C deutlichst überschätzt.
Achso ja, der Code:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// WiFi-Zugangsdaten
const char* ssid = "x"; 
const char* password = "y";

// MQTT-Zugangsdaten
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_user = "MQTT_USER";
const char* mqtt_password = "MQTT_PASSWORD";
const char* in_topic = "ESP/1";
const char* out_topic = "ESP/0";

// Pin Definitionen
const int buttonPin = 13;
const int ledPin = 5;
int ledState = LOW;          // speichert den aktuellen LED-Zustand

bool oldVal = false;


// WiFi-Client-Objekt und MQTT-Client-Objekt
WiFiClient espClient;
PubSubClient client(espClient);

// MQTT-Callback-Funktion
void callback(char* topic, byte* payload, unsigned int length) {
  
  Serial.print("Empfangen: ");
  Serial.println((char)payload[0]);

  // Überprüfen, ob das empfangene Thema unserem gewünschten Thema entspricht
  if (strcmp(topic, in_topic) == 0) {
    // Ausgabe des empfangenen Payloads
    switchMaLamp((char)payload[0]);
  }
}

void switchMaLamp(char payload) {
  // Pin auf HIGH oder LOW schalten, basierend auf dem empfangenen Payload
  if ((char)payload == '1' || ledState && (char)payload == '3') {
    Serial.println("Lampe geht 1");
    digitalWrite(ledPin, LOW);
  } else if ((char)payload == '0' || !ledState && (char)payload == '3') {
    Serial.println("Lampe geht 0");
    digitalWrite(ledPin, HIGH);
  } else {
    Serial.println("ERROR IN ZUWEISUNG");
    Serial.println((char) payload);
    digitalWrite(ledPin, ledState);
  }
  ledState = !ledState;
}

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);

  // verbinde mit dem WiFi-Netzwerk
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }

  // verbinde mit dem MQTT-Broker
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  reconnect();
  client.publish(out_topic, (const char *)"1");
  client.publish("spawned", in_topic);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH ) {
    Serial.println("KNOPFI");
    switchMaLamp('3');
    
    for (int i=0; i<5; i++){ // TODO: mehr versuche
      client.publish(out_topic, ledState == HIGH ? (const char *)'0' :  (const char *)'1' );
      delay(10);
    }
    delay(800);
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      client.subscribe(in_topic);
    } else {
      delay(1000);
    }
  }
}

External reset or wake-up from Deep-sleep

Also: Nix WDT
Und wenn WDT, sind meist (quasi immer) Schleifen die Ursache.
Tipp: yield()


Ich glaube nicht, dass man sich auf eine solche Art Zeiger bauen kann, und die dann auch noch bei der Gegenstation was vernünftiges anrichten.

Was bedeutet das?

Zum Debuggen von Watchdog Events würde ich empfehlen, die gerade laufende Funktion (ID) irgendwo zu speichern und im Watchdog Interrupt irgendwie ausgeben. Dann weiß man, wo in etwa das Programm stecken geblieben ist. Dort dann die sinnvollerweise notwendige Watchdog-Fütterung einfügen, oder das Programm geeignet umstrukturieren.

Falscher Adressat für die Beantwortung dieser rhetorischen Frage.

Danke euch schonmal :slight_smile:
Ich setze mich mal an die Pointer und yield() Geschichte. Hoffentlich wird es das sein...
Zu meiner Verteidigung: Ich habe vorher noch nie mit C - ähnlichen Sprachen gearbeitet.

ich vermute, du meinst:

client.publish(out_topic, ledState?"0":"1");

Das zählt nicht als Rechtfertigung.
Zudem hast du das im ersten Posting schon gesagt!
Glaubst du wirklich, dass wir das nicht merken? Auch ohne dass du das sagst?
Einfach irgendwelche Fantasien da hin malen und dann von uns reparieren lassen!

Tipp:
Falls du die Sprache lernen willst, welche du verwendest, dann solltest du das auch tun.
Fantasie ist da nicht so sehr hilfreich. Pragmatismus und ein C++ Grundlagenbuch schon eher.

... ist ein gewaltiger Unterschied zwischen '0' und "0"