标题:STM32室内环境检测系统

系统总体概述

该系统以STM32单片机为核心,连接多种环境传感器,采集数据并通过本地显示或无线方式上传,实现对温度、湿度、气压、光照、空气质量等关键室内环境参数的实时监控。

其核心架构如下图所示:

text

[传感器阵列]   ->   [STM32 MCU]   ->   [输出与通信单元]   ->   [用户/云平台]
 (数据采集)      (核心处理与控制)      (人机交互与上行)        (数据消费端)

第一部分:硬件系统设计(下位机)

1. 核心控制器 (MCU)
  • 推荐型号STM32F103C8T6(蓝色战舰版,性价比之王,资源丰富)或 STM32F407VET6(性能更强,如需复杂算法或驱动更高级屏幕)。

  • 核心职责

    • 初始化并读取所有传感器的数据。

    • 进行数据滤波、校准、单位转换等预处理。

    • 驱动本地显示模块(OLED/LCD)。

    • 管理无线通信模块(如ESP8266/ESP01S)的通信逻辑。

    • 处理用户输入(按键、旋钮)。

2. 传感器阵列 (感知层)

根据需求选择搭配,通信方式主要是 I2C 和 SPI,简化布线。

  • 温湿度传感器

    • DHT11:低成本,数字接口,但精度较低。

    • SHT30/SHT31:I2C接口,精度高,响应快,推荐使用。

  • 大气压强传感器

    • BMP280 / BME280:I2C/SPI接口,可测气压、温度。BME280额外集成了湿度测量。

  • 环境光传感器

    • BH1750:I2C接口,专用于光照强度测量,分辨率高。

  • 空气质量传感器 (VOC/CO2)

    • SGP30:I2C接口,测量TVOC(总挥发性有机物)和eCO2(等效二氧化碳)。

    • CCS811:I2C接口,功能类似。

  • 颗粒物传感器 (PM2.5/PM10)

    • 攀藤PMS5003:UART串口通信,提供精确的颗粒物浓度数据。

3. 输出与通信单元 (交互与上行)
  • 本地显示

    • 0.96寸OLED显示屏 (I2C):低功耗,显示效果好,适合显示多行数据。

    • LCD1602/LCD2004 (需转I2C模块):字符型液晶,简单易用。

  • 无线通信 (可选,但建议具备):

    • Wi-Fi模块 (ESP8266/ESP01S):通过UART与STM32通信,使用AT指令将数据上传到云平台(如阿里云、ThingsBoard、Home Assistant)。

    • 蓝牙模块 (HC-05/HC-08):通过UART连接,可将数据发送到手机APP,实现短距离监控。

  • 报警提示

    • LED灯:用不同颜色表示环境质量(如绿色优、红色差)。

    • 蜂鸣器:当某项参数超标时,发出声音警报。

4. 电源与外围电路
  • 供电:USB供电(5V)或外部电源适配器,经LDO稳压芯片(如AMS1117-3.3)转换为系统工作的3.3V

  • 用户输入:1-2个按键,用于切换显示页面、设置阈值等。

  • PCB:建议将核心板(STM32最小系统)与传感器板分开,通过排针连接,便于调试和扩展。


第二部分:软件系统设计(固件程序)

软件设计应采用模块化分层的思想,保证程序结构清晰,易于维护和扩展。

1. 软件开发环境
  • IDE:STM32CubeIDE (免费,官方推荐,集成了STM32CubeMX和调试功能)。

  • 开发方式HAL库(简单易用,开发快)或 LL库(更接近寄存器,效率高)。

  • 第一步:使用STM32CubeMX进行图形化配置:

    • 选择MCU型号。

    • 配置时钟树(SYSCLK到72MHz for F103)。

    • 启用所需外设:I2C1SPI1UART1 (连接Wi-Fi模块)、UART2 (调试口)、ADC等。

    • 生成初始化代码。

2. 程序主循环逻辑

c

// 1. 主函数初始化
int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C_Init();
  MX_USART1_UART_Init(); // For WiFi
  MX_USART2_UART_Init(); // For Debug
  OLED_Init();
  Sensors_Init(); // 初始化所有传感器
  WiFi_Init();    // 初始化ESP8266

  // 2. 主循环
  while (1) {
      // 2.1 读取传感器数据 (可加延时防读取过快)
      Temperature = SHT30_ReadTemp();
      Humidity    = SHT30_ReadHumidity();
      Pressure    = BMP280_ReadPressure();
      Light       = BH1750_ReadLight();
      // ... 读取其他传感器

      // 2.2 数据预处理 (滤波,计算)
      Filtered_Temp = LowPass_Filter(Temperature, Old_Temp);

      // 2.3 本地显示更新
      OLED_ShowString(0, 0, "Temp:");
      OLED_ShowNum(40, 0, Filtered_Temp, 2, 16);

      // 2.4 判断是否报警
      if (Filtered_Temp > Temp_MAX_Threshold) {
          LED_Red_On();
          Buzzer_On();
      }

      // 2.5 无线发送数据 (例如每5秒发送一次)
      if (HAL_GetTick() - sendTime > 5000) {
          sendTime = HAL_GetTick();
          WiFi_SendData(Temp, Humidity, ...); // 通过串口发送AT指令给ESP8266
      }

      // 2.6 处理用户按键
      Key_Scan();

      HAL_Delay(500); // 主循环延时
  }
}
3. 关键驱动模块
  • sht30.c/.h:SHT30传感器的驱动函数。

  • bmp280.c/.h:BMP280传感器的驱动函数。

  • oled.c/.h:OLED显示屏的驱动函数。

  • esp8266.c/.h:封装AT指令,实现连接Wi-Fi、TCP连接、发送数据等功能。

  • filter.c/.h:实现软件滤波算法(如均值滤波、一阶低通滤波)。


第三部分:数据上行与展示(可选)

1. 通信协议
  • MQTT协议:是物联网首选协议,轻量级,发布/订阅模式。ESP8266连接到MQTT Broker(服务器),STM32将数据打包成JSON格式通过ESP8266发布到指定主题(Topic)。

    • 示例JSON:{"temp": 26.5, "humi": 45, "light": 300}

2. 云平台/上位机
  • 本地部署

    • Home Assistant:在树莓派或电脑上部署,通过MQTT集成接收数据,可制作非常美观的UI控制面板。

    • Node-RED:图形化编程工具,轻松实现数据流处理和简单UI展示。

  • 公有云平台

    • ThingsBoard:开源IoT平台,功能强大,支持设备管理、数据可视化和报警。

    • 阿里云IoT平台 / 腾讯云IoT Explorer:提供一站式解决方案,稳定可靠。

系统设计要点

  1. 低功耗考虑:如果采用电池供电,需要让STM32和传感器在空闲时进入休眠模式(Stop或Standby),定时唤醒采集。

  2. 数据准确性:软件滤波算法对传感器数据的稳定性至关重要。

  3. 稳定性

    • 为Wi-Fi通信增加重连机制。

    • 加入看门狗(IWDG/WWDG),防止程序跑飞。

  4. 扩展性:硬件设计留出多余的I2C、UART接口,软件采用模块化编程,便于未来增加新传感器(如二氧化碳、噪音传感器)。

代码实现:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐