Kapazitiver Bodenfeuchtesensor-Werte auf dem LCD_Display 12c anzeigen

Hallo ich hoffe es geht euch gut und ich bitte um eure Hilfe.
Schon seit einigen Tagen versuche ich die Bodenfeuchte Werte auf einem Display anzuzeigen, allerdings tauchen dort immer Fehler. Ich habe wirklich alles versucht, vieles aus dem Internet kopiert, viele Videos geguckt, aber irgendwie werden die Daten nicht angezeigt. Es wird immer nur ein eine Stelle Fehler angezeigt. (Zeile:8 lcd.init();).
Ich stelle den Code hier im Anhang.
Nur zum Info, ich habe dieses Video angeguckt und nachgemacht: https://srituhobby.com/capacitive-soil-moisture-sensor-v1-2-arduino-code/
Vielen Dank im Voraus.

Coden:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
#define sensor A2
#define wet 210
#define dry 510

void setup() {
Serial.begin(9600);
lcd.init(); // Hier wird Fehler angezeigt!!!
lcd.backlight();
}

void loop() {
int value = analogRead(sensor);
Serial.println(value);
lcd.setCursor(1, 0);
lcd.print("Moisture Value");
lcd.setCursor(3, 1);
lcd.print(value);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print("--");
int pre = map(value, wet, dry, 100, 0);
lcd.setCursor(10, 1);
lcd.print(pre);
lcd.print("%");
lcd.print(" ");
}

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Außerdem formatiere den Code bitte ordentlich. Strg+T in der IDE hilft Dir dabei.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Code in Codetags:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
#define sensor A2
#define wet 210
#define dry 510

void setup() {
Serial.begin(9600);
lcd.init(); // Hier wird Fehler angezeigt!!!
lcd.backlight();
}

void loop() {
int value = analogRead(sensor);
Serial.println(value);
lcd.setCursor(1, 0);
lcd.print("Moisture Value");
lcd.setCursor(3, 1);
lcd.print(value);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print("--");
int pre = map(value, wet, dry, 100, 0);
lcd.setCursor(10, 1);
lcd.print(pre);
lcd.print("%");
lcd.print(" ");
}

nach dem du den Sketch richtig gepostest hast (Anleitung siehe Tommy)

poste auch die Fehlermeldung. Wir sehen ja nicht welcher Fehler genau gemeldet wird!

Was passiert:
Es gibt verschiedene ähnlich lautende LCD Libraries.
die einen brauchen lcd.begin(), die anderen ein lcd.init(), einige mit Parameter die anderen ohne.

Entweder du verwendest die gleiche Library die auch derjenige Verwendet von dem du den Code kopiert hast oder du schaust nach in den Beispielen der installierten Library, wie die dieses begin oder init machen und hältst dich ganz genau daran.

Evtl. sieht dann auch der Konstruktor - diese Zeile

LiquidCrystal_I2C lcd (0x27, 16, 2);

anders aus.

Also - lad erst mal das Hello World beispiel aus deiner Library hoch und kontrolliere, ob dieses etwas auf deinem Display anzeigt.


Das wird angezeigt

auch das ganze rote da unten kannst mit STRG-C/STRG-V rauskopieren und hier als Text in Code-Tags posten.

Aber mach mal wie ich sage ... nimm das Hello World Beispiel aus deiner installierten LCD Library und kompiliere das mal und lade das hoch auf deinen Uno.

Ich wette einfach mal - du hast eine Library installiert deren Beispiel nicht ein aufrufbares init() enthält sondern ein begin(). Die Fehlermeldung dazu ist ja eindeutig.

Hallo Nochmal. Ich habe nun den richtigen Library verwendet und das Programcode lässt sich auch übertragen, aber das LCD-Display flattert. In dem Display bewegen sich viele komischen Linien. Auch wenn ich die Helligkeit mehr oder weniger mache. Außerdem habe ich auch alle Kabeln kontrolliert.
Vielen Dank, dass sie sich die Zeit für meine Fragen nehmen.
Ich blende nochmal meine neuen Coden auf.

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2); 
#define sensor A2
#define wet 210
#define dry 510

void setup() {
  Serial.begin(9600);
 lcd.begin (16,2);
  lcd.backlight();
}
void loop() {
  int value = analogRead(sensor);
  Serial.println(value);
  lcd.setCursor(1, 0);
  lcd.print("Moisture Value");
  lcd.setCursor(3, 1);
  lcd.print(value);
  lcd.print(" ");
  lcd.setCursor(7,1);
  lcd.print("--");
  int pre = map(value, wet, dry, 100, 0);
  lcd.setCursor(10, 1);
  lcd.print(pre);
  lcd.print("%");
  lcd.print(" ");
} 

Hier einpaar Bilder von Display:


naja du aktualsierst das ganze Display tausende male pro Sekunde. Klar flackert das.
aktualisere nur, wenn sich was ändert.

ungetestet:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
#define sensor A2
#define wet 210
#define dry 510

void setup() {
  Serial.begin(9600);
  lcd.begin (16, 2);
  lcd.backlight();
}
void loop() {
  static int previousValue = 0;        // eine statische Variable zum merken des alten Wertes
  int value = analogRead(sensor);
  if (previousValue != value)         // eine Bedingung die nur true wir, wenn sich alter und neuer Wert unterscheiden
  {
    previousValue = value;            // gleich übernehmen fürs nächste Mal
    Serial.println(value);
    lcd.setCursor(1, 0);
    lcd.print("Moisture Value");
    lcd.setCursor(3, 1);
    lcd.print(value);
    lcd.print(" ");
    lcd.setCursor(7, 1);
    lcd.print("--");
    int pre = map(value, wet, dry, 100, 0);
    lcd.setCursor(10, 1);
    lcd.print(pre);
    lcd.print("%");
    lcd.print(" ");
  }
}

wenn dir das immer noch zu viel ist, dann brauchst du eine Hyterese. Das machst am besten mit einer Differenz zB.

if (abs(previousValue - value) > 5)         // eine Bedingung die nur true wir, wenn sich alter und neuer Wert um x unterscheiden

Ich habe das ganz am Ende auf jeder 5 Sekunden verändert. Aber trotzdem sieht man nichts auf dem Display.

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
#define sensor A2
#define wet 210
#define dry 510

void setup() {
  Serial.begin(9600);
  lcd.begin (16, 2);
  lcd.backlight();
}
void loop() {
  static int previousValue = 0;        // eine statische Variable zum merken des alten Wertes
  int value = analogRead(sensor);
  if (previousValue != value)         // eine Bedingung die nur true wir, wenn sich alter und neuer Wert unterscheiden
  {
    previousValue = value;            // gleich übernehmen fürs nächste Mal
    Serial.println(value);
    lcd.setCursor(1, 0);
    lcd.print("Moisture Value");
    lcd.setCursor(3, 1);
    lcd.print(value);
    lcd.print(" ");
    lcd.setCursor(7, 1);
    lcd.print("--");
    int pre = map(value, wet, dry, 100, 0);
    lcd.setCursor(10, 1);
    lcd.print(pre);
    lcd.print("%");
    lcd.print(" ");
    delay(5000); // Jeder 5 Sekunden 
  }
}

Leider nicht. Ich habe das mit 3 Displays probiert aber das geht einfach nicht.
Ich glaube, das liegt irgendwo an Programm coden

Löte mal bitte die Kontakte sauber nach.
Das sieht sehr nach kalten Lötstellen aus.
Gut durchwärmen und ein wenig Flußmittel.

Und bei VDD V0 ist da ne Zinnbrücke drin?

Das bezweifle ich.

Lötstellen sauberst nachlöten so wie xy schreibt.

ALLE Dupont Kabel entfernen.
NEU verkabeln mit 4 verschiedenen Farben. SCHWARZ = GND, ROT = 5V.

Neue Bilder zeigen. Auch von der Rückseite des LCD Displays / den Anschlüssen des LCD Treibers.

Und zeige ein Bild welche Library du da genau installiert hast:

sowie als Text in Code-Tags den ganzen Compiler-Output vom HELLO World Beispiel.

Hallo nochmal,
Wie besprochen habe ich die Lötstellen sauber nachgelötet und alle Jumperkabeln erneuert. Bilder gibt es im Anhang.
Diesmal habe ich versucht die Temperatur mit einem DHT11 Sensor auf dem Display anzuzeigen, welche eigentlich auch ganz gut geklappt hat. Die Coden dazu finden sie im Anhang.

#include <dht.h> //DHT and LCD libraries
#include <LiquidCrystal_I2C.h>
 
#define I2C_ADDR 0x27 
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
 
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
 
dht DHT; //Declaring the DHT as a dht type to use it later
 
#define DHT11_PIN 7 //Declaring where the DHT signal pin is wired
 
void setup(){
  lcd.begin (16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();
}
 
void loop()
{
  lcd.clear();
  lcd.setCursor(0,0);
  int chk = DHT.read11(DHT11_PIN); //Reading data from the module
  lcd.print("Temp: ");
  lcd.print(DHT.temperature); //Showing temperature value (before that you can do some math to get the temperature in Farnheit)
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humidity: ");
  lcd.println(DHT.humidity); //Showing humidity percentage
  lcd.print(" %");
  delay(1000); //Refreshing every 1s
}

Bilder dazu:


Das klappt aber immer noch nicht bei dem Bodenfeuchtigkeitssensor, welche ich eigentlich am meisten brauche.
Ich bedanke mich nochmal für eure Unterstützung.

neu:
lcd.print("\44");
Sollte funktionieren....

Funktioniert leider immer noch nicht. Auf dem Display wird nur ein "A" angezeigt und wenn die Feuchtigkeitswerte sich ändern dann werden mehreren "AAAAA" angezeigt.
Kennen sie irgendwelche Internetseiten, wo man sich informieren kann?

Also irgendwie kommt mir das komisch vor.
Kannst Du mal das Wort auf "Humi" runterkürzen udn dann ganz normal das % wieder reinschreiben?

Ich habe das Hingekriegt. Die Werte lassen sich auf Display anzeigen.
Danke nochmal für eure Unterstützung.
Im Anhang finden sie den Coden:

#include <LiquidCrystal_I2C.h>
 
#define I2C_ADDR 0x27 
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

const int dry = 595; // value for dry sensor
const int wet = 239; // value for wet sensor

void setup(){
  lcd.begin (16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0,0);
  int sensorVal = analogRead(A0); 
  int percentageHumididy = map(sensorVal, wet, dry, 100, 0); 
  lcd.print("Bodenfeuchte:");
  lcd.print(percentageHumididy);
  lcd.println("%");
  
  delay(3000); 
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.