news 2026/6/3 2:57:09

用GY-39传感器DIY一个桌面环境监测仪(STM32+LCD显示,附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用GY-39传感器DIY一个桌面环境监测仪(STM32+LCD显示,附完整代码)

用GY-39传感器打造智能桌面环境监测站(STM32实战指南)

在创客圈子里,环境监测一直是个经久不衰的热门主题。想象一下,桌面上摆放着一个实时显示温湿度、气压和光照的小设备,不仅能满足技术宅的好奇心,还能为植物养护、摄影布光甚至居家健康提供数据参考。这次我们要用GY-39这款全能传感器模块,搭配STM32开发板和LCD屏幕,打造一个功能全面且颜值在线的桌面监测仪。

相比市面上单一的温湿度计或气压计,这个DIY项目的独特之处在于:

  • 多参数集成:一个设备同时监测4种环境指标
  • 实时可视化:LCD屏幕提供直观的数据反馈
  • 可扩展性强:基础框架可轻松添加更多传感器
  • 成本可控:总硬件成本不超过百元

1. 硬件准备与连接方案

1.1 核心器件选型建议

选择硬件时需要考虑兼容性和性价比。以下是经过实测的推荐配置:

组件型号备注
主控板STM32F103C8T6蓝色pill开发板性价比最高
传感器GY-39注意区分山寨版本
显示屏1.3寸IIC OLED或0.96寸IPS LCD
连接线杜邦线建议使用镀金端子款

特别注意:GY-39有多个版本,建议选择带有BH1750光照芯片的改良版,其光照量程可达65535lux,比早期版本更精准。

1.2 硬件连接图解

根据接口类型不同,有两种可靠的连接方案:

方案A:UART串口连接

GY-39 STM32 VCC → 3.3V GND → GND TX → PA3(USART2_RX) RX → PA2(USART2_TX)

方案B:I2C接口连接

GY-39 STM32 VCC → 3.3V GND → GND SCL → PB6(I2C1_SCL) SDA → PB7(I2C1_SDA)

提示:如果使用I2C接口,需要确保总线上没有地址冲突。GY-39的默认地址是0x5C,与某些OLED屏的0x3C可以共存。

2. STM32开发环境搭建

2.1 工程创建关键步骤

使用STM32CubeIDE创建工程时,这些配置项需要特别注意:

  1. 时钟配置

    • 设置HCLK为72MHz
    • 启用外部晶振(HSE)
  2. 外设初始化

    // 对于UART方案 MX_USART2_UART_Init(); // 对于I2C方案 MX_I2C1_Init();
  3. DMA配置(提升效率):

    • 启用USART2_RX的DMA通道
    • 设置循环模式(Circular)

2.2 必备驱动库安装

除了标准HAL库,还需要准备:

  • GY39_driver.h:封装传感器通信协议
  • LCD_GFX.c:提供图形显示功能
  • fonts.h:包含多种字号的中英文字库

3. 传感器数据采集与处理

3.1 数据包解析技巧

GY-39的UART协议有两大关键数据包类型:

光照数据包(0x15)结构

字节1 字节2 字节3 字节4 字节5 0xA5 0x15 Lux高 Lux低 校验和

环境数据包(0x45)结构

字节1 字节2 字节3 字节4 字节5 字节6 字节7... 0xA5 0x45 温度高 温度低 气压1 气压2 气压3...

解析代码示例:

void parse_gy39_data(uint8_t *buf) { if(buf[1] == 0x15) { uint16_t lux = (buf[2]<<8) | buf[3]; // 光照处理逻辑 } else if(buf[1] == 0x45) { int16_t temp = (buf[2]<<8) | buf[3]; uint32_t pressure = (buf[4]<<16) | (buf[5]<<8) | buf[6]; // 环境数据处理逻辑 } }

3.2 数据校准与滤波

原始数据往往需要后期处理才能更准确:

  1. 温度补偿

    // 芯片自发热补偿 real_temp = raw_temp - 1.5;
  2. 移动平均滤波

    #define FILTER_SIZE 5 float temp_history[FILTER_SIZE]; float filtered_temp() { float sum = 0; for(int i=0; i<FILTER_SIZE; i++){ sum += temp_history[i]; } return sum/FILTER_SIZE; }

4. 数据显示与界面设计

4.1 LCD界面布局方案

一个美观的界面应该包含这些元素:

  • 主数据显示区(占屏70%)

    • 大字体的当前温度/湿度
    • 趋势箭头(相比上次读数)
  • 次级信息区(底部30%)

    • 气压变化曲线
    • 光照强度进度条

4.2 动态效果实现

通过以下代码可以实现平滑的数值变化效果:

void animate_value(uint16_t x, uint16_t y, int old_val, int new_val) { int step = (new_val > old_val) ? 1 : -1; while(old_val != new_val) { old_val += step; LCD_ShowNum(x, y, old_val, 3, WHITE); HAL_Delay(30); } }

4.3 低功耗优化技巧

延长电池供电时间的方法:

  • 设置传感器为间歇工作模式
  • 降低LCD刷新率(非必要不刷新)
  • 启用STM32的STOP模式
// 进入低功耗模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

5. 外壳设计与成品展示

5.1 3D打印方案

推荐使用这些设计要素:

  • 倾斜15°的观看角度
  • 顶部散热孔阵列
  • 磁吸式后盖(方便更换电池)

5.2 电源管理

三种供电方案对比:

类型优点缺点
USB供电稳定可靠线材束缚
18650电池续航持久需要充电电路
太阳能+超级电容完全无线阴天不稳定

6. 项目进阶与扩展

这个基础框架可以衍生出多种实用变种:

  • 温室监控版:增加土壤湿度传感器
  • 气象站版:添加风速风向检测
  • 智能家居版:通过WiFi上传数据

一个特别实用的改进是添加SD卡存储功能,记录历史数据用于分析:

void log_to_sd(float temp, float humi) { FIL file; char buffer[64]; sprintf(buffer, "%f,%f\n", temp, humi); f_open(&file, "datalog.csv", FA_WRITE | FA_OPEN_APPEND); f_write(&file, buffer, strlen(buffer), NULL); f_close(&file); }

调试时发现一个有趣现象:当用手指轻触GY-39的金属外壳时,温度读数会有0.3℃左右的上升,这说明传感器的热耦合性很好,但也提示我们需要将模块安装在远离热源的位置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 2:55:38

VSCode里C#调试踩坑记:Code Runner配置项修改与‘dotnet run’命令详解

VSCode里C#调试踩坑记&#xff1a;Code Runner配置项修改与‘dotnet run’命令详解在轻量级开发工具的选择上&#xff0c;VSCode凭借其丰富的插件生态和跨平台特性&#xff0c;成为许多C#开发者的首选。然而&#xff0c;当从Visual Studio转向VSCode时&#xff0c;调试环境的配…

作者头像 李华
网站建设 2026/6/3 2:52:20

Codex客户端 Computer Use插件不可用的解决方法

Codex客户端 Computer Use插件不可用的解决方法 大家好 这里是「代码简单说」,欢迎大家关注同名公众号,不定时更新更多实用有趣的教程 也欢迎大家在评论区一起讨论交流!~ SEO关键词&#xff1a;Codex Computer Use插件不可用、Codex电脑使用功能、Computer Use权限设置、Codex录…

作者头像 李华
网站建设 2026/6/3 2:49:50

如果我有一个“智能调度员“,能不能既省钱又不降质量?

上篇算完那笔 43 倍的账单之后&#xff0c;我一直在想一个问题&#xff1a;有没有办法让系统自动替我做选择&#xff1f;不是"我该不该换便宜的模型"——这个问题没意义。便宜的解决不了复杂问题&#xff0c;贵的处理简单问题是浪费。真正的问题是&#xff1a;**能不…

作者头像 李华