硬件:合宙esp32c3(无串口芯片版本)+ max30102
软件:PlatformIO
esp32c3:
esp32c3:由于没有串口芯片,需要调用内置的串口管理才能使用Serial.print()。需要将platformio.ini中board 改为 adafruit_qtpy_esp32c3 。或者加入(board=esp32-c3-devkitm-1时):
build_flags =
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
需要注意的是,如果使用adafruit_qtpy_esp32c3,那么I2C的默认端口将改变,需要手动设置才行:
Wire.setPins(8, 9) // SDA, SCL
particleSensor.begin(Wire, I2C_SPEED_FAST)
可以使用I2C scanner进行验证: Arduino Playground - I2cScanner
MAX30102:
对于MAX30102,最坑的地方在于,如果使用sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor Library,那么读取到的IR和RED是反的。表现为可以读取到稳定的心率,却始终无法获取稳定的血氧, SPO2经常是-999。拿Example8_SPO2举例,原始代码为:
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
应改为
redBuffer[i] = particleSensor.getIR();
irBuffer[i] = particleSensor.getRed();
似乎是因为max30102和max30105的这个信息是反的。
这部分可以用下面的链接验证,RED应该要比IR的波动小才对:coniferconifer/ESP32_MAX30102_simple-SpO2_plotter: Simple SpO2 plotter from scratch for Arduno IDE by reading MH-ET LIVE MAX30102 raw RED/IR data (github.com)