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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:05:20