Build A Binary Clock Using Arduino

Introduction

In this project, 16 LEDs are used to represent the time in binary. The time is read from a Real Time Clock breakout board – the same one used in the Digital Clock page.

Binary Clock

The binary clock uses 4 place values for the hour (12hr format), 6 place values for the minutes, and 6 for the seconds.

Arduino Time

 

So the following pattern…

Arduino Time

 

… makes the time, 8+2 = 10 hours, 16 + 4 + 1 = 21 minutes, 4+2+1 = 7 seconds.

You Will Need

  • DS1307 Breakout Board & RTC
  • 2 x 74HC595 Shift Registers
  • 16 x LEDs
  • 16 x 330 Ohm Resistors
  • Jumper Wires
  • 2 Full Size Breadboards

Making The Circuit

Take care with this one, there are a lot of things to get connected. The Arduino isn’t shown in this diagram. The text labels show the pin connections – the connections to the shift registers are to digital pins.

Here is a blurry photograph of the binary clock circuit set up on an Arduino Mega. There are some minor differences to the diagram to account for the differences between the Uno and the Mega. Some of the components (eg resistors) are also slightly different. However, it works just like the one in the diagram.

Programming The Arduino

The tricky part of this code is to create the correct binary pattern. The first shift register controls the 4 LEDs that make the hours as well as 4 of the LEDs that make up the minutes. The second shift register does the other 2 LEDs of the minutes as well as all of the seconds.

Binary Clock diagram

Because of the number of places where a faulty or missing connection can prevent this from working, it’s worth just checking that you can light all of the LEDs properly. With the rest of the code as below, replace the loop with the following lines to make sure that all of the LEDs can be lit,

  writeByte(255,1);
writeByte(255,2);

The main program,

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;
int datapin = 2;
int clockpin = 3;
int latchpin = 4;
int datapin2 = 8;
int clockpin2 = 9;
int latchpin2= 10;

void setup()
{
Serial.begin(57600);
Wire.begin();
RTC.begin();

if (! RTC.isrunning()) {
Serial.println(“RTC is NOT running!”);
// following line sets the RTC to the date & time this sketch was compiled
//RTC.adjust(DateTime(__DATE__, __TIME__));
}

pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(datapin2, OUTPUT);
pinMode(clockpin2, OUTPUT);
pinMode(latchpin2, OUTPUT);
}

void loop()
{

DateTime now = RTC.now();
// All used for checking the time of the clock
// This section can be removed when everything is working
Serial.print(now.day(), DEC);
Serial.print(‘/’);
Serial.print(now.month(), DEC);
Serial.print(‘/’);
Serial.print(now.year(), DEC);
Serial.print(‘ ‘);
Serial.print(now.hour(), DEC);
Serial.print(‘:’);
Serial.print(now.minute(), DEC);
Serial.print(‘:’);
Serial.print(now.second(), DEC);
Serial.println();
// End of section that can be removed

int mins = now.minute();
int secs = now.second();
int hr = now.hour();
// convert to 12 hour time
if (hr>12)
{
hr = hr-12;
}

// variables to describe pattern of on lights
byte data1 = 0;
byte data2 = 0;

// encode the time
// hr = 1st four bits
for (int i =0;i<4;i++)
{
if (bitRead(hr,i)==1)
{
bitWrite(data1,3-i,1);
}
}
// mins on the first shift register
for (int i =2;i<6;i++)
{
if (bitRead(mins,i)==1)
{
bitWrite(data1,9-i,1);
}
}
// remaining mins LEDs
for (int i =0;i<2;i++)
{
if (bitRead(mins,i)==1)
{
bitWrite(data2,1-i,1);
}
}
// seconds
for (int i =2;i<8;i++)
{
if (bitRead(secs,i-2)==1)
{
bitWrite(data2,9-i,1);
}
}
// output the information
writeByte(data1,1);
writeByte(data2,2);
// a brief pause
delay(500);

}

void writeByte(byte data, byte set)
{
int d,c,l;
if (set==1)
{
d = 2;
c = 3;
l = 4;
}
else if (set==2)
{
d = 8;
c = 9;
l = 10;
}
shiftOut(d, c, MSBFIRST, data);
// toggle the latch pin so that the data appears as an output
digitalWrite(l, HIGH);
digitalWrite(l, LOW);
}

For more detail: Make A Binary Clock Using Arduino

 


About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top