Zeitschaltuhr mit ESP8266 und DS3231

Hallo,

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
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
}






void loop() {

  //Alles zum RTC

  DateTime now = rtc.now();
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  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 ?

Fehlermeldungen gibt es keine.
Habe zum testen die LED auf dem Board genommen. Diese leuchtet dauerhaft, egal welche Uhrzeit ist.

Nicht das die Interne LED am anderen Pin liegt.

Und auf dem ESP8266 ist mir kein GPIO20 bekannt.
Da solltest du mal einen anderen Pin verwenden.
Vermutlich die 2.

Die 20 habe gesehen nur fiel mir nicht auf, zu viel mit ESP32 beschäftigt

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");
    Serial.flush();
    abort();
  }
}






void loop() {

  //Alles zum RTC

  DateTime now = rtc.now();
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  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() == 00 && now.minute() == 10) {  //Macht Licht an
    digitalWrite(14, HIGH);
  }
  if (now.hour() == 00 && now.minute() == 11) {   //Macht Licht aus
    digitalWrite(14, LOW);
  }

  {
    delay(3000);
  }
}

Du kannst mit


pinMode(BUILTIN_LED, OUTPUT);

digitalWrite(BUILTIN_LED, LOW);

testen.

Funktioniert der einfache Blink Sketch?

Uhrzeit vom 3231 gestellt?

Dein Vergleich ist nur 1 Minute lang gültig!

Also ich würde das erstmal aufs kleinste notwendige runterbrechen um zu sehen, ob überhaupt was funktioniert.

Der folgende Code soll alle Sekunde die Zeit ausgeben und die LED umschalten.

//Libraries die hinzugefüght werden

// #include <OneWire.h>
#include "RTClib.h"

const byte ledPin = 14;
byte lastSecond = 99;

RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

DateTime now;

void setup()
{
  Serial.begin(9600);
  digitalWrite(ledPin, LOW);
  pinMode(ledPin, 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");
    Serial.flush();
    abort();
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void printTime()
{
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  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();
}

void loop()
{
  now = rtc.now();
  if (now.second() != lastSecond)
  {
    printTime();
    digitalWrite(ledPin, !digitalRead(ledPin)); // toggle
    lastSecond = now.second();
  }
}

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.

Ich code mir zur Kontrolle immer was "sichtbares" rein.

Z.B.

if (now.hour() == 00 && now.minute() == 10) {  //Macht Licht an
    digitalWrite(14, HIGH);
   Serial.println("Stunde 0 und Minute 10");
  }

Dann kannst du erst mal sehen ob die Abfrage oder die WriteAusgabe das Problem ist.

Habe @progger schon in #4 vorgeschlagen will er nicht.

Sorry, hatte ich übersehen...

Nix Sorry, doppelt gemoppelt hält besser :wink:

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.

Würde ich anders machen :slight_smile:

digitalWrite (14, zeit >= 1630 && zeit < 2230 );

Der einfache Blinksketch funktioniert. Der DS3231 ist auch gestellt und geprüft.

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.