Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

Apps und Online-Dienste

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

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

#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

Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient

Herstellungsprozess

  1. Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
  2. Arduino Echtzeituhr für islamische Gebetszeiten bauen
  3. Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
  4. Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
  5. DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
  6. MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
  7. Präzises DIY-Messrad mit Arduino Nano und Drehgeber
  8. Web-fähigen IoT-Messer mit Arduino, Yaler und IFTTT bauen
  9. Arduino Flip Clock mit 8×8 LED-Matrix – DIY Echtzeituhr-Projekt
  10. Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen