ESP32 + SSD1306 OLED + MAX30102 血氧传感器。能看天气、测血氧、显示时间。区二等奖。
硬件
- ESP32 开发板(CP210 系列驱动)
- SSD1306 OLED 屏幕(128x64,SPI 接口)
- MAX30102 血氧传感器(I2C 接口)
- 两节 21700 电池并联供电(5V 输出)
- 三个按键(GPIO 下拉电阻)
功能
天气显示
调用 OpenWeather API,HTTP 协议(ESP32 固件不支持 HTTPS)。urequests 库发请求,ujson 解析返回数据。OpenWeather 免费版一天可以调用 1000 次,够用。
网络校时
ntptime 同步 UTC 时间,加 8 小时转东八区。用阿里、微软等大厂的 NTP 服务器,保证稳定。每隔固定循环次数重新校时。
血氧检测
MAX30102 采集红光和红外光,I2C 协议通讯。巴特沃斯带通滤波 + 相关系数算法计算血氧饱和度。
公式:R = (red_ac/red_dc) / (ir_ac/ir_dc),SPO2 = a - b*R。系数 a=106, b=17 需要根据实际情况校准。
前 45 秒数据不准,要等稳定。
中文显示
自己写了 16x16 点阵字库。把汉字拆成单个字,通过字典找字模数据,创建帧缓冲区,最后贴到屏幕上。
按键切换
4 个界面,GPIO 下拉电阻检测。用 machine.Pin 的 pull 参数实现。
踩过的坑
- MicroPython 不原生支持 SSD1306,要用第三方库
- 固件不支持 HTTPS,只能用 HTTP 的 API
- 血氧数据前 45 秒不准,要等稳定
- NTP 服务器有时候连不上,加了多个备选
- 字库文件要单独存放,方便扩展
代码
MicroPython 写的,ESP32 上直接跑。字库是单独的 .py 文件,导入后使用。
