亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电

零部件与物料

零部件数量备注
Arduino Nano R31
DS3231M ±5ppm I²C 实时时钟1
TPIC6C595 大电流移位寄存器4替代 74HC595 解决过热
IV-9 Numitron 数码管(4位)4
通用 LED(秒指示)2
100nF 去耦电容4
1N4007 高压整流二极管2
拨码开关(电源/亮度)1
1kΩ 限流电阻1

所需工具

软件与在线服务

项目简介

本指南带你制作 Numitron 管时钟:Arduino Nano + DS3231 RTC + 4 片 TPIC6C595 驱动 4 位 IV-9 管。显示时间、日期、年份,每 30 秒轮播一次环境温度。相比原版(GitHub: theremotheman 仓库),本项目解决两大痛点:

新增省电模式可微亮显示,全套元件廉价易得,适合进阶 DIY 爱好者。

核心亮点

代码

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);
  }
}

原理图

复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电

制造工艺

  1. Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
  2. 自制 Arduino 伊斯兰祷告时间实时时钟
  3. 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
  4. Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
  5. Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
  6. MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
  7. 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
  8. 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘
  9. Arduino 8×8 LED 矩阵翻页时钟 - DIY 实时时钟项目
  10. 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
  11. Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
  12. 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟