复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
零部件与物料
| 零部件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | |
| DS3231M ±5ppm I²C 实时时钟 | 1 | |
| TPIC6C595 大电流移位寄存器 | 4 | 替代 74HC595 解决过热 |
| IV-9 Numitron 数码管(4位) | 4 | |
| 通用 LED(秒指示) | 2 | |
| 100nF 去耦电容 | 4 | |
| 1N4007 高压整流二极管 | 2 | |
| 拨码开关(电源/亮度) | 1 | |
| 1kΩ 限流电阻 | 1 |
所需工具
- 电烙铁
- 无铅焊锡丝
软件与在线服务
- Arduino IDE
项目简介
本指南带你制作 Numitron 管时钟:Arduino Nano + DS3231 RTC + 4 片 TPIC6C595 驱动 4 位 IV-9 管。显示时间、日期、年份,每 30 秒轮播一次环境温度。相比原版(GitHub: theremotheman 仓库),本项目解决两大痛点:
- 74HC595 总电流超 70mA 导致过热 → 改用 TPIC6C595 大电流驱动
- 阻塞式
delay()导致每分钟仅读一次 RTC → 改用非阻塞millis()实时刷新
新增省电模式可微亮显示,全套元件廉价易得,适合进阶 DIY 爱好者。
核心亮点
- 仅 4 只 IV-9 管 + 4 片 TPIC6C595
- DS3231 内置温度传感器,免外接测温
- 拨码开关控制秒指示 LED 与亮度档位
- 组装后装入装饰外壳,工艺品级摆件
代码
Arduino 固件
#include <RTClib.h> // DS3231 带温度
RTC_DS3231 rtc;
#include <Wire.h>
#include <TimeLib.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <SPI.h>
#define led 7
const int latchPin = 13;
const int clockPin = 10;
const int dataPin = 11;
unsigned long previousMillis = 0;
unsigned long previousMillisDiode = 0;
const long interval = 30000; // 30秒轮播刷新
const long intervalDiode = 500; // 秒指示灯闪烁
// 0-9 与 °C 符号的段码(TPIC6C595 输出低电平有效,位定义见原理图)
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 符号
0b10111000 // °C 小数点
};
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);
}
void loop() {
tmElements_t tm;
RTC.read(tm); // 读取时间/温度
// 拆解数字
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;
// 秒指示灯 500ms 翻转
if (millis() - previousMillisDiode >= intervalDiode) {
previousMillisDiode = millis();
digitalWrite(led, !digitalRead(led));
}
// 每 30 秒轮播:日期 → 年份 → 温度
if (millis() - previousMillis >= interval) {
previousMillis = millis();
// 清屏呼吸效果
digitalWrite(clockPin, LOW);
SPI.transfer(0); SPI.transfer(0); SPI.transfer(0); SPI.transfer(0);
digitalWrite(clockPin, HIGH); delay(500);
// 显示月/日
digitalWrite(clockPin, LOW);
SPI.transfer(nums[month2]); SPI.transfer(nums[month1]);
SPI.transfer(nums[day2]); SPI.transfer(nums[day1]);
digitalWrite(clockPin, HIGH); delay(1500);
// 清屏
digitalWrite(clockPin, LOW);
SPI.transfer(0); SPI.transfer(0); SPI.transfer(0); SPI.transfer(0);
digitalWrite(clockPin, HIGH); delay(500);
// 显示年(后两位)
digitalWrite(clockPin, LOW);
SPI.transfer(nums[year4]); SPI.transfer(nums[year3]);
SPI.transfer(nums[year2]); SPI.transfer(nums[year1]);
digitalWrite(clockPin, HIGH); delay(1500);
// 清屏
digitalWrite(clockPin, LOW);
SPI.transfer(0); SPI.transfer(0); SPI.transfer(0); SPI.transfer(0);
digitalWrite(clockPin, HIGH); delay(500);
// 显示温度(°C)
digitalWrite(clockPin, LOW);
SPI.transfer(0b10111000); // 小数点
SPI.transfer(0b11001010); // °C 符号
SPI.transfer(nums[temp2]); SPI.transfer(nums[temp1]);
digitalWrite(clockPin, HIGH); delay(1500);
// 最终清屏
digitalWrite(clockPin, LOW);
SPI.transfer(0); SPI.transfer(0); SPI.transfer(0); SPI.transfer(0);
digitalWrite(clockPin, HIGH); delay(500);
} else {
// 常规显示 时:分
digitalWrite(clockPin, LOW);
SPI.transfer(nums[minute2]); SPI.transfer(nums[minute1]);
SPI.transfer(nums[hour2]); SPI.transfer(nums[hour1]);
digitalWrite(clockPin, HIGH);
}
}
原理图
制造工艺
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- 自制 Arduino 伊斯兰祷告时间实时时钟
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘
- Arduino 8×8 LED 矩阵翻页时钟 - DIY 实时时钟项目
- 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
- Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
- 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟