You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:14:53