Hallo zusammen,
ich habe mal wieder eine Denkblockade und komme nicht zum gewünschten Ergebnis. Ziel ist es die Uhrzeit per WLAN zu holen und diese dann in den DS3231 zu speichern unter Berücksichtigung der Sommer / Winterzeit. Da der DS3231 relativ genau ist, möchte ich die Uhrzeit nur einmal jede Stunde evtl. auch nur einmal pro Tag holen. Zu meinem Problem:
-
Wie setze ich den Code von jurs richtig ein, damit die Uhrzeit später stimmt? Meine Befürchtung ist, das ich die Sommerzeit berechne (+1Std) und dann wird die "Sommerzeit vom NTP Server übertragen" und ich rechne dann quasi 1 Stunde mehr drauf. Hoffe Ihr versteht was ich meine....
-
Ich verwende die ESP Library von hier. Auf dem ESP ist eine NTP Firmware von Tomer drauf. Ich habe noch ein Problem mit dem ESP8266, wenn er die Zeit holt, steht der µC ca.für 4 Sec bzw. ich habe ein Delta von 4s bei meiner Zeit. Wie kann ich diesen BUG beseitigen?
Ebenso habe ich noch eine Frage: Wie kann ich vorher Prüfen ob die Internet Verbindung besteht? Schalte Nachts mein WLAN ab und dann kann er sich ja gar keine Zeit mehr hole wenn ich den Intervall auf jede Stunde setze.
/*
Includes
*/
#include <Wire.h>
#include <esp8266_ntp.h>
#include <Time.h>
#include <SoftwareSerial.h>
SoftwareSerial debugSerial(10,11);
/*
Variables
*/
unsigned long CurrentMillisUpdateTime;
unsigned long PrevMillisUpdateTime = 0;
//################################ Setup #######################################//
//################################ WLAN - Setup #######################################//
#define WIFI_SSID "GEHEIM" // Enter your WLAN SSID
#define WIFI_PASS "GEHEIM" // Enter your WLAN Pass
//################################ Time Sync Update #######################################//
const long UpdateTime = 60000; // Time in ms (60sec = 60000ms / 60min = 360000)
//#########################################################################################//
//#########################################################################################//
ESP8266_NTP esp8266_ntp;
#define RTC_ADDRESS 0x68 // I2C Address of RTC 0x68
byte RTC_Minute,RTC_Hour,ESP_Sec,ESP_Minute,ESP_Hour=0;
void setup() {
debugSerial.begin(38400);
if(esp8266_ntp.initialize(WIFI_SSID, WIFI_PASS) == 0) {
esp8266_ntp.setGMTOffset(2);
}
Wire.begin();
Wire.beginTransmission(RTC_ADDRESS);
Wire.write(0x0E);
Wire.write(0x00);
Wire.endTransmission();
RTC_Start();
SyncTime();
Read_RTC_Time();
debugSerial.print(RTC_Hour);
debugSerial.print(RTC_Minute);
debugSerial.print(RTC_Sec);
}
void loop() {
SyncTime ();
Read_RTC_Time();
debugSerial.print(RTC_Hour);
debugSerial.print(":");
debugSerial.print(RTC_Minute);
debugSerial.print(":");
debugSerial.println(RTC_Sec);
}
void SyncTime(){
CurrentMillisUpdateTime = millis();
if(CurrentMillisUpdateTime - PrevMillisUpdateTime >= UpdateTime){
if(esp8266_ntp.initialize(WIFI_SSID, WIFI_PASS) == 0) {
esp8266_ntp.setGMTOffset(2);
PrevMillisUpdateTime = CurrentMillisUpdateTime;
ESP_Hour=hour(getNtpTime());
ESP_Minute=minute(getNtpTime());
ESP_Sec=second(getNtpTime());
RTC_Set();
}
}
}
time_t getNtpTime(){
esp8266_ntp.setGMTOffset(2);
return esp8266_ntp.getTime();
}
boolean SummerTime(){
DateTime now = RTC.now();
if (now.month()<3 || now.month()>10) return false;
if (now.month()>3 && now.month()<10) return true;
if (now.month()==3 && now.day()<25) return false;
if (now.month()==10 && now.day()<25) return true;
if (now.month()==3 && (now.hour() + 24 * now.day())>=(1 + 24*(31 - (5 * now.year() /4 + 4) % 7))
|| now.month()==10 && (now.hour() + 24 * now.day())<(1 + 24*(31 - (5 * now.year() /4 + 1) % 7)))
return true;
else
return false;
}
void Read_RTC_Time(){
Wire.beginTransmission(RTC_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(RTC_ADDRESS, 3);
RTC_Sec= bcdToDec(Wire.read());
RTC_Minute= bcdToDec(Wire.read());
RTC_Hour= bcdToDec(Wire.read());
}
void RTC_Set(){
Wire.beginTransmission(RTC_ADDRESS);
Wire.write(0x00);
Wire.write(decToBcd(ESP_Sec));
Wire.write(decToBcd(ESP_Minute));
Wire.write(decToBcd(ESP_Hour));
Wire.endTransmission();
}
void RTC_Start(){
Wire.beginTransmission(RTC_ADDRESS);
Wire.write(0x00);
Wire.write(decToBcd(RTC_Sec));
Wire.endTransmission();
}
byte decToBcd(byte val){
return ((val/10)<<4)+(val%10);
}
byte bcdToDec(byte val){
return ((val>>4)*10)+val%16;
}