Horloge binaire à base d’arduino
Comme je suis toujours à la recherche de challenges, j’ai décidé dans le cadre d’un projet plus global de fabriquer une horloge binaire à base d’arduino. Une horloge binaire : késako ??
Concept d’une horloge binaire
Une horloge binaire est un moyen d’affichage de l’heure en base 2. Mais un schéma va vous aider à vite comprendre.

On lit l’heure par morceau. Les 2 colonnes de gauche représentent les heures, et la première colonne les dizaines (soit 0, 1 ou 2). Pour avoir le 0, aucune des leds n’est allumée. Pour un 1, la led du bas, pour un 2, celle du haut. Vous suivez toujours ?
La 2ème colonne représente les unités des heures (de 0 à 9). Ici, on affiche les nombre nécessaire pour faire le chiffre.
Exemple : pour afficher 7, on éclaire les leds 1 + 2 + 4, pour afficher 8, on allume la led 8 seulement.
Pour lire l’heure, il suffit d’ajouter en elle les colonnes.
![]()
L’horloge
L’horloge est fabriquée à partir d’un arduino, de leds 5mm, de résistances (220 ohms) et de boutons poussoirs.
Voici le schéma simplifié (réalisé avec Fritzing) :

Les 2 premières leds à gauche (pin 13 et 12) sont pour les dizaines des heures.
Les leds 3 à 6 (pin 11 à 8) sont pour les unités des heures.
Les leds 7 à 9 (pin 7 à 5) sont pour les dizaines des minutes.
Les leds 10 à 13 (pin 4 à 1) sont pour les unités des minutes.
Les 2 boutons poussoirs sont reliés sur A0 et A5 pour ajouter des minutes et des heures. Par défaut, le programme initialise l’horloge à 12h puis à chaque ajout sur les boutons, on ajoute 1 min ou 1 heure.
Le Programme
Le programme Arduino est assez simple. Je l’ai légèrement adapté du site où j’ai trouvé la base du projet mais il est simple à comprendre. Le voici.
/*
An open-source binary clock for Arduino.
Source : http://www.instructables.com/id/LED-Binary-Clock-1/
Modified : https://www.sla99.fr
Date : 2018-02-14
*/
int second = 0, minute = 0, hour = 12; //start the time on 12:00:00
int munit = 0;
int hunit = 0;
int valm = 0;
int valh = 0;
int ledstats = 0;
int i = 0;
boolean light = 1;
void setup() { //set outputs and inputs
pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT);
pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT);
pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT);
pinMode(14, INPUT);
pinMode(19, INPUT);
digitalWrite(14, HIGH);
digitalWrite(19, HIGH);
}
void loop() {
static unsigned long lastTick = 0; // set up a local variable to hold the last time we moved forward one second
// (static variables are initialized once and keep their values between function calls)
// move forward one second every 1000 milliseconds
if (millis() - lastTick >= 1000) {
lastTick = millis();
second++;
}
// move forward one minute every 60 seconds
if (second >= 60) {
minute++;
second = 0; // reset seconds to zero
}
// move forward one hour every 60 minutes
if (minute >= 60) {
hour++;
minute = 0; // reset minutes to zero
}
if (hour >= 24) {
hour = 0;
minute = 0; // reset minutes to zero
}
munit = minute % 10; //sets the variable munit and hunit for the unit digits
hunit = hour % 10;
//minutes units
if (munit == 1 || munit == 3 || munit == 5 || munit == 7 || munit == 9) {digitalWrite(1, HIGH);}else{digitalWrite(1, LOW);}
if (munit == 2 || munit == 3 || munit == 6 || munit == 7) {digitalWrite(2, HIGH);}else{digitalWrite(2, LOW);}
if (munit == 4 || munit == 5 || munit == 6 || munit == 7) {digitalWrite(3, HIGH);}else{digitalWrite(3, LOW);}
if (munit == 8 || munit == 9) { digitalWrite(4, HIGH);}else{digitalWrite(4, LOW);}
//minutes
if ((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >= 50 && minute < 60)) {digitalWrite(5, HIGH);}else{digitalWrite(5, LOW);} if (minute >= 20 && minute < 40) {digitalWrite(6, HIGH);}else{digitalWrite(6, LOW);} if (minute >= 40 && minute < 60) {digitalWrite(7, HIGH);}else{digitalWrite(7, LOW);} //hour units if (hunit == 1 || hunit == 3 || hunit == 5 || hunit == 7 || hunit == 9) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);} if (hunit == 2 || hunit == 3 || hunit == 6 || hunit == 7) {digitalWrite(9, HIGH);} else{digitalWrite(9, LOW);} if (hunit == 4 || hunit == 5 || hunit == 6 || hunit == 7) {digitalWrite(10, HIGH);} else{digitalWrite(10, LOW);} if (hunit == 8 || hunit == 9) {digitalWrite(11, HIGH);} else{digitalWrite(11, LOW);} //hour if (hour >= 10 && hour < 20){digitalWrite(12, HIGH);}else {digitalWrite(12, LOW);} if (hour >= 20 && hour < 24){digitalWrite(13, HIGH);}else {digitalWrite(13, LOW);}
valm = digitalRead(14); // add one minute when pressed
if (valm == LOW) {
minute++;
second = 0;
delay(250);
}
valh = digitalRead(19); // add one hour when pressed
if (valh == LOW) {
hour++;
second = 0;
delay(250);
}
}
Résultat
Et voici le résultat en photo. Ici sur l’image, il est 21h36 (21h35 sur la deuxième photo) !

Source du projet : http://whttp://www.instructables.com/id/LED-Binary-Clock-1/
Le fichier source Arduino complet : télécharger ici ou sur Github :
La suite ?
Il est prévu que cette horloge soit intégrée dans un caisson, avec un thermomètre à led à base d’arduino (tuto à venir), caisson qui servira de support d’écran de PC. Un projet totalement geek !!!



