Arduino Nano七段显示器负温度'-'符号显示异常问题
Arduino七段管负温度显示问题修复
关键问题定位
- 段码数组调用错误:
displayDigit函数中已根据digit正负选择了对应段码数组,但实际读取段码时仍固定使用正数字数组digitSegments,完全忽略负数专用的digitSegmentsNegative数组。 - 负数索引转换逻辑错误:处理负digit时,直接转为正数作为索引,导致无法正确调用纯负号的段码(数组索引0)。
- 温度拆分逻辑混乱:
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)); } }
核心修改说明
- 修复段码数组调用:在
displayDigit中,最终输出时使用选中的digitSegmentsToDisplay数组,而非固定的digitSegments。 - 修正负数索引转换:将负标记(-1、-2)转换为负数段码数组的正确索引,确保
-1对应负号,-2对应'-1'。 - 简化温度拆分逻辑:用
isNegative统一标记正负,拆分温度时先取绝对值,避免变量状态矛盾。 - 移除冗余代码:删除原代码中无意义的浮点数转换和冗余判断,保持逻辑清晰。
内容的提问来源于stack exchange,提问作者K_njb
相关产品推荐
相关产品推荐

