用 Arduino Nano 制作可靠的 LCD 秒表 —— 无需电位器
元件与材料
| 元件 | 数量 |
|---|---|
| 面包板(通用) | 1 |
| Arduino Nano R3 | 1 |
| Adafruit 标准 LCD - 16x2 白字蓝底 | 1 |
| SparkFun 12mm 按钮开关 | 3 |
| 10kΩ 电阻 | 5 |
| 221Ω 电阻 | 1 |
| 跳线(通用) | 26 |
项目简介
大家好!这是一个适合初学者的 LCD 入门项目。本项目使用 Arduino Nano 和 QUAPASS 1602A 16x2 LCD 显示屏,实现一个可计时小时、分钟、秒的秒表,并支持调节 LCD 亮度。
通过少量代码修改,理论上也可显示百分之一秒,但受限于 LCD 刷新速度,实际效果可能不佳。
我已对计时逻辑进行微调,使其误差控制在约 15% 以内(实际运行 10 分钟,秒表显示约 10 分 2 秒)。若你修改了 stopwatch 子程序中的起始计时逻辑,也需要同步调整延时参数,以补偿 Arduino 代码执行时间带来的误差。
步骤 1:硬件连接
请参考原理图,将 Arduino 与 LCD、按钮、电阻正确连接。LCD 的对比度调节引脚(通常为 V0)直接通过 PWM 引脚(本项目为 D6)控制亮度,无需电位器。
步骤 2:上传代码
将下方完整代码复制到 Arduino IDE,连接 Arduino Nano 通过 USB 供电,点击上传即可运行。
步骤 3:开始使用
三个按钮分别对应:启动/暂停、停止/继续、复位。享受制作的乐趣吧!如有疑问欢迎留言交流。
核心代码
/* 简易 LCD 秒表:支持启动、停止、复位、圈速 */
#include <LiquidCrystal.h>
// LCD 接线:RS=12, E=11, D4=5, D5=4, D6=3, D7=2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int h = 0, m = 0, s = 0, ms = 0; // 时、分、秒、毫秒
const int startPin = 8; // 启动按钮
const int stopPin = 9; // 停止按钮
const int resetPin = 10; // 复位按钮
const int brightnessPin = 6; // 亮度控制引脚 (PWM)
int brightness = 100; // 亮度 0-255
void setup() {
analogWrite(brightnessPin, brightness);
lcd.begin(16, 2);
pinMode(startPin, INPUT);
pinMode(stopPin, INPUT);
pinMode(resetPin, INPUT);
pinMode(brightnessPin, OUTPUT);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("TIME:");
lcd.print(h); lcd.print(":");
lcd.print(m); lcd.print(":");
lcd.print(s);
lcd.setCursor(0, 1);
lcd.print("STOPWATCH");
if (digitalRead(startPin) == HIGH) {
stopwatch(); // 进入计时子程序
}
}
// ----- 计时主逻辑 -----
void stopwatch() {
lcd.setCursor(0, 0);
lcd.print("TIME:");
lcd.print(h); lcd.print(":");
lcd.print(m); lcd.print(":");
lcd.print(s);
ms += 10;
delay(10); // 基准延时 10ms
if (ms == 590) { // 约 0.59 秒刷新一次屏幕,减少闪烁
lcd.clear();
ms = 0;
s++;
}
if (s == 60) { s = 0; m++; }
if (m == 60) { m = 0; h++; }
lcd.setCursor(0, 1);
lcd.print("STOPWATCH");
if (digitalRead(stopPin) == HIGH) {
stopwatchStop(); // 按下停止
} else {
stopwatch(); // 递归继续计时
}
}
// ----- 停止状态:等待继续或复位 -----
void stopwatchStop() {
lcd.setCursor(0, 0);
lcd.print("TIME:");
lcd.print(h); lcd.print(":");
lcd.print(m); lcd.print(":");
lcd.print(s);
lcd.setCursor(0, 1);
lcd.print("STOPWATCH");
if (digitalRead(startPin) == HIGH) {
stopwatch(); // 继续计时
}
if (digitalRead(resetPin) == HIGH) {
stopwatchReset(); // 复位
return;
}
stopwatchStop(); // 保持停止状态
}
// ----- 复位所有计数 -----
void stopwatchReset() {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("STOPWATCH");
h = m = s = 0;
return; // 返回主循环
}
所需库
标准 LiquidCrystal 库已内置于 Arduino IDE,无需额外安装。若使用 I2C 模块,请改用 LiquidCrystal_I2C 库。
原理图
请参考项目附件中的原理图接线。关键点:
- LCD 数据线接 D2-D7,控制线接 D11、D12
- 三个按钮分别接 D8、D9、D10,外接 10kΩ 下拉电阻
- LCD 对比度引脚 (V0) 接 D6 (PWM),通过
analogWrite调节亮度 - 221Ω 电阻串联在 LCD 背光阳极,限流保护
制造工艺
- 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
- 智能窗帘:基于Arduino与太阳能的自动光控系统
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
- Arduino RGB 颜色混合器 – 分步制作教程
- 自制 AI LCD 陪伴机器人:你的互动小伙伴
- 手把手打造Arduino Nano喂食机器人