Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient
Komponenten und Zubehör
| Arduino Nano R3 | × | 1 |
| Maxim Integrated DS3231M – ±5 ppm, I²C Echtzeituhr | × | 1 |
| TPIC6C595 Schieberegister (High-Current Driver) | × | 4 |
| IV9 Numitron-Röhre (4-stellige Anzeige) | × | 4 |
| Generische LED (für Sekundenanzeige) | × | 2 |
| Kondensator 100 nF (Entkopplung) | × | 4 |
| 1N4007 – Hochspannungs-, Hochstrom-Diode | × | 2 |
| Schiebeschalter (Strom / Display-Helligkeit) | × | 1 |
| Widerstand 1 kΩ (Strombegrenzung) | × | 1 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (generisch)
- Lötzinn, bleifrei
Apps und Online-Dienste
- Arduino IDE (Integrated Development Environment)
Über dieses Projekt
Diese Anleitung führt Sie durch den Bau einer stilvollen Numitron-Röhren-Uhr, angetrieben von einem Arduino Nano, DS3231 Echtzeitmodul und TPIC6C595 Schieberegistern. Das Ergebnis ist eine wärmearme, zuverlässige Anzeige, die Zeit, Datum, Jahr und die Umgebungstemperatur alle 30 Sekunden anzeigt.
Das ursprüngliche Konzept stammt aus diesem GitHub-Repository. Bei meinem ersten Bau traten mehrere Probleme auf: Die 74HC595 Schieberegister überhitzten, da der Gesamtstromverbrauch ihre 70 mA Nennleistung überschritt, und das Programm nutzte blockierende Delays, wodurch die RTC nur einmal pro Minute ausgelesen wurde.
Durch den Wechsel zu den High-Current TPIC6C595 Treibern und Refactoring der Firmware auf nicht-blockierende millis()-Timing aktualisiert die Uhr nun in Echtzeit, hält die Numitron-Röhren kühl und bietet sogar einen Stromsparmodus, der das Display dimm beleuchtet.
Wesentliche Highlights:
- Nur vier IV9 Numitron-Röhren und vier TPIC6C595 Treiber erforderlich.
- Der DS3231 liefert präzise Zeitmessung und einen Temperatursensor, wodurch ein externes Thermometer entfällt.
- Ein Schiebeschalter toggelt die LED-Sekundenanzeige und erlaubt Helligkeitsanpassung.
- Alle Komponenten sind günstig und leicht erhältlich – ein großartiges DIY-Projekt für Enthusiasten.
Nach dem Zusammenbau der Schaltung und Hochladen des Codes einfach die Uhr in ein dekoratives Gehäuse einbauen. Sie wird in jeder Werkstatt oder Vitrine zum Gesprächsthema.
Code
- Arduino Code
Arduino Code
#include <RTClib.h> // RTC mit Temperatur für DS3231
RTC_DS3231 rtc; // DS3231 instanziieren
#include <Wire.h> // I2C Verdrahtung
#include <TimeLib.h> // Zeitfunktionen
#include <Time.h> // Zeitbibliothek
#include <DS1307RTC.h> // zusätzliche RTC-Unterstützung
#include <SPI.h>
#define led 7
const int latchPin = 13; // Latch-Pin für TPIC6C595
const int clockPin = 10; // Clock-Pin
const int dataPin = 11; // Data-Pin
unsigned long previousMillis = 0; // letztes Display-Update
unsigned long previousMillisDiode = 0; // letzter LED-Toggle
const long interval = 30000; // Display-Aktualisierungsintervall (30 s)
const long intervalDiode = 500; // LED-Blinkintervall
const int nums[12] = {
0b10111110, // 0
0b00000110, // 1
0b01111010, // 2
0b01101110, // 3
0b11000110, // 4
0b11101100, // 5
0b11111100, // 6
0b00001110, // 7
0b11111110, // 8
0b11101110, // 9
0b11001010, // °C Indikator
0b10111000 // °C Dezimalpunkt
};
// Variablen für geparste Zeit und Temperatur
int hour1, hour2, minute1, minute2, day1, day2, month1, month2, year1, year2, year3, year4, temp1, temp2;
int hourDecimal, minuteDecimal, dayDecimal, monthDecimal, year70, tempDecimal;
void setup() {
pinMode(led, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.begin(9600);
SPI.begin();
digitalWrite(clockPin, LOW); // Clock startet LOW
}
void loop() {
tmElements_t tm; // Struktur aus DS1307RTC Bibliothek
RTC.read(tm); // aktuelle Zeit und Temperatur lesen
// Ziffern parsen
hourDecimal = tm.Hour / 10;
hour1 = hourDecimal;
hour2 = tm.Hour - 10 * hourDecimal;
minuteDecimal = tm.Minute / 10;
minute1 = minuteDecimal;
minute2 = tm.Minute - 10 * minuteDecimal;
dayDecimal = tm.Day / 10;
day1 = dayDecimal;
day2 = tm.Day - 10 * dayDecimal;
monthDecimal = tm.Month / 10;
month1 = monthDecimal;
month2 = tm.Month - 10 * monthDecimal;
year70 = tm.Year - 30;
year1 = 2;
year2 = 0;
year3 = year70 / 10;
year4 = year70 - 10 * year3;
tempDecimal = rtc.getTemperature() / 10;
temp1 = tempDecimal;
temp2 = rtc.getTemperature() - 10 * tempDecimal;
// Sekunden-LED toggeln
if (millis() - previousMillisDiode >= intervalDiode) {
previousMillisDiode = millis();
digitalWrite(led, !digitalRead(led));
}
// Display alle 30 s aktualisieren
if (millis() - previousMillis >= interval) {
previousMillis = millis();
// Display löschen (Atem-Effekt)
digitalWrite(clockPin, LOW);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
digitalWrite(clockPin, HIGH);
delay(500);
// Datum anzeigen (Monat/Tag)
digitalWrite(clockPin, LOW);
SPI.transfer(nums[month2]);
SPI.transfer(nums[month1]);
SPI.transfer(nums[day2]);
SPI.transfer(nums[day1]);
digitalWrite(clockPin, HIGH);
delay(1500);
// Wieder löschen
digitalWrite(clockPin, LOW);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
digitalWrite(clockPin, HIGH);
delay(500);
// Jahr anzeigen (JJ)
digitalWrite(clockPin, LOW);
SPI.transfer(nums[year4]);
SPI.transfer(nums[year3]);
SPI.transfer(nums[year2]);
SPI.transfer(nums[year1]);
digitalWrite(clockPin, HIGH);
delay(1500);
// Wieder löschen
digitalWrite(clockPin, LOW);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
digitalWrite(clockPin, HIGH);
delay(500);
// Temperatur anzeigen (°C)
digitalWrite(clockPin, LOW);
SPI.transfer(0b10111000); // Dezimalpunkt
SPI.transfer(0b11001010); // °C Symbol
SPI.transfer(nums[temp2]);
SPI.transfer(nums[temp1]);
digitalWrite(clockPin, HIGH);
delay(1500);
// Endgültig löschen
digitalWrite(clockPin, LOW);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
SPI.transfer(0b00000000);
digitalWrite(clockPin, HIGH);
delay(500);
} else {
// Reguläre Zeitanzeige (HH:MM)
digitalWrite(clockPin, LOW);
SPI.transfer(nums[minute2]);
SPI.transfer(nums[minute1]);
SPI.transfer(nums[hour2]);
SPI.transfer(nums[hour1]);
digitalWrite(clockPin, HIGH);
}
}
Schaltpläne
Herstellungsprozess
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Echtzeituhr für islamische Gebetszeiten bauen
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
- DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
- MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
- Präzises DIY-Messrad mit Arduino Nano und Drehgeber
- Web-fähigen IoT-Messer mit Arduino, Yaler und IFTTT bauen
- Arduino Flip Clock mit 8×8 LED-Matrix – DIY Echtzeituhr-Projekt
- Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen