diff --git a/simpleclock.ino b/simpleclock.ino index 1f3f920..51c9bda 100644 --- a/simpleclock.ino +++ b/simpleclock.ino @@ -6,33 +6,6 @@ * 2 buttons for adjusting time. */ -/* This software distributed under BSD 2 Clause License - * - * Copyright (c) Sergei Fedosoff, All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright - * notice, this listof conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITYOF SUCH DAMAGE. - */ - /* DS1307 lib by FrankieChu for Seeed RTC module, in my case * Grove___RTC_DS1307-1.0.0.zip */ #include @@ -43,7 +16,7 @@ SevSeg Display; /* push button stuff */ const long initial_delay = 600; // wait a bit before spin numbers -const long adjust_interval = 200; // delay between consecutive number increnents +const long adjust_interval = 200; // delay between consecutive number increments const long bounce_delay = 20; // contact bounce compensation const int hrs_btn = A0; // put hour adjusting button on A0 lane const int min_btn = A1; // put minute adjusting button on A1 lane @@ -60,8 +33,9 @@ const long interval = 500; bool dot = true; /* time inaccuracy compensation flag */ -uint8_t compflag = 0; +bool compflag = true; const uint8_t timeSkew = 6; // assume that clock runs faster than should +bool timeSkewEven = false; // comp. 1 additional second per 2 days /* ambient light compensation aka night mode */ const int photoPin = A2; @@ -74,19 +48,19 @@ void setup() byte digitPins[] = {9, 10, 11, 12}; byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 13}; bool resistorsOnSegments = true; // 8 resistors, 330 Ohms each - /* updateWithDelays defaults to false and it is recommended value, + /* updateWithDelays defaults to false and it is recommended value, * but i was unable to make my display to change brightness with * recommended value, so i have to use updateWithDelays=true, * in this case brightness gets changed. */ - bool updateWithDelays = true; // Default. Recommended + bool updateWithDelays = true; /* without it there is visual bug at 0 o'clock, and in current version * of SevSeg' setChars() does not dots at all */ bool leadingZeros = false; Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, - resistorsOnSegments, updateWithDelays, leadingZeros); + resistorsOnSegments, updateWithDelays, leadingZeros); Display.setBrightness(100); // setup clock @@ -106,7 +80,7 @@ void setup() pinMode(hrs_btn, INPUT_PULLUP); pinMode(min_btn, INPUT_PULLUP); - // setup brigtness sensor + // setup ambient brigtness sensor pinMode(photoPin, INPUT); } @@ -122,7 +96,7 @@ void loop() // push button magic if ((!btn_pushed) and - ((digitalRead(hrs_btn) == LOW) or (digitalRead(min_btn) == LOW))) { + ((digitalRead(hrs_btn) == LOW) or (digitalRead(min_btn) == LOW))) { if (currentPushTimer - previousPushTimer >= initial_delay) { previousPushTimer = currentPushTimer; btn_pushed = true; @@ -130,7 +104,7 @@ void loop() } if (btn_pushed and - (digitalRead(hrs_btn) != LOW) and (digitalRead(min_btn) != LOW)) { + (digitalRead(hrs_btn) != LOW) and (digitalRead(min_btn) != LOW)) { // compensate possible contact bounce with delay if (currentPushTimer - previousPushTimer >= bounce_delay) { btn_pushed = false; @@ -169,20 +143,30 @@ void loop() /* * Let's implement time compenstion for individual rtc module time * charachteristics. In in my case quartz resonator as inaccurate as - * +/- about 5-8 seconds per 24 hours, maybe its require more EMI + * +/- about 6.5 seconds per 24 hours, maybe its require more EMI * shielding? */ if ((clock.hour == 21) and (clock.minute == 21) and - (clock.second == 21) and (compflag == 0)) { - clock.fillByHMS(clock.hour, clock.minute, (clock.second - timeSkew)); + (clock.second == 21) and (compflag)) { + + if (timeSkewEven) { + timeSkewEven = false; + clock.fillByHMS(clock.hour, clock.minute, + (clock.second - timeSkew - 1)); + } else { + timeSkewEven = true; + clock.fillByHMS(clock.hour, clock.minute, + (clock.second - timeSkew)); + } + clock.setTime(); - compflag = 1; + compflag = false; } if ((clock.hour == 21) and (clock.minute == 21) and - (clock.second == 23) and (compflag == 1)) { - compflag = 0; + (clock.second == 23) and (!compflag)) { + compflag = true; } // make blinking dot @@ -205,28 +189,29 @@ void loop() } /* ambient light compensation - * ambLight can be in range of 0..1023, if it 800, it has point to use fullbright + * ambLight can be in range of 0..1023, if it 800, it has point to use + * fullbright */ if (ambLight >= 940) { Display.setBrightness(100); } else if ((ambLight < 900) and (ambLight >= 840)) { - Display.setBrightness(95); + Display.setBrightness(75); } else if ((ambLight < 800) and (ambLight >= 735)) { - Display.setBrightness(70); + Display.setBrightness(40); } else if ((ambLight < 700) and (ambLight >= 635)) { - Display.setBrightness(25); - } else if ((ambLight < 600) and (ambLight >= 530)) { Display.setBrightness(15); - } else if ((ambLight < 500) and (ambLight >= 430)) { + } else if ((ambLight < 600) and (ambLight >= 530)) { Display.setBrightness(12); - } else if ((ambLight < 400) and (ambLight >= 325)) { + } else if ((ambLight < 500) and (ambLight >= 430)) { Display.setBrightness(10); - } else if ((ambLight < 300) and (ambLight >= 220)) { + } else if ((ambLight < 400) and (ambLight >= 325)) { Display.setBrightness(8); - } else if ((ambLight < 200) and (ambLight >= 110)) { - Display.setBrightness(7); - } else if (ambLight < 100) { + } else if ((ambLight < 300) and (ambLight >= 220)) { Display.setBrightness(6); + } else if ((ambLight < 200) and (ambLight >= 110)) { + Display.setBrightness(4); + } else if (ambLight < 100) { + Display.setBrightness(3); } Display.refreshDisplay();