Md. Khairul Alam
Created January 24, 2025

PCB Binary Watch

A watch specially designed for engineers.

11
PCB Binary Watch

Things used in this project

Hardware components

ATmega328
Microchip ATmega328
×1
SMD LED 1206 RED
×1
DS3231M - ±5ppm, I2C Real-Time Clock
Maxim Integrated DS3231M - ±5ppm, I2C Real-Time Clock
×1
Battery Holder, Lithium CR2032
Battery Holder, Lithium CR2032
×1
SMD Button 5.2
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Schematics

Schematic

PCB 2D

PCB 3D

PCB Layout

Code

Arduino Code Version 1

Arduino
/*
Md. Khairul Alam
Arduino PCB Binary Clock
Date: 1 January, 2023
*/

#include <DS3231M.h>  
#include "LowPower.h"


DS3231M_Class DS3231M; 


const int wake_up_pin = 2;


const int min_one = 6;
const int min_ten = 5;
const int hour_one = 4;
const int hour_ten = 3;


const int min_one_pos_one = 10;
const int min_one_pos_two = 9;
const int min_one_pos_four = 8;
const int min_one_pos_eight = 7;


const int min_ten_pos_one = 9;
const int min_ten_pos_two = 8;
const int min_ten_pos_four = 7;


const int hour_one_pos_one = 10;
const int hour_one_pos_two = 9;
const int hour_one_pos_four = 8;
const int hour_one_pos_eight = 7;


const int hour_ten_pos_one = 8;
const int hour_ten_pos_two = 7;


void wake_up()
{
   
}


void setup() {
  // put your setup code here, to run once:
  //DateTime(F(__DATE__), F(__TIME__))
  pinMode(min_one, OUTPUT);
  pinMode(min_ten, OUTPUT);
  pinMode(hour_one, OUTPUT);
  pinMode(hour_ten, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(wake_up_pin, INPUT_PULLUP); 
  
  Serial.begin(9600);
  while (!DS3231M.begin())  // Initialize RTC communications
  {
    Serial.println("Not found");
    delay(1000);
  }
  DS3231M.adjust(DateTime(2022, 12, 30, 12, 0, 0));  // Set to specific Date/Time  
}


int hour_o = 0;
int hour_t = 0;
int minute_o = 0;
int minute_t = 0;


void loop() {


  attachInterrupt(0, wake_up, LOW);
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);


  // execution will start from here after wake up
  // Disable external pin interrupt on wake up pin.
  detachInterrupt(0);   
  delay(200);
  DateTime       now = DS3231M.now(); 
  int hour = now.hour();
  int minute = now.minute();


  hour_o = hour%10;
  hour_t = hour/10;


  minute_o = minute%10;
  minute_t = minute/10;


  long startTime = millis();
  while((millis() - startTime)<10000){  
    min_one_display(minute_o);
    delay(5);
    min_ten_display(minute_t);
    delay(5);
    hour_one_display(hour_o);
    delay(5);
    hour_ten_display(hour_t);
    delay(5);
  }
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
}


void min_one_display(int min_one_value){
  digitalWrite(min_one, HIGH);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
  switch(min_one_value){
    case 0:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 1:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 2:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 3:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 4:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 5:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 6:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 7:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;


    case 8:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, LOW);
      break;


    case 9:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, LOW);
      break;
   }
}


void hour_one_display(int hour_one_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, HIGH);
  digitalWrite(hour_ten, LOW);
  switch(hour_one_value){
    case 0:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 1:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 2:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 3:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 4:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 5:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 6:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 7:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;


    case 8:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, LOW);
      break;


    case 9:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, LOW);
      break;
   }
}


void min_ten_display(int min_ten_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, HIGH);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
  switch(min_ten_value){
    case 0:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, HIGH);
      break;


    case 1:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, HIGH);
      break;


    case 2:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, LOW);
      digitalWrite(min_ten_pos_four, HIGH);
      break;


    case 3:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, LOW);
      digitalWrite(min_ten_pos_four, HIGH);
      break;


    case 4:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, LOW);
      break;


    case 5:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, LOW);
      break;


   }
}


void hour_ten_display(int hour_ten_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, HIGH);
  switch(hour_ten_value){
    case 0:
      digitalWrite(hour_ten_pos_one, HIGH);
      digitalWrite(hour_ten_pos_two, HIGH);
      break;


    case 1:
      digitalWrite(hour_ten_pos_one, LOW);
      digitalWrite(hour_ten_pos_two, HIGH);
      break;


    case 2:
      digitalWrite(hour_ten_pos_one, HIGH);
      digitalWrite(hour_ten_pos_two, LOW);
      break;


   }
}

Credits

Md. Khairul Alam
70 projects • 590 followers
Developer, Maker & Hardware Hacker. Currently working as a faculty at the University of Asia Pacific, Dhaka, Bangladesh.
Contact

Comments

Please log in or sign up to comment.