From 80d8f29c0f7e9888e5cc095a9e6e0ca0d506e510 Mon Sep 17 00:00:00 2001 From: zlax Date: Mon, 1 Jul 2024 14:14:56 +0300 Subject: [PATCH] add RTC timestamp bias correction --- hencoop.ino | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/hencoop.ino b/hencoop.ino index 2ea426a..9234f39 100644 --- a/hencoop.ino +++ b/hencoop.ino @@ -33,12 +33,19 @@ unsigned long lastButtonPressed; 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: Thread pressButtonThread = Thread(); // Create thread for button state checking +Thread correctionThread = Thread(); // Time bias correction thread void setup() { Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug - serStr("starting setup..."); +// serStr("starting setup..."); display.begin(); // Initializes the display display.setBacklight(100); // Set the brightness to 100 % display.print("INIT"); // Display INIT on the display @@ -60,21 +67,27 @@ void setup() { if(timeStatus()!= timeSet) Serial.println("Unable to sync with the RTC"); else - Serial.println("RTC has set the system time"); +// Serial.println("RTC has set the system time"); + Serial.println(now()); // Button state cheking thread: pressButtonThread.onRun(pressButton); pressButtonThread.setInterval(buttonCheck); // Interval for checking button pressing + // Time bias correction thread: + correctionThread.onRun(correctionLoop); + correctionThread.setInterval(correctionCheck); delay (1000); display.off(); - serStr("...setup finished"); +// serStr("...setup finished"); } void loop() { // Threads init: if (pressButtonThread.shouldRun()) pressButtonThread.run(); + if (correctionThread.shouldRun()) + correctionThread.run(); if (timeStatus() == timeSet) { // If RTC works - call the checkTime function checkTime(); @@ -297,7 +310,7 @@ void checkTime() { openDoor(); delay(60000); } - if (hour() == 22 && minute() == 50) { + if (hour() == 23 && minute() == 20) { closeDoor(); delay(60000); } @@ -308,7 +321,7 @@ void checkTime() { openDoor(); delay(60000); } - if (hour() == 22 && minute() == 35) { + if (hour() == 23 && minute() == 15) { closeDoor(); delay(60000); } @@ -319,7 +332,7 @@ void checkTime() { openDoor(); delay(60000); } - if (hour() == 21 && minute() == 30) { + if (hour() == 22 && minute() == 30) { closeDoor(); delay(60000); } @@ -338,7 +351,7 @@ void checkTime() { lightOff(); delay(60000); } - if (hour() == 20 && minute() == 5) { + if (hour() == 21 && minute() == 35) { closeDoor(); delay(60000); } @@ -357,7 +370,7 @@ void checkTime() { lightOff(); delay(60000); } - if (hour() == 18 && minute() == 45) { + if (hour() == 19 && minute() == 45) { closeDoor(); 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; +}