Construire une Horloge de Berlin avec Arduino UNO – Horloge à Matrice LED DIY
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino UNO | 1 | |
| MAX7219 (pilote afficheurs 8 chiffres / matrice LED) | 1 | Juste le CI, utilisé dans les modules matrice LED |
| Module RTC (horloge temps réel) – DS1307 | 1 | |
| LED 5 mm jaune | 13 | |
| LED 5 mm rouge | 11 | Peut être remplacé par des RGB |
| Résistance 10 kΩ | 1 |
À propos du projet
Ce projet est adapté d'un tutoriel que j'ai publié sur Instructables. L'horloge de Berlin (BerlinUhr ou Mengenlehreuhr) est probablement la toute première horloge numérique, existant depuis 1975. Plus d'infos sur Wikipedia.
Comment lire l'heure
Quatre rangées de lumières :
- Rangée supérieure : heures × 5 (4 LED rouges)
- Deuxième rangée : heures unitaires 1 à 4 (4 LED rouges)
- Troisième rangée : minutes × 5 (11 LED jaunes, dont une toutes les 3 pour les quarts)
- Rangée inférieure : minutes unitaires 1 à 4 (4 LED jaunes)
- La grosse LED du haut clignote chaque seconde
Exemple sur la photo : 2×5h + 3h + 6×5min + 2min = 13:32 (format 24h).
Étape 1 : Électronique
Arduino UNO, module RTC DS1307 (broches A4/SDA, A5/SCL), MAX7219 pour piloter les LED (DataIn pin 12, CLK pin 11, LOAD pin 10), LED secondes sur pin 13. Résistances : 220 Ω pour la LED secondes, 68 kΩ pour Iset du MAX7219 (limite le courant des sorties).
Étape 2 : Montage
Le MAX7219 pilote 8 afficheurs 7 segments. Ici, ses sorties DIG 0–4 commandent les « lignes » de LED. La rangée « minutes×5 » ayant 11 LED, on utilise DIG 1 et DIG 2. Les sorties segments A–G et DP reçoivent des mots binaires (ex: B01010100) via la bibliothèque LedControl.
Attention : Le bit de poids fort (MSB) correspond au segment DP, pas au segment A – inverser la logique si vous avez déjà câblé.
Étape 3 : Les LED
Les anodes des LED d'une même rangée sont reliées à une sortie DIG du MAX7219, les cathodes aux segments correspondants. La LED secondes est branchée directement sur la pin 13.
Étape 4 : Le code
#include
#include
const int DS1307 = 0x68; // A5=SCL, A4=SDA
const char* days[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
const char* months[] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
byte second=0, minute=0, hour=0, weekday=0, monthday=0, month=0, year=0;
byte lastMinute=0, lastSecond=0;
int Led=13;
// Patterns binaires pour 0 à 11 LED allumées (MSB = DP)
byte nul = B00000000;
byte een = B01000000;
byte twee = B01100000;
byte drie = B01110000;
byte vier = B01111000;
byte vijf = B01111100;
byte zes = B01111110;
byte zeven= B01111111;
byte acht = B11111111;
byte negen= B01000000; // 9 = 8+1
byte tien = B01100000; // 10 = 8+2
byte elf = B01110000; // 11 = 8+3
int a=0, b=0, c=0, vijfMinTwee=0;
int uitgang = LOW;
LedControl lc = LedControl(12, 11, 10, 1); // DataIn, CLK, LOAD, 1 device
unsigned long delaytime = 100;
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Led, OUTPUT);
lc.shutdown(0, false);
lc.setIntensity(0, 8); // Luminosité moyenne
lc.clearDisplay(0);
}
void loop() {
readTime();
digitalWrite(Led, uitgang);
if (second != lastSecond) {
uitgang = (uitgang == LOW) ? HIGH : LOW;
digitalWrite(Led, uitgang);
lastSecond = second;
}
if (minute != lastMinute) {
printTime();
lastMinute = minute;
}
}
byte bcdToDec(byte val) {
return (val/16*10) + (val%16);
}
void printTime() {
long minuten = minute;
long uren = hour;
int vijfmin = minuten / 5;
int eenminuut = minuten - (vijfmin * 5);
int vijfuren = uren / 5;
int eenuren = uren - (vijfuren * 5);
a = vijfmin; digitaal(); vijfmin = b; vijfMinTwee = c;
a = eenminuut; digitaal(); eenminuut = b;
a = vijfuren; digitaal(); vijfuren = b;
a = eenuren; digitaal(); eenuren = b;
lc.setRow(0, 4, vijfuren); // DIG 4 : heures×5
lc.setRow(0, 3, eenuren); // DIG 3 : heures unitaires
lc.setRow(0, 1, vijfmin); // DIG 1 : minutes×5 (partie 1)
lc.setRow(0, 2, vijfMinTwee); // DIG 2 : minutes×5 (partie 2)
lc.setRow(0, 0, eenminuut); // DIG 0 : minutes unitaires
}
void readTime() {
Wire.beginTransmission(DS1307);
Wire.write(byte(0));
Wire.endTransmission();
Wire.requestFrom(DS1307, 7);
second = bcdToDec(Wire.read());
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read());
weekday = bcdToDec(Wire.read());
monthday = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void digitaal() {
switch (a) {
case 0: b=nul; c=nul; break;
case 1: b=een; c=nul; break;
case 2: b=twee; c=nul; break;
case 3: b=drie; c=nul; break;
case 4: b=vier; c=nul; break;
case 5: b=vijf; c=nul; break;
case 6: b=zes; c=nul; break;
case 7: b=zeven; c=nul; break;
case 8: b=acht; c=nul; break;
case 9: b=acht; c=negen; break;
case 10: b=acht; c=tien; break;
case 11: b=acht; c=elf; break;
}
}
Le code est simple : lecture RTC, conversion BCD, calcul des rangées, envoi au MAX7219 via setRow. Bonus : vous apprenez à compter en néerlandais de 0 à 11 !
Bibliothèque
Processus de fabrication
- Maîtriser les calculs de constante de temps pour circuits RC et RL
- L'Horloge à Coucou : Histoire, Artisanat et Évolution Moderne
- Le sablier : histoire, artisanat et attrait moderne
- L'évolution de la mesure du temps : des cadrans solaires aux montres à quartz de précision
- Maîtriser time.sleep() en Python : Bonnes pratiques, multithreading et exemples réels
- Rpibot : Robot mobile low-cost et extensible pour apprentissage systèmes embarqués
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les dates et heures en Python : Guide pratique
- Horloge Miroir Infini : Élégance Infinie et Précision Temporelle