Moin Klaus,
hier Dein bezogen auf die Meldungen überarbeiteter Sketch (kompiliert, ansonsten nicht getestet):
/*
Da diese Konstanten im Sketch nicht verwendet werden, sondern stattdessen feste Werte (340, 500) eingetragen wurden, habe ich neue Konstanten mit selbst sprechenden Namen eingeführt:
const int Lw = 595; //Anpassen des Wertes, den der Sensor in der Luft (trocken) anzeigt (serieller Monitor).
const int Fw = 270; // Anpassen des Wertes, den der Sensor in der gewässerten Erde (nass) anzeigt (serieller Monitor).
Weiteres dazu in einem Kommentar weiter unten
*/
const int SensorPin = A0;
const int Led = 14; //"D5" am ESP8266
int Sensorwert = 0;
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <UrlEncode.h>
#define DHTPIN 4 // Ist am ESP8266 "D2"!
#define DHTTYPE DHT11 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "";
const char* password = "";
WiFiServer server(80);
// +international_country_code + phone number
// Portugal +351, example: +351912345678
String phoneNumber = "";
String apiKey = "";
boolean schonWasGemeldet = false;
boolean giessMichGesendet = false;
const int schaltSchwelle = 420;
const int toleranz = 20;
void sendMessage(String message) {
String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
WiFiClient client;
HTTPClient http;
http.begin(client, url);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Send HTTP POST request
int httpResponseCode = http.POST(url);
if (httpResponseCode == 200) {
Serial.print("Message sent successfully");
}
else {
Serial.println("Error sending the message");
Serial.print("HTTP response code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
}
void setup() {
Serial.begin(115200);
pinMode(Led, OUTPUT);
dht.begin();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Wartezeit vor der Messung
delay(10000);
// Sensor wird ausgelesen. Hier nur Celsius, Fahrenheit ist auskommentiert (|| isnan(f)).
float h = dht.readHumidity();
// Temperatur in Celsius (default)
float t = dht.readTemperature();
// Temperatur in Fahrenheit (isFahrenheit = true)
//float f = dht.readTemperature(true);
// Fehlersuchlauf und Abbruch mit Meldung.
if (isnan(h) || isnan(t)) {
Serial.println(F("Fehler beim Auslesen des Sensors!"));
return;
}
// Compute heat index in Fahrenheit (the default)
// float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.println(WiFi.localIP());
Serial.print(F("Temperatur: "));
Serial.print(t);
Serial.println(F("°C "));
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(h);
Serial.println(F("% "));
Sensorwert = analogRead(SensorPin); //Sensor in die Erde
Serial.println(Sensorwert);
WiFiClient client = server.available();
client.println("HTTP/1.1 200 OK");
client.println();
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name =\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<meta charset=utf-8 />");
client.println("<head><meta http-equiv=\"refresh\" content=\"10\">");
client.println("<link rel=\"icon\" href\"data:,\">");
client.println("<title>PlantBox</title>");
client.println("<body>");
client.println("<span style='color: #199BDE;'>");
client.println("<H2><u><center><span style='color: #ff5733;'>PlantBox</span></center></u></H2>");
client.println("<h4><center>Temperatur:");
client.println(dht.readTemperature() - 5); // Ausgeben der Temperatur
client.println("°"); // Schreiben des ° Zeichen
//client.println("C</h4></center>");
client.println("<h4><center>Luftfeuchte:");
client.println(dht.readHumidity()); // Ausgeben der Temperatur
client.print("%"); // Schreiben des ° Zeichen
client.println("<h4><center>Bodenfeuchte:");
client.println(analogRead(SensorPin));
client.println("</h4></center>");
/*
Das hier ist so nicht ok:
=====================================
if (Sensorwert <= 500) {
// Gut bewässert
}
if (Sensorwert >= 340) {
// zu trocken
}
=====================================
Beispiel: Der Sensorwert 400 ist kleiner als 500 aber auch grösser als 340.
Damit ist gleichzeitig sowohl alles gut bewässert wie auch zu trocken ...
Die Wertebereiche dürfen sich nicht überschneiden; eine Lücke
ist jedoch zulässig, wenn man sie von Anfang an richtig
behandelt.
Ich gehe mangels besseren Wissens davon aus, dass die Schwelle zwischen
"gut bewässert" und "zu trocken" in der Mitte bei (500+340)/2 = 420 liegt.
Als Hysteresetoleranz setze ich provisorisch einen Wert von +/-20 an:
* Untere Schaltschwelle 420-20 = 400
* Obere Schaltschwelle 420+20 = 440
Bei Bedarf anpassen bei den Konstanten (siehe oben)
const int schaltSchwelle = 420;
const int toleranz = 20;
*/
switch (Sensorwert) {
case 0 ... schaltSchwelle - toleranz: // Wertebereich für gut bewässert
allesOk(client);
break;
case schaltSchwelle - toleranz + 1 ... schaltSchwelle + toleranz - 1: // Hysterese
// Wenn wir gleich nach einem Neustart hier landen, signalisieren wir
// dass alles Ok ist. Später passiert hier nichts mehr
if (!schonWasGemeldet) {
allesOk(client);
}
break;
case schaltSchwelle + toleranz... 1023: // Wertebereich für definitiv zu trocken
giessMich(client);
break;
}
}
void giessMich(WiFiClient& aClient) {
Serial.println("Bitte gießen!!!");
digitalWrite(Led, HIGH);
aClient.println("<center>");
aClient.println("<H3><span style='color: #FF0000;'>Bitte gieß mich!</span></H3>");
aClient.print("</body>\n</html>");
schonWasGemeldet = true;
if (!giessMichGesendet) {
giessMichGesendet = true;
sendMessage("Gieß mich bitte!!!");
}
}
void allesOk(WiFiClient& aClient) {
giessMichGesendet = false;
schonWasGemeldet = true;
Serial.println("Pflanze gut gewässert!");
digitalWrite(Led, LOW);
aClient.println("<center>");
aClient.println("<H3><span style='color: #00FF00;'>Pflanze gut gewässert!!</span></H3>");
aClient.print("</body>\n</html>");
}
Zwei Hinweise:
- Generell sollte man bei Fragen hier im Forum den kompletten Sketch posten. Häufig sind bei Teil-Sketchen relevante Teile im "Verborgenen" zu finden. Wenn man grundsätzlich Schwierigkeiten hat, erforderlichen Anpassungen selbst einzubauen, ist das Posten des kompletten Sketches eher zwingend.
- Es würde sich empfehlen, getrennte Funktionen für das Timing (millis() statt delay()), das Einlesen der Sensorwerte, das Erstellen der Webseite und die Auswertung des Feuchtesensors zu erstellen und dies alles nicht unübersichtlich in der loop() aneinanderzureihen ... Das würde Übersicht und Pflegbarkeit des Codes deutlich verbessern ... Dazu müsstest Du Dich vielleicht von LOW auf MEDIUM Level hocharbeiten. Es kommt halt darauf an, ob Du eher an einem Einzelprojekt interessiert bist, oder aber für die Zukunft weitere Arbeiten in Planung hast, die Du ganz oder zumindest weitgehend ohne externe NI ("Natürliche Intelligenz", eine alte, vom Aussterben bedrohte Technik) erarbeiten möchtest

Ob der Sketch gleich in Deinem Sinne funktioniert, kann ich ohne eigenen Test nicht gesichert sagen. Gerne mal testen. In den Kommentaren steht etwas zu den Änderungen und Ergänzungen.
Gruß
ec2021
P.S.: Das Handling der Webseite ist m.E. auch nicht ok....
Hier ein komplett überarbeiteter Sketch, der kompiliert und (ohne den DHT11 angeschlossen zu haben) grundsätzlich läuft. Für die Anwendung auf einem meiner ESP32 habe ich die Möglichkeit der bedingten Compilierung per #define genutzt. Da #define ESP32USED auskommentiert ist, sollte es bei Dir für den ESP8266 ohne Änderungen kompilieren. SSID/Passwort-Daten musst Du natürlich noch eintragen.
Der integrierte Webserver funktioniert grundsätzlich, könnte aber noch optimiert werden; das bräuchte etwas mehr Zeit ...
Modifizierter Sketch
//#define ESP32USED
#include <DHT.h>
#ifdef ESP32USED
#include <WiFi.h>
#include <HTTPClient.h>
#include "WiFiSecrets.h"
const byte SensorPin = 34;
#else
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "";
const char* password = "";
const byte SensorPin = A0;
#endif
#include <WiFiClient.h>
#include <UrlEncode.h>
#define DHTPIN 4 // Ist am ESP8266 "D2"!
#define DHTTYPE DHT11 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
WiFiServer server(80);
// +international_country_code + phone number
// Portugal +351, example: +351912345678
String phoneNumber = "";
String apiKey = "";
const int schaltSchwelle = 420;
const int toleranz = 20;
const int Led = 14; //"D5" am ESP8266
float humidity;
float temperature;
int Sensorwert = 0;
const unsigned long messIntervall = 10000;
unsigned long letzteMessung = 0;
boolean schonWasGemeldet = false;
boolean giessMichGesendet = false;
boolean dhtValid = false;
char aColor[10]; // Es braucht nur 7, aber besser etwas Luft
char aText[65]; // Auch hier einiges an Sicherheit eingebaut (bisher max. 39 Zeichen)
void setup() {
Serial.begin(115200);
pinMode(Led, OUTPUT);
dht.begin();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
// Dieser Dummy-Text dürfte normalerweise nie erscheinen ...
strcpy(aColor, "FF00FF");
strcpy(aText, "----------- Bitte warten ------------");
// Einmal vor der loop() ausführen, um klare Startbedingungen zu schaffen
messenUndAuswerten();
}
void loop() {
if (millis() - letzteMessung >= messIntervall) {
messenUndAuswerten();
}
updateWebPage(aColor, aText);
}
void messenUndAuswerten() {
letzteMessung = millis();
messung();
auswertung();
}
void messung() {
#ifdef ESP32USED
dhtValid = false;
#else
// Sensor wird ausgelesen
humidity = dht.readHumidity();
// Temperatur in Celsius (default)
temperature = dht.readTemperature();
// Temperatur in Fahrenheit (isFahrenheit = true)
//temperature = dht.readTemperature(true);
dhtValid = !(isnan(humidity) || isnan(temperature));
#endif
// Compute heat index in Fahrenheit (the default)
// float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahrenheit = false)
// Der Heat Index ist die "gefühlte Temperatur"; wird hier zwar ermittelt
// aber ansonsten nirgends verwendet ?!?!?!?
// *********************************************
// float hic = dht.computeHeatIndex(temperature, humidity, false);
// *********************************************
Sensorwert = analogRead(SensorPin); //Sensor in die Erde
#ifdef ESP32USED
Sensorwert = map(Sensorwert, 0, 4095, 0, 1023);
#endif
Serial.println(WiFi.localIP());
if (dhtValid) {
Serial.print(F("Temperatur: "));
Serial.print(temperature);
Serial.println(F("°C "));
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(humidity);
Serial.println(F("% "));
} else {
Serial.println(F("DHT11-Werte fehlerhaft"));
}
Serial.print("Feuchtemesswert: ");
Serial.println(Sensorwert);
}
void auswertung() {
switch (Sensorwert) {
case 0 ... 19: // Eher ein Kurzschluss ???
fehler();
break;
case 20 ... schaltSchwelle - toleranz: // Wertebereich für gut bewässert
allesOk();
break;
case schaltSchwelle - toleranz + 1 ... schaltSchwelle + toleranz - 1: // Hysterese
// Wenn wir gleich nach einem Neustart hier landen, signalisieren wir
// dass alles Ok ist. Später passiert hier nichts mehr
if (!schonWasGemeldet) {
allesOk();
}
break;
case schaltSchwelle + toleranz... 1023: // Wertebereich für definitiv zu trocken
giessMich();
break;
}
}
void giessMich() {
Serial.println("Bitte gießen!!!");
digitalWrite(Led, HIGH);
strcpy(aColor, "FF0000");
strcpy(aText, "Bitte gieß mich!");
schonWasGemeldet = true;
if (!giessMichGesendet) {
giessMichGesendet = true;
sendMessage("Gieß mich bitte!!!");
}
}
void allesOk() {
giessMichGesendet = false;
schonWasGemeldet = true;
Serial.println("Pflanze gut gewässert!");
digitalWrite(Led, LOW);
strcpy(aColor, "00FF00");
strcpy(aText, "Pflanze gut gewässert!!");
}
void fehler() {
Serial.println("Fehlerhafter Sensorwert");
digitalWrite(Led, HIGH);
strcpy(aColor, "FF0000");
strcpy(aText, "Fehlerhafter Sensorwert!!");
}
void updateWebPage(char* color, char* text) {
// WiFiClient client = server.accept();
WiFiClient client = server.available();
if (client) {
if (client.connected()) {
// Serial.println("Client connected");
client.println("HTTP/1.1 200 OK");
client.println();
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name =\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<meta charset=utf-8 />");
client.println("<head><meta http-equiv=\"refresh\" content=\"3\">");
client.println("<link rel=\"icon\" href\"data:,\">");
client.println("<title>PlantBox</title>");
client.println("<body>");
client.println("<span style='color: #199BDE;'>");
client.println("<H2><u><center><span style='color: #ff5733;'>PlantBox</span></center></u></H2>");
if (dhtValid) {
client.println("<h4><center>Temperatur:");
client.print(temperature - 5); // Ausgeben der Temperatur
client.println("°"); // Schreiben des ° Zeichen
client.println("<h4><center>Luftfeuchte:");
client.print(humidity); // Ausgeben der Temperatur
client.println("%"); // Schreiben des ° Zeichen
} else {
client.println("<h4><center>Temperatur: ungültig");
client.println("<h4><center>Luftfeuchte: ungültig");
}
client.println("<h4><center>Bodenfeuchte:");
client.println(Sensorwert);
client.println("</h4></center>");
char buffer[100]; // Bei längeren Ausgaben muss die Puffergröße ggf. angepasst werden!!!!!
sprintf(buffer, "<H3><span style='color: #%s;'>%s</span></H3>", color, text);
client.println(buffer);
client.println("<center>\n\n");
client.print("</body>\n</html>");
}
client.stop();
}
}
void sendMessage(String message) {
#ifndef ESP32USED
String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
WiFiClient client;
HTTPClient http;
http.begin(client, url);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Send HTTP POST request
int httpResponseCode = http.POST(url);
if (httpResponseCode == 200) {
Serial.print("Message sent successfully");
} else {
Serial.println("Error sending the message");
Serial.print("HTTP response code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
#endif
}