Arduino Lcd Display gibt mit if Statement kein Bild aus?!

Hallo, ich versuche der Zeit mein Gewächshaus zu automatisieren, ich habe ein 20x4 I2C Display, eine Thermistor, Bodenfeuchtigkeitsensor, Und ein MagnetVentil das ich über ein Relay Zeitabhängig mit dem DS3231 ansteuern kann.

Grundlegend funktioniert alles, wenn ich aber Daten auf meinem Display anzeigen möchte und meine Zeit abfrage aktiviert habe bekomme ich kein Bild mehr am LCD.
Woran liegt das?

#include <DS3231.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//Moisture Sensor
const int dry = 804;
const int wet = 420;

//Lcd Screen
LiquidCrystal_I2C lcd(0x27,20,4);

//Thermistor
int tempPin = 0;

//Time Module
DS3231 clock;
RTCDateTime dt;

//Zeitraum 1
const int OnHour = 8;
const int OnMin = 30;
const int OffHour = 10;
const int OffMin =30;
//Zeitraum 2
const int OnHour2 = 18;
const int OnMin2 = 15;
const int OffHour2 = 20;
const int OffMin2 =15;

void setup() {
  //Time Module
  Serial.begin(9600);
  
  //Lcd Screen
  lcd.init();
  lcd.init();

}

void loop() { 

  //Zeitabfrage(); (Wenn diese Funktion aktiviert wird bekomme ich kein Bild mehr)

  //Thermistor
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius

  //Moisture Sensor
  int SensorVal = analogRead(A1);
  int percentageHumididy = map(SensorVal, wet, dry, 100, 0);
  Serial.println(analogRead(A1));
  
  //Lcd Screen
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temperatur:"); lcd.print(tempC);
  lcd.setCursor(0,1);
  lcd.print("Bodenfeuchte:");lcd.print(percentageHumididy);lcd.print("%");
  lcd.setCursor(0,2);
  lcd.print("1 Von:"); lcd.print(OnHour); lcd.print(":"); lcd.print(OnMin); lcd.print("-"); lcd.print(OffHour); lcd.print(":"); lcd.print(OffMin);
  lcd.setCursor(0,3);
  lcd.print("2 Von:"); lcd.print(OnHour2); lcd.print(":"); lcd.print(OnMin2); lcd.print("-"); lcd.print(OffHour2); lcd.print(":"); lcd.print(OffMin2);

Das ist die Funktion Zeitabfrage:

void Zeitabfrage(){
  //Zeitabfrage
  dt = clock.getDateTime();
  if (dt.hour == OnHour && dt.minute == OnMin || dt.hour == OnHour2 && dt.minute == OnMin2){
    Serial.println("Bewässerung läuft");
  }
  if (dt.hour == OffHour && dt.minute == OffMin || dt.hour == OffHour2 && dt.minute == OffMin2){
    Serial.println("Bewässerung läuft nicht");
  }
}

Du solltest den Sketch schon komplett posten.
In deiner Zeitabfrage sieht man nichts davon, wie du die Zeit auf dein Display schreibst.

Meine Zeit möchte ich nicht aufs Display schreiben, nur die Start und Endpunkte meiner beiden Zeiträume, wenn man sich in diesem Zeitraum befindet soll das Relay angehen, das ist aber hier noch nicht im Sketch, bis jetzt wird nur im Serial Monitor ausgegeben ob man in dem Zeitraum angekommen ist.

Dennoch hilft uns dein Code-Fragment nicht. Also bitte kompletten Sketch posten.

#include <DS3231.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//Moisture Sensor
const int dry = 804;
const int wet = 420;

//Lcd Screen
LiquidCrystal_I2C lcd(0x27,20,4);

//Thermistor
int tempPin = 0;

//Time Module
DS3231 clock;
RTCDateTime dt;

//Zeitraum 1
const int OnHour = 8;
const int OnMin = 30;
const int OffHour = 10;
const int OffMin =30;
//Zeitraum 2
const int OnHour2 = 18;
const int OnMin2 = 15;
const int OffHour2 = 20;
const int OffMin2 =15;

//Relay
Relay = 12;

void setup() {
  //Time Module
  Serial.begin(9600);
  
  //Lcd Screen
  lcd.init();
  lcd.init();

  //Relay
  pinMode(Relay,OUTPUT);
}

void loop() { 


  //Zeitabfrage
  dt = clock.getDateTime();
  if (dt.hour == OnHour && dt.minute == OnMin || dt.hour == OnHour2 && dt.minute == OnMin2){
    Serial.println("Bewässerung läuft");
    digitalWrite(Relay, HIGH);
  }
  if (dt.hour == OffHour && dt.minute == OffMin || dt.hour == OffHour2 && dt.minute == OffMin2){
    Serial.println("Bewässerung läuft nicht");
    digitalWrite(Relay, LOW);
}

  //Thermistor
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius

  //Moisture Sensor
  int SensorVal = analogRead(A1);
  int percentageHumididy = map(SensorVal, wet, dry, 100, 0);
  Serial.println(analogRead(A1));
  
  //Lcd Screen
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temperatur:"); lcd.print(tempC);
  lcd.setCursor(0,1);
  lcd.print("Bodenfeuchte:");lcd.print(percentageHumididy);lcd.print("%");
  lcd.setCursor(0,2);
  lcd.print("1 Von:"); lcd.print(OnHour); lcd.print(":"); lcd.print(OnMin); lcd.print("-"); 
  lcd.print(OffHour); lcd.print(":"); lcd.print(OffMin);
  lcd.setCursor(0,3);
  lcd.print("2 Von:"); lcd.print(OnHour2); lcd.print(":"); lcd.print(OnMin2); lcd.print("-"); lcd.print(OffHour2); lcd.print(":"); lcd.print(OffMin2);
}

Aktuell kann ich keinen Fehler erkennen, leider auch den Sketch nicht kompilieren, da ich die von dir genutzte RTC-Library nicht habe.

Kannst du denn mal ein paar serielle Ausgaben reinhängen, um zu erkennen, wo es hakt ?

Hallo,

was meinst Du mit kein Blid mehr und Zeitabfrage aktiviert.

hast Du für die RTC ein sheeld verwendet, bei dem eventuell A12 benutzt wird.

Heinz

Hi

Also Dein Problem kommt, wenn Du diese Zeile
dt = clock.getDateTime();
aktiv hast?

Hätte ja mehr auf lcd.backlight(); getippt, daß Das Dort abgeschaltet wird (hätte eine 1 oder 0 innerhalb der Klammer vermutet).

MfG

Hallo,

//Relay
Relay = 12;

const int Relay=12;

da harkt der Compiler , ansonsten finde ich auch keinen Fehler. Kenne abe auch die Lib nicht

lcd.backlight();

steht im Beispiel der Lib auch so drin.

der Kram mit der RTC steht auch im Beispiel der Lib so drin.

ich hab leider kein Ic2 Display

Heinz

xhansdampfx:

#include <DS3231.h>

int tempPin = 0;

//Lcd Screen
 lcd.init();
 lcd.init();

Welche DS3231 lib? Bitte einen Link dahin - github hat soviele unzählige Ergebnisse...
Der PIN 0 ist RX - das soll sicher A0 sein.
Ein init() reicht

Und hier bau mal um:

(dt.hour == OnHour && dt.minute == OnMin || dt.hour == OnHour2 && dt.minute == OnMin2)

änder das mal in

((dt.hour == OnHour && dt.minute == OnMin) || (dt.hour == OnHour2 && dt.minute == OnMin2))

sowie

(dt.hour == OffHour && dt.minute == OffMin || dt.hour == OffHour2 && dt.minute == OffMin2)

in

((dt.hour == OffHour && dt.minute == OffMin) || (dt.hour == OffHour2 && dt.minute == OffMin2))

Hi

Das 0 ist unglücklich, wird aber von analogRead ebenso interpretiert, wie A0 (bzw. genau anders herum).
Also: klappt auch so, wesentlich besser lesbar wird's aber, wenn Du A0 für den analogen Pin schreibst.

MfG

postmaster-ino:
Das 0 ist unglücklich, wird aber von analogRead ebenso interpretiert, wie A0 (bzw. genau anders herum).

Ah - danke für den Hinweis. Das ist das, was im Thread "Framework" schon angesprochen wurde. Immer wieder schön, das einem Einiges abgenommen wird.
Nein, ich werd immer mit A schreiben :wink:

Kann es damit zu tun haben, das mein DS3231 Modul auf SCL und SDA ist und Mein LCD mit SDA auf A4 und SCl auf angeschlossen ist? A5

Die DS3231 Libary wurde bei meinem Elegoo Starter Kit mitgeliefert.

Jetzt habe ich Diesen Code hochgeladen, alles Funktioniert, ich habe jetzt aber nicht Mein DS3231 Modul an die SDA und SCl Pins anschlossen, da der Display ja auch an denen Anschlossen ist (A4 und A5).
Kann ich mein Lcd an anderen Pins anschließen?

#include <DS3231.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//Moisture Sensor
const int dry = 804;
const int wet = 420;

//Lcd Screen
LiquidCrystal_I2C lcd(0x27,20,4);

//Thermistor
int tempPin = A0;

//Time Module
DS3231 clock;
RTCDateTime dt;

//Zeitraum 1
const int OnHour = 8;
const int OnMin = 30;
const int OffHour = 10;
const int OffMin =30;
//Zeitraum 2
const int OnHour2 = 18;
const int OnMin2 = 15;
const int OffHour2 = 20;
const int OffMin2 =15;

//Relay
int Relay = 12;

void setup() {
  //Time Module
  Serial.begin(9600);
  
  //Lcd Screen
  lcd.init();
  lcd.init();

  //Relay
  pinMode(Relay,OUTPUT);
}

void loop() { 


  //Zeitabfrage
  dt = clock.getDateTime();
  if ((dt.hour == OnHour && dt.minute == OnMin) || (dt.hour == OnHour2 && dt.minute == OnMin2)){
    Serial.println("Bewässerung läuft");
    digitalWrite(Relay, HIGH);
  }
  if ((dt.hour == OffHour && dt.minute == OffMin) || (dt.hour == OffHour2 && dt.minute == OffMin2)){
    Serial.println("Bewässerung läuft nicht");
    digitalWrite(Relay, LOW);
}

  //Thermistor
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius

  //Moisture Sensor
  int SensorVal = analogRead(A1);
  int percentageHumididy = map(SensorVal, wet, dry, 100, 0);
  Serial.println(analogRead(A1));
  
  //Lcd Screen
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Temperatur:"); lcd.print(tempC);
  lcd.setCursor(0,1);
  lcd.print("Bodenfeuchte:");lcd.print(percentageHumididy);lcd.print("%");
  lcd.setCursor(0,2);
  lcd.print("1 Von:"); lcd.print(OnHour); lcd.print(":"); lcd.print(OnMin); lcd.print("-"); lcd.print(OffHour); lcd.print(":"); lcd.print(OffMin);
  lcd.setCursor(0,3);
  lcd.print("2 Von:"); lcd.print(OnHour2); lcd.print(":"); lcd.print(OnMin2); lcd.print("-"); lcd.print(OffHour2); lcd.print(":"); lcd.print(OffMin2);
}

I2C ist ein Bus und du kannst problemlos mehrere I2C-Module anschließen.
Die müssen nur unterschiedliche Adressen haben.

Wie ändere ich diese Adressen, und wo mache ich das im Code? Schon mal Danke für die Info!

xhansdampfx:
Wie ändere ich diese Adressen, und wo mache ich das im Code? Schon mal Danke für die Info!

Das hängt vom Modul ab.
Manche Bausteine haben nur eine feste Adresse, bei einigen kannst du die ändern.
Wie, das steht im jeweiligen Datenblatt und muss dann im Sketch bei der Initialisierung angepasst werden.
Z.B. beim Display die "0x27".

xhansdampfx:
Die DS3231 Libary wurde bei meinem Elegoo Starter Kit mitgeliefert.

Jetzt habe ich Diesen Code hochgeladen, alles Funktioniert, ich habe jetzt aber nicht Mein DS3231 Modul an die SDA und SCl Pins anschlossen, da der Display ja auch an denen Anschlossen ist (A4 und A5).

I2C ist ein BUS. Die angeschlossenen Geräte "quatschen" über ihre Adressen.
Das, was Du beim Initialisieren vom Display mit 0x27 übergibst, ist die Adresse. Der Schaltkreis kann unterschiedliche Adressen annehmen.
Die DS3231 hat nur eine Adresse - man ist wohl davon ausgegangen, das nur eine Uhr gebraucht wird, aber mehrere Displays möglich sein könen.
Für die Uhr ist die Adresse fest in der LIB verankert.

Kann ich mein Lcd an anderen Pins anschließen?

ja.
i2c kann man auch mit Software bauen, willst Du aber nicht :wink:
Der Diplay lässt sich auch mit 4 oder 8 digitalen Pins betreiben, aber wie schon HotSystems schrub:nicht nötig.

  //Lcd Screen
  lcd.init();
  lcd.init();

Das ist immer noch drin...

xhansdampfx:
Wie ändere ich diese Adressen, und wo mache ich das im Code? Schon mal Danke für die Info!

Das brauchst Du nicht!

Ändern der Adressen auf der Platine. Mit Steckbrücken oder Lötpunkten.

Nur nicht bei der Uhr - da ist sie fest.

Hi

Die Slaves haben meist eine feste Basic-Adresse.
Wenn Pins A0...A2 vorhanden sind, kann man Diese auf Vdd oder GND legen und damit die Adresse umstellen.
(A0...A2 wären 3 Adresspins, wären 8 mögliche Adressen, also 8 dieser Slaves können gleichzeitig am Bus hängen und separat angesprochen werden).
Ohne die Ax Pins ist eben nur dieser eine Slave möglich - andere Slaver (also andere basis-IDs) gehen natürlich trotzdem.

Achtung: Je nach I²C-Slave bringen Die eigene Pull-UP-Widerstände mit - wenn der Gesamt-Widerstand zu klein wird, klappt der Bus nicht mehr!
Besser Slaves kaufen, Die KEINE eigenen Widerstände enthalten haben.

MfG