Zeitschaltuhr Relais RTC1307

Hallo,
ich bräuchte ein bissl Hilfe zum einfacheren programmieren des nachfolgenden Sketches.

Realisiert wurde mit einem

  • ArduinoUno
    -LCD 16/2
    -DS1307RTC
  • 4-fach Relais Shield

eine einfache Terra-Steuerung.
Es funktioniert alles mehr oder weniger gut, mal gehts auch garnicht.

Elektrisch und elektronisch ist alles richtig angeschlossen es geht einfach nur ums programmieren.
Ich hätte gern folgendes einfacher und übersichtlicher, eventuell mit Variablen, programmiert.

Relais_1 08:00 Uhr AN
Relais_1 19:30 Uhr AUS

Relais_2 08:05 Uhr AN
Relais_2 19:35 Uhr AUS

Relais_3 08:10 Uhr AN
Relais_3 19:40 Uhr AUS

Relais_4 08:30 Uhr für 25 Sekunden AN
Relay_4 20:00 Uhr für 25 Sekunden AN die übrige Zeit ist Relais_4 AUS

Hier mein bisheriger CODE.....

#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);

#define RELAY_ON 0
#define RELAY_OFF 1

#define Relay_1 10 // 50W Spot
#define Relay_2 11 // Tageslicht 150W
#define Relay_3 12 // LuckyReptile 70W
#define Relay_4 13 // Beregnungsanlage

void setup()
{
  Serial.begin(9600); // initialisieren serielle Kommunikation
  setSyncProvider(RTC.get); // holen Zeit von RTC(Uhr)
  
  // Nur zur Kontrolle:
  if(timeStatus()!= timeSet) // wenn Status geaendert
  {
     Serial.println("Synchronisation fehlgeschlagen"); // bei Fehler
  }
  else // sonst ...
  {
     Serial.println("Synchronisation erfolgreich"); // alles ok
  }
  lcd.begin(16, 2);
  
  digitalWrite(Relay_1, RELAY_OFF);
  digitalWrite(Relay_2, RELAY_OFF);
  digitalWrite(Relay_3, RELAY_OFF);
  digitalWrite(Relay_4, RELAY_OFF);
  
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
}

void loop()
{
   digitalUhrAnzeige();
   delay(500);
   Relais1();
   Relais2();
   Relais3();
   Relais4();
}

void digitalUhrAnzeige()
{
   // digitale Anzeige der Zeit
   lcd.setCursor(0, 0); // positionieren LCD-Cursor, 1. Zeile, 1. Spalte
   printZiffernGenulltOhnePunkt(hour()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(minute()); // rufen Subroutine auf
   //printZiffernGenulltmitPunkt(second()); // rufen Subroutine auf
   Serial.print(" "); // fuegen Freizeichen ein
   lcd.print(" "); // fuegen Freizeichen ein
   lcd.setCursor(0, 1);
   printZiffernGenulltOhnePunkt(day()); // rufen Subroutine auf
   Serial.print("."); // fuegen Freizeichen ein
   lcd.print("."); // fuegen Freizeichen ein
   printZiffernGenulltOhnePunkt(month()); // rufen Subroutine auf
   Serial.print("."); // fuegen Freizeichen ein
   Serial.println(year()); // Zeilenvorschub
   lcd.print(".");  
   printZiffernGenulltOhnePunkt(year());
}

void printZiffernGenulltOhnePunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  if(zahl < 10) // wenn kleiner als 10 ...
   {
     Serial.print(""); // fuehrende 0 einfuegen
     lcd.print("");  // fuehrende 0 einfuegen
   }
   Serial.print(zahl); // Ausgabe auf serieller Konsole
   lcd.print(zahl); // Ausgabe auf LCD     
}

void printZiffernGenulltmitPunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  Serial.print(":"); // trennende ":" einfuegen
  lcd.print(":"); // trennende ":" einfuegen
  if(zahl < 10) // wenn kleiner als 10 ...
  {
     Serial.print('0'); // fuehrende 0 einfuegen
     lcd.print('0');
  }
  Serial.print(zahl); // Ausgabe auf serieller Konsole
  lcd.print(zahl);
}

void Relais1() { // 50W Spot

  if((hour()>=8 && minute()>=0) && (hour()<=19 && minute()<=30))
  {
    digitalWrite(Relay_1, RELAY_ON);
  }
  else
  {
    digitalWrite(Relay_1, RELAY_OFF);
  }
}

void Relais2() { // Tageslicht 150W

  if((hour()>=8 && minute()>=5) && (hour()<=19 && minute()<=35))
  {
    digitalWrite(Relay_2, RELAY_ON);
  }
  else
  {
    digitalWrite(Relay_2, RELAY_OFF);
  }
}

void Relais3() { // LuckyReptile 70W

  if((hour()>=8 && minute()>=10) && (hour()<=19 && minute()<=40))
  {
    digitalWrite(Relay_3, RELAY_ON);
  }
  else
  {
    digitalWrite(Relay_3, RELAY_OFF);
  }
}

void Relais4() { //Beregnungsanlage

  if(hour()==8 && minute()==30)
  {
    digitalWrite(Relay_4, RELAY_ON);
    delay(25000);
    digitalWrite(Relay_4, RELAY_OFF);
  }
  else
  {
    digitalWrite(Relay_4, RELAY_OFF);
  }
  
  if(hour()==20 && minute()==00)
  {
    digitalWrite(Relay_4, RELAY_ON);
    delay(25000);
    digitalWrite(Relay_4, RELAY_OFF);
  }
  else
  {
    digitalWrite(Relay_4, RELAY_OFF);
  }
}

Wanderfalke:
Es funktioniert alles mehr oder weniger gut, mal gehts auch garnicht.

Bei Deinem Code ist das ja auch kein Wunder:

if((hour()>=8 && minute()>=5) && (hour()<=19 && minute()<=35))

Das bedeutet soviel wie
Zwischen 08:05 Uhr und 19:35 Uhr schalte wie folgt:

  • wenn Minute >=5 und Minute<=35 ==> EIN
  • wenn Minute >35 oder Minute <5 ==> AUS
    D.h. in der angegebenen Zeit immer eine halbe Stunde ein- und eine halbe Stunde ausschalten.

Das ist nicht genau das, was Du programmieren wolltest, oder

Rechne die Zeit auf Minuten um und arbeite mit denen .
Grüße Uwe

Ja genau so wollte ich es ja nicht haben.

Es sollte um 08:05 angehen und um 19:30 ausgehen, nicht mehr nicht weniger.

Für die Zeitschaltfunktion ist die TimeAlarms Lib gut:
http://www.pjrc.com/teensy/td_libs_TimeAlarms.html

Funktioniert bei mir einwandfrei und ist schon auf die Time Lib ausgelegt. Das muss man nicht per Hand machen.

Du gibt da einfach die Stunden, Minuten, und Sekunden, sowie eine Callback-Funktion an und die Funktion wird aufgerufen wenn die Zeit erreicht ist.

Serenifly:
Für die Zeitschaltfunktion ist die TimeAlarms Lib gut:
TimeAlarms Library, Run Functions At Specific Times

Funktioniert bei mir einwandfrei und ist schon auf die Time Lib ausgelegt. Das muss man nicht per Hand machen.

Du gibt da einfach die Stunden, Minuten, und Sekunden, sowie eine Callback-Funktion an und die Funktion wird aufgerufen wenn die Zeit erreicht ist.

Was mach ich wenn der Arduino mal abstürzt um 12Uhr?
Schaltet der den Ausgang dann trotzdem?

Kommt drauf an wie er abstürzt. Wenn er intern Unsinn macht (z.B. Murks mit Pointern) hast du ein Problem. Aber wenn ein Reset erfolgt, läuft das Programm wieder vom Anfang und funktioniert.

Das ist aber unabhängig davon wie man das genau implementiert.

Ich hab mal die TimeAlarm inplementiert.

Also wenn es im Moment 19:00 Uhr ist und der Ausgang um 19:05 auf HIGH geschaltet werden soll dann macht der das auch.
Nur wenn es grad 19:10 ist und der Ausgang 19:05 auf HIGH geschaltet werden soll dann macht der das natürlich nicht.

Vielleicht hilft das:
http://forum.arduino.cc/index.php/topic,122141.0.html
http://forum.arduino.cc/index.php?topic=123859.0
http://forum.arduino.cc//index.php?topic=68195.0

Wanderfalke:
Nur wenn es grad 19:10 ist und der Ausgang 19:05 auf HIGH geschaltet werden soll dann macht der das natürlich nicht.

Ja, das wird nur ausgelöst wenn der Alarm gesetzt war bevor die Zeit erreicht ist.

Wenn du beim Einstellen des Alarms auch auslösen willst, wenn die Zeit schon vorüber ist musst du die Alarmzeit mit der aktuellen Zeit vergleichen und anpassen wenn die Zeit schon erreicht ist. z.B. ein paar Sekunden oder eine Minute in die Zukunft legen.

Bei der Time Lib eignet sich für solche Vergleiche auch gut die Zeit in time_t. Das sind die Sekunden seit 1970. Dann muss man nicht Stunden und Minuten einzeln vergleichen. Die kann man auch voneinander abziehen und die Differenz in andere Einheiten umrechnen.

Wanderfalke:
Also wenn es im Moment 19:00 Uhr ist und der Ausgang um 19:05 auf HIGH geschaltet werden soll dann macht der das auch.
Nur wenn es grad 19:10 ist und der Ausgang 19:05 auf HIGH geschaltet werden soll dann macht der das natürlich nicht.

Ich habe mal meinen RTC-Demo Sketch um ein paar Schaltfunktionen aufgebohrt.
Kannst Du ja mal ausprobieren.

Es sind drei Zeitschaltuhren (Ausgänge) mit je einer Schaltzeit pro Tag implementiert.
Und ein Kurzzeit-Timer mit zwei Schaltzeiten pro Tag, der nur wenige Sekunden laufen soll.

Probier mal aus, Code hängt als Dateianhang dran.

Mögliche Anpassungen sind die Art wie der Ausgang geschaltet werden soll, wenn also das Relais "active LOW" schaltet (ist z.B. der Fall bei mechanischen Relais mit Optokoppler), dann ändere die Definition auf:
#define EIN LOW
#define AUS HIGH

Und anpassbar im Quellcode sind die Schaltzeiten an den verschiedenen Relais

schaltRelais_t schaltRelais[3]={
{10, 800, 1930}, // pin, Einschaltzeit, Ausschaltzeit
{11, 805, 1935},
{12, 810, 1940},
};

Erste Angabe in der Zeile ist die Pin-Nummer, dann die Einschaltzeit, dann die Ausschaltzeit

Wichtig ist, dass Du keine Zahlen mit "führenden Nullen" angibst, sonst betrachtet der Compiler die Angabe als "Oktalzahl" und das wird dann falsch interpretiert. Also Zeitangaben nach 10:00 Uhr so codieren:
1930 ==> entspricht 19:30 Uhr
und bei Zeiten vor 10:00 Uhr die führenden Nullen unbedingt weglassen, z.B.
803 ==> entspricht 08:03 Uhr
830 ==> entspricht 08:30 Uhr
45 ==> entspricht 00:45 Uhr
3 ==> entspricht 00:03 Uhr
0 ==> entspricht 00:00 Uhr

Die laufende Uhrzeit der Echtzeituhr (DS1307 oder DS3231 wahlweise) kann über den seriellen Monitor direkt mit einem set-Befehl eingestellt werden, ohne dass ein neuer Sketch hochgeladen werden müßte.

ZeitschaltUhrMitTimer.ino (7.77 KB)

1 Like

Probier mal aus, Code hängt als Dateianhang dran.

Hab ich gemacht, es funktioniert.

Bis ich bei deinem Code so einigermaßen durchgeblickt bin...

Jetzt muss ich noch versuchen die Zeit aufs LCD zu bekommen, eventuell noch die Stellung der Relais.

Danke Jurs.

2 Fragen hab ich dennoch.....

Warum klicken die Relais wenn man einen redet macht oder den Arduino neu startet?
Bei meinem eigenen Code gibt es manchmal Fehlanzeigen auf dem Display , was durch einen Reset wieder weg ist.

Also mein eigener Code funktioniert auch, aber nur wenn ich die Die vollen Stunden als Variablen Berechnung zugrunde ziehe. Wenn ich Minuten einbinden will, is aus die Maus.

Serenifly:
Für die Zeitschaltfunktion ist die TimeAlarms Lib gut:
TimeAlarms Library, Run Functions At Specific Times

Funktioniert bei mir einwandfrei und ist schon auf die Time Lib ausgelegt. Das muss man nicht per Hand machen.

Du gibt da einfach die Stunden, Minuten, und Sekunden, sowie eine Callback-Funktion an und die Funktion wird aufgerufen wenn die Zeit erreicht ist.

TimeAlarm funktioniert nur wenn ich -settime- benutze

wenn, wie ich, -setsynctime- geht TimeAlarm nicht, warum auch immer, der bekommt irgendwie die zeit nicht.

Wanderfalke:
Warum klicken die Relais wenn man einen redet macht oder den Arduino neu startet?

Relais klicken immer dann, wenn sie schalten.

Bezieht sich die Frage:
a) Auf Deinem Code?
b) Auf meinen Code?
c) Oder nur allgemein?

Der von mir gepostete Code ist so wie gepostet für Relais mit "Active HIGH" Schaltlogik vorgesehen, also dass das Relais schaltet, wenn der Eingang am Relais HIGH geschaltet wird:
#define EIN HIGH
#define AUS LOW
Das ist zum Beispiel der Fall bei SSR (Halbleiter) Wechselstromrelais zum Schalten von Wechselstrom.

Wenn Du mechanische Relais hast, bei denen im Eingang Optokoppler sitzen, dann haben diese eine inverse Schaltlogik und die Relais schalten "Active LOW", also immer wenn der Ausgang LOW ist. Mein Code ist auch für den Fall vorbereitet, allerdings mußt Du dann die Schaltlogik der Relais im Code vertauschen:
#define EIN LOW
#define AUS HIGH
In dem Fall bedeutet dann "EIN" den Status "LOW" am Relais und "AUS" bedeutet "HIGH".
Muss man dann eben im Programm konsequent EIN und AUS verwenden, wenn es um die Relais geht, dann kann man es ganz leicht per #define umkonfigurieren und das Programm läuft mit SSR Halbleiter-Relais genau so wie mit mechanischen Relais mit Optokopplern im Eingang.

Wanderfalke:
Bei meinem eigenen Code gibt es manchmal Fehlanzeigen auf dem Display , was durch einen Reset wieder weg ist.

Das hört sich nach mechanischen Relais an, in Verbindung mit mangelhafter Entstörung der Schaltkontakte beim Schalten von Strömen. Stichwort "Löschschaltung" oder "Snubber". Dann gibt es beim Schalten immer einen schönen, dicken Funken, der erzeugt gewaltige elektromagnetische Störungen, und an Deinem Arduino wirkt jede "lange Leitung", egal ob Leiterbahn auf der Platine oder angeschlossener Draht, als Empfangsantenne für Störungen. Wenn die Störungen ausreichend groß sind, kippt der Pegel, z.B. auf einer Leitung zum Display, dann zeigt das Display Datenmüll.

Da SSR-Halbleiterrelais inzwischen sehr preiswert zu bekommen sind und die meisten Forenteilnehmer hier keine ausreichenden Kenntnisse zur Auswahl und Berechnung von Löschschaltungen/Snubbern haben, verwenden die meisten zum störungsfreien Schalten von Wechselstrom nur noch SSR-Halbleiterrelais.

Was den Code zum Einbinden einer LCD angeht, so bietet es sich an, eine Uhrzeit einmal pro Sekunde zu aktualisieren. In der loop werden bereits andere Aktionen im Sekundentakt ausgeführt. Es bietet sich also an, hier den Funktionsaufruf zum Updaten des Displays mit einzuklinken, am besten unmittelbar nach dem Auslesen der Zeit:

 if (millis()-lastMillis>1000) // nur einmal pro Sekunde
  {
    lastMillis=millis();
    rtcReadTime(dummy, dummy, dummy, stunden, minuten, sekunden);
    updateDisplay(stunden,minuten,sekunden); // ==> Aufruf einer Funktion zum Updaten des Displays
    if (minuten!=lastMinute) // die aktuelle Minute hat gewechselt
    {
      lastMinute=minuten;
      snprintf(buffer,sizeof(buffer),"%02d:%02d Uhr",stunden,minuten);
      Serial.println(buffer);
      relaisSchaltenNachZeit(stunden,minuten);
      relaisTimerNachZeit(stunden,minuten);
    }
  }

Die Zeit übergibst Du an die Funktion, den Zustand der Zeitschalt-Relais kannst Du innerhalb Deiner Display-Routine immer direkt mit digitalRead() am Relais-Pin abfragen.

Der Kurzzeit-Timer ist in meinem Code per "delay()" Aufruf realisiert.
Entweder schreibst Du den Kurzzeit-Timer so um, dass er delay-frei laufen kann.
Oder Du gehst in die Funktion "relaisTimerNachZeit" und gibst Text aus ähnlich wie es dort auf Serial erfolgt, also z.B.

  • vor dem delay() ==> LCD Löschen, Anzeige "Kurzzeittimer"
  • nach dem delay() ==> LCD löschen
    (wird dann in der nächsten nachfolgenden Sekunde wieder von der normalen Displayanzeige aktualisiert)

Wanderfalke:
wenn, wie ich, -setsynctime- geht TimeAlarm nicht, warum auch immer, der bekommt irgendwie die zeit nicht.

Da gibt es etwas das etwas unschön ist:

Alarm.delay(milliseconds);
Alarms and Timers are only checked and their functions called when you use this delay function. You can pass 0 for minimal delay. This delay should be used instead of the normal Arduino delay(), for timely processing of alarms and timers.

Mach einfach Alarm.delay(0) am Ende der loop.

Mach einfach Alarm.delay(0) am Ende der loop.

Hab ich gemacht, und siehe da.... Es funktioniert.

Ich hab jetzt die Beregnung 2 mal am Tag über die Alarmfunktion laufen, jeweils 25 Sekunden.

Danke Serenifly :slight_smile: :slight_smile: :slight_smile:

Relais klicken immer dann, wenn sie schalten.

Bezieht sich die Frage:
a) Auf Deinem Code?
b) Auf meinen Code?
c) Oder nur allgemein?

Allgemein beim Start hat das Relais 4 immer geklickt wie verrückt. Ich hab den Fehler gefunden.
Relais4 war an DigitalPin13 angeschlossen, und der wird irgendwie beim starten vom Bootloader angesprochen.
Da ich aber am UNO nicht mehr DigitalPins zur Verfügung hatte blieb mir nichts anderes übrig wie Den Mega2650 zu benutzen.

Und alles ist gut, kein klicken mehr beim Start oder Reset.

Da SSR-Halbleiterrelais inzwischen sehr preiswert zu bekommen sind und die meisten Forenteilnehmer hier keine ausreichenden Kenntnisse zur Auswahl und Berechnung von Löschschaltungen/Snubbern haben, verwenden die meisten zum störungsfreien Schalten von Wechselstrom nur noch SSR-Halbleiterrelais.

Dann werd ich mal noch mein Relaisshield gegen ein SSR austauschen, dann ist vielleicht auch mein LCD-Quark weg.

Werd dann noch meinen Sketch demnächst hochladen, für andere die es interessiert.

Danke nochmals an Alle Beteiligten für Ihre Hilfe.

Wanderfalke:
Relais4 war an DigitalPin13 angeschlossen, und der wird irgendwie beim starten vom Bootloader angesprochen.

Ja, dafür ist der Bootloader verantwortlich, der läßt die Pin-13 LED blinken.

Wanderfalke:
Da ich aber am UNO nicht mehr DigitalPins zur Verfügung hatte blieb mir nichts anderes übrig wie Den Mega2650 zu benutzen.

Dass Du die Analog-Pins bei Bedarf alle wie sie da sind auch wie Digital-Pins ansprechen könntest und ein UNO damit bis zu 20 digitale Ein-/Ausgänge zur Verfügung hat,, ist Dir aber schon klar?

Beim UNO gilt:
A0= D14
A1= D15
A2= D16
A3= D17
A4= D18
A5= D19

Ob der Arduino bei Dir in einer Schaltung 14 digitale und 6 analoge I/O hat, oder ob er nur 20 digitale Pins hat, das kannst Du Dir selbst aussuchen. Also spräche überhaupt nichts gegen:
pinMode(17,OUTPUT);
digitalWrite(17,HIGH);
auf einem UNO, wenn Du A3/D17 als digitalen Ausgang ansprechen wolltest.

Dass Du die Analog-Pins bei Bedarf alle wie sie da sind auch wie Digital-Pins ansprechen könntest und ein UNO damit bis zu 20 digitale Ein-/Ausgänge zur Verfügung hat,, ist Dir aber schon klar?

Nein das habe ich nicht gewusst....

Aber danke für den Tip.

Ich habs eben ausprobiert, funktioniert wunderbar.

Ich bin auch schon ein bissl weiter.

Momentaner Stand vom TerraControlCenter:

-DS1307RTC ausgebaut
-EthernetShield auf dem UNO Huckepack
-2 DHT11 Sensoren
-LCD 16/2 Display

Ablauf ist folgender im Moment.

  • Zeit wird per NTP von meiner Fritzbox geholt
  • Alle 3min werden beide DHT11 Sensoren ausgelesen und auf dem LCD angezeigt
  • zwischen den Anzeigen wird die aktuelle Zeit auf dem LCD angezeigt
  • jede Stunde werden die 4 SensorWerte per "PHP -get-" gesendet und in eine MYSQL Datenbank eingetragen
  • es können 4 Relais geschaltet werden (Beleuchtung, Beregnung)
  • Relais4-Beregnung schaltet 3mal am Tag zu einer festen Uhrzeit
    *Relais 1-3 Schalten zu festen Zeiten ein und zu festen Zeiten aus (im Moment nur volle Stunde, Minuten muss ich mir noch gedanken machen)

*Die MySQL Sensordaten kann ich in einem Liniendiagramm auf einem Webserver darstellen lassen.
*der Webserver, PHP,MYSQL usw. laufen auf einem RaspberryPi

So das wars erstmal, werde jetzt erstmal einige Tage Testlauf laufen lassen.

jurs:

Wanderfalke:
Also wenn es im Moment 19:00 Uhr ist und der Ausgang um 19:05 auf HIGH geschaltet werden soll dann macht der das auch.
Nur wenn es grad 19:10 ist und der Ausgang 19:05 auf HIGH geschaltet werden soll dann macht der das natürlich nicht.

Ich habe mal meinen RTC-Demo Sketch um ein paar Schaltfunktionen aufgebohrt.
Kannst Du ja mal ausprobieren.

Es sind drei Zeitschaltuhren (Ausgänge) mit je einer Schaltzeit pro Tag implementiert.
Und ein Kurzzeit-Timer mit zwei Schaltzeiten pro Tag, der nur wenige Sekunden laufen soll.

Probier mal aus, Code hängt als Dateianhang dran.

Mögliche Anpassungen sind die Art wie der Ausgang geschaltet werden soll, wenn also das Relais "active LOW" schaltet (ist z.B. der Fall bei mechanischen Relais mit Optokoppler), dann ändere die Definition auf:
#define EIN LOW
#define AUS HIGH

Und anpassbar im Quellcode sind die Schaltzeiten an den verschiedenen Relais

schaltRelais_t schaltRelais[3]={
{10, 800, 1930}, // pin, Einschaltzeit, Ausschaltzeit
{11, 805, 1935},
{12, 810, 1940},
};

Erste Angabe in der Zeile ist die Pin-Nummer, dann die Einschaltzeit, dann die Ausschaltzeit

Wichtig ist, dass Du keine Zahlen mit "führenden Nullen" angibst, sonst betrachtet der Compiler die Angabe als "Oktalzahl" und das wird dann falsch interpretiert. Also Zeitangaben nach 10:00 Uhr so codieren:
1930 ==> entspricht 19:30 Uhr
und bei Zeiten vor 10:00 Uhr die führenden Nullen unbedingt weglassen, z.B.
803 ==> entspricht 08:03 Uhr
830 ==> entspricht 08:30 Uhr
45 ==> entspricht 00:45 Uhr
3 ==> entspricht 00:03 Uhr
0 ==> entspricht 00:00 Uhr

Die laufende Uhrzeit der Echtzeituhr (DS1307 oder DS3231 wahlweise) kann über den seriellen Monitor direkt mit einem set-Befehl eingestellt werden, ohne dass ein neuer Sketch hochgeladen werden müßte.

Hallo,

ich habe dein Sketch ausprobiert und der Funktionniert für meine Anwendung (Gartenbewässerung) auch recht gut, jedoch müsste ich die Relais mehrmals am Tag einschalten und zwei immer gleichzeitig z.B: R1+R2 von 800, 815 ; R1+R3 von 830, 845 ; R1+R4 von 900, 915 und das gleiche nochmal abends. Kann mir jemand Helfen wie ich das im Sketch ändern kann?

Danke Rico