Other Arduino Codes and Videos by Robojax

Build Simple digital clock using Arduino DS3107

دروس آردوینو به فارسی

Build digital clock using HT16K33 with DS3107 with Arduino

Using this code shown in the video, we build a digital clock using seven segment display wiht HT16K33 module and DS1307 Real time clock module with Arduino.

Libraries needed for this project

1-DS1307 RTClib library (and watch video instruction)
2-HT16K33 Library (and watch video instruction)
Both libraries are available for download from links below.

Chapters in this video

Digital clock with HT16K33 and DS1307: main

Digital clock with HT16K33 and DS1307: main
Click on image to enlarge

Resources for this sketch


 /*
 * file: DS1307_HT16K33_clock_display
 * Digital clock using DS1307 Real Time clock module and Arduino
 * Displays time on 4 digits seven segment dispaly HT16K33
 * Used DS1307 library and HT16K33 library below
 * watch video instruction: https://youtu.be/JUcskPLro4U
 * 
 * Must watch two videos
 * Introduction to DS1307: https://youtu.be/-I1nReV_oZg
 * Introduction to HT16K33: https://youtu.be/tEwWsbHQA5Q
 * 
 * Written by Ahmad Shamshiri on Feb 07, 2021 in Ajax, Ontario, Canada
 * www.Robojax.com
 * 
  * 
 * 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
  
*/
//DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec)

#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

 
   

If you found this tutorial helpful, please support me so I can continue creating content like this. support me via PayPal