ESP32 - WiFi bricht ab und ESP32 stürzt ab

Hallo,
ich bin noch recht neu, in der Welt der Sketche und wollte mir jetzt eine Smarte Bewässerung bauen, die nur in einem bestimmten Zeitraum misst und die Pumpe aktiviert.

Mein Problem ist, dass sich der ESP32 nach ca. 10 Minuten aufhängt und keine Daten mehr sendet.

#include <WiFi.h>
#include <PubSubClient.h>
#include "time.h"

// MQTT Zugangsdaten
const char* ssid = "xxx";
const char* password = "xxx";
const char* MQTT_User = "xxx";
const char* MQTT_Pass = "xxx";
const char* MQTT_Server = "192.168.178.xx";
const char* MQTT_Name = "Schlafzimmer_Bewaesserung";
const char* MQTT_Topic_Feuchtigkeit = "Schlafzimmer_Bewaesserung/Feuchte";
const char* MQTT_Topic_Pumpe = "Schlafzimmer_Bewaesserung/Pumpe";

// --------------- Variablen Bewaesserung ---------------------------------------
int RelaisPIN = 27;
int FeuchtigkeitsPIN = 33;
int Feuchtigkeitswert = 0;
int Relaiswert = 0;

// --------------- Variablen Timer -----------------------------------------------
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;
int second;
int minute;
int hour;
int day;
int month;
int year;
int weekday;
long current;
struct tm timeinfo;

WiFiClient wclient;
PubSubClient client(wclient);
int now, lastMsg;
char feuchtigkeit_message[50], pumpe_message[50];

void reconnect() {
  while (!client.connected()) {
    Serial.print("\nconnected to ");
    Serial.println(MQTT_Server);
    if (client.connect(MQTT::Connect(MQTT_Name).set_auth(MQTT_User, MQTT_Pass))) {
      Serial.print("\nconnected to ");
      Serial.println(MQTT_Server);
      client.publish(MQTT_Name, "verbunden" );
    } else {
      Serial.println("\nTrying connect again");
      delay(5000);
    }
  }
}
// --------------- Timer initialisieren ---------------------------------------
void printLocalTime()
{
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %d %B %Y %H:%M:%S");
}

void setup() {
  Serial.begin(9600);
  pinMode(RelaisPIN, OUTPUT);
  pinMode(FeuchtigkeitsPIN, INPUT);
  digitalWrite(RelaisPIN, HIGH);
  client.set_server(MQTT_Server, 1886);
  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  WiFi.setHostname("ESP-Schlafzimmer-Bewaesserung-0");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("-");
  }
  Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
}

void loop() {
  int wifi_retry = 0;
  while(WiFi.status() != WL_CONNECTED && wifi_retry < 5 ) {
      wifi_retry++;
      Serial.println("WiFi not connected. Try to reconnect");
      WiFi.disconnect();
      WiFi.mode(WIFI_OFF);
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      delay(100);
  }
  if(wifi_retry >= 5) {
      Serial.println("\nReboot");
      ESP.restart();
  }

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  printLocalTime();
  second = timeinfo.tm_sec;
  minute = timeinfo.tm_min;
  hour = timeinfo.tm_hour;
  day = timeinfo.tm_mday;
  month = timeinfo.tm_mon + 1;
  year = timeinfo.tm_year + 1900;
  weekday = timeinfo.tm_wday + 1;
  Feuchtigkeitswert = analogRead(FeuchtigkeitsPIN);
  Relaiswert = digitalRead(RelaisPIN);

  long now = millis();
  if (now - lastMsg > 10000) {
    snprintf (feuchtigkeit_message, 75, "%d", Feuchtigkeitswert);
    snprintf (pumpe_message, 75, "%d", Relaiswert);
    long lastTime = millis();

    client.publish(MQTT_Topic_Feuchtigkeit, feuchtigkeit_message);
    client.publish(MQTT_Topic_Pumpe, pumpe_message);
  }

    if (Feuchtigkeitswert > 3000 && hour >= 10 && hour <= 23)
    {
      digitalWrite(RelaisPIN, LOW);
      delay(5000);
      digitalWrite(RelaisPIN, HIGH);
      delay(5000);
    }
    else
    {
      digitalWrite(RelaisPIN, HIGH);
    }

  delay(10000);
}

Mir ist bewusst, dass das Sketch nicht wirklich optimiert aufgebaut ist, aber vielleicht kann mir jemand weiterhelfen und sagen, wie ich dem Problem, des "sterbenden" ESP auf den Grund gehen kann.

Hallo,

deine Variablen sind das reinste Kaos. Global und lokal doppelt, lokale Merker nicht static, kann so nicht funktionieren.

du definierst global

int now, lastMsg;

und verwendest dann lokal mit Neudefinition

long now = millis();
  if (now - lastMsg > 10000) {
    snprintf (feuchtigkeit_message, 75, "%d", Feuchtigkeitswert);
    snprintf (pumpe_message, 75, "%d", Relaiswert);
    long lastTime = millis();

Das kann nicht gut gehen. lokal now ist nicht die global now. lokal now geht verloren und lastTime wird praktisch nicht genutzt. Alles was mit millis zu tun hat benötigt unsigned long. Schreibe dir Funktionen die du dann aufrufst.

Bsp. komplett befreit von globalen Variablen.

void ausgabe (unsigned long const interval)                     
{
  static unsigned long lastMillis = 0;
  unsigned long ms = millis();
  
   if (ms - lastMillis >= interval)
   {
    lastMillis = ms;    // aktuelle Zeit merken
    snprintf (feuchtigkeit_message, 75, "%d", Feuchtigkeitswert);
    snprintf (pumpe_message, 75, "%d", Relaiswert);

    client.publish(MQTT_Topic_Feuchtigkeit, feuchtigkeit_message);
    client.publish(MQTT_Topic_Pumpe, pumpe_message);
  }
}

Aufruf mit

ausgabe(10000);

Das gleiche Prinzip kannste mit all deinen delay Wartezeiten anwenden.

Hallo Doc_Arduino,

danke, für deine ausführliche Antwort und Lösungsansätze.

Ich werde das Sketch jetzt mal umschreiben und schauen, wie es sich verhält, denn das "alte" Sketch rausche nach ca. 10 Min ab.(Also erstmal beobachten)

Was schon mal etwas geholfen hat, war das Aufräumen, der Variablen und die Trennung, des 2.4 GHz-Netzes, vom 5 GHz-Netz.

Jetzt hat er sage und schreibe ca. eine Stunde durchgehalten.

Muss mich noch ein wenig mehr, mit der Materie beschäftigen und das Sketch weiter bearbeiten.

EDIT:
Ich lebe eindeutig in einem Bunker.
Habe heute morgen den ESP neu gestartet und dann die Zimmertür, zwischen ESP und Router geschlossen und binnen Sekunden hat er keine Daten mehr geschickt und im Backend, meiner Fritte war der ESP auch nicht mehr erreichbar.

Also heißt es Netzwerk ausbauen.

Hallo,

schön, da wird mit aufräumen noch viel Arbeit drin stecken. Dran bleiben. :wink:
Notfalls zum debuggen seriell Zwischenwerte von vermutlich Amok laufenden Variablenwerten ausgeben lassen.

Hey Doc_Arduino,

mal als kleinen Zwischenstand:
Ich habe jetzt Powerline, in das Zimmer gelegt, wo der ESP32 liegt und was soll ich sagen?!
Es lag tatsächlich an dem miesen Empfang, in dem Zimmer.
Denn er sendet und sendet und sendet.

Wie ich die Tipps, mit den Funktionen, in dem Sketch umsetze, muss ich mir noch mal genau anschauen.

Aber erstmal vielen Dank, für den Tipp, mit den doppelten Variablen.

Wenn der Laptop Empfang hat, wäre möglicherweise auch eine externe Antenne von Nutzen gewesen.