Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig

Onderdelen en benodigdheden

Arduino Nano R3 × 1
Maxim Integrated DS3231M – ±5 ppm, I²C Real-Time Clock × 1
TPIC6C595 Schuifregister (Hoogstroom-driver) × 4
IV9 Numitron-buis (4-cijfer display) × 4
Generieke LED (voor seconden-indicator) × 2
Condensator 100 nF (Decoupling) × 4
1N4007 – Hoogspanning, Hoogstroom Diode × 2
Schuifschakelaar (Voeding / Display-intensiteit) × 1
Weerstand 1 kΩ (Stroombegrenzing) × 1

Benodigde tools en machines

  • Solderbout (Generiek)
  • Solderdraad, Loodvrij

Apps en online diensten

  • Arduino IDE (Integrated Development Environment)

Over dit project

Deze gids leidt je door het bouwen van een stijlvolle Numitron-buis klok aangedreven door een Arduino Nano, DS3231 real-time module, en TPIC6C595 schuifregisters. Het resultaat is een laag-hitte, betrouwbare display die tijd, datum, jaar, en de omgevingstemperatuur elke 30 seconden toont.

Het oorspronkelijke concept kwam van deze GitHub-repository. Tijdens mijn eerste build liep ik tegen diverse problemen aan: de 74HC595 schuifregisters overheetten omdat de totale stroomtrekking hun 70 mA-nominale waarde overschreed, en het programma gebruikte blokkerende delays die ervoor zorgden dat de klok de RTC slechts één keer per minuut uitlees.

Door over te schakelen naar de hoogstroom TPIC6C595 drivers en de firmware te herstructureren om non-blokkerende millis() timing te gebruiken, werkt de klok nu in real-time, houdt de Numitron-buizen koel, en biedt zelfs een energiezuinige modus die de display dim belicht.

Belangrijkste hoogtepunten:

  • Alle vier IV9 Numitron-buizen en vier TPIC6C595 drivers zijn vereist.
  • De DS3231 biedt nauwkeurige tijdmeting en een temperatuursensor, wat de noodzaak voor een externe thermometer elimineert.
  • Een schuifschakelaar schakelt de LED-gestuurde seconden-indicator en stelt je in staat de displayhelderheid aan te passen.
  • Alle componenten zijn goedkoop en gemakkelijk verkrijgbaar, wat dit een geweldig DIY-project maakt voor enthousiastelingen.

Na het monteren van de schakeling en het uploaden van de code, monteur je de klok simpelweg in een decoratieve behuizing. Het zal een gespreksonderwerp zijn in elke werkplaats of vitrine.

Code

  • Arduino Code

Arduino Code C/C++

#include <RTClib.h> // RTC met temperatuur voor DS3231
RTC_DS3231 rtc; // instantiate DS3231
#include <Wire.h> // I2C bedrading
#include <TimeLib.h> // tijdsfuncties
#include <Time.h> // tijdsbibliotheek
#include <DS1307RTC.h> // additionele RTC-ondersteuning
#include <SPI.h>
#define led 7
const int latchPin = 13; // latch pin voor TPIC6C595
const int clockPin = 10; // clock pin
const int dataPin = 11; // data pin
unsigned long previousMillis = 0; // laatste display-update
unsigned long previousMillisDiode = 0; // laatste LED-toggle
const long interval = 30000; // display vernieuwingsinterval (30 s)
const long intervalDiode = 500; // LED knipperinterval
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-indicator
  0b10111000  // °C decimaal punt
};
// Variabelen om geparsde tijd en temperatuur op te slaan
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); // zorg dat clock laag start
}

void loop() {
  tmElements_t tm; // structuur uit DS1307RTC bibliotheek
  RTC.read(tm); // lees huidige tijd en temperatuur
  // Parse cijfers
  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;
  // Toggle seconden LED
  if (millis() - previousMillisDiode >= intervalDiode) {
    previousMillisDiode = millis();
    digitalWrite(led, !digitalRead(led));
  }
  // Vernieuw display elke 30 s
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();
    // Wis display (ademhalingseffect)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    // Toon datum (maand/dag)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[month2]);
    SPI.transfer(nums[month1]);
    SPI.transfer(nums[day2]);
    SPI.transfer(nums[day1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    // Wis opnieuw
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    // Toon jaar (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);
    // Wis opnieuw
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    // Toon temperatuur (°C)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b10111000); // decimaal punt
    SPI.transfer(0b11001010); // °C-symbool
    SPI.transfer(nums[temp2]);
    SPI.transfer(nums[temp1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    // Eindig wissen
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
  } else {
    // Reguliere tijdweergave (UU:MM)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[minute2]);
    SPI.transfer(nums[minute1]);
    SPI.transfer(nums[hour2]);
    SPI.transfer(nums[hour1]);
    digitalWrite(clockPin, HIGH);
  }
}

Schema's

Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig

Productieproces

  1. Bouw een real-time gyroscoop-spel met Arduino Nano & MPU-6050 sensor
  2. Bouw een Arduino Real-Time Clock voor Islamitische Gebedstijden
  3. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  4. Arduino Temperatuurbewaking & Realtime Klok met 3.2" TFT-display
  5. Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
  6. MobBob: Bouw Je Eigen Arduino Robot, Naadloos Bestuurd via Android Smartphone
  7. Een nauwkeurig meetwieltje bouwen met Arduino Nano en draaiencoder
  8. Web-IoT Meter Bouwen met Arduino, Yaler en IFTTT
  9. Arduino Flip Clock met 8×8 LED Matrix – DIY Real-Time Clock Project
  10. Precieze Luchtkwaliteit Monitor met Sharp GP2Y1010AU0F Sensor
  11. Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO