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

极简高精度 Arduino UNO 数字时钟:无 RTC、无电位器、无外部上拉电阻

项目亮点

元件清单

元件数量备注
Arduino UNO R31主控
1602 LCD(白字蓝底)1HD44780 兼容,16×2 字符
12 mm 轻触按钮2分别接 D2(时)、D3(分)
半尺寸面包板1
公对公杜邦线1 包

硬件接线(极简版)

LCD VSS  → GND
LCD VDD  → 5V
LCD V0   → D9 (PWM)        // 对比度,analogWrite(9, 120) 约 1.2V
LCD RS   → D12
LCD RW   → GND             // 只写模式
LCD E    → D11
LCD D4-D7 → D5-D8
LCD A    → D10 (PWM)       // 背光,analogWrite(10, 255) 全亮
LCD K    → GND

按钮1(调时)一脚 → D2,另一脚 → GND
按钮2(调分)一脚 → D3,另一脚 → GND
// 代码中 pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP);

核心原理

1. 软件 RTC:毫秒累加法

static uint32_t lastTick = 0;
void loop() {
  uint32_t now = millis();
  if (now - lastTick >= 1000) {
    lastTick += 1000;          // 累加 1000 ms,避免漂移
    seconds++;
    if (seconds >= 60) { seconds = 0; minutes++; }
    if (minutes >= 60) { minutes = 0; hours++; }
    if (hours >= 24) hours = 0;
    updateDisplay();
  }
  handleButtons();             // 非阻塞按钮扫描
}

关键点:lastTick += 1000 而非 lastTick = now,可消除循环执行时间抖动带来的累积误差。

2. PWM 控制 LCD 对比度与背光

3. 内部上拉按钮去抖

bool readBtn(uint8_t pin) {
  static uint32_t last[2] = {0,0};
  static bool state[2] = {HIGH, HIGH};
  bool reading = digitalRead(pin);
  uint8_t idx = (pin == 2) ? 0 : 1;
  if (reading != state[idx]) {
    if (millis() - last[idx] > 20) { state[idx] = reading; last[idx] = millis(); }
  }
  return state[idx] == LOW;    // 按下为 LOW
}

完整代码(精简版)

#include 
LiquidCrystal lcd(12, 11, 5, 6, 7, 8);  // RS, E, D4-D7

uint8_t h=12, m=0, s=0;
uint32_t lastTick=0;
const uint8_t BTN_H=2, BTN_M=3;
const uint8_t PWM_CONTRAST=9, PWM_BACKLIGHT=10;

void setup() {
  pinMode(BTN_H, INPUT_PULLUP);
  pinMode(BTN_M, INPUT_PULLUP);
  pinMode(PWM_CONTRAST, OUTPUT);
  pinMode(PWM_BACKLIGHT, OUTPUT);
  analogWrite(PWM_CONTRAST, 120);   // 对比度约 1.2V
  analogWrite(PWM_BACKLIGHT, 200);  // 背光 ~80%
  lcd.begin(16,2);
  lcd.print(F("Simple Clock"));
  delay(1000);
}

void loop() {
  uint32_t now = millis();
  if (now - lastTick >= 1000) {
    lastTick += 1000;
    if (++s >= 60) { s=0; if (++m >= 60) { m=0; if (++h >= 24) h=0; } }
    showTime();
  }
  if (readBtn(BTN_H)) { h = (h+1)%24; showTime(); delay(200); }
  if (readBtn(BTN_M)) { m = (m+1)%60; s=0; showTime(); delay(200); }
}

void showTime() {
  char buf[9];
  sprintf(buf, "%02d:%02d:%02d", h, m, s);
  lcd.setCursor(0,0);
  lcd.print(buf);
}

常见问题与优化

  1. 走时偏快/慢:UNO 陶瓷谐振器典型误差 ±0.5%,约 ±43 秒/天。可在 if (now - lastTick >= 1000) 中微调阈值(如 998/1002)校准。
  2. 掉电走时丢失:本设计无备用电池,上电后需手动对时。如需掉电保持,请改用 DS3231 RTC 模块(见项目 1005017581)。
  3. LCD 显示乱码:检查 D4-D7 接线顺序,确保共地;对比度 PWM 占空比过大/过小均会导致全黑/全白。
  4. 按钮误触发:面包板接触不良易抖动,建议焊接排针或使用专用按钮模块。

扩展建议


一句话总结:用最少的元件、最简洁的代码,在 Arduino UNO 上跑出一个“够用、准确、可扩展”的数字时钟,极适合初学者理解 millis() 非阻塞定时、PWM 模拟输出、内部上拉等核心概念。

制造工艺

  1. 布谷鸟钟:历史、工艺与现代演变
  2. 沙漏:历史、工艺与现代魅力
  3. 计时演进史:从日晷到精密石英表的技术跨越
  4. 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
  5. 自制 Arduino 伊斯兰祷告时间实时时钟
  6. 精准文字时钟:分钟级文字显示时间
  7. 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
  8. Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
  9. 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟
  10. 数字化采购:后疫情时代制胜的必由之路
  11. 加速数字化转型的七大核心驱动力
  12. 航空航天卓越:及时准确洞察赢得竞争优势