STM32‑HAL 库实战|SGP30 二氧化碳传感器 I2C 采集 + LCD 显示 + 串口输出
前言
本篇记录基于 STM32L431VC 智能家居开发板,驱动SGP30 二氧化碳传感器完整实验。使用 I2C 总线读取气体浓度,实现 LCD 本地实时显示、串口向上位机输出测量数据,完整覆盖硬件连接、程序架构、实验现象、排错以及拓展方案,适合 STM32 嵌入式新手学习参考。
硬件平台:STM32L431VC 鸿蒙智能家居开发板 传感器:SGP30 二氧化碳传感器(I2C 通信) 开发框架:STM32 HAL 库 调试工具:SSCOM 串口助手,波特率 115200
一、实验原理与硬件拓扑
SGP30 是一款 I2C 接口的气体传感器,单片机通过 I2C 总线向传感器发送读取指令,传感器返回环境二氧化碳浓度数据,单位ppm。
整套系统数据链路: STM32L4主控I2C外设 ↔ SGP30二氧化碳传感器 主控FSMC接口 ↔ LCD液晶显示屏,本地展示CO₂浓度 USART2串口 → CH340转USB → PC端SSCOM串口助手输出日志 GPIO驱动LED作为板载指示外设
程序整体运行逻辑: 上电后依次执行 HAL 库底层初始化、系统时钟、LCD、LED、串口、SGP30 传感器初始化;全部外设就绪后进入while(1)死循环,周期性调用CO2_Handle()函数,完成传感器数据读取、数值处理、屏幕刷新、串口打印。
注意:时钟是所有外设工作的基础,I2C、串口、LCD 都依赖对应的外设时钟,时钟配置错误外设会直接无法工作。
二、程序整体架构解析
项目主要分为:main 主函数、系统时钟配置、SGP30 传感器业务处理CO2_Handle()三大模块。
main.c 主函数入口代码
int main(void)
{
HAL_Init(); //HAL库底层初始化
SystemClock_Config(); //系统时钟配置
LCD_Display_Init(); //LCD屏幕初始化显示
gpio_module_open(LEDS); //LED模块GPIO初始化
uart_open(uart2, 115200); //打开串口2,波特率115200
printf("\r\n 二氧化碳检测实验 \r\n");
printf("------------------------------\r\n");
printf("开始本实验:\r\n\r\n");
Init_SGP30(); //二氧化碳传感器I2C引脚初始化
printf("** 二氧化碳传感器初始化\r\n");
while(1)
{
CO2_Handle(); //检测二氧化碳值并显示
}
}
函数说明:
HAL_Init():初始化 HAL 库,配置 SysTick 系统滴答定时器,搭建 HAL 运行底层环境。SystemClock_Config():配置 HSE 外部晶振,PLL 锁相环生成系统主时钟,同时开启 I2C、USART 等外设时钟。LCD_Display_Init():完成 LCD 屏幕驱动初始化,为数据显示做准备。gpio_module_open(LEDS):初始化 LED 的 GPIO 引脚。uart_open(uart2,115200):初始化串口 2,完成 printf 重定向,串口可以打印日志。Init_SGP30():初始化 I2C 通信引脚,完成 SGP30 传感器上电初始化。while(1)死循环:循环调用CO2_Handle(),持续采集处理二氧化碳数据。_Error_Handler():HAL 库错误回调函数。时钟、外设初始化出错时进入该函数,可在回调内添加屏幕打印错误提示,方便定位故障。
📝踩坑记录:本次工程原始文件头部注释写的是 BH1750 光强传感器,实际代码实现 SGP30 二氧化碳检测,注释与业务代码不匹配。开发过程中一定要维护注释,保证注释和实际功能一致。
CO2_Handle 核心业务处理函数
CO2_Handle()在主循环中被反复调用,主要完成:
- 通过 I2C 接口读取 SGP30 传感器二氧化碳浓度;
- 将采集到的 CO₂浓度数值刷新显示到 LCD 屏幕;
- 通过串口输出当前检测的 ppm 数值;
- 做简单时序控制,控制采集频率,避免 I2C 读取过于频繁。
三、实验现象与运行结果
将程序下载至 STM32 开发板,PC 打开 SSCOM 串口调试助手。 配置参数:选择正确 COM 端口,波特率设置115200。
- 开发板上电,各个外设依次初始化;LCD 屏幕点亮,显示 “二氧化碳检测实验” 标题,实时刷新二氧化碳浓度;串口输出实验初始化日志。
- 正常室内环境,传感器读出二氧化碳浓度约 400ppm。串口持续输出:
**读取二氧化碳传感器数据
**二氧化碳浓度:400 ppm
- 向传感器附近吹气,环境二氧化碳升高,可以观察到 LCD 屏幕上的数字变大,串口输出的 ppm 数值同步上升。
- 如果硬件初始化出现异常,LCD 屏幕打印
An error message detected错误提示。
四、常见问题排查
- SGP30 读不到数据,初始化失败 优先检查 I2C 硬件接线,确认 SDA、SCL 引脚没有接反;检查 I2C 外设时钟是否开启;确认传感器供电 3.3V 正常。I2C 通信对接线很敏感,接线错误直接无法读取传感器。
- 串口助手乱码 核对波特率必须为 115200;确认 printf 重定向到 USART2;检查 CH340 驱动是否正常安装。
- LCD 屏幕黑屏,没有任何显示 检查 LCD 初始化函数,确认 FSMC 总线硬件接线,屏幕供电是否正常。
心得体会:串口打印是嵌入式调试的利器,可以直观看到传感器返回原始数据,快速区分是硬件问题还是逻辑代码 bug。
五、拓展开发思路
在现有二氧化碳采集 Demo 基础上,可以扩展更多实用功能:
- 阈值声光报警:设定 CO₂浓度阈值,超过阈值点亮 LED,驱动蜂鸣器报警,用于室内空气质量提醒。
- 本地数据存储:将采集的二氧化碳浓度存储到单片机片内 Flash,保存历史检测数据。
- 云平台远程监控:对接 WiFi / 鸿蒙网络模块,把 ppm 数值上传云平台,网页 / 手机远程查看环境二氧化碳。
- 多传感器融合:接入 BH1750 光照、DHT 温湿度传感器,一块屏幕同时展示多项环境参数。
- 按键人机交互:使用按键切换屏幕页面,控制串口输出开启关闭。
- 低功耗优化:定时唤醒单片机读取传感器,其余时间进入休眠模式,降低整机功耗,适合电池供电设备。
实验总结
本实验完整实践了 STM32 HAL 库开发流程:底层 HAL 初始化 →系统时钟配置→各个外设初始化→主循环周期性业务采集。 学会 I2C 协议驱动 SGP30 气体传感器,掌握 LCD 本地显示、串口上报数据。理解时钟对于外设的重要意义,同时也注意到代码注释维护的必要性。 这个项目是智能家居、环境监测类项目很好的入门 Demo,可以基于它继续拓展环境监测设备。
更多推荐



所有评论(0)