使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
组件与材料
| 组件 | 数量 | 备注 |
|---|---|---|
| 面包板 (通用) | 1 | |
| 杜邦线 (通用) | 1 | |
| SparkFun 7 段串口显示屏 - 红色 | 1 | 本项目未使用扩展板 |
| USB-A 转 Mini-USB 线缆 | 1 | |
| Arduino Mega 2560 | 1 | 任何 Arduino 型号均可工作 |
应用与在线服务
- Arduino IDE
项目简介
这个项目的诞生源于我手头没有现成的计时器。使用方法非常简单:将代码上传到 Arduino(任何型号均可),倒计时即会自动开始。如果需要修改总时长,只需更改代码中的 long n = 60000; 这一行。注意:1000 = 1 秒,因此 60000 代表 60 秒。公式为 秒数 × 1000,将结果替换 60000 即可。按下复位键后,计数器会自动重新开始倒计时。
接线说明
请参考原理图连接 4 位数码管与 Arduino。该显示屏采用串口通信,仅需少量引脚即可驱动四位数码管。
核心代码
以下代码实现了倒计时功能,包含数码管段码驱动、位选控制及按键复位逻辑:
// 7 段数码管引脚映射
// pin 11 - A = 12
// pin 7 - B = 10
// pin 4 - C = 8
// pin 2 - D = 7
// pin 1 - E = 6
// pin 10 - F = 11
// pin 5 - G = 9
// pin 3 - 小数点
const int a = 12, b = 10, c = 8, d = 7, e = 6, f = 11, g = 9;
int p = 0; // 小数点引脚
int startStopReset = 13; // 复位按键引脚
const int d1 = 1, d2 = 2, d3 = 3, d4 = 4; // 位选引脚
long n = 60000; // 起始时间(毫秒) - 可修改为任意时长
int x = 100;
int del = 55; // 扫描延迟(微秒)
void setup() {
pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT);
pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT);
pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(p, OUTPUT);
pinMode(startStopReset, INPUT_PULLUP); // 使用内部上拉
}
void loop() {
digitalWrite(p, HIGH);
clearLEDs();
pickDigit(1); pickNumber((n/x/1000)%10); delayMicroseconds(del);
clearLEDs();
pickDigit(2); pickNumber((n/x/100)%10); delayMicroseconds(del);
clearLEDs();
pickDigit(3); dispDec(3); pickNumber((n/x/10)%10); delayMicroseconds(del);
clearLEDs();
pickDigit(4); pickNumber(n/x%10); delayMicroseconds(del);
n--; // 倒计时递减 (改为 n++ 可变为正计时秒表)
if (digitalRead(startStopReset) == LOW) { // 按下复位键
n = 60000; // 重置为初始时间,需与初始值一致
}
}
// 位选控制:拉低对应位的引脚使其亮起(共阴极)
void pickDigit(int x) {
digitalWrite(d1, HIGH); digitalWrite(d2, HIGH); digitalWrite(d3, HIGH); digitalWrite(d4, HIGH);
switch(x) {
case 1: digitalWrite(d1, LOW); break;
case 2: digitalWrite(d2, LOW); break;
case 3: digitalWrite(d3, LOW); digitalWrite(p, HIGH); break; // 第三位显示小数点
default: digitalWrite(d4, LOW); break;
}
}
// 数字段码显示
void pickNumber(int x) {
switch(x) {
default: zero(); break;
case 1: one(); break; case 2: two(); break; case 3: three(); break;
case 4: four(); break; case 5: five(); break; case 6: six(); break;
case 7: seven(); break; case 8: eight(); break; case 9: nine(); break;
}
}
void dispDec(int x) { digitalWrite(p, LOW); } // 点亮小数点
void clearLEDs() { // 熄灭所有段
digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW);
digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW);
digitalWrite(g, LOW); digitalWrite(p, LOW);
}
// 0-9 段码定义 (共阴极:HIGH=亮)
void zero() { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,LOW); }
void one() { digitalWrite(a,LOW); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); }
void two() { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,LOW); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,LOW); digitalWrite(g,HIGH); }
void three(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,HIGH); }
void four() { digitalWrite(a,LOW); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void five() { digitalWrite(a,HIGH); digitalWrite(b,LOW); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void six() { digitalWrite(a,HIGH); digitalWrite(b,LOW); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void seven(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); }
void eight(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void nine() { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
原理图
请参考原理图连接 4 位数码管至 Arduino。显示屏通过串口接口通信,大大减少了占用的 IO 口数量。
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
- 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 基于 Arduino Nano 的智能运动感应水枪
- Arduino 洗手计时器:抗击 COVID-19 的简易 DIY 工具
- Arduino 向日葵:制作电子向日葵追踪阳光
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南