Hallo ich habe einen Bodenfeuchtesensor gebaut der ein Relais schaltet wenn der Boden trocken ist schaltet relais ein und bei feucht aus diesen schaltzustand moechte ich gerne auf dem Display anzeigen lassen also wenn:
Boden trocken = Pumpe ein
Bodenb feucht = pumpe aus
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include "setting.h"
LiquidCrystal_I2C lcd (0x27, 20, 4);
const int AirValue = 620;
const int WaterValue = 310;
int soilMoistureValue = 0;
int soilmoisturepercent = 0;
#define PIN_Switch D4
void setup() {
lcd.init();
lcd.backlight();
lcd.begin(20, 4);
Serial.begin (115200);
pinMode (PIN_Switch, OUTPUT);
digitalWrite (PIN_Switch, LOW);
Serial.println();
Serial.println();
Serial.print("Verbinde mit ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Verbunden!");
Serial.print("IP addresse: ");
Serial.println(WiFi.localIP());
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Planzenbewaesserung");
lcd.setCursor(0, 1);
//lcd.println(localIP);
lcd.print(WiFi.localIP());
soilMoistureValue = analogRead (A0);
Serial.println (soilMoistureValue);
soilmoisturepercent = map (soilMoistureValue, AirValue, WaterValue, 0, 100);
if (soilmoisturepercent >= 100) {
Serial.println("100 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
delay(250);
}
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");
lcd.setCursor(0, 3);
lcd.print("Pumpe ein");
delay(250);
} else if (soilmoisturepercent > 0 && soilmoisturepercent < 100) {
Serial.print (soilmoisturepercent);
Serial.println("%");
delay(250);
if (soilmoisturepercent > 40 && soilmoisturepercent < 100)
{
digitalWrite(PIN_Switch, HIGH);
}
if (soilmoisturepercent > 0 && soilmoisturepercent < 40)
//else if (soilmoisturepercent > 0 && soilmoisturepercernt < 40)
//else if (soilmoisturepercent > 40 && soilmoisturepercent < 100)
digitalWrite(PIN_Switch, LOW);
}
}
Der Programmcode funktioniert auch soweit sehr gut nur Display nicht.
Display: I2C HD44780 20x4
Das Problem:
Wenn der Boden feucht ist wird Pumpe ein und Pumpe aus angezeigt und das relaus schaltet hin und her erst nach einen reset geht der Pumpen-text wieder weg fuer hilfe ware ich dankbar denn google bringt nix gescheites zusammen
Gruss Hitman43
fony
May 31, 2023, 8:39pm
2
Zwei Fragen :
Wie ist das Display angeklemmt ?
Was für Sensor ist das, mit welcher Spannung arbeitet er ?
Zeichne mall ein Plan wie das wurde verdrahtet.
ESP ist nicht 5V tolerant.
der Sensor ist ein Kapazitiver Soil Moisture Sensor V1.2 der mit 5v betrieben wird.
Das Display ist ein i2c Display HD44780 (steht im Text)
Ueber das Display sollen die schaltzustaende angezeigt werden ob pumpe ein oder aus ist.
Du musst entweder das Display mal löschen mit lcd.clear();
ODER einfacher, den alten, gleich langen Text überschreiben.
Momentan schreibst Du in verschiedene Zeilen
fony
June 1, 2023, 5:57am
5
Sind am I2C Bus levelshifter, Pegelwandler eingebaut?
Ja watt denn nu?
Läuft? Läuft nicht?
Schalte es einmal hin und her und ständig?
Das würde ich ins Setup ans Ende setzen.
Dann mit kleiner Hysterese:
Hitman43:
if (soilmoisturepercent >= 100) {
Serial.println("100 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
delay(250);
}
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe ein");
delay(250);
}
else {
Serial.print (soilmoisturepercent);
Serial.println("%");
delay(250);
if (soilmoisturepercent > 45)
{
digitalWrite(PIN_Switch, HIGH);
}
if (soilmoisturepercent < 40)
{
digitalWrite(PIN_Switch, LOW);
}
}
Je nachdem wie stark die Werte schwanken.
If vereinfacht.
Klammern gesetzt.
Displayzeile korrigiert.
hallo habs hinbekommen den lcd text ans ende und den ersten mit lcd.clear geloescht
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");//
delay(250);
} else if (soilmoisturepercent > 0 && soilmoisturepercent < 100) {
Serial.print (soilmoisturepercent);
Serial.println("%");
delay(250);
if (soilmoisturepercent > 40 && soilmoisturepercent < 100)
{
digitalWrite(PIN_Switch, HIGH);
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
delay(2000);
lcd.clear();
}
if (soilmoisturepercent > 0 && soilmoisturepercent < 40)
//else if (soilmoisturepercent > 0 && soilmoisturepercernt < 40)
//else if (soilmoisturepercent > 40 && soilmoisturepercent < 100)
digitalWrite(PIN_Switch, LOW);
lcd.setCursor(0, 2);
lcd.print("Pumpe ein");
}
}
der untere teil des codes der das relais schaltet
Dankle fuer die freundliche hilfe
fony
June 1, 2023, 6:10pm
9
Man nutzt kein lcd. clear () , das geht auf die Augen den das
lcd.print("Planzenbewaesserung");
wird jedes mall neu geschrieben
außer dem
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
lcd.setCursor(0, 2);
lcd.print("Pumpe ein");
ist gleich lang, also wozu das Löschen?
Im erstem Sketch hast du so geschrieben
if (soilmoisturepercent >= 100) {
Serial.println("100 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
delay(250);
}
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");
lcd.setCursor(0, 3);
lcd.print("Pumpe ein");
delay(250);
dann reicht doch die Ausgabe Verriegeln
if (soilmoisturepercent >= 100) {
Serial.println("100 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
lcd.setCursor(0, 3 );
lcd.print(" "); // hier wird die "Pumpe ein" gelöscht
delay(250);
}
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");
lcd.setCursor(0, 3);
lcd.print("Pumpe ein");
lcd.setCursor(0, 2 );
lcd.print(" "); //// hier wird die "Pumpe aus" gelöscht
delay(250);
Und die frage ob du nutzt ein levelshifter für SCL, SDA wurde nicht beantwortet, ist ja nicht mein ESP, und Geld
einen levelshifter nutze ich nicht hab display an D1 und D2 angeschlossen und Pumpe ueber Relais an D4
Ja wenn du mir sagst wiue ich das dann genau schreiben muss so oft mache ich das nicht das ich da 100% gut drin bin
fony
June 1, 2023, 6:52pm
11
Problem ist das Display gibt 5v raus, das verkraftet der ESP auf die Dauer nicht.
Ich nutze so ein Teil mittlerweile verkaufen die das massenweise.
Du brauchst nur die helfte vom Modul
Angeschlossen wird er so wie auf der Zeichnung 5V Signal auf den LCD, 3.3V Signal aud den ESP dazu 5V und 3,3V drauf, GND braucht man nicht
fony
June 1, 2023, 6:54pm
12
habe dir in dem Schnipsel gezeigt das zwischen den" " muss Minimum so lang sein wie der angezeigter Tex 'Pumpe aus'
if (soilmoisturepercent >= 100) {
Serial.println("100 %");
lcd.setCursor(0, 2);
lcd.print("Pumpe aus");
lcd.setCursor(0, 3 );
lcd.print(" "); // hier wird die "Pumpe ein" gelöscht
delay(250);
}
else if (soilmoisturepercent <= 0) {
Serial.println("0 %");
lcd.setCursor(0, 3);
lcd.print("Pumpe ein");
lcd.setCursor(0, 2 );
lcd.print(" "); //// hier wird die "Pumpe aus" gelöscht
delay(250);
Wir wissen doch gar nicht, welches Board genau?
Es gibt auch welche mit 5V.
Und es gibt 3.3V Displays.
habe ein wemos D1 mini im Einsatz den rest probiere ich morgen abend aus
Mein LCD ist an gescglossen VCC = 3,3V, GND, SLC, SDA
fony
June 1, 2023, 7:16pm
15
In form 2004 oder 1602? zeige link, mittlerweile brauch ich keinen aber wäre interessant zu wissen. Der PCF kann das (2,2V - 5V), nur die LED nicht sonst ist der Kontrast für den A...
fony
June 1, 2023, 7:51pm
17
Hat er und somit 5 V auf SDA hier D2
@progger hast du noch nicht mit ESP rumgespielt?
Persönlich habe am einem ESP32 mit einem 5V TFT LCD 4 Pins kaputt gemacht.
Fakt ist, der TO schreibt, sein Display wir an 3,3Volt betrieben. Damit kann es funktionieren, meist ist aber bei 3,3V der Kontrast deutlich schlechter und das Display fast nicht lesbar.
Wird es aber mit 5Volt betrieben, kann wie von @fony schon geschrieben, der ESP sehr schnell schaden nehmen, da die 5Volt auf den I2C-Pins liegt. Auch so kann es funktionieren, aber nicht sehr lange.
Leider gibt es, wie wir in Post #16 sehen, sehr viele schlechte Tutorials, die einen User in diese Falle laufen lassen. Um dieses Problem zu umgehen, sollte man für den I2C-Bus den von fony beschriebenen Levelshifter einsetzen.
Aber Achtung , dieser funktioniert nur sicher mit I2C und nicht an anderen Datenleitungen.
fony
June 2, 2023, 6:00am
19
HotSystems:
3,3Volt betrieben.
Ups, übersehen😕
Sorry @Hitman43
Hallo zusammen
habe das ganze ausprobiert und bin nicht zum erfolg gekommen daher habe ich nocheinmal neu angefangen was jetzt auch funktioniert.
Progger wir mal ein Display ansteuert weis ich hab ja schon 2 am laufen.
einen levelshifter hab ich bestellt ist nur noch nicht eingetroffen
Hier mein Code so funktioniert es 100% mehr soll es auch garnicht tun.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include "setting.h"
LiquidCrystal_I2C lcd (0x27, 20, 4);
const int echoPin = A0; //D3
int Feuchtigkeit;
const int dry = 675;
const int wet = 360;
//Relais-Pumpe
#define PIN_Switch D4
//Relais-Status
#define RELAY_OFF 0
#define RELAY_ON 1
#define Relay_1 2
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(100);
// Starte WiFi Verbindung
Serial.print("Verbindung zu ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi Verbindung");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected())
{
Serial.println("Verbindung zu mqtt ...");
if (client.connect(SensorName))
{
Serial.println("Verbindung");
client.subscribe("OsoyooCommand");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
//Warten
delay(100);
}
}
}
void setup() {
lcd.init();
lcd.backlight();
lcd.begin(20, 4);
pinMode(PIN_Switch, OUTPUT); //Relais-Pumpe
digitalWrite(PIN_Switch, LOW);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
if (!client.connected()) {
reconnect();
}
client.loop();
String msg = "";
pinMode(A0, INPUT);
delay(200);
}
void loop() {
// Lese Sensor Daten
int Bodenfeuchtigkeit = analogRead(A0);
int percentageHumidity = map(Bodenfeuchtigkeit, wet, dry, 100, 0);
if (percentageHumidity >= 100) {
Serial.println("100%");
//Serial.println("%");
delay(250);
}
else if (percentageHumidity <= 0) {
Serial.println("0");
Serial.println("%");
delay(250);
}
else if (percentageHumidity > 0 && percentageHumidity < 100) {
Serial.print(percentageHumidity);
Serial.println("%");
delay(250);
}
if (percentageHumidity > 40 && percentageHumidity < 100) {
digitalWrite(PIN_Switch, HIGH);
}
if (percentageHumidity > 0 && percentageHumidity < 40) {
digitalWrite(PIN_Switch, LOW);
}
int relayState = digitalRead(Relay_1);
if (relayState == HIGH)
{
Serial.println("Relais aus");
lcd.setCursor(0, 3);
lcd.print("Pumpe aus");
} else {
Serial.println("Relais ein");
lcd.setCursor(0, 3);
lcd.print("Pumpe ein");
}
// Daten an LCD Display uebertragen
lcd.setCursor(0, 0);
lcd.print("Bodenfeuchte:");
lcd.setCursor(0, 1);
lcd.print( percentageHumidity);
lcd.print("%");
// Sende Sensordaten an mqtt-Server
delay(10);
client.publish("Wohnzimmer/Pflanze_TV", String(percentageHumidity).c_str(), true);
client.publish("Wohnzimmer/Pflanze_TV-Status", String(relayState).c_str(), true);
delay(100);
// Gehe schlafen fuer 15 minutes
//ESP.deepSleep( 15 * 60 * 1000000);
//delay(100);
}