Robojax

Lesson 105: Ultimate Arduino Clocks projects using DS1307

Lesson 105: Ultimate Arduino Clocks projects using DS1307

Please select other codes for this lecture from the links below.

  • Lesson 19: Introduction to LCD screen
  • Lesson 25: Introduction to HT16K33 Seven Segment Display
  • Purchase LCD Screen from Amazon USA
  • Purchase LCD Screen from Amazon Canada
  • Purchase LCD Screen from all other Amazon
  • Part 13: Clock and Timers

    This in this lesson we have 7 projects in one. We learn how use DS1307 Real-Time Clock (RTC) module to build a clock using Arduino.

    This is project 4 LED Seven Segment Clock. This code is to build and Actual Digital Clock using DS1207. We used HT16K33 4 digit seven segment display to display time.

    Projects

    
     /*
     * Lesson 105-1: Building Clock using DS1307 | Robojax Arduino Step By Step Course
     This code:  Project 4: LED Seven Segment Clock using DS1307
    In this lesson we learn how to use DS1307 Real-time clock module to build Arduino clock. In this lesson we learn about 7 projects. 
    
    Project 1: Basic DS1307 Clock with Arduino
    Project 2: DS1307 Alarm with Buzzer and Relay
    Project 3: DS1307 Alarm with Relay and AC Bulb
    Project 4: LED Seven Segment Clock using DS1307
    Project 5: Unlimited Alarm with Relay
    Project 6: LCD Clock using DS1307
    Project 7: LCD Clock with Alarm 
     * Watch Video instrution for this code:https://youtu.be/gz9xqvRroDY
     * 
     * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
     * 
     * for library of this code visit http://robojax.com/
     * 
    If you found this tutorial helpful, please support me so I can continue creating 
    content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax 
    
    Written by Ahmad Shamshiri on Feb 07, 2021
    
     *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
     * This code has been download from Robojax.com
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <https://www.gnu.org/licenses/>.
    	
      DS1307: RTCLib from Adafruit
       https://github.com/adafruit/RTClib/   	
      HT16k33 library
    //  AUTHOR: Rob Tillaart
    // VERSION: 0.1.0
    // PURPOSE: demo
    //     URL: http://www.adafruit.com/products/1002
    //     URL: https://github.com/RobTillaart/HT16K33
    
    */
    
    
    #include <Wire.h>
    #include "RTClib.h"
    
    RTC_DS1307 rtc;
    
    #include "HT16K33.h"
    HT16K33  seg(0x70);//initialize the display with 0x70 I2C address
    
    //watch video for settings details and demo https://youtu.be/JUcskPLro4U
    bool showSecond = false;//show or hide seconds. set to false to not show
    unsigned int secondDisplayEvery=5000;//show seconds every 10 seconds
    unsigned int secondBlinkCount=6;//show 3 blinks of second 
    unsigned int secondDisplayDuration =5000;//for how long seconds should be shown (in milliseonds)
    bool showLeadingZero =false;
    bool showSecondNoBlink=true;//just count senconds no blink
    
    unsigned long rememberTime = millis();
    void showSeconds1();
    void showSeconds2();
    
    char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    
    void setup () {
      while (!Serial); // for Leonardo/Micro/Zero
    
    
      Serial.begin(9600);
      if (! rtc.begin()) {
        Serial.println("Couldn't find RTC");
        while (1);
      }
    
      if (! rtc.isrunning()) {
        Serial.println("RTC is NOT running!");
    
      }
    
        Serial.println("Robojax Digitla Clock");
      Serial.println("using DS1307 and HT16K33");  
    
        // following line sets the RTC to the date & time this sketch was compiled
        // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
         //rtc.adjust(DateTime(2019, 3, 3, 20, 0, 0));
      //rtc.adjust(DateTime(2019, 3, 3, 8, 1, 0));
       rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
     //settings for seven sigment display
      seg.begin();
      Wire.setClock(100000);
    
      seg.displayOn();
    
      seg.setDigits(4);
      seg.displayTest(1); 
       
      seg.displayOff(); 
      delay(50);
      seg.displayOn();  
      seg.brightness(10);//set brightness from 1-15        
    }
    
    void loop () {
      (showLeadingZero)? seg.setDigits(4) : seg.setDigits(3);
      
        DateTime now = rtc.now();
         //printTime();//print time on serial monitor   
    
      seg.displayTime(now.hour(),now.minute());
      seg.displayColon(1);     
      delay(500);
      seg.displayColon(0);  
      delay(500); 
    
      (showSecondNoBlink)? showSeconds2() : showSeconds1();  
        
    }//loop end
    
    /*
     * 
     * @brief shows seconds on HT16K33 display
     * with blinking
     * @param none
     * @return no return value
     * written Feb 06, 2021 by Ahmad Shamshiri
     * www.robojax.com
     */
    void showSeconds1()
    {
      int count = secondBlinkCount;
      if(showSecond){
          if(millis() - rememberTime   > secondDisplayEvery)
          {
              while(count>=0)
              {
                DateTime now = rtc.now();       
                count -=1;      
                seg.setDigits(2);    
                seg.displayInt(now.second());     
                delay(500);
                seg.displayOff();  
                delay(500);  
                seg.displayOn();
                rememberTime = millis()  ;  
              }// while end    
          }//if
      }//if showSecond is true
    }//showSecond() end
    
    /*
     * 
     * @brief shows seconds on HT16K33 display
     * without blinking. 
     * @param none
     * @return no return value
     * written Feb 06, 2021 by Ahmad Shamshiri
     * www.robojax.com
     */
    void showSeconds2()
    {
      int count = secondDisplayDuration;
    
      if(showSecond){
          if(millis() - rememberTime   > secondDisplayEvery)
          {
              while(count>=0)
              {        
                DateTime now = rtc.now();        
                count -=50;      
                seg.setDigits(2);    
                seg.displayInt(now.second());     
                delay(50);
                rememberTime = millis()  ;  
              }// while end    
          }//if
      }//if showSecond is true
    }//showSeconds2() end
    
    /*
     * 
     * @brief prints time on serial monitor
     * @param none
     * @return no return value
     * written Feb 06, 2021 by Ahmad Shamshiri
     * www.robojax.com
     */
    void printTime()
    {
      
        DateTime now = rtc.now();
        
        Serial.print(now.year(), DEC);
        Serial.print('/');
        Serial.print(now.month(), DEC);
        Serial.print('/');
        Serial.print(now.day(), DEC);
        Serial.print(" (");
        Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
        Serial.print(") ");
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);
        Serial.print(':');
        Serial.print(now.second(), DEC);
        Serial.println();
    }//printTime() end