Berlin-Uhr mit Arduino UNO bauen – DIY LED-Matrix-Uhr
Komponenten und Zubehör
| Arduino UNO | 1 | |
| MAX7219 LED-Display-Treiber | 1 | Der IC, der auch in LED-Matrix-Breakouts verwendet wird |
| Real Time Clock (RTC) Modul | 1 | z. B. DS1307 Breakout |
| 5 mm LED gelb | 13 | Für Stunden-Anzeige (5h & 1h Reihen) |
| 5 mm LED rot | 11 | Für Minuten-Anzeige (5min & 1min Reihen) |
| Widerstand 10 kΩ | 1 | Für MAX7219 Strombegrenzung (ISet) |
| Widerstand 220 Ω | 1 | Für Sekunden-LED an Pin 13 |
| Widerstand 68 kΩ | 1 | Alternative für ISet (bessere thermische Stabilität) |
Benötigte Werkzeuge
- Lötkolben & Lötzinn
- Steckbrett / Lochrasterplatine (Eurocard-Format)
- Multimeter
Über dieses Projekt
Dies ist eine Übertragung eines Tutorials von der Instructables-Website. Noch nicht ganz perfekt integriert, aber der Inhalt ist vollständig.
Einführung: Die Berlin-Uhr
Die Berlin-Uhr (Berliner Uhr, Mengenlehreuhr) war vermutlich die allererste digitale Uhr. Seit 1975 öffentlich installiert. Mehr Infos: Wikipedia.
Wie man die Zeit abliest: Vier Lichtreihen zeigen die Zeit an:
- Obere Reihe (rot): Stunden × 5 (je Licht = 5 Stunden)
- Zweite Reihe (rot): Einzelstunden 1–4
- Dritte Reihe (gelb): Minuten × 5 (je Licht = 5 Minuten, jede 3. LED rot für 15/30/45 Min)
- Untere Reihe (gelb): Einzelminuten 1–4
- Großes Licht oben: Blinkt jede Sekunde
Beispiel: 2 Lichter in Reihe 1 (2×5=10h) + 3 Lichter in Reihe 2 (3h) + 6 Lichter in Reihe 3 (6×5=30min) + 2 Lichter in Reihe 4 (2min) = 13:32. Die Uhr nutzt 24-Stunden-Format.
Schritt 1: Die Elektronik
Benötigt werden: Arduino UNO, RTC-Modul (DS1307), 13 gelbe + 11 rote LEDs (5mm), MAX7219 Treiber-IC, Breadboard/Lochrasterplatine, Widerstände (220Ω für Sekunden-LED, 68kΩ für MAX7219 ISet). Die LedControl-Bibliothek wird verwendet: GitHub.
Schritt 2: Aufbau
Datenblatt MAX7219: SparkFun.
MAX7219 Pin-Belegung:
- Pin 4, 9 → GND
- Pin 19 → VCC
- Pin 18 (ISet) → VCC über 68kΩ Widerstand (begrenzt LED-Strom)
- Pin 1 (DIN) → Arduino Pin 12
- Pin 12 (LOAD) → Arduino Pin 10
- Pin 13 (CLK) → Arduino Pin 11
Ausgänge: DIG 0–4 treiben die LED-Reihen an (DIG 1 & 2 für die 11 LEDs der 5-Minuten-Reihe). Segmente A–G + DP erhalten Byte-Werte (z. B. B01010100). Wichtig: DP ist das MSB (Most Significant Bit), nicht LSB – dies muss bei der Programmierung beachtet werden.
Schritt 3: LED-Verdrahtung
Die Sekunden-LED ist direkt an Pin 13 angeschlossen. Das Foto zeigt 17:47 Uhr.
Schritt 4: Der Code
#include
#include
const int DS1307 = 0x68; // I2C-Adresse RTC
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;
byte nul = B00000000, een = B01000000, twee = B01100000, drie = B01110000;
byte vier = B01111000, vijf = B01111100, zes = B01111110, zeven = B01111111;
byte acht = B11111111, negen = B01000000, tien = B01100000, elf = B01110000;
int a = 0, b = 0, c = 0, vijfMinTwee = 0;
int uitgang = LOW;
LedControl lc = LedControl(12, 11, 10, 1); // DIN, CLK, LOAD, Devices
unsigned long delaytime = 100;
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Led, OUTPUT);
lc.shutdown(0, false);
lc.setIntensity(0, 8); // Helligkeit 0-15
lc.clearDisplay(0);
}
void loop() {
readTime();
digitalWrite(Led, uitgang);
// Sekunden-Blinken
if (second != lastSecond) {
uitgang = (uitgang == LOW) ? HIGH : LOW;
digitalWrite(Led, uitgang);
lastSecond = second;
}
// Minuten-Update
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: 5-Stunden
lc.setRow(0, 3, eenuren); // DIG 3: 1-Stunden
lc.setRow(0, 1, vijfmin); // DIG 1: 5-Minuten (Teil 1)
lc.setRow(0, 2, vijfMinTwee); // DIG 2: 5-Minuten (Teil 2)
lc.setRow(0, 0, eenminuut); // DIG 0: 1-Minuten
}
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;
}
}
Der Code ist übersichtlich: RTC auslesen, Zeit in Berlin-Uhr-Format umrechnen, an MAX7219 senden. Als Bonus lernt man niederländisch zählen (nul, een, twee, drie, vier, vijf, zes, zeven, acht, negen, tien, elf) – der Autor ist Niederländer!
Code-Repository
Herstellungsprozess
- Zeitkonstanten-Berechnung für RC- und RL-Schaltungen meistern
- Kuckucksuhr: Geschichte, Handwerkskunst und moderne Evolution
- Die Sanduhr: Geschichte, Handwerkskunst und moderne Anziehungskraft
- Die Evolution der Zeitmessung: Von Sonnenuhren zu präzisen Quarzuhren
- Pythons time.sleep() meistern: Best Practices, Multithreading und Praxisbeispiele
- Rpibot: Kostengünstiger, erweiterbarer mobiler Roboter für Embedded Systems Lernen
- Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Datum & Zeit in Python meistern: Praktischer Leitfaden
- Infinity Mirror Clock: Endlose Eleganz trifft präzise Zeitanzeige