ich möchte eine Zeitschaltuhr mit einem DS3231 und einem ESP8266 verwirklichen. Hintergrund ist ein Teil der Weihnachtsbeleuchtung (ein Schneemann welcher durch die halbe Starße fährt). Die Beleuchtung soll 16:30 Uhr einschalten und 22:30 Uhr ausschalten. Die Komponenten habe ich bereits aber leider funktioniert mein Code nicht. Ich sehe auch nicht weshalb. Daher wende ich mich an euch. Die RTC DS3231 ist getestet und ich kann die aktuelle Uhrzeit auslesen. Daran liegts schon mal nicht.
Hier nun der Code:
//Libraries die hinzugefüght werden
#include <OneWire.h>
#include "RTClib.h"
const float LightON = 16; //Zeit Licht geht an
const float LightOFF = 22; //Zeit Licht geht aus
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
void setup() {
Serial.begin(9600);
pinMode(16, OUTPUT); //Relais Licht
#ifndef ESP8266
while (!Serial)
; // wait for serial port to connect. Needed for native USB
#endif
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println();
if (now.hour() >= LightON) { //Macht das Licht um die Stunde an
digitalWrite(20, HIGH);
}
if (now.hour() >= LightOFF) { //Macht das Licht um die Stunde aus
digitalWrite(20, LOW);
}
{
delay(3000);
}
}
Das ist leider eine nichts sagende Fehlerbeschreibung. Der kann man nichts entnehmen .
Also was funktioniert und was funktioniert nicht ?
Gibt es Fehlermeldungen ?
Naja, ich bin über die 20 auch erst durch deinen Post gefallen.
Und damit der TO sieht, was gemeint ist, hier gleich ein Link mit entsprechenden Infos.
Vielen Dank!
Das mit dem PIN hatte ich übersehen...sollte natürlich 16 sein und nicht 20.
Habe das jetzt abgeändert! In der Beschreibung habe ich gelesen die LED leuchtet bei LOW.
Werde das morgen wieter testen.
Auch will ich die Minuten mit rein bringen, da ich ja nicht zur vollen Stunde schalten möchte.
So, habe jetzt eine LED genommen und bin an D5 GPIO14 gegangen.
Den Code habe ich auch nochmal geändert. Leider schaltet die LED nicht ein/aus und mein Relais somit auch nicht. Irgendwo habe ich mir im Code wohl einen Fehler eingebaut. Bin weiterhin für Hilfe Dankbar!!!
//Libraries die hinzugefüght werden
#include <OneWire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
void setup() {
Serial.begin(9600);
pinMode(14, OUTPUT); //Relais Licht
#ifndef ESP8266
while (!Serial)
; // wait for serial port to connect. Needed for native USB
#endif
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Nach dem ersten aufspielen sollte die LED im Sekundentakt blinken und die Uhrzeit auf dem SerMon ausgegeben werden. Letztere sollte, bis auf eine kleine Abweichung im Sekundenbereich, stimmen.
Dann kannst Du die Zeile
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
auskommentieren und den Code nochmal raufspielen.
Es sollte noch immer blinken und wenn Du den Resetknopf drückst, sollte die Uhrzeit nach dem Start noch immer stimmen.
Und jetzt kannst Du anfangen Deinen LED-Pin, der dann ein relaispin wird, mit Deiner Zeitschaltung zu programmieren....
Es wäre hilfreich für die Helfenden, wenn Du Dein Programm ordentlich in einem Stück mit Code-Tags zeigst.
Wenn Du lernen und verstehen möchtest, dann ignoriere meine Vorschlag, wenn Du aber unter Zeitdruck nach einer fertigen Lösung schaust, gibt es Esp8266 Zeitschaltuhr bis zu 100 Schaltzeiten am Seitenende.
Dann kombiniere die beiden doch.
Z.B. now.hour()*60+now.minute()
Beim Militär nehmen sie gerne now.hour()*100+now.minute() und vergleichen das mit 1630 bzw 2230.
Und denk dran, dass zwei if hintereinander fast gleichzeitig ausgeführt werden. Wenn beide true ergeben, siehst du nur die Auswirkung des zweiten.
Das eine kann man beliebig oft machen, das andere optimalerweise genau ein mal.
Wie oft der Sketch die if - Anweisung ausführt, sollte möglichst egal sein.
LED blinkt und die Uhrzeit wird im seriellen Monitor angezeigt, auch nach auskommentieren und reset. Muss mich dann morgen für den Rest nochmal ran setzen.