diff --git a/simpleclock.ino b/simpleclock.ino index d26846d..49a12f8 100644 --- a/simpleclock.ino +++ b/simpleclock.ino @@ -1,160 +1,160 @@ -/* - * 7 Segment 4 Digits clock with digit point separator - * - * It uses display module with common anode and DS1307 - * RTC module to enhance time keeping ability of - * Atmega 328p based Arduino nano microcontroller and - * 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 list -of 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 POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include -#include -#include -// DS1307 lib by FrankieChu for Seeed RTC module -#include - -DS1307 clock; -SevSeg Display; - -unsigned long currentMillis; -unsigned long previousMillis = 0; -const long interval = 500; -const int hrs_btn = A0; -const int min_btn = A1; -bool dot = true; -uint8_t minutes; -uint8_t hours; - -void setup() -{ - // setup display - byte hardwareConfig = COMMON_ANODE; - byte numDigits = 4; - byte digitPins[] = {9, 10, 11, 12}; - byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 13}; - bool resistorsOnSegments = true; // 8 resistors, 330 Ohms each - bool updateWithDelays = false; // Default. Recommended - /* 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); - Display.setBrightness(90); - - // setup clock - clock.begin(); - - // if rtc returns incorrect time, reset it to some default value - clock.getTime(); - - if (( clock.hour > 23 ) || (clock.minute > 59)) - { - clock.fillByYMD(2019,2,23); // 23 Feb 2013 - clock.fillByHMS(15,52,30); // 15:52 30" - clock.fillDayOfWeek(SAT); // Saturday - clock.setTime(); // put date to rtc - } - - // setup control buttons - pinMode(hrs_btn, INPUT_PULLUP); - pinMode(min_btn, INPUT_PULLUP); -} - - -void loop() -{ - unsigned long currentMillis = millis(); - char str[4]; - float d; - - if (currentMillis - previousMillis >= interval) - { - previousMillis = currentMillis; - - if (dot == false) - { - dot = true; - - if (digitalRead(hrs_btn) == LOW) - { - clock.getTime(); - hours = clock.hour + 1; - (hours > 23)? hours = 0: hours; - clock.fillByHMS(hours, clock.minute, 0); - clock.setTime(); - } - - if (digitalRead(min_btn) == LOW) - { - clock.getTime(); - minutes = clock.minute + 1; - (minutes > 59)? minutes = 0: minutes; - clock.fillByHMS(clock.hour, minutes, 0); - clock.setTime(); - } - } - else - { - dot = false; - } - } - - clock.getTime(); - - // make blinking dot - if (clock.hour > 0) - { - if (dot == true) - { - Display.setNumber((clock.hour * 100 + clock.minute), 2); - } - else - { - Display.setNumber((clock.hour * 100 + clock.minute)); - } - } - else - { - /* 0 o'clock is an exception, we dont want to see "00.00", we want see - * "0.00" or "0 00", so we have to use this "hack" */ - if (dot == true) - { - d = float(clock.minute) / 100; - Display.setNumber(d, 2); - } - else - { - sprintf(str, "%2d%02d", clock.hour, clock.minute); - Display.setChars(str); - } - } - - Display.refreshDisplay(); -} - -/* vim: set filetype=cpp: */ +/* + * 7 Segment 4 Digits clock with digit point separator + * + * It uses display module with common anode and DS1307 + * RTC module to enhance time keeping ability of + * Atmega 328p based Arduino nano microcontroller and + * 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 list +of 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 POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include +#include +// DS1307 lib by FrankieChu for Seeed RTC module +#include + +DS1307 clock; +SevSeg Display; + +unsigned long currentMillis; +unsigned long previousMillis = 0; +const long interval = 500; +const int hrs_btn = A0; +const int min_btn = A1; +bool dot = true; +uint8_t minutes; +uint8_t hours; + +void setup() +{ + // setup display + byte hardwareConfig = COMMON_ANODE; + byte numDigits = 4; + byte digitPins[] = {9, 10, 11, 12}; + byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 13}; + bool resistorsOnSegments = true; // 8 resistors, 330 Ohms each + bool updateWithDelays = false; // Default. Recommended + /* 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); + Display.setBrightness(90); + + // setup clock + clock.begin(); + + // if rtc returns incorrect time, reset it to some default value + clock.getTime(); + + if (( clock.hour > 23 ) || (clock.minute > 59)) + { + clock.fillByYMD(2019,2,23); // 23 Feb 2013 + clock.fillByHMS(15,52,30); // 15:52 30" + clock.fillDayOfWeek(SAT); // Saturday + clock.setTime(); // put date to rtc + } + + // setup control buttons + pinMode(hrs_btn, INPUT_PULLUP); + pinMode(min_btn, INPUT_PULLUP); +} + + +void loop() +{ + unsigned long currentMillis = millis(); + char str[4]; + float d; + + if (currentMillis - previousMillis >= interval) + { + previousMillis = currentMillis; + + if (dot == false) + { + dot = true; + + if (digitalRead(hrs_btn) == LOW) + { + clock.getTime(); + hours = clock.hour + 1; + (hours > 23)? hours = 0: hours; + clock.fillByHMS(hours, clock.minute, 0); + clock.setTime(); + } + + if (digitalRead(min_btn) == LOW) + { + clock.getTime(); + minutes = clock.minute + 1; + (minutes > 59)? minutes = 0: minutes; + clock.fillByHMS(clock.hour, minutes, 0); + clock.setTime(); + } + } + else + { + dot = false; + } + } + + clock.getTime(); + + // make blinking dot + if (clock.hour > 0) + { + if (dot == true) + { + Display.setNumber((clock.hour * 100 + clock.minute), 2); + } + else + { + Display.setNumber((clock.hour * 100 + clock.minute)); + } + } + else + { + /* 0 o'clock is an exception, we dont want to see "00.00", we want see + * "0.00" or "0 00", so we have to use this "hack" */ + if (dot == true) + { + d = float(clock.minute) / 100; + Display.setNumber(d, 2); + } + else + { + sprintf(str, "%2d%02d", clock.hour, clock.minute); + Display.setChars(str); + } + } + + Display.refreshDisplay(); +} + +/* vim: set filetype=cpp: */