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.

leds1

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.

Résultat de recherche d'images pour "horloge binaire"

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) :

Schema_horloge_binaire

 

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) !

horloge1 horloge2

 

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 :

A led binary clock
https://github.com/doddyfab/Arduino_BinaryClock
1 forks.
1 stars.
0 open issues.

Recent commits:

 

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 !!!

One Comment

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.