ESP32与MAX30102健康监测:血氧体温测量实战

发布时间:2026/9/20 15:58:06
ESP32与MAX30102健康监测:血氧体温测量实战 1. 为什么选择ESP32搭配MAX30102做健康监测1.1 从需求出发一个能落地的健康监测方案长什么样血氧和体温这两个指标但凡家里有老人或者自己做过健康管理的人都知道它们的分量。血氧饱和度反映的是血液携氧能力正常人在95%以上低于90%就需要引起重视体温就更不用说了发烧与否是最直观的健康信号。医院里测这两个指标用的是指夹式血氧仪和电子体温计便宜的二三十块贵的几百块但它们的共同问题是数据是孤立的测完看一眼就没了没法记录趋势没法远程查看更没法做自动化告警。我一开始的想法很简单能不能自己做一个设备能连续监测血氧和体温数据能上传到手机或者电脑上最好还能在异常的时候提醒我。这个需求听起来不复杂但真正动手做的时候选型就成了第一个要解决的问题。市面上的方案大致分两类一类是用现成的健康监测模块比如某些集成了血氧、心率、体温的成品模组优点是省事缺点是贵、封闭、没法定制另一类是自己选传感器加主控灵活性高成本可控但需要自己搞定硬件连接、驱动、数据处理和通信。我选的是第二条路主控用ESP32传感器用MAX30102。1.2 为什么是ESP32而不是别的单片机ESP32这颗芯片这几年在物联网领域的热度不用我多说。它有几个特性特别适合做健康监测设备第一双核处理器。ESP32有两个核心一个可以专门跑传感器数据采集和处理另一个跑网络通信和逻辑控制互不干扰。这一点在做连续监测的时候很重要因为血氧数据的采集对时序有一定要求如果被网络任务打断数据质量会下降。第二内置WiFi和蓝牙。这意味着你不需要额外加通信模块设备可以直接连WiFi上传数据或者通过蓝牙把数据推到手机App上。我实测下来ESP32的WiFi稳定性在2.4GHz频段下完全够用蓝牙BLE的功耗也控制得不错。第三丰富的外设接口。MAX30102是I2C接口的ESP32的I2C控制器支持标准模式和快速模式最高400kHz读取MAX30102的FIFO数据绰绰有余。而且ESP32的GPIO数量足够后面如果要加显示屏、蜂鸣器、按键之类的扩展引脚不会不够用。第四生态成熟。Arduino框架、ESP-IDF、MicroPython三条路都能走社区里关于ESP32的资料铺天盖地遇到问题基本都能搜到答案。对于零基础的玩家来说这一点太重要了。对比一下其他选项STM32F103C8T6性能也不错但没有内置WiFi要联网还得加ESP8266或者别的模块整体复杂度上去了Arduino Uno就更不用说了内存和算力都吃紧跑个I2C读取还行但要做数据处理和网络通信就力不从心了。所以ESP32在这个场景下几乎是最优解。1.3 MAX30102到底能测什么测不准怎么办MAX30102是Maxim现在被ADI收购了推出的一款集成式脉搏血氧和心率监测传感器。它的核心原理是光电容积脉搏波描记法PPG传感器内部有两个LED一个红光660nm一个红外光880nm还有一个光电探测器。当光照射到皮肤上时血液中的氧合血红蛋白和脱氧血红蛋白对这两种波长的光吸收率不同通过分析反射回来的光强变化就能推算出血氧饱和度。这里要划重点MAX30102测的是相对变化不是绝对数值。它输出的是原始的光强数据血氧值是通过算法计算出来的。Maxim官方提供了算法但那个算法是给医疗级设备用的代码量大、资源消耗高在ESP32上跑起来比较吃力。社区里有一些简化版的算法精度会打折扣但对于日常监测来说够用了。温度方面MAX30102内部有一个温度传感器但它测的是芯片自身的温度不是人体温度。这个数据可以用来做环境温度补偿但不能直接当体温用。如果你真的想测体温需要额外加一个接触式温度传感器比如MAX30205人体温度传感器精度±0.1°C或者DS18B20防水封装适合腋下测量。我在实际项目里用的是MAX30205贴在指夹内侧测出来的数据跟电子体温计对比误差在0.2°C以内。所以这个项目的完整方案是ESP32做主控MAX30102测血氧和心率MAX30205测体温数据通过WiFi上传到本地服务器或者通过蓝牙推到手机异常时触发告警。2. 硬件选型与电路连接别在第一步就翻车2.1 核心器件清单与选型理由先把购物清单列出来这些都是我实际用过、验证过能跑通的型号器件型号数量备注主控板ESP32-DevKitC V41带USB转串口烧录方便血氧传感器MAX30102模块1注意买带电平转换的模块体温传感器MAX30205模块1或者DS18B20防水探头显示屏SSD1306 OLED 0.96寸1I2C接口可选蜂鸣器有源蜂鸣器3.3V1告警用可选面包板400孔1调试用杜邦线母对母、公对母若干建议多备这里重点说一下MAX30102模块的选购。市面上有两种模块一种是裸芯片焊在小板上的I2C引脚直接引出另一种是带了电平转换和稳压的。一定要买带电平转换的因为MAX30102的工作电压是1.8V而ESP32的I2C电平是3.3V直接连会烧传感器。带电平转换的模块上会有一颗稳压芯片和两颗MOS管价格贵几块钱但省心。MAX30205模块相对少一些如果买不到可以用DS18B20替代。DS18B20是单总线接口只需要一个GPIO就能读防水封装的探头可以贴在腋下或者含在嘴里注意卫生精度虽然不如MAX30205但±0.5°C的误差对日常监测来说可以接受。2.2 I2C地址冲突与引脚分配MAX30102的I2C地址是0x577位地址MAX30205的默认地址是0x48SSD1306 OLED的地址通常是0x3C或0x3D。这三个地址不冲突可以挂在同一条I2C总线上。ESP32的I2C引脚是可以自定义的默认的SDA是GPIO21SCL是GPIO22。我建议就用默认的因为很多示例代码都是基于这个配置改来改去容易出问题。接线方式如下MAX30102模块VCC接3.3VGND接GNDSDA接GPIO21SCL接GPIO22MAX30205模块VCC接3.3VGND接GNDSDA接GPIO21SCL接GPIO22OLED模块VCC接3.3VGND接GNDSDA接GPIO21SCL接GPIO22蜂鸣器正极接GPIO25负极接GND注意所有模块的VCC都接3.3V不要接5V。ESP32的GPIO输出是3.3V电平接5V会损坏芯片。2.3 电源噪声对血氧测量的影响这一点是很多人忽略的坑。MAX30102对电源噪声非常敏感如果电源纹波大血氧读数会跳得很厉害。我一开始用USB供电读出来的血氧值在92到98之间乱跳后来在MAX30102的VCC和GND之间并了一颗10μF的钽电容和一颗0.1μF的陶瓷电容数据就稳定多了。另外ESP32的WiFi模块在工作时会有瞬间的大电流需求如果电源供电不足会导致电压跌落影响传感器读数。建议用质量好一点的USB线或者单独给ESP32供电。如果条件允许可以在电源输入端加一颗100μF的电解电容做缓冲。3. 开发环境搭建从零到点灯3.1 Arduino IDE还是MicroPython我为什么选ArduinoESP32的开发方式有好几种Arduino IDE、ESP-IDF、MicroPython、PlatformIO。对于零基础的玩家我推荐从Arduino IDE入手原因有三第一库生态最丰富。MAX30102有现成的Arduino库SparkFun的MAX3010x库MAX30205也有对应的库直接调用就行不用自己写驱动。MicroPython的库相对少一些有些需要自己移植。第二调试方便。Arduino IDE的串口监视器用起来很顺手Serial.println()打日志简单直接。ESP-IDF虽然功能强大但学习曲线陡峭不适合零基础。第三资料多。遇到问题搜一下大概率能找到Arduino的解决方案。MicroPython的社区虽然也在增长但中文资料还是偏少。当然如果你已经熟悉PythonMicroPython也是个不错的选择代码写起来更简洁。但要注意MicroPython在ESP32上的内存管理不如Arduino灵活处理大量传感器数据时可能会遇到内存碎片的问题。3.2 Arduino IDE配置ESP32开发板如果你还没装Arduino IDE先去官网下载最新版。安装完成后按照以下步骤添加ESP32支持打开Arduino IDE点击“文件”-“首选项”在“附加开发板管理器网址”里填入https://espressif.github.io/arduino-esp32/package_esp32_index.json点击“工具”-“开发板”-“开发板管理器”搜索“esp32”找到“esp32 by Espressif Systems”点击安装安装完成后在“工具”-“开发板”里选择“ESP32 Dev Module”这里有个坑开发板管理器下载速度可能很慢因为服务器在国外。如果下载失败可以多试几次或者找个网络好的时间段。我实测下来早上七八点的时候下载速度最快。3.3 安装必要的库文件在Arduino IDE里点击“工具”-“管理库”搜索并安装以下库SparkFun MAX3010x Pulse and Proximity Sensor LibraryMAX30102的驱动库Adafruit SSD1306OLED显示屏驱动Adafruit GFX Library图形库SSD1306依赖它ArduinoJson处理JSON数据上传服务器时用PubSubClientMQTT通信可选MAX30205的库可能需要手动安装因为Arduino库管理器里不一定有。可以去GitHub上搜“MAX30205 Arduino”下载ZIP文件然后在Arduino IDE里点击“项目”-“加载库”-“添加.ZIP库”。提示安装库的时候注意版本兼容性。SparkFun MAX3010x库的最新版可能跟某些ESP32核心版本有冲突如果编译报错可以试试降级到1.0.0版本。4. 核心代码实现从读取原始数据到算出结果4.1 MAX30102初始化与FIFO读取MAX30102的工作流程是这样的传感器内部有一个FIFO先进先出缓冲区每采样一次就把红光和红外光的ADC值存进去。ESP32通过I2C定期读取FIFO拿到原始数据后做处理。初始化代码的关键参数#include Wire.h #include MAX30105.h #include heartRate.h MAX30105 particleSensor; void setup() { Serial.begin(115200); Wire.begin(21, 22); // SDA, SCL if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { Serial.println(MAX30102 not found. Check wiring.); while (1); } particleSensor.setup(); // 默认配置 particleSensor.setPulseAmplitudeRed(0x0A); // 红光LED电流 particleSensor.setPulseAmplitudeIR(0x0A); // 红外LED电流 }setPulseAmplitudeRed和setPulseAmplitudeIR这两个参数控制LED的亮度。值越大光越强穿透力越强但功耗也越大。0x0A大概是10mA左右对于指夹式测量来说够用了。如果测出来的信号太弱可以适当调大但不要超过0x1F约50mA否则LED发热会影响测量。采样率方面particleSensor.setup()默认是100Hz也就是每秒100个样本。这个速率对于心率计算来说足够了血氧计算可能需要更高的采样率但100Hz也能用。4.2 心率计算时域峰值检测法心率计算的原理很简单找到PPG信号中的峰值两个峰值之间的时间间隔就是一次心跳的周期。SparkFun的库提供了一个checkForBeat()函数它用的是一个简单的阈值检测算法。long lastBeat 0; float beatsPerMinute; int beatAvg; void loop() { long irValue particleSensor.getIR(); if (checkForBeat(irValue) true) { long delta millis() - lastBeat; lastBeat millis(); beatsPerMinute 60 / (delta / 1000.0); if (beatsPerMinute 255 beatsPerMinute 20) { beatAvg (beatAvg * 3 beatsPerMinute) / 4; // 滑动平均 } } }这里用了一个滑动平均来平滑数据因为单次计算的心率可能会有波动。beatAvg的初始值是0前几次计算会不太准等积累了几个数据之后就稳定了。注意checkForBeat()函数对信号质量要求比较高如果手指没放好或者移动了会误检。实际使用的时候建议先等几秒钟让信号稳定再开始计算。4.3 血氧计算比值法与其局限性血氧的计算比心率复杂得多。基本原理是氧合血红蛋白和脱氧血红蛋白对红光和红外光的吸收率不同通过计算两种光的吸收比值Ratio of Ratios再查表或者用经验公式换算成血氧饱和度。简化版的算法是这样的float calculateSpO2(float redAC, float redDC, float irAC, float irDC) { float R (redAC / redDC) / (irAC / irDC); float spO2 110 - 25 * R; // 经验公式仅作参考 return constrain(spO2, 0, 100); }这个公式里的redAC和irAC是交流分量脉搏波动部分redDC和irDC是直流分量平均光强。R值通常在0.4到1.0之间对应的血氧值在100到85之间。必须说明的是这个公式是非常粗糙的。Maxim官方的算法要复杂得多涉及大量的校准和滤波。用这个简化公式测出来的血氧值误差可能在±3%到±5%之间。对于日常监测来说看趋势比看绝对值更有意义。如果发现血氧值持续下降那就需要引起注意了。我在实际使用中发现手指的温度对血氧读数影响很大。冬天手指冷的时候测出来的血氧值会偏低因为末梢血液循环变差了。所以测量前最好先搓搓手让手指暖和起来。4.4 体温读取MAX30205的I2C通信MAX30205的读取比MAX30102简单它就是一个标准的I2C温度传感器。寄存器地址0x00是温度值16位高字节在前分辨率是0.00390625°C。#include Wire.h #define MAX30205_ADDR 0x48 float readTemperature() { Wire.beginTransmission(MAX30205_ADDR); Wire.write(0x00); Wire.endTransmission(false); Wire.requestFrom(MAX30205_ADDR, 2); if (Wire.available() 2) { uint8_t msb Wire.read(); uint8_t lsb Wire.read(); int16_t raw (msb 8) | lsb; return raw * 0.00390625; } return -1; }这个代码直接读寄存器不依赖第三方库移植性更好。raw是有符号的16位整数因为温度可能是负的。乘以0.00390625就是摄氏度值。如果用的是DS18B20代码会不一样需要用到OneWire和DallasTemperature库。DS18B20的读取速度比较慢一次转换需要750ms不适合高频采样但测体温不需要太快几秒钟读一次就够了。5. 数据上传与远程监控让数据走出设备5.1 WiFi连接与MQTT协议选择ESP32连WiFi的代码很简单几行就能搞定#include WiFi.h const char* ssid your_ssid; const char* password your_password; void connectWiFi() { WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(WiFi connected); Serial.println(WiFi.localIP()); }连上WiFi之后数据上传的方式有好几种HTTP POST、MQTT、WebSocket。我推荐用MQTT因为它轻量、实时性好、支持订阅/发布模式。你可以把数据发布到一个主题上手机App或者电脑上的客户端订阅这个主题就能实时收到数据。MQTT服务器可以用Mosquitto装在树莓派或者本地电脑上。ESP32端用PubSubClient库#include PubSubClient.h WiFiClient espClient; PubSubClient client(espClient); void reconnectMQTT() { while (!client.connected()) { if (client.connect(ESP32Client)) { client.publish(health/data, connected); } else { delay(5000); } } } void uploadData(float spo2, float temp, int hr) { char payload[100]; snprintf(payload, 100, {\spo2\:%.1f,\temp\:%.2f,\hr\:%d}, spo2, temp, hr); client.publish(health/data, payload); }提示MQTT的payload用JSON格式方便解析。注意snprintf的缓冲区大小要够否则会截断。5.2 蓝牙BLE推送手机App直连方案如果不想折腾服务器可以用蓝牙BLE直接把数据推到手机。ESP32的BLE功能很完善Arduino核心自带BLE库。#include BLEDevice.h #include BLEServer.h #include BLEUtils.h #include BLE2902.h BLEServer* pServer; BLECharacteristic* pCharacteristic; void setupBLE() { BLEDevice::init(ESP32_Health); pServer BLEDevice::createServer(); BLEService* pService pServer-createService(0000180D-0000-1000-8000-00805F9B34FB); pCharacteristic pService-createCharacteristic( 00002A37-0000-1000-8000-00805F9B34FB, BLECharacteristic::PROPERTY_NOTIFY ); pCharacteristic-addDescriptor(new BLE2902()); pService-start(); pServer-getAdvertising()-start(); } void sendBLEData(float spo2, float temp) { char data[50]; snprintf(data, 50, SpO2:%.1f,Temp:%.2f, spo2, temp); pCharacteristic-setValue(data); pCharacteristic-notify(); }手机端可以用nRF Connect或者自己写一个App来接收数据。BLE的优点是低功耗、直连缺点是传输距离短一般10米以内而且同时连WiFi和BLE的时候ESP32的功耗会明显增加。5.3 数据可视化从串口到网页最简答的可视化就是串口监视器但那个只能看数字不直观。我推荐用WebSocket 网页的方式ESP32跑一个WebSocket服务器网页端用JavaScript接收数据并画图。ESP32端用esp_websocket_client或者WebSocketsServer库#include WebSocketsServer.h WebSocketsServer webSocket WebSocketsServer(81); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { // 处理客户端消息 } void setup() { webSocket.begin(); webSocket.onEvent(webSocketEvent); } void loop() { webSocket.loop(); // 定期发送数据 char data[50]; snprintf(data, 50, %.1f,%.2f,%d, spo2, temp, hr); webSocket.broadcastTXT(data); }网页端用Chart.js画实时曲线效果很不错。这个方案的好处是不需要额外的服务器ESP32自己就能搞定。6. 常见问题与排查技巧实录6.1 传感器读不到数据怎么办这是最常见的问题排查步骤按顺序来现象可能原因排查方法I2C扫描不到设备接线错误用I2C扫描程序确认地址读到的值全是0传感器未初始化检查begin()返回值读到的值全是65535I2C通信失败检查上拉电阻缩短杜邦线数据跳动大电源噪声加滤波电容换USB线血氧值一直偏低手指太冷/没放好搓手调整手指位置I2C扫描程序很简单几行代码就能跑#include Wire.h void setup() { Wire.begin(21, 22); Serial.begin(115200); while (!Serial); Serial.println(I2C Scanner); } void loop() { byte error, address; int nDevices 0; for (address 1; address 127; address) { Wire.beginTransmission(address); error Wire.endTransmission(); if (error 0) { Serial.print(Found device at 0x); Serial.println(address, HEX); nDevices; } } if (nDevices 0) Serial.println(No I2C devices found); delay(5000); }如果扫描不到MAX30102先检查接线再检查模块上的电平转换芯片是否正常。有些便宜的模块省掉了电平转换直接连3.3V会烧。6.2 血氧读数不准的五个原因血氧读数不准是这个项目里最让人头疼的问题。我踩过的坑总结下来有五个第一手指位置不对。MAX30102的LED和探测器在模块的同一面手指要完全覆盖这两个窗口。如果手指歪了光路不对读数就会偏。正确的位置是食指指腹正对传感器窗口轻轻按压不要用力。第二环境光干扰。强光直射传感器会影响读数。模块上一般有一层遮光胶但如果环境光太强还是会有影响。测量时用手掌稍微遮挡一下。第三手指温度低。前面说过了末梢循环差会导致血氧读数偏低。冬天测量前先搓手。第四运动伪影。手指移动会产生额外的光强变化干扰PPG信号。测量时保持静止不要说话。第五算法精度。简化版算法本身就有误差不要期望它能达到医疗级精度。看趋势不看绝对值。6.3 WiFi和蓝牙同时用的坑ESP32的WiFi和蓝牙共用同一个射频前端理论上可以同时工作但实际上会互相干扰。我实测下来同时开WiFi和BLE的时候WiFi的吞吐量会下降30%左右BLE的连接稳定性也会变差。如果项目里两个都要用建议分时复用平时用BLE推送数据到手机需要上传服务器的时候再开WiFi。或者用ESP32的双核特性一个核心跑WiFi一个核心跑BLE减少冲突。另外WiFi和BLE同时工作时功耗会明显增加电池供电的话续航会大打折扣。如果要做便携设备建议只用BLE或者用WiFi但降低上传频率。6.4 烧录失败的常见原因ESP32烧录失败也是新手经常遇到的问题。常见原因和解决方法驱动没装CP2102或CH340驱动没装设备管理器里看不到串口。去官网下载对应驱动安装。开发板选错工具-开发板里要选“ESP32 Dev Module”不要选别的。端口选错工具-端口里选对应的COM口。烧录时按住BOOT键有些板子需要按住BOOT键再点上传看到“Connecting...”再松开。USB线质量差有些USB线只有充电功能没有数据线。换一根线试试。提示如果一直显示“Connecting...”可以试试降低上传速度。在工具-Upload Speed里选115200。7. 从原型到成品外壳设计与佩戴方式7.1 指夹式外壳的3D打印方案面包板上的原型只能用来调试真正要日常使用需要一个外壳。我设计了一个简单的指夹式外壳用Fusion 360画的可以3D打印。外壳分上下两半下半部分放ESP32和电池上半部分放传感器。MAX30102和MAX30205都固定在指夹的内侧手指伸进去就能同时测血氧和体温。OLED显示屏嵌在外壳顶部方便查看数据。3D打印的材料建议用PETG或者ABS不要用PLA因为PLA在体温下会变软。打印精度0.2mm就够了不需要太高。如果不想3D打印也可以用现成的指夹式血氧仪外壳改装把里面的电路板换成自己的。某宝上有卖空外壳的几块钱一个。7.2 电池供电与功耗优化便携设备必须考虑功耗。ESP32在WiFi工作时的电流大约是120mABLE工作时大约是30mA深度睡眠时只有10μA左右。如果用1000mAh的锂电池WiFi连续工作只能撑8小时BLE能撑30小时深度睡眠可以撑好几个月。功耗优化的策略降低采样率血氧和心率不需要连续测量可以每5分钟测一次每次测30秒。用BLE代替WiFiBLE的功耗比WiFi低得多。深度睡眠不测量的时候让ESP32进入深度睡眠定时唤醒。关闭不必要的LEDESP32开发板上的电源LED和用户LED都会耗电可以拆掉或者用胶带遮住。我实际测试下来用BLE 定时唤醒的方案1000mAh电池可以撑3到5天基本满足日常使用。7.3 佩戴舒适性与信号质量的平衡指夹式设计的一个矛盾是夹得太紧手指不舒服长时间佩戴会麻夹得太松传感器接触不好信号质量差。我的解决方案是用硅胶垫。在指夹内侧贴一层2mm厚的硅胶垫既能增加摩擦力防止滑动又能让压力分布更均匀。硅胶垫的硬度选邵氏A20左右的太硬了不舒服太软了起不到固定作用。另外手指的粗细不同指夹的开口大小要能调节。我用了弹簧铰链可以根据手指粗细自动调整夹紧力。弹簧的劲度系数选0.5N/mm左右夹紧力大概在2N到3N之间既不会太紧也不会太松。8. 数据准确度验证跟商用设备对比8.1 血氧对比测试方法与结果为了验证自己做的设备准不准我买了一台某品牌的指夹式血氧仪做对比。测试方法是同一个人同一根手指先用自己的设备测3次再用商用血氧仪测3次取平均值对比。测试结果测试次数自制设备SpO2商用血氧仪SpO2差值197.298-0.8296.898-1.2397.598-0.5496.597-0.5597.098-1.0平均差值在-0.8%左右自制设备读数偏低。这个偏差在可接受范围内因为简化算法本身就有系统性偏差。如果要做更精确的测量需要做校准用商用设备测一组数据然后拟合一个校正曲线。8.2 体温对比测试与校准体温对比用的是某品牌的电子体温计腋下测量。MAX30205贴在指夹内侧测的是手指温度跟腋下温度有差异需要校准。我测了一组数据手指温度比腋下温度平均低1.5°C左右。所以最终显示的体温值是在MAX30205读数基础上加1.5°C。这个偏移量因人而异也跟环境温度有关最好每个人自己校准一下。校准方法先用电子体温计测腋下温度记下来然后用自己的设备测手指温度记下来两者的差值就是偏移量。把这个偏移量写到代码里以后测出来的就是估算的体温值。注意手指温度受环境影响很大冬天在室外测出来的手指温度可能比体温低好几度。所以这个设备更适合在室内使用或者作为趋势监测不要当成医疗级体温计。9. 项目扩展方向从单点监测到健康管理系统9.1 接入米家生态的可行性分析有朋友问我能不能把这个设备接入米家用米家App查看数据。技术上是可以的但需要用到ESP32的米家Mesh方案。米家Mesh是基于蓝牙Mesh的ESP32需要烧录特定的固件然后通过米家App配网。不过米家Mesh的协议是半封闭的自定义数据的上报格式有限制血氧和体温这种自定义数据不一定能直接显示。更可行的方案是用Home Assistant通过MQTT把数据接入HA然后在HA的仪表盘上显示。HA的灵活性比米家高得多支持自定义卡片和自动化规则。9.2 多设备组网与数据汇聚如果家里有多个老人需要监测可以部署多个ESP32节点每个节点负责一个人数据统一上传到MQTT服务器。服务器端用Node-RED或者自己写一个Python脚本做数据汇聚和存储。数据存储可以用InfluxDB它是专门做时序数据库的适合存储传感器数据。配合Grafana做可视化可以画出漂亮的趋势图。这套方案我在家里跑了一年多稳定性很好。9.3 异常告警与自动化联动监测的最终目的是在异常时及时提醒。告警规则可以这样设血氧低于92%持续30秒触发告警体温高于37.5°C触发告警心率低于50或高于120持续1分钟触发告警告警方式可以是蜂鸣器响、手机推送、或者通过MQTT触发家里的智能音箱播报。我用的方案是MQTT 企业微信机器人告警消息直接推到手机上响应很快。自动化联动方面可以跟家里的空调、加湿器联动。比如体温偏高时自动开空调降温血氧偏低时自动开窗通风如果外面空气质量好的话。这些用Home Assistant的自动化规则就能实现。10. 我在实际操作中的几点体会这个项目我从零开始做前后花了大概两个月的时间中间踩了不少坑。最大的体会是传感器数据的好坏硬件设计占七成软件算法占三成。很多人一上来就纠结算法但其实电源噪声、接线质量、传感器位置这些硬件因素对数据的影响更大。把硬件做扎实了即使用简单的算法数据也能用。另一个体会是不要追求医疗级的精度。自己做的设备成本摆在那里传感器精度、算法复杂度都有限。把它当成一个健康趋势监测工具看长期变化而不是跟医院的血氧仪比绝对值。我用了半年多发现它最大的价值是让我养成了定期监测的习惯而不是某一次测量的精确数值。最后分享一个小技巧如果你觉得血氧读数一直不稳定可以试试在MAX30102的LED窗口上贴一层红色透明胶带。这层胶带可以滤掉一部分环境光同时让红光和红外光的混合更均匀实测下来读数稳定性有明显提升。这个方法是社区里的一个老玩家告诉我的原理说不太清楚但确实管用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询