MAX30100血氧传感器LED控制逻辑异常代码排查求助
问题描述
基于MAX30100传感器的项目中设置了三个LED控制逻辑:
- 当SpO2≥94%时,绿灯点亮、红灯熄灭;
- 当80%<SpO2<94%时,绿灯熄灭、红灯点亮;
- 其余情况(SpO2≤80%)双灯均熄灭。
目前前两个条件运行正常,但当SpO2数值低于80%时,红灯仍处于点亮状态而非熄灭,相关代码如下:
#include <LiquidCrystal_I2C.h> #include "MAX30100_PulseOximeter.h" LiquidCrystal_I2C lcd (0x27, 16,2); #define REPORTING_PERIOD_MS 1000 PulseOximeter pox; uint32_t tsLastReport = 0; const uint8_t red_pin = 4; const uint8_t green_pin = 5; void onBeatDetected() { Serial.println("Beat!"); } void setup() { Serial.begin(115200); Serial.print("Initializing pulse oximeter.."); pinMode(red_pin, OUTPUT); pinMode(green_pin, OUTPUT); lcd.init (); lcd. backlight (); lcd.print("Initializing..."); delay(3000); lcd.clear(); if (!pox.begin()) { Serial.println("FAILED"); for(;;); } else { Serial.println("SUCCESS"); } pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA); // Register a callback for the beat detection pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { // Make sure to call update as fast as possible pox.update(); if (millis() - tsLastReport > REPORTING_PERIOD_MS) { Serial.print("Heart rate:"); Serial.print(pox.getHeartRate()); Serial.print("bpm / SpO2:"); Serial.print(pox.getSpO2()); Serial.println("%"); lcd.clear(); lcd.setCursor(0,0); lcd.print("BPM : "); lcd.print(pox.getHeartRate()); lcd.setCursor(0,1); lcd.print("SpO2: "); lcd.print(pox.getSpO2()); lcd.print("%"); tsLastReport = millis(); uint8_t spo2 = pox.getSpO2(); if (94<=spo2) { digitalWrite(green_pin, HIGH); digitalWrite(red_pin, LOW); } else if (80<spo2<94){ digitalWrite(red_pin, HIGH); digitalWrite(green_pin, LOW); } else { digitalWrite(red_pin, LOW); digitalWrite(green_pin, LOW); } } }
问题分析与解决
问题根源在于条件判断的语法错误:C/C++不支持80<spo2<94这种连续比较写法。该表达式会先计算80<spo2,得到布尔值0或1,再将这个结果与94比较。当spo2≤80时,80<spo2的结果是0,0<94为真,导致else if分支被错误触发,红灯持续点亮。
正确的写法需要用逻辑与运算符&&拆分两个条件:
uint8_t spo2 = pox.getSpO2(); if (94 <= spo2) { digitalWrite(green_pin, HIGH); digitalWrite(red_pin, LOW); } else if (spo2 > 80 && spo2 < 94){ digitalWrite(red_pin, HIGH); digitalWrite(green_pin, LOW); } else { digitalWrite(red_pin, LOW); digitalWrite(green_pin, LOW); }
也可以简化else if的条件为spo2 > 80(因为前面已经排除了spo2≥94的情况),但保留完整范围判断能让逻辑更清晰,避免后续修改代码时出现疏漏。
内容的提问来源于stack exchange,提问作者Md fiz
相关产品推荐
相关产品推荐

