Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente

Componentes e Materiais

Arduino Nano R3 ×1
Maxim Integrated DS3231M — ±5 ppm, RTC I²C ×1
Registrador de Deslocamento TPIC6C595 (Driver Alta Corrente) ×4
Tubo Numitron IV9 (display 4 dígitos) ×4
LED Genérico (indicador de segundos) ×2
Capacitor 100 nF (Desacoplamento) ×4
1N4007 — Diodo Alta Tensão, Alta Corrente ×2
Chave Deslizante (Potência / Intensidade Display) ×1
Resistor 1 kΩ (Limitação de Corrente) ×1

Ferramentas e Máquinas Necessárias

Aplicativos e Serviços Online

Sobre Este Projeto

Este guia orienta na construção de um elegante relógio de tubos Numitron alimentado por Arduino Nano, módulo RTC DS3231 e registradores de deslocamento TPIC6C595. O resultado é um display de baixa dissipação térmica, confiável, que mostra hora, data, ano e temperatura ambiente a cada 30 segundos.

O conceito original veio de este repositório GitHub. Na minha primeira montagem, encontrei vários problemas: os registradores 74HC595 superaqueciam porque o consumo total de corrente excedia sua classificação de 70 mA, e o programa usava delays bloqueantes que faziam o relógio ler o RTC apenas uma vez por minuto.

Ao trocar para os drivers de alta corrente TPIC6C595 e refatorar o firmware para usar temporização não-bloqueante com millis(), o relógio agora atualiza em tempo real, mantém os tubos Numitron frios, e até oferece modo de economia de energia que ilumina o display fracamente.

Destaques principais:

Após montar o circuito e carregar o código, simplesmente monte o relógio em um gabinete decorativo. Será um iniciador de conversas em qualquer oficina ou vitrine.

Código

Código Arduino (C/C++)

#include <RTClib.h> // RTC com temperatura para DS3231
RTC_DS3231 rtc; // instanciar DS3231
#include <Wire.h> // fiação I2C
#include <TimeLib.h> // funções de tempo
#include <Time.h> // biblioteca time
#include <DS1307RTC.h> // suporte RTC adicional
#include <SPI.h>

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

unsigned long previousMillis = 0;       // última atualização do display
unsigned long previousMillisDiode = 0;  // último toggle do LED
const long interval = 30000;            // intervalo de refresh do display (30 s)
const long intervalDiode = 500;         // intervalo de blink do 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  // ponto decimal °C
};

// Variáveis para armazenar dígitos parseados de hora e temperatura
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); // garante clock começando baixo
}

void loop() {
  tmElements_t tm; // estrutura da biblioteca DS1307RTC
  RTC.read(tm);    // lê hora atual e temperatura

  // Parse 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;

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

  // Refresh display a cada 30 s
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();

    // Limpa display (efeito breathing)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);

    // Mostra data (mês/dia)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[month2]);
    SPI.transfer(nums[month1]);
    SPI.transfer(nums[day2]);
    SPI.transfer(nums[day1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);

    // Limpa novamente
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);

    // Mostra ano (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);

    // Limpa novamente
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);

    // Mostra temperatura (°C)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b10111000); // ponto decimal
    SPI.transfer(0b11001010); // símbolo °C
    SPI.transfer(nums[temp2]);
    SPI.transfer(nums[temp1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);

    // Limpeza final
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
  } else {
    // Display regular de hora (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

Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente

Processo de manufatura

  1. Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
  2. Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
  3. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  4. Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
  5. Construa um Voltímetro DIY com Arduino e Display Nokia 5110 – Guia Passo a Passo
  6. MobBob: Construa Seu Próprio Robô Arduino, Controlado via Smartphone Android
  7. Roda de Medição Precisa DIY com Arduino Nano e Encoder Rotativo
  8. Crie um Medidor IoT Web com Arduino, Yaler e IFTTT
  9. Relógio Flip Arduino com Matriz LED 8×8 – Projeto DIY de Relógio em Tempo Real
  10. Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO