Zeitgesteuerte Relais Funktionen...Ich werd Wahnsinnig

Hallo,

ich bin noch frisch in der Arduino Welt und wollte eine simple Steuerung für mein Aquarium auf Basis eines Uno´s aufbauen.

Gesagt getan. Relaiskarte gelötet, Pumpen eingebau, Display eingebaut bis hierher kein Problem.

Dann gings ans Coden soweit funktionier auch alles zufriedenstellend, allerdings klappt die "Zeitschaltuhr" nicht.

Ich möchte 3 Ausgänge über jeweils 2 Zeiten, also z.b. 8.00 Uhr bis 12.00 Uhr und 14.00 Uhr bis 21.00 Uhr schalten.

Und ich bekomm es einfach nicht hin...das Ding macht was es will. :astonished:
Mal funktionier der Code mal wieder nicht....
Ich häng ihn mal an, ich hoffe einer kann mir helfen.

Schonmal Danke im Vorraus.

#include <Timer.h>
#include <DS1307.h>
#include <Wire.h>
#include <LiquidCrystal.h>


int P1 = 6;                                               //Pumpe 1 an PIN 6
int P2 = 7;                                               //Pumpe 2 an PIN 7     
int S1 = 8;                                               //Licht an PIN 8
int S2 = 13;                                              //Mondlicht an PIN 13
int S3 = 10;                                              //CO² an PIN 10 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);   

int S1_An1 = 800;            //Licht an Zeit 1 (Std,Min,Sek)
int S1_Aus1 = 1200;           //Licht aus Zeit 1 (Std,Min,Sek)
int S1_An2 = 1400;            //Licht an Zeit 2 (Std,Min,Sek)
int S1_Aus2 = 2130;           //Licht aus Zeit 2 (Std,Min,Sek)

int S2_An1 = 730;            //Mondlicht an Zeit 1 (Std,Min,Sek)
int S2_Aus1 = 800;           //Mondlicht aus Zeit 1 (Std,Min,Sek)
int S2_An2 = 2129;            //Mondlicht an Zeit 2 (Std,Min,Sek)
int S2_Aus2 = 2330;           //Mondicht aus Zeit 2 (Std,Min,Sek)

int S3_An1 = 745;            //CO² an Zeit 1 (Std,Min,Sek)
int S3_Aus1 = 1215;           //CO² aus Zeit 1 (Std,Min,Sek)
int S3_An2 = 1345;            //CO² an Zeit 2 (Std,Min,Sek)
int S3_Aus2 = 2145;           //CO² aus Zeit 2 (Std,Min,Sek)

int P1_An = 836;             //Pumpe1 an Zeit 1 (Std,Min,Sek)
Timer t1;                    //Timer für Pumpe1 definieren
long P1_Dauer = 10;           // Dauer wie lange gepumpt wird in Sek.

int P2_An = 836;            //Pumpe2 an Zeit 2 (Std,Min,Sek)
Timer t2;                    //Timer für Pumpe2 definieren
long P2_Dauer = 15;           // Dauer wie lange gepumpt wird in Sek.

//************************************************************************************************************************
void setup(void) {
  
  
//  RTC.stop();                                  //Uhr stellen
//  RTC.set(DS1307_SEC,0);
//  RTC.set(DS1307_MIN,23);
//  RTC.set(DS1307_HR,9);
//  RTC.set(DS1307_DOW,6);
//  RTC.set(DS1307_DATE,23);
//  RTC.set(DS1307_MTH,02);
//  RTC.set(DS1307_YR,13);
//  RTC.start();
  
  
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);

  t1.pulse(P1, P1_Dauer*1000,LOW); // Timer für Pumpe 1
  t2.pulse(P2, P2_Dauer*1000,LOW); // Timer für Pumpe 2

  Wire.begin();                   //I2C bus

  lcd.begin(20, 4);               //LCD-Anzeige initialisieren
  lcd.clear();                    //LCD leeren
}
//***************************************************************************************************
void loop(void){
  //Get time from DS1307***** 
  int minute, hour, second, date, month, year, tens, ones, key; 
  int mil_time;

  hour = RTC.get(DS1307_HR,true);                        //Militärzeit  [0,23]
  minute = RTC.get(DS1307_MIN,false);
  second = RTC.get(DS1307_SEC,false);
  // date = RTC.get(DS1307_DATE,false);
  // month = RTC.get(DS1307_MTH,false);
  // year = RTC.get(DS1307_YR,false);
  mil_time = (hour * 100) + minute  ;  //Zeitformat 0000,2400

  //*****************************************Relais Steuerung************************************************
  //*********************************************Licht********************************************************

  if((S1_Aus1 < S1_An1) && (S1_An1 <= mil_time || S1_Aus1 > mil_time) || (S1_An1 <= mil_time && S1_Aus1 > mil_time)) 
  {
    digitalWrite(S1, HIGH);
  }
  else
  {
    digitalWrite(S1, LOW);
  }

  if((S1_Aus2 < S1_An2) && (S1_An2 <= mil_time || S1_Aus2 > mil_time) || (S1_An2 <= mil_time && S1_Aus2 > mil_time)) 
  {
    digitalWrite(S1, HIGH);
  }
  else
  {
    digitalWrite(S1, LOW);
  }
  //********************************************Mondlicht******************************************************  
  if((S2_Aus1 < S2_An1) && (S2_An1 <= mil_time || S2_Aus1 > mil_time) || (S2_An1 <= mil_time && S2_Aus1 > mil_time)) 
  {
    digitalWrite(S2, HIGH);
  }
  else
  {
    digitalWrite(S2, LOW);
  }

  if((S2_Aus2 < S1_An2) && (S2_An2 <= mil_time || S2_Aus2 > mil_time) || (S2_An2 <= mil_time && S2_Aus2 > mil_time)) 
  {
    digitalWrite(S2, HIGH);
  }
  else
  {
    digitalWrite(S2, LOW);
  }
  //************************************************CO2**********************************************************
  if((S3_Aus1 < S3_An1) && (S3_An1 <= mil_time || S3_Aus1 > mil_time) || (S3_An1 <= mil_time && S3_Aus1 > mil_time)) 
  {
    digitalWrite(S3, HIGH);
  }
  else
  {
    digitalWrite(S3, LOW);
  }

  if((S3_Aus2 < S3_An2) && (S3_An2 <= mil_time || S3_Aus2 > mil_time) || (S3_An2 <= mil_time && S3_Aus2 > mil_time)) 
  {
    digitalWrite(S3, HIGH);
  }
  else
  {
    digitalWrite(S3, LOW);
  }
  //************************************************Pumpe 1**********************************************************
  if(P1_An == mil_time )
    t1.update();
  else
  {
    digitalWrite(P1, LOW);
  }
  //************************************************Pumpe 2**********************************************************
  if(P2_An == mil_time )
    t2.update();
  else
  {
    digitalWrite(P2, LOW);
  }  
  //*******************************************************************************************************************  
  //*******************************************************************************************************************

  //*********************************************LCD Anzeige Uhrzeit Ausgabe*******************************************
  lcd.setCursor(0,0); 
  lcd.print ("Aquaduino");

  lcd.setCursor(10,0);                    //Stunde
  if (hour < 10)
    lcd.print("0");
  lcd.print( hour );

  lcd.print(":");                        //Minute
  if( minute < 10)
    lcd.print("0");
  lcd.print( minute);

  lcd.print(":");                         //Sekunde
  if( second < 10)
    lcd.print("0");
  lcd.print(second);  
  //**************************************************LCD Status Anzeige *******************************************
  lcd.setCursor(0,1);                      //Licht
  lcd.print("Licht");
  lcd.setCursor(7,1);
  if(digitalRead(S1) == HIGH){
    lcd.print("An ");
  }
  else{
    lcd.print("Aus");
  }

  lcd.setCursor(0,2);                      //Mondlicht
  lcd.print("MLicht");
  lcd.setCursor(7,2);
  if(digitalRead(S2) == HIGH){
    lcd.print("An ");
  }
  else{
    lcd.print("Aus");
  }  

  lcd.setCursor(0,3);                      //CO2
  lcd.print("CO2");
  lcd.setCursor(7,3);
  if(digitalRead(S3) == HIGH){
    lcd.print("An ");
  }
  else{
    lcd.print("Aus");
  }   

  lcd.setCursor(11,1);                      //Pumpe 1
  lcd.print("P1");
  lcd.setCursor(14,1);
  if(digitalRead(P1) == HIGH){
    lcd.print("An ");
  }
  else{
    lcd.print("Aus");
  } 

  lcd.setCursor(11,2);                      //Pumpe 2
  lcd.print("P2");
  lcd.setCursor(14,2);
  if(digitalRead(P2) == HIGH){
    lcd.print("An ");
  }
  else{
    lcd.print("Aus");
  }     
}

Ich habs nur überflogen. Das mit der Miitärzeit gefällt mir schon mal gar nicht, aber egal.
Ich denke deine Abfragen sind falsch, die müssen verknüpft werden.
Beispiel: du fragst ist die Zeit zwischen 8 und 12 wenn ja Licht an. Direkt danach fragst du ist es zwischen 14 und
21.30. Das ist es natürlich nicht, also Licht wieder aus u.s.w.
gruß

Was hältst du hier von:

//Datum und Zeitfunktionen nutzen einen DS1307 RTC Chip,
//die Verbindung findet über I2C und die Wire Bibliothek statt
#include <Wire.h>
#include "RTClib.h"
 
RTC_DS1307 RTC;
int zwischenvariable = 0;
int ledpin = 13;
// LED ist zwischen 15 und 20 Uhr an
int hourOn = 15;
int hourOff = 20;
 
void setup () {
    Wire.begin();
    RTC.begin();
    //pinMode definiert das über den angegebenen Pin (hier ledpin, also 13)
    //ein Signal ausgegeben wird
    pinMode(ledpin,OUTPUT);
    if (! RTC.isrunning())
    {
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}
 
void loop () {
    //Übergeben der Zeitwerte an die Variable now (Zeit in Millisekunden seit 1970)
    DateTime now = RTC.now();
    //Vergleich zwischen now.hour() und den definierten An-Aus-Variablen
    if(now.hour()>=hourOn && now.hour()<hourOff)
    {
      //If-Vergleich ergibt true
      digitalWrite(ledpin,HIGH);
    }
    else
    {
      //If-Vergleich ergibt false
      digitalWrite(ledpin,LOW);
    }
    //delay(5); muss eben manchmal genutzt werden
}

Nemonic:
Und ich bekomm es einfach nicht hin...das Ding macht was es will

Du programmierst ja auch, was Du willst!
So what?

Die einfachste Schaltlogik bekommst Du realisiert, wenn Du als Vorgabe machst:

  • keine Einschaltzeiten, die über Mitternacht hinausreichen

In dem Fall brauchst Du Dir nur Hilfsvariablen für die Schaltzeiten zu machen, in denen abgelegt wird, ob die aktuelle Zeit innerhalb der zu schaltenden Zeit liegt, also zwisch An- und Ausschaltzeit, oder nicht:

boolean Schaltzeit1, Schaltzeit2, Schaltzeit3;

Dann setzt Du die Hilfsvariablen, je nachdem ob die aktuelle Zeit zwischen der jeweiligen Ein- und Ausschaltzeit liegt:

Schaltzeit1= (mil_time >= S1_An1 &&  mil_time < S1_Aus1);
Schaltzeit2= (mil_time >= S1_An2 &&  mil_time < S1_Aus2);
Schaltzeit3= (mil_time >= S1_An3 &&  mil_time < S1_Aus3);

Wenn Du Dich innerhalb einer der drei Schaltzeiten befindest, schaltest Du den Ausgang HIGH, sonst LOW:

if(Schaltzeit1 || Schaltzeit2 || Schaltzeit3)
  digitalWrite(S1, HIGH);
else
  digitalWrite(S1, LOW);

Also erstmal: Übersichtlich programmieren, bis es funktioniert!

Wenn es dann funktioniert und Du den RAM-Speicherplatz für die drei Hilfsvariablen wieder einsparen möchtest, kannst Du die Hilfsvariablen am Ende wieder rausschmeissen, indem Du alles in eine extra lange if-Abfrage reinpackst und die Hilfsvariablen wieder einsparst, wenn es Dir auf diese 3 Bytes RAM mehr ankommt als auf übersichtlichen Code.

Das meine 2te Abfrage die erste zu nichte macht war der Hinweis den ich brauchte.

Jetzt hab ich im ersten Schritt über eine lange If Abfrage meine Lösung bekommen.

Das mit den Boleans schau ich mir im Nachgang an.

Danke Euch für die Hilfe.

Aber 1. Warum ist das mit der Militärzeit eine unschöne Lösung?
2. Ich dachte ich hätte recht übersichtlich programmiert?