如何用Arduino在四位7段数码管同步显示两位温度值及℃标识
四位7段数码管同步显示温度与摄氏度标识的实现方案
问题背景
用DHT传感器读取环境温度后,已将温度转换为数字数组(如19℃对应数组[1,9]),需要在四位7段数码管上同步显示:第2位放十位数字、第3位放个位数字、第4位放字母C。当前代码是逐个轮播显示,人眼能明显看到切换过程,需改为视觉上同步显示的效果。
核心原理
利用人眼的视觉暂留效应:快速轮流点亮每个数码管(每个仅点亮1-5毫秒),循环往复,人眼会认为所有数码管是同时亮起的。
修改步骤与代码实现
1. 补充字母C的段码函数
原代码中c()函数是显示数字0的逻辑,需新增专门显示字母C的函数:
void showC() { digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, LOW); }
2. 修改主循环逻辑
将原轮播的长延时改为极短延时,循环依次点亮目标数码管,实现视觉同步:
void loop() { // 这里保留你原有读取温度、更新digits数组的逻辑 // ... // 点亮第2位数码管,显示十位数字 switch (digits[0]) { case 0: zero(); break; // 注意:原代码case0调用的c()应为显示0的函数,建议重命名为zero() 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; } turnOnDisplay2(); delay(2); // 短延时,利用视觉暂留 turnOffAllDisplays(); // 关闭所有数码管,避免段码串扰 // 点亮第3位数码管,显示个位数字 switch (digits[1]) { case 0: 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; } turnOnDisplay3(); delay(2); turnOffAllDisplays(); // 点亮第4位数码管,显示字母C showC(); turnOnDisplay4(); delay(2); turnOffAllDisplays(); // 串口打印温度可放在此处,避免频繁打印 // Serial.println(roundedTemperature); }
3. 新增关闭所有数码管的辅助函数
避免多个数码管同时点亮导致的段码混乱:
void turnOffAllDisplays() { digitalWrite(digit1, HIGH); digitalWrite(digit2, HIGH); digitalWrite(digit3, HIGH); digitalWrite(digit4, HIGH); }
4. 完善数码管点亮函数
确保每个turnOnDisplayX()函数仅打开对应数码管,其余保持关闭(原turnOnDisplay2()逻辑正确,其余可参照编写):
void turnOnDisplay2() { digitalWrite(digit1, HIGH); digitalWrite(digit2, LOW); digitalWrite(digit3, HIGH); digitalWrite(digit4, HIGH); } void turnOnDisplay3() { digitalWrite(digit1, HIGH); digitalWrite(digit2, HIGH); digitalWrite(digit3, LOW); digitalWrite(digit4, HIGH); } void turnOnDisplay4() { digitalWrite(digit1, HIGH); digitalWrite(digit2, HIGH); digitalWrite(digit3, HIGH); digitalWrite(digit4, LOW); }
关键说明
- 延时时间建议在1-5毫秒之间:过短可能导致亮度不足,过长会出现明显闪烁。
- 切换数码管前必须关闭所有数码管,防止段码信号串到其他数码管上。
- 原代码中
case 0调用的c()函数建议重命名为zero(),避免与显示字母C的showC()混淆。
内容的提问来源于stack exchange,提问作者Daniela_02
相关产品推荐
相关产品推荐

