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
- 00:38 Introduction
- 01:51 Wiring explained
- 03:16 Arduino code explained
- 13:19 Demonstration of all features
Digital clock with HT16K33 and DS1307: main

Click on image to enlarge
Resources for this sketch
- Introduction to DS1307 Code and Video
- Introduction to HT16K33 4 digit seven segment
- HT16K33 Library (from Robojax.com)
- HT16K33 Library (from GitHub)
- HT16K33 Datasheet(pdf)
- Real Time clock library (from Robojax.com)
- Real Time clock library (from Gethub)
- DS1307 Datasheet (pdf)
- Robojax Crash Course on Arduino: Learn Arduino in 30 Minutes (code and video)
- Robojax Arduino Course on Udemy
- Get Early Access to my videos via Patreon
/*
* 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