Guten Abend,
endlich wieder am Bauen...
jar : Ja, vielen Dank, hat super geholfen.
Das fertige Projekt soll an einem Ort verschenkt werden, wo es nicht zwingend Wifi zum Holen der aktuellen Zeit gibt.
Außerdem funktioniert die ntp-Synchronisation (wahrscheinlich durch Auslastung serverseitig) sehr unregelmäßig.
Ich brauche also eine RealTimeClock!
Ich habe ein DS3231 besorgt, die Ladeschaltung (durch Auslöten des Widerstands, wie empfohlen) deaktiviert und angebaut.
Ich nutze die Timelib.h eines gewissen Paul Stoffregen (Github-Repo PStoffregen-TimeLib).
Dazu kombiniere ich die eine Rtc-Library von Makuna (GitHub-Repo Makuna - RtcDs3231).
Soweit so gut.
Die Includings erweiterte ich mich:
[...]
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
[...]
Im Setup aktiviere ich die Rtc und hole mir die (zuvor einmalig gestellte) Uhrzeit:
void setup() {
Rtc.Begin();
RtcDateTime now = Rtc.GetDateTime();
now = now -2208988800UL;
Rtc.Enable32kHzPin(false);
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);
setTime(now);
[...]
Funktioniert super.
Allerdings habe ich zwei Probleme:
1.
Ich hole wie vorher die Zeit vom ntp-Server.
Am Ende habe ich das Hochschreiben in die RTC eingefügt. Dabei habe ich mich am die Empfehlung von Makuna gehalten.
Wenn ich jetzt den ESP neu starte, liege ich exakt 30 Jahre und 7 Tage daneben!?
Kann sich jemand einen Reim darauf machen?
Ich habe jetzt einfach die fehlenden Sekunden draufgerechnet (siehe Codeblock (entscheidend ab "ab hier Erweiterung..."))
time_t getNtpTime()
{
IPAddress timeServerIP; // time.nist.gov NTP server address
while (Udp.parsePacket() > 0) ; // discard any previously received packets
//get a random server from the pool
WiFi.hostByName(ntpServerName, timeServerIP);
sendNTPpacket(timeServerIP);
uint32_t beginWait = millis();
while ((millis() - beginWait) < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
//ab hier Erweiterung "Schreiben in die RTC"
int epochtime = secsSince1900 + 946080000 + 604800 + (timeZone * SECS_PER_HOUR); //plus 30 Jahre, 7 Tage
RtcDateTime timeToSet;
timeToSet.InitWithEpoch32Time(epochtime);
Rtc.SetDateTime(timeToSet);
return secsSince1900 - 2208988800UL + (timeZone * SECS_PER_HOUR);
}
}
return 0; // return 0 if unable to get the time
}
Display More
Ich will ja aber auch was lernen... weiß jemand warum?
2.
In der Timelib kann man einen "SetSyncProvider" (inkl. "setSyncIntervall") festlegen, das war bisher der Funktionsaufruf "getNtpTime".
In meinem Verständnis läuft es momentan so ab:
ESP bootet -> Zeit wird aus Rtc ausgelesen.
Die Zeit welche auf dem Display angezeigt wird, ist die ESP-eigene Zeit (einmalig durch RTC gestellt und durch den internen Clock weitergezählt).
Wenn ein Ntp-Paket empfangen wird, wird die ESP-eigene Zeit und (mit den Code oben) die Rtc-Zeit angepasst.
Ist das richtig so?
Da die internen Clocks meist recht ungenau sind, würde ich gern als "SyncProvider" die Rtc nehmen (und regelmäßiger als jetzt syncen) und nur ab und zu mal die ntp-Zeit mit der Rtc abgleichen.
Leider scheint die Makuna-Lib die Funktion SetSyncProvider nicht zu unterstützen, oder wie kann ich die IDE-Fehlermeldung für "setSyncProvider(GetDateTime)" verstehen?
exit status 1
cannot convert 'RtcDS3231<T_WIRE_METHOD>::GetDateTime<TwoWire>' from type 'RtcDateTime (RtcDS3231<TwoWire>::)()' to type 'getExternalTime {aka long int (*)()}'
Da fehlts mir dann doch an Erfahrung.
Vielleicht kann mir jemand helfen bzw. hat jemand Expertise im Umgang ESP8266, NTP und RTC ( dreamshader ?). Hatte ich zumindest in deinem Blog gelesen 
In der Hoffnung euch nicht allzuviel gelangweilt zu haben...
Mfg
PS:
Die Version 0.9 enthält nun u.a.:
- mehrere Wifis vorkonfigurierbar
- Liebesdisplay (zeigt verstrichene Sekunden/Tage/Jahre) inkl. einer durchlaufenden Glückwunschmeldung in einer Beziehung an 

- alle 5 Sekunden wird im Liebesdisplay stattdessen ein Bitmap eingeblendet *kitsch pur*
- Menüpunkt "IP-Adresse" heißt jetzt "Wifi-Info" und zeigt verbundene SSID, IP und Signalstärke an
- wie oben beschrieben eingebundene RTC
ToDo:
- automatische Sommer-/Winterzeitumstellung