Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Construye un reloj Numitron retro con Arduino: Simple, fiable y eficiente energéticamente

Componentes y suministros

Arduino Nano R3×1
Maxim Integrated DS3231M – ±5 ppm, RTC I²C×1
Registro de desplazamiento TPIC6C595 (Driver alta corriente)×4
Tubo Numitron IV9 (display 4 dígitos)×4
LED genérico (indicador segundos)×2
Condensador 100 nF (Desacoplo)×4
1N4007 – Diodo alta tensión, alta corriente×2
Interruptor deslizante (Potencia / Intensidad display)×1
Resistencia 1 kΩ (Limitación corriente)×1

Herramientas y máquinas necesarias

Aplicaciones y servicios online

Sobre este proyecto

Esta guía te lleva paso a paso para construir un elegante reloj de tubos Numitron alimentado por un Arduino Nano, módulo RTC DS3231 y registros de desplazamiento TPIC6C595. El resultado es una pantalla de bajo calor, fiable, que muestra hora, fecha, año y temperatura ambiente cada 30 segundos.

El concepto original vino de este repositorio GitHub. En mi primera construcción, encontré varios problemas: los registros de desplazamiento 74HC595 se sobrecalentaban porque la corriente total superaba su límite de 70 mA, y el programa usaba retardos bloqueantes que causaban que el reloj leyera el RTC solo una vez por minuto.

Al cambiar a los drivers de alta corriente TPIC6C595 y refactorizar el firmware para usar temporización no bloqueante con millis(), el reloj ahora actualiza en tiempo real, mantiene los tubos Numitron fríos, e incluso ofrece un modo de ahorro de energía que ilumina tenuemente la pantalla.

Aspectos destacados:

Tras montar el circuito y subir el código, simplemente monta el reloj en una carcasa decorativa. Será un iniciador de conversación en cualquier taller o vitrina.

Código

Código Arduino (C/C++)

#include <RTClib.h> // RTC con temperatura para DS3231
RTC_DS3231 rtc; // instanciar DS3231
#include <Wire.h> // I2C
#include <TimeLib.h> // funciones tiempo
#include <Time.h> // librería tiempo
#include <DS1307RTC.h> // soporte RTC adicional
#include <SPI.h>

#define led 7
const int latchPin = 13; // latch para TPIC6C595
const int clockPin = 10; // clock
const int dataPin = 11;  // data

unsigned long previousMillis = 0;      // última actualización display
unsigned long previousMillisDiode = 0; // último toggle LED
const long interval = 30000;           // intervalo refresco display (30 s)
const long intervalDiode = 500;        // intervalo parpadeo LED

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, // indicador °C
  0b10111000  // punto decimal °C
};

// Variables para dígitos parseados
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); // asegurar clock empieza en LOW
}

void loop() {
  tmElements_t tm; // estructura de librería DS1307RTC
  RTC.read(tm);    // leer hora actual y temperatura

  // Parsear dígitos
  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;

  // Parpadear LED segundos
  if (millis() - previousMillisDiode >= intervalDiode) {
    previousMillisDiode = millis();
    digitalWrite(led, !digitalRead(led));
  }

  // Refrescar display cada 30 s
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();
    
    // Limpiar display (efecto respiración)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // Mostrar fecha (mes/día)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[month2]);
    SPI.transfer(nums[month1]);
    SPI.transfer(nums[day2]);
    SPI.transfer(nums[day1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // Limpiar de nuevo
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // Mostrar año (AA)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[year4]);
    SPI.transfer(nums[year3]);
    SPI.transfer(nums[year2]);
    SPI.transfer(nums[year1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // Limpiar de nuevo
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // Mostrar temperatura (°C)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b10111000); // punto decimal
    SPI.transfer(0b11001010); // símbolo °C
    SPI.transfer(nums[temp2]);
    SPI.transfer(nums[temp1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // Limpieza final
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
  } else {
    // Display hora regular (HH:MM)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[minute2]);
    SPI.transfer(nums[minute1]);
    SPI.transfer(nums[hour2]);
    SPI.transfer(nums[hour1]);
    digitalWrite(clockPin, HIGH);
  }
}

Esquemáticos

Construye un reloj Numitron retro con Arduino: Simple, fiable y eficiente energéticamente

Proceso de manufactura

  1. Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
  2. Construye un reloj en tiempo real con Arduino para horarios de oración islámica
  3. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  4. Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
  5. Construye un voltímetro DIY con Arduino y pantalla Nokia 5110 – Guía paso a paso
  6. MobBob: Robot Arduino Impreso en 3D, Controlado por Smartphone Android
  7. Construir una rueda medidora DIY precisa con Arduino Nano y encoder rotativo
  8. Crear un medidor IoT web con Arduino, Yaler e IFTTT
  9. Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
  10. Construye un monitor de calidad del aire preciso con el sensor Sharp GP2Y1010AU0F
  11. Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO