Zeitsteuerung

ElEspanol:
Wieso einmal ein RTC und ein anderes rtc Objekt?

Das kann ich dir leider nicht sagen ich weiß nur wenn ich eins von beiden weg lass gibt´s nen Fehler

Das kommt davon dass du einfach nur Code kopierst. Entscheide dich für eine Bibliothek, erstelle nur ein RTC Objekt und schreibe dann den Rest so um, dass du nur das verwendest.

Also wenn du rtc verwendest, dann ändere Aufrufe von RTC. auch in rtc. um.

Hanzzz98:
Ich habe inzwischen meinen Code Überarbeitet und er lässt sich hochladen gibt dann auch die Uhrzeit, dass Datum und den Zustand des Relais an schaltet es aber nicht um.

Könnt ihr mir sagen warum?

Das ist relativ einfach:

  if(now.hour() >=RelaisOn1 && now.hour() <RelaisOff1)//Relais einschalten wen die momentane Stundenzeit gleich oder 
  if(now.hour() >=RelaisOn2 && now.hour() <RelaisOff2)
  if(now.hour() >=RelaisOn3 && now.hour() <RelaisOff3)

Nur wenn das erste if zu "true" ausgewertet wird, wird das zweite if ausgeführt.
Nur wenn dann auch das zweite if zu "true" ausgewertet wird, wird das dritte if ausgeführt.
Und wenn dann auch das dritte if "true" ergibt, dann wird im nachfolgenden Codeblock geschaltet.

Das kann so natürlich nicht funktionieren, weil natürlich von Deinen drei if-Bedingungen allenfalls eine zur Zeit, aber nicht alle drei zur selben Zeit "true" ergeben.

Wenn ich morgen etwas Zeit habe, mache ich Dir mal ein Beispielprogramm.

[Nachtrag] Als Abhilfe in Deinem Code würde ggf. folgende Logik helfen, damit überhaupt geschaltet wird:

  boolean state=LOW; // anfängliche Annahme, es wäre LOW der richtige Schaltzustand
  if(now.hour() >=RelaisOn1 && now.hour() <RelaisOff1) state=HIGH; // nein, HIGH ist richtig
  if(now.hour() >=RelaisOn2 && now.hour() <RelaisOff2) state=HIGH; // nein, HIGH ist richtig
  if(now.hour() >=RelaisOn3 && now.hour() <RelaisOff3) state=HIGH; // nein, HIGH ist richtig
  digitalWrite(11, state); // hier wird der state gesetzt, der als korrekt ermittelt wurde

er lässt sich hochladen gibt dann auch die Uhrzeit, dass Datum und den Zustand des Relais an schaltet es aber nicht um.

Könnt ihr mir sagen warum?

Weil Pin 11 nur dann auf OUTPUT gesetzt wird, wenn die rtc nicht läuft ?

Wo genau, kannst du selber finden :wink:

Viel Spass!

Anbei ein erster Softwareentwurf für für so eine "manuell übersteuerbare Zeitschaltuhr".

Installation: Den im ZIP-Archiv enthaltenen Ordner in Deinem Arduino Sketch-Ordner entpacken.

Externe Drittanbieter-Libraries werden nicht verwendet, ich habe Dir eine eigene RTC-Library mit auf einen Tab in der Arduino-IDE gepackt.

Einstellbare Modifikationen im Hauptprogramm sind die Angaben zum Relay. Vordefiniert ist das Ein- und Ausschalten der Board-LED:

const byte relayPin=13;
const byte relayActive=HIGH;

Für mechanische "active LOW" schaltende Relaismodule hier LOW eintragen.

Weiterhin einstellbar sind die Schaltzeiten. Diese sind definiert als
(100*Stunde + Minute), zwar in jeder Zeile links die Einschaltzeit, rechts daneben die Ausschaltzeit:

int relayTimes[][2]={ // define ON and OFF times
  {800,900},
  {1200,1300},
  {1700,1800},
};

Und schließlich ist auch der anzuschließende Button konfigurierbar:

const byte buttonPin=A3; // pin for button to override relay switching state until next switching time
const byte INPUTMODE= INPUT_PULLUP;

INPUT_PULLUP dann verwenden, wenn der Button an seinen Button-Pin und an GND angeschlossen wird.

Alternativ INPUT verwenden, wenn der Button an seinen Button-Pin und an 5V angeschlossen wird und in der Schaltung zusätzlich ein externer Pull-Down Widerstand verwendet wird.

Eine Einstellmöglichkeit für Zeit und Datum über Serial ist noch nicht eingebaut, sondern es gibt nur in der setup() Funktion eine auskommentierte Zeile, über die Du durch Entfernen der Kommentarstriche beim Programmstart eine bestimmte Zeit einstellen kannst, um dann danach den Sketch nochmals mit wieder eingefügten Kommentarstrichen hochzuladen, damit dann die Zeiteinstellung in Zukunft wieder auskommentiert ist.

Anlage: 1 Arduino-Sketch als ZIP-Archiv
Hinweis: Der Code ist bisher noch NICHT besonders gründlich getestet.

Viel Spaß damit, Feedback willkommen!

clockHanzzz.zip (3.2 KB)

jurs:
Viel Spaß damit, Feedback willkommen!

So mein Feedback
Erstmal vielen vielen Dank für die mühe.
Der Code enthält wahrscheinlich einen kleinen Fehler da das Rtc Modul eine Falsche Uhrzeit bekommt (statt 17:21 21:48).
Ansonsten läuft es super das Relais schaltet zu den eingestellten Uhrzeiten um und die manuelle Ein- und Ausschaltung funktioniert auch super.

Hanzzz98:
Der Code enthält wahrscheinlich einen kleinen Fehler da das Rtc Modul eine Falsche Uhrzeit bekommt (statt 17:21 21:48).

Eigentlich bekommt die RTC überhaupt keine Uhrzeit, wenn Du die auskommentierte Zeile zum Einstellen der Zeit nicht "entkommentierst":

 // setDS3231time(2015,12,9, 12,59,45); // = 9.12.2015 12:59:45

Trotz des Namens sollte die Funktion mit DS3231 wie auch mit DS1307 RTC-Modulen funktionieren.

Wenn Du dort die Kommentarstriche am Anfang der Zeile entfernst, kannst Du eine bestimmte Zeit einstellen, die dann bei jedem Power-On/Reset des Controllers neu gesetzt wird. So einen Sketch solltest Du also nur zum Einstellen hochladen.

Und wenn Du mit auskommentierter Zeile hochlädst, liest der Sketch immer nur die batteriegepufferte Zeit aus der RTC aus (einmal pro Sekunde), also exakt die Zeit, auf der die RTC gerade läuft (ich glaube, ich habe das sogar mit automatischer Sommerzeitanzeige programmiert, RTC läuft dabei immer auf Winterzeit).