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.