add RTC timestamp bias correction
This commit is contained in:
parent
e0d3ea3647
commit
80d8f29c0f
49
hencoop.ino
49
hencoop.ino
|
@ -33,12 +33,19 @@ unsigned long lastButtonPressed;
|
||||||
|
|
||||||
SevenSegmentExtended display(PIN_CLK, PIN_DIO);
|
SevenSegmentExtended display(PIN_CLK, PIN_DIO);
|
||||||
|
|
||||||
|
// Time bias correction variables:
|
||||||
|
int correctionBias = 1; // Daily clock correction in seconds
|
||||||
|
long correctionCheck = 300000;
|
||||||
|
byte correctionHour = 3;
|
||||||
|
bool correctionReady = true;
|
||||||
|
|
||||||
// Threads:
|
// Threads:
|
||||||
Thread pressButtonThread = Thread(); // Create thread for button state checking
|
Thread pressButtonThread = Thread(); // Create thread for button state checking
|
||||||
|
Thread correctionThread = Thread(); // Time bias correction thread
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug
|
Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug
|
||||||
serStr("starting setup...");
|
// serStr("starting setup...");
|
||||||
display.begin(); // Initializes the display
|
display.begin(); // Initializes the display
|
||||||
display.setBacklight(100); // Set the brightness to 100 %
|
display.setBacklight(100); // Set the brightness to 100 %
|
||||||
display.print("INIT"); // Display INIT on the display
|
display.print("INIT"); // Display INIT on the display
|
||||||
|
@ -60,21 +67,27 @@ void setup() {
|
||||||
if(timeStatus()!= timeSet)
|
if(timeStatus()!= timeSet)
|
||||||
Serial.println("Unable to sync with the RTC");
|
Serial.println("Unable to sync with the RTC");
|
||||||
else
|
else
|
||||||
Serial.println("RTC has set the system time");
|
// Serial.println("RTC has set the system time");
|
||||||
|
Serial.println(now());
|
||||||
|
|
||||||
// Button state cheking thread:
|
// Button state cheking thread:
|
||||||
pressButtonThread.onRun(pressButton);
|
pressButtonThread.onRun(pressButton);
|
||||||
pressButtonThread.setInterval(buttonCheck); // Interval for checking button pressing
|
pressButtonThread.setInterval(buttonCheck); // Interval for checking button pressing
|
||||||
|
// Time bias correction thread:
|
||||||
|
correctionThread.onRun(correctionLoop);
|
||||||
|
correctionThread.setInterval(correctionCheck);
|
||||||
|
|
||||||
delay (1000);
|
delay (1000);
|
||||||
display.off();
|
display.off();
|
||||||
serStr("...setup finished");
|
// serStr("...setup finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// Threads init:
|
// Threads init:
|
||||||
if (pressButtonThread.shouldRun())
|
if (pressButtonThread.shouldRun())
|
||||||
pressButtonThread.run();
|
pressButtonThread.run();
|
||||||
|
if (correctionThread.shouldRun())
|
||||||
|
correctionThread.run();
|
||||||
|
|
||||||
if (timeStatus() == timeSet) { // If RTC works - call the checkTime function
|
if (timeStatus() == timeSet) { // If RTC works - call the checkTime function
|
||||||
checkTime();
|
checkTime();
|
||||||
|
@ -297,7 +310,7 @@ void checkTime() {
|
||||||
openDoor();
|
openDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
if (hour() == 22 && minute() == 50) {
|
if (hour() == 23 && minute() == 20) {
|
||||||
closeDoor();
|
closeDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
|
@ -308,7 +321,7 @@ void checkTime() {
|
||||||
openDoor();
|
openDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
if (hour() == 22 && minute() == 35) {
|
if (hour() == 23 && minute() == 15) {
|
||||||
closeDoor();
|
closeDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
|
@ -319,7 +332,7 @@ void checkTime() {
|
||||||
openDoor();
|
openDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
if (hour() == 21 && minute() == 30) {
|
if (hour() == 22 && minute() == 30) {
|
||||||
closeDoor();
|
closeDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
|
@ -338,7 +351,7 @@ void checkTime() {
|
||||||
lightOff();
|
lightOff();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
if (hour() == 20 && minute() == 5) {
|
if (hour() == 21 && minute() == 35) {
|
||||||
closeDoor();
|
closeDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
|
@ -357,7 +370,7 @@ void checkTime() {
|
||||||
lightOff();
|
lightOff();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
if (hour() == 18 && minute() == 45) {
|
if (hour() == 19 && minute() == 45) {
|
||||||
closeDoor();
|
closeDoor();
|
||||||
delay(60000);
|
delay(60000);
|
||||||
}
|
}
|
||||||
|
@ -401,3 +414,23 @@ void checkTime() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void correctionLoop() {
|
||||||
|
if (hour() == correctionHour) {
|
||||||
|
if (correctionReady) {
|
||||||
|
// CORRECTION!
|
||||||
|
tmElements_t RTCtime;
|
||||||
|
RTC.read(RTCtime);
|
||||||
|
time_t RTCtimestamp;
|
||||||
|
RTCtimestamp = makeTime(RTCtime);
|
||||||
|
tmElements_t timeNew;
|
||||||
|
time_t newTimestamp = RTCtimestamp - correctionBias; // -1sec everyday
|
||||||
|
if ((day() % 5) == 0) newTimestamp = newTimestamp - 2; // -2sec every 5 days (-0.4sec everyday)
|
||||||
|
breakTime(newTimestamp, timeNew);
|
||||||
|
RTC.write(timeNew);
|
||||||
|
setSyncProvider(RTC.get);
|
||||||
|
// CORRECTION!
|
||||||
|
correctionReady = false;
|
||||||
|
}
|
||||||
|
} else correctionReady = true;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue