前言

本篇记录基于 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(); //检测二氧化碳值并显示
    }
}

函数说明:

  1. HAL_Init():初始化 HAL 库,配置 SysTick 系统滴答定时器,搭建 HAL 运行底层环境。
  2. SystemClock_Config():配置 HSE 外部晶振,PLL 锁相环生成系统主时钟,同时开启 I2C、USART 等外设时钟。
  3. LCD_Display_Init():完成 LCD 屏幕驱动初始化,为数据显示做准备。
  4. gpio_module_open(LEDS):初始化 LED 的 GPIO 引脚。
  5. uart_open(uart2,115200):初始化串口 2,完成 printf 重定向,串口可以打印日志。
  6. Init_SGP30():初始化 I2C 通信引脚,完成 SGP30 传感器上电初始化。
  7. while(1)死循环:循环调用CO2_Handle(),持续采集处理二氧化碳数据。
  8. _Error_Handler():HAL 库错误回调函数。时钟、外设初始化出错时进入该函数,可在回调内添加屏幕打印错误提示,方便定位故障。

📝踩坑记录:本次工程原始文件头部注释写的是 BH1750 光强传感器,实际代码实现 SGP30 二氧化碳检测,注释与业务代码不匹配。开发过程中一定要维护注释,保证注释和实际功能一致。

CO2_Handle 核心业务处理函数

CO2_Handle()在主循环中被反复调用,主要完成:

  1. 通过 I2C 接口读取 SGP30 传感器二氧化碳浓度;
  2. 将采集到的 CO₂浓度数值刷新显示到 LCD 屏幕;
  3. 通过串口输出当前检测的 ppm 数值;
  4. 做简单时序控制,控制采集频率,避免 I2C 读取过于频繁。

三、实验现象与运行结果

将程序下载至 STM32 开发板,PC 打开 SSCOM 串口调试助手。 配置参数:选择正确 COM 端口,波特率设置115200

  1. 开发板上电,各个外设依次初始化;LCD 屏幕点亮,显示 “二氧化碳检测实验” 标题,实时刷新二氧化碳浓度;串口输出实验初始化日志。
  2. 正常室内环境,传感器读出二氧化碳浓度约 400ppm。串口持续输出:
**读取二氧化碳传感器数据
**二氧化碳浓度:400 ppm
  1. 向传感器附近吹气,环境二氧化碳升高,可以观察到 LCD 屏幕上的数字变大,串口输出的 ppm 数值同步上升。
  2. 如果硬件初始化出现异常,LCD 屏幕打印An error message detected错误提示。

四、常见问题排查

  1. SGP30 读不到数据,初始化失败 优先检查 I2C 硬件接线,确认 SDA、SCL 引脚没有接反;检查 I2C 外设时钟是否开启;确认传感器供电 3.3V 正常。I2C 通信对接线很敏感,接线错误直接无法读取传感器。
  2. 串口助手乱码 核对波特率必须为 115200;确认 printf 重定向到 USART2;检查 CH340 驱动是否正常安装。
  3. LCD 屏幕黑屏,没有任何显示 检查 LCD 初始化函数,确认 FSMC 总线硬件接线,屏幕供电是否正常。

心得体会:串口打印是嵌入式调试的利器,可以直观看到传感器返回原始数据,快速区分是硬件问题还是逻辑代码 bug。

五、拓展开发思路

在现有二氧化碳采集 Demo 基础上,可以扩展更多实用功能:

  1. 阈值声光报警:设定 CO₂浓度阈值,超过阈值点亮 LED,驱动蜂鸣器报警,用于室内空气质量提醒。
  2. 本地数据存储:将采集的二氧化碳浓度存储到单片机片内 Flash,保存历史检测数据。
  3. 云平台远程监控:对接 WiFi / 鸿蒙网络模块,把 ppm 数值上传云平台,网页 / 手机远程查看环境二氧化碳。
  4. 多传感器融合:接入 BH1750 光照、DHT 温湿度传感器,一块屏幕同时展示多项环境参数。
  5. 按键人机交互:使用按键切换屏幕页面,控制串口输出开启关闭。
  6. 低功耗优化:定时唤醒单片机读取传感器,其余时间进入休眠模式,降低整机功耗,适合电池供电设备。

实验总结

本实验完整实践了 STM32 HAL 库开发流程:底层 HAL 初始化 →系统时钟配置→各个外设初始化→主循环周期性业务采集。 学会 I2C 协议驱动 SGP30 气体传感器,掌握 LCD 本地显示、串口上报数据。理解时钟对于外设的重要意义,同时也注意到代码注释维护的必要性。 这个项目是智能家居、环境监测类项目很好的入门 Demo,可以基于它继续拓展环境监测设备。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐