Probleme mit RTC

Hallo,

ich habe ein kleines Problem bei meiner Steuerung für mein Terrarium mit dem Arduino Nano.

Es sollen zwei unterschiedliche Lampen über eine Zeitschaltuhr EIN und Aus geschaltet werden.
Ausnahme die Temperatur steigt über eine bestimmte Temperatur. Dann soll eine Lampe abgeschaltet werden bis die Temperatur wieder unterschritten wird.

Die Uhrzeit soll auch auf einem LCD Display dargestellt werden.

Die Zeitschaltuhr haut nicht wirklich hin da wohl auch nach der Minutenzahl geschaltet wird und nicht wieder eingeschaltet wird wenn die Temperatur unterschritten wird.

Die Anzeige der Uhrzeit auf dem LCD Display bei Werten unter 10 funktioniert auch nicht. Dann erscheint z.B. 13:98

Hoffe jemand kann mir bei meinem Programm helfen oder mir ein paar Tipps geben.

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN 6                                         
#define DHTTYPE DHT22                                     
DHT dht(DHTPIN, DHTTYPE);                                  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


float feuchte;
float temperatur; 
int LED = 7;
int Strahler = 8;
int LCD_Helligkeit = 9;
int LCD_Kontrast = 10;                              
 
void setup() {
  dht.begin();                              
  lcd.begin(16, 2);
  setSyncProvider(RTC.get);
  pinMode(LED, OUTPUT);
  pinMode(Strahler, OUTPUT);
  pinMode(LCD_Helligkeit, OUTPUT);
  pinMode(LCD_Kontrast, OUTPUT);

     Serial.begin(9600);
}
 
void loop()
{
if ((hour()>= 7 && minute()>= 20 && dht.readTemperature()<= 30)) {  // Zeitschaltuhr Strahler EIN
   digitalWrite(Strahler, LOW);
}
if ((hour()>= 22 && minute()>= 00)||(dht.readTemperature()>= 35)) {  // Zeitschaltuhr Strahler AUS
   digitalWrite(Strahler, HIGH);
}
if ((hour()>= 8 && minute()>= 00)) {  // Zeitschaltuhr LED EIN, LCD Helligkeit auf Tag
   digitalWrite(LED, LOW);
   analogWrite(LCD_Helligkeit, 200);
   analogWrite(LCD_Kontrast, 90);
}
if ((hour()>= 21 && minute()>= 50)) {  // Zeitschaltuhr LED AUS, LCD Helligkeit auf Nacht
   digitalWrite(LED, HIGH);
   analogWrite(LCD_Helligkeit, 30);
   analogWrite(LCD_Kontrast, 90);
}
float feuchte = dht.readHumidity();                           
float temperatur = dht.readTemperature();  

  lcd.setCursor(6, 0);
  lcd.print("Grad");
 
  lcd.setCursor(6, 1);
  lcd.print("% Feuchte");
    
  lcd.setCursor(0, 0);
  lcd.print(temperatur);
 
  lcd.setCursor(0, 1);
  lcd.print(feuchte);
  
if (hour() || minute() >=10) {
  lcd.setCursor(11, 0);
  lcd.print(hour());
  lcd.setCursor(14, 0);
  lcd.print(minute());
  lcd.setCursor(13, 0);
  lcd.print(':');
  delay(1000);
  lcd.setCursor(13, 0);
  lcd.print(' ');
  delay(1000);
 }
 if (hour() <10) {
  lcd.setCursor(12, 0);
  lcd.print(hour());
  lcd.setCursor(11, 0);
  lcd.print("0");
 }
 if (minute() <10) {
  lcd.setCursor(15, 0);
  lcd.print(minute());
  lcd.setCursor(14, 0);
  lcd.print("0");
 }
  Serial.print(hour());
  Serial.print(" ");
  Serial.print(minute());
  Serial.println();
  }

Terrarium.ino (2.2 KB)

Bitte poste deinen Code nicht als Bild, sondern als Text!
Verwende dazu "Code Tags".

Wie sollen wir dir helfen, wenn du uns deinen Sketch nicht zeigst.
Die Bilder helfen nicht dabei.

Poste den Sketch bitte direkt im Forum.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Hallo, das sind keine Code-Tags.
Den Sketch kann kaum ein mobiler User lesen.

Zu deinem Sketch, du musst eine Statusvariable nehmen, die du in der Loop abfragst.

Diese wird entsprechend der Zeit und der Temperatur gesetzt bzw. gelöscht.

Und verwende Funktionen für deine einzelnen Blöcke (Anzeige Uhr, Auswertung Zeit und Auswertung Temperatur), dann wird es übersichtlicher.

Wandle die Stunden, Minuten in Minuten um und arbeite mit diesen um die Zeiten zu kontrollieren.
Grüße Uwe

Ich hoffe, dir ist auch klar, dass die von dir gewählte RTC sehr ungenau ist. Die geht im Jahr um einige Minuten falsch.

Eine bessere ist das die DS3231. Da sind es im Jahr nur sehr wenige Sekunden, wenn überhaupt.

OK, der Sketch ist jetzt lesbar drin, prima....allerdings hast du da leider etwas verschluckt. :wink:

Alles vor der Loop fehlt.

traust dich über structs drüber? ansonsten würde ich die Schaltzeiten einfach in ein Uhrzeitformat 0001 - 2359 konvertieren.

Und die IF's ein wenig strukturieren.

Alles ungetestet, da du kein Setup herzeigst, aber die Idee sool klar sein:

uint16_t actualTime = hour*100+minute();
if (actualTime>=720 && actualTime <=2200) {  // Zeitabhängiges Einschalten: Untertags...
{
  //Serial.println(F("Tagebetrieb"));
  if (digitalRead(Strahler))
  {
   if (dht.readTemperature()>= 35))                                   // über 35 Grad ausschalten
   {
     digitalWrite(Strahler, HIGH);
   }
  else
  {
     if (dht.readTemperature()<= 30))                                   // unter 30 Grad einschalten
     {
        digitalWrite(Strahler, LOW);
     }
  } 
}
else
{
  //Serial.println(F("Nacht AUS"));
  digitalWrite(Strahler, HIGH);
}

if (dht.readTemperature()>= 36)
{
  Serial.println(F("Fische Lebensretter"));
  digitalWrite(Strahler, HIGH);
}