From 828491671514c2075054ef2cf31fe4ff0c0bd4b3 Mon Sep 17 00:00:00 2001 From: zlax Date: Sat, 17 Jan 2026 23:55:04 +0300 Subject: [PATCH] actualising code for modern libs --- hencoop.ino | 284 ++++++++++++++++++++++++++++------------------------ hencoop.odt | Bin 20115 -> 0 bytes 2 files changed, 151 insertions(+), 133 deletions(-) delete mode 100644 hencoop.odt diff --git a/hencoop.ino b/hencoop.ino index 9234f39..b2fe2ea 100644 --- a/hencoop.ino +++ b/hencoop.ino @@ -1,7 +1,7 @@ /* * Hencoop with automatic lamp and door timer, TM1637 display, two buttons and magnetically operated sealed switch */ - +#include #include #include #include @@ -45,11 +45,10 @@ 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 - pinMode(pinRelay3, OUTPUT); pinMode(pinRelay4, OUTPUT); pinMode(pinDC, OUTPUT); @@ -67,9 +66,13 @@ 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()); + while (!Serial) ; // wait for serial + delay(200); + Serial.println("DS1307RTC"); + // Button state cheking thread: pressButtonThread.onRun(pressButton); pressButtonThread.setInterval(buttonCheck); // Interval for checking button pressing @@ -77,9 +80,9 @@ void setup() { correctionThread.onRun(correctionLoop); correctionThread.setInterval(correctionCheck); - delay (1000); + delay (100); display.off(); -// serStr("...setup finished"); + serStr("...setup finished"); } void loop() { @@ -89,7 +92,8 @@ void loop() { if (correctionThread.shouldRun()) correctionThread.run(); - if (timeStatus() == timeSet) { // If RTC works - call the checkTime function + tmElements_t tm; + if (RTC.read(tm)) { // If RTC works - call the checkTime function checkTime(); } else { display.on(); @@ -105,9 +109,11 @@ void pressButton() { displayWork = 0; } if (digitalRead(redButton) == HIGH || digitalRead(blackButton) == HIGH) { + tmElements_t tm; + RTC.read(tm); display.on(); displayWork = 1; - display.printTime(hour(), minute(), true); + display.printTime(tm.Hour, tm.Minute, true); buttonPressed = buttonPressed + 200; if (buttonPressed > buttonShortPress) { @@ -153,7 +159,7 @@ void openDoor() { digitalWrite(pinRelay3, HIGH); digitalWrite(pinRelay4, HIGH); delay(1000); - digitalWrite(pinDC, LOW); // DC on + digitalWrite(pinDC, LOW); // DC on delay(3000); digitalWrite(pinRelay4, LOW); while (digitalRead(doorSwitch) == LOW) { @@ -164,7 +170,7 @@ void openDoor() { } digitalWrite(pinRelay4, HIGH); delay(2000); - digitalWrite(pinDC, HIGH); // DC off + digitalWrite(pinDC, HIGH); // DC off delay(1000); digitalWrite(pinRelay3, HIGH); digitalWrite(pinRelay4, HIGH); @@ -183,13 +189,13 @@ void closeDoor() { digitalWrite(pinRelay3, HIGH); digitalWrite(pinRelay4, HIGH); delay(1000); - digitalWrite(pinDC, LOW); // DC on + digitalWrite(pinDC, LOW); // DC on delay(3000); digitalWrite(pinRelay3, LOW); delay(closeDoorVar); digitalWrite(pinRelay3, HIGH); delay(2000); - digitalWrite(pinDC, HIGH); // DC off + digitalWrite(pinDC, HIGH); // DC off delay(1000); digitalWrite(pinRelay3, HIGH); digitalWrite(pinRelay4, HIGH); @@ -204,211 +210,223 @@ void closeDoor() { // Send string to serial monitor with millis() counter and date/time void serStr(const char* serString) { + tmElements_t tm; + RTC.read(tm); long currentTime = millis(); String space = " "; String stringToPrint = currentTime + space + serString; Serial.println(stringToPrint); // RTC mark Serial.print("RTC time = "); - Serial.print(hour()); + Serial.print(tm.Hour); Serial.write(':'); - Serial.print(minute()); + Serial.print(tm.Minute); Serial.write(':'); - Serial.print(second()); + Serial.print(tm.Second); Serial.print(", date (D/M/Y) = "); - Serial.print(day()); + Serial.print(tm.Day); Serial.write('/'); - Serial.print(month()); + Serial.print(tm.Month); Serial.write('/'); - Serial.print(year()); + Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } void checkTime() { - // January 08:06 08:50 16:27 17:11 - if (month() == 1) { - if (hour() == 8 && minute() == 15) { + tmElements_t tm; + RTC.read(tm); + // January + if (tm.Month == 1) { + if (tm.Hour == 8 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 15 && minute() == 55) { + if (tm.Hour == 7 && tm.Minute == 55) { lightOn(); delay(60000); } - if (hour() == 18 && minute() == 35) { + if (tm.Hour == 17 && tm.Minute == 55) { lightOff(); delay(60000); } - if (hour() == 17 && minute() == 50) { + if (tm.Hour == 19 && tm.Minute == 55) { closeDoor(); delay(60000); } } - // February 07:18 07:56 17:31 18:10 - if (month() == 2) { - if (hour() == 7 && minute() == 20) { + // February + if (tm.Month == 2) { + if (tm.Hour == 7 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 16 && minute() == 55) { + if (tm.Hour == 7 && tm.Minute == 30) { lightOn(); delay(60000); } - if (hour() == 19 && minute() == 30) { + if (tm.Hour == 19 && tm.Minute == 15) { lightOff(); delay(60000); } - if (hour() == 18 && minute() == 45) { + if (tm.Hour == 19 && tm.Minute == 30) { closeDoor(); delay(60000); } } - // March 06:11 06:47 18:30 19:07 - if (month() == 3) { - if (hour() == 6 && minute() == 15) { + // March + if (tm.Month == 3) { + if (tm.Hour == 6 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 17 && minute() == 55) { + if (tm.Hour == 7 && tm.Minute == 30) { lightOn(); delay(60000); } - if (hour() == 20 && minute() == 30) { + if (tm.Hour == 19 && tm.Minute == 30) { lightOff(); delay(60000); } - if (hour() == 19 && minute() == 45) { + if (tm.Hour == 19 && tm.Minute == 45) { closeDoor(); delay(60000); } } - // April 04:48 05:27 19:33 20:13 - if (month() == 4) { - if (hour() == 4 && minute() == 55) { + // April + if (tm.Month == 4) { + if (tm.Hour == 5 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 20 && minute() == 50) { - closeDoor(); - delay(60000); - } - } - // May 03:31 04:20 20:32 21:21 - if (month() == 5) { - if (hour() == 3 && minute() == 50) { - openDoor(); - delay(60000); - } - if (hour() == 21 && minute() == 55) { - closeDoor(); - delay(60000); - } - } - // June 02:43 03:44 21:15 22:16 - if (month() == 6) { - if (hour() == 3 && minute() == 15) { - openDoor(); - delay(60000); - } - if (hour() == 23 && minute() == 20) { - closeDoor(); - delay(60000); - } - } - // July 03:08 04:04 21:05 22:00 - if (month() == 7) { - if (hour() == 3 && minute() == 30) { - openDoor(); - delay(60000); - } - if (hour() == 23 && minute() == 15) { - closeDoor(); - delay(60000); - } - } - // August 04:15 04:58 20:08 20:51 - if (month() == 8) { - if (hour() == 4 && minute() == 15) { - openDoor(); - delay(60000); - } - if (hour() == 22 && minute() == 30) { - closeDoor(); - delay(60000); - } - } - // September 05:21 05:58 18:50 19:27 - if (month() == 9) { - if (hour() == 5 && minute() == 25) { - openDoor(); - delay(60000); - } - if (hour() == 18 && minute() == 20) { + if (tm.Hour == 18 && tm.Minute == 55) { lightOn(); delay(60000); } - if (hour() == 20 && minute() == 50) { + if (tm.Hour == 20 && tm.Minute == 45) { lightOff(); delay(60000); } - if (hour() == 21 && minute() == 35) { + if (tm.Hour == 20 && tm.Minute == 50) { closeDoor(); delay(60000); } } - // October 06:20 06:57 17:32 18:09 - if (month() == 10) { - if (hour() == 6 && minute() == 25) { + // May + if (tm.Month == 5) { + if (tm.Hour == 4 && tm.Minute == 30) { openDoor(); delay(60000); } - if (hour() == 16 && minute() == 55) { - lightOn(); - delay(60000); - } - if (hour() == 19 && minute() == 30) { - lightOff(); - delay(60000); - } - if (hour() == 19 && minute() == 45) { + if (tm.Hour == 21 && tm.Minute == 55) { closeDoor(); delay(60000); } } - // November 07:20 08:02 16:24 17:06 - if (month() == 11) { - if (hour() == 7 && minute() == 30) { + // June + if (tm.Month == 6) { + if (tm.Hour == 4 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 15 && minute() == 55) { - lightOn(); - delay(60000); - } - if (hour() == 18 && minute() == 30) { - lightOff(); - delay(60000); - } - if (hour() == 17 && minute() == 45) { + if (tm.Hour == 22 && tm.Minute == 30) { closeDoor(); delay(60000); } } - // December 08:05 08:51 15:56 16:42 - if (month() == 12) { - if (hour() == 8 && minute() == 20) { + // July + if (tm.Month == 7) { + if (tm.Hour == 4 && tm.Minute == 15) { openDoor(); delay(60000); } - if (hour() == 15 && minute() == 25) { + if (tm.Hour == 22 && tm.Minute == 15) { + closeDoor(); + delay(60000); + } + } + // August + if (tm.Month == 8) { + if (tm.Hour == 4 && tm.Minute == 45) { + openDoor(); + delay(60000); + } + if (tm.Hour == 21 && tm.Minute == 45) { + closeDoor(); + delay(60000); + } + } + // September + if (tm.Month == 9) { + if (tm.Hour == 5 && tm.Minute == 55) { + openDoor(); + delay(60000); + } + if (tm.Hour == 17 && tm.Minute == 15) { lightOn(); delay(60000); } - if (hour() == 18 && minute() == 5) { + if (tm.Hour == 20 && tm.Minute == 15) { lightOff(); delay(60000); } - if (hour() == 17 && minute() == 25) { + if (tm.Hour == 20 && tm.Minute == 55) { + closeDoor(); + delay(60000); + } + } + // October + if (tm.Month == 10) { + if (tm.Hour == 6 && tm.Minute == 25) { + openDoor(); + delay(60000); + } + if (tm.Hour == 7 && tm.Minute == 15) { + lightOn(); + delay(60000); + } + if (tm.Hour == 19 && tm.Minute == 15) { + lightOff(); + delay(60000); + } + if (tm.Hour == 19 && tm.Minute == 45) { + closeDoor(); + delay(60000); + } + } + // November + if (tm.Month == 11) { + if (tm.Hour == 6 && tm.Minute == 45) { + openDoor(); + delay(60000); + } + if (tm.Hour == 7 && tm.Minute == 15) { + lightOn(); + delay(60000); + } + if (tm.Hour == 19 && tm.Minute == 15) { + lightOff(); + delay(60000); + } + if (tm.Hour == 17 && tm.Minute == 15) { + closeDoor(); + delay(60000); + } + } + // December + if (tm.Month == 12) { + if (tm.Hour == 8 && tm.Minute == 15) { + openDoor(); + delay(60000); + } + if (tm.Hour == 7 && tm.Minute == 45) { + lightOn(); + delay(60000); + } + if (tm.Hour == 19 && tm.Minute == 45) { + lightOff(); + delay(60000); + } + if (tm.Hour == 16 && tm.Minute == 45) { closeDoor(); delay(60000); } @@ -416,20 +434,20 @@ void checkTime() { } void correctionLoop() { - if (hour() == correctionHour) { + tmElements_t RTCtime; + RTC.read(RTCtime); + if (RTCtime.Hour == correctionHour) { if (correctionReady) { - // CORRECTION! - tmElements_t RTCtime; - RTC.read(RTCtime); + // CORRECTION 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) + if ((RTCtime.Day % 5) == 0) newTimestamp = newTimestamp - 2; // -2sec every 5 days (-0.4sec everyday) breakTime(newTimestamp, timeNew); RTC.write(timeNew); setSyncProvider(RTC.get); - // CORRECTION! + // CORRECTION correctionReady = false; } } else correctionReady = true; diff --git a/hencoop.odt b/hencoop.odt deleted file mode 100644 index 5c80eb8834fa401d894a5b356a54669b7fcaa217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20115 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