用STM32和GY39打造高精度桌面环境监测站附3D打印方案在创客圈里环境监测一直是个经典项目。不同于市面上成品监测仪的封闭性自己动手搭建不仅能自由定制功能还能深入理解传感器原理与嵌入式开发。这次我们要用STM32F103C8T6蓝色药丸开发板和GY39传感器制作一个能同时监测温度、湿度、气压和光照强度的多功能设备。1. 硬件选型与设计思路1.1 核心器件对比选择GY39而非BME280DHT22组合主要考虑三点优势特性GY39BME280DHT22集成度四合一传感器需要两个模块通信接口UART/I2C双模仅I2C/单线光照检测内置需额外传感器注意GY39的UART默认波特率为9600I2C地址为0x5A。实际测试发现在3.3V供电时I2C通信更稳定。1.2 最小系统搭建所需材料清单STM32F103C8T6开发板带USB转串口GY39模块0.96寸OLED显示屏SSD1306驱动3.7V锂电池充电模块轻触开关×23D打印外壳后文提供模型文件接线示意图GY39 STM32 VCC ---- 3.3V GND ---- GND SDA ---- PB7 SCL ---- PB6 TXD ---- PA3 (USART2_RX)2. 底层驱动开发2.1 CubeMX配置技巧使用STM32CubeMX生成基础工程时关键配置点在Connectivity中启用I2C1标准模式配置USART2为异步模式9600波特率为OLED分配GPIORESET: PC0DC: PC1CS: PA4软件SPI时可不接避坑指南如果同时使用UART和I2C建议将I2C时钟频率设为100kHz而非400kHz避免电磁干扰导致数据异常。2.2 多协议数据采集GY39的数据解析需要区分通信方式I2C模式读取流程// 启动I2C传输 HAL_I2C_Master_Transmit(hi2c1, 0x5A1, reg, 1, 100); HAL_I2C_Master_Receive(hi2c1, 0x5A1, buffer, 8, 100); // 数据解析示例温度 float temp ((buffer[1]8)|buffer[2])/100.0;UART模式命令帧# 请求光照数据的Hex命令 light_cmd [0xA5, 0x83, 0x28] # 需转换为字节发送实测发现UART模式下连续请求不同数据时需间隔至少100ms否则模块可能无响应。3. 用户界面优化3.1 OLED动态显示方案采用双页面设计通过按键切换主页面实时数值趋势箭头TEMP: 25.6°C ↑ HUMI: 45% → LUX: 320 PRESS: 1012hPa二级页面24小时极值记录使用u8g2库实现平滑动画u8g2_DrawXBM(u8g2, x, y, width, height, bitmap); u8g2_SendBuffer(u8g2);3.2 低功耗处理通过以下策略使待机电流5mA启用STM32的STOP模式设置传感器为间歇工作模式每10秒唤醒OLED动态刷新仅数据变化时更新关键代码HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);4. 成品组装与校准4.1 3D打印外壳设计提供两种版本可选简约版单层结构适合桌面放置扩展版预留孔位支持添加PM2.5传感器打印参数建议材料PLA层高0.2mm填充率15%4.2 传感器校准技巧针对常见误差的修正方法温度补偿公式需根据实测调整T_corrected 1.02*T_raw - 0.5光照传感器线性校准// 在100-1000Lux范围内分段补偿 if(lux 300) lux * 1.1; else if(lux 800) lux * 0.98;完整项目代码已托管在GitHub包含硬件原理图KiCad格式3D模型文件STLSTEP带注释的完整工程Keil MDK
用STM32和GY39传感器DIY一个桌面环境监测仪(附完整代码)
发布时间:2026/6/3 9:23:32
用STM32和GY39打造高精度桌面环境监测站附3D打印方案在创客圈里环境监测一直是个经典项目。不同于市面上成品监测仪的封闭性自己动手搭建不仅能自由定制功能还能深入理解传感器原理与嵌入式开发。这次我们要用STM32F103C8T6蓝色药丸开发板和GY39传感器制作一个能同时监测温度、湿度、气压和光照强度的多功能设备。1. 硬件选型与设计思路1.1 核心器件对比选择GY39而非BME280DHT22组合主要考虑三点优势特性GY39BME280DHT22集成度四合一传感器需要两个模块通信接口UART/I2C双模仅I2C/单线光照检测内置需额外传感器注意GY39的UART默认波特率为9600I2C地址为0x5A。实际测试发现在3.3V供电时I2C通信更稳定。1.2 最小系统搭建所需材料清单STM32F103C8T6开发板带USB转串口GY39模块0.96寸OLED显示屏SSD1306驱动3.7V锂电池充电模块轻触开关×23D打印外壳后文提供模型文件接线示意图GY39 STM32 VCC ---- 3.3V GND ---- GND SDA ---- PB7 SCL ---- PB6 TXD ---- PA3 (USART2_RX)2. 底层驱动开发2.1 CubeMX配置技巧使用STM32CubeMX生成基础工程时关键配置点在Connectivity中启用I2C1标准模式配置USART2为异步模式9600波特率为OLED分配GPIORESET: PC0DC: PC1CS: PA4软件SPI时可不接避坑指南如果同时使用UART和I2C建议将I2C时钟频率设为100kHz而非400kHz避免电磁干扰导致数据异常。2.2 多协议数据采集GY39的数据解析需要区分通信方式I2C模式读取流程// 启动I2C传输 HAL_I2C_Master_Transmit(hi2c1, 0x5A1, reg, 1, 100); HAL_I2C_Master_Receive(hi2c1, 0x5A1, buffer, 8, 100); // 数据解析示例温度 float temp ((buffer[1]8)|buffer[2])/100.0;UART模式命令帧# 请求光照数据的Hex命令 light_cmd [0xA5, 0x83, 0x28] # 需转换为字节发送实测发现UART模式下连续请求不同数据时需间隔至少100ms否则模块可能无响应。3. 用户界面优化3.1 OLED动态显示方案采用双页面设计通过按键切换主页面实时数值趋势箭头TEMP: 25.6°C ↑ HUMI: 45% → LUX: 320 PRESS: 1012hPa二级页面24小时极值记录使用u8g2库实现平滑动画u8g2_DrawXBM(u8g2, x, y, width, height, bitmap); u8g2_SendBuffer(u8g2);3.2 低功耗处理通过以下策略使待机电流5mA启用STM32的STOP模式设置传感器为间歇工作模式每10秒唤醒OLED动态刷新仅数据变化时更新关键代码HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);4. 成品组装与校准4.1 3D打印外壳设计提供两种版本可选简约版单层结构适合桌面放置扩展版预留孔位支持添加PM2.5传感器打印参数建议材料PLA层高0.2mm填充率15%4.2 传感器校准技巧针对常见误差的修正方法温度补偿公式需根据实测调整T_corrected 1.02*T_raw - 0.5光照传感器线性校准// 在100-1000Lux范围内分段补偿 if(lux 300) lux * 1.1; else if(lux 800) lux * 0.98;完整项目代码已托管在GitHub包含硬件原理图KiCad格式3D模型文件STLSTEP带注释的完整工程Keil MDK