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

Arduino Nano七段显示器负温度'-'符号显示异常问题

Arduino七段管负温度显示问题修复

关键问题定位

  1. 段码数组调用错误:displayDigit函数中已根据digit正负选择了对应段码数组,但实际读取段码时仍固定使用正数字数组digitSegments,完全忽略负数专用的digitSegmentsNegative数组。
  2. 负数索引转换逻辑错误:处理负digit时,直接转为正数作为索引,导致无法正确调用纯负号的段码(数组索引0)。
  3. 温度拆分逻辑混乱:displayTemperature中重复的负数判断分支导致变量状态矛盾,例如先将temp转为正数,后续又用temp < 0做判断,逻辑冲突。

修正后的完整代码

// Pins for seven-segment display segments
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A2, A3};
const int numSegments = 14;

float temperature = 0.0;
float temperatureSum = 0.0;
int temperatureCount = 0;

void setup() {
  for (int i = 0; i < numSegments; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }

  Serial.begin(9600);
  analogReference(INTERNAL);
}

void loop() {
  int temperatureSum = 0;
  for (int i = 0; i < 10; i++) {
    long sensorValue = analogRead(A1);
    Serial.println(sensorValue);
    long voltage =  (sensorValue) * (1100 / 1023.0);
    long temperature = (voltage - 500) / 10;
    temperatureSum += temperature;
    delay(10);
  }
  int averagedTemperature = temperatureSum / 10;

  // Test Wert
  averagedTemperature = -13;

  Serial.println(averagedTemperature);

  // 温度范围限幅
  if (averagedTemperature < -19) {
    averagedTemperature = -19;
  } else if (averagedTemperature > 50) {
    averagedTemperature = 50;
  }

  displayTemperature(averagedTemperature);
  delay(500);
}

void displayTemperature(int temp) {
  int tensDisplayCode = 0;
  int ones = 0;
  bool isNegative = temp < 0;
  int absTemp = abs(temp);

  ones = absTemp % 10;

  if (isNegative) {
    if (absTemp < 10) {
      // -1~-9:十位显示负号(用-1标记)
      tensDisplayCode = -1;
    } else {
      // -10~-19:十位显示带负号的1(用-2标记)
      tensDisplayCode = -2;
    }
  } else {
    // 正温度:十位显示对应数字(0~5)
    tensDisplayCode = absTemp / 10;
  }

  displayDigit(tensDisplayCode, 0);
  delay(5);
  displayDigit(ones, 7);
}

void displayDigit(int digit, int startIndex) {
  const byte digitSegments[] = {
    B0000001,  // 0
    B1001111,  // 1
    B0010010,  // 2
    B0000110,  // 3
    B1001100,  // 4
    B0100100,  // 5
    B0100000,  // 6
    B0001111,  // 7
    B0000000,  // 8
    B0000100,  // 9
  };

  const byte digitSegmentsNegative[] = {
    B1111110, // '-' 负号
    B1001110  // '-1' 带负号的1
  };

  const byte* digitSegmentsToDisplay;
  int index = 0;

  if (digit >= 0) {
    digitSegmentsToDisplay = digitSegments;
    index = digit;
  } else {
    digitSegmentsToDisplay = digitSegmentsNegative;
    // 转换负标记为正确索引:-1→0(负号),-2→1(-1)
    index = -digit - 1;
  }

  // 使用选中的段码数组输出
  for (int i = 0; i < 7; i++) {
    digitalWrite(segmentPins[startIndex + i], bitRead(digitSegmentsToDisplay[index], 6 - i));
  }
}    

核心修改说明

  1. 修复段码数组调用:在displayDigit中,最终输出时使用选中的digitSegmentsToDisplay数组,而非固定的digitSegments。
  2. 修正负数索引转换:将负标记(-1、-2)转换为负数段码数组的正确索引,确保-1对应负号,-2对应'-1'。
  3. 简化温度拆分逻辑:用isNegative统一标记正负,拆分温度时先取绝对值,避免变量状态矛盾。
  4. 移除冗余代码:删除原代码中无意义的浮点数转换和冗余判断,保持逻辑清晰。

内容的提问来源于stack exchange,提问作者K_njb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:02:00