基于STM32F103C8T6的智能家居环境监测系统(多传感器+WiFi+OLED)
前言
随着人们对居住环境健康与安全的关注度日益提升,实时监测室内温湿度、气压、空气质量等参数变得越来越重要。市面上的环境监测设备功能单一或价格偏高,于是萌生了用STM32自己搭建一套多功能环境监测系统的想法。
本项目以STM32F103C8T6为主控,集成了6种环境传感器(温湿度、气压、烟雾、一氧化碳、空气质量、光照),通过OLED分页显示各项数据,4按键菜单导航交互操作,并利用ESP8266-01S将数据通过WiFi实时推送到手机,超标时还有声光报警。整个系统成本低、扩展性强,非常适合嵌入式学习和DIY。
项目亮点速览:
- 7项环境参数同时采集(温/湿/压/光/烟/CO/空气)
- OLED 8页分页显示 + 菜单导航状态机
- WiFi双模自动切换(STA优先,AP兜底)
- 手机TCP实时接收数据
- 超标声光报警
一、系统总体设计
1.1 系统架构
系统采用“主控-传感器-显示-通信”四层架构,STM32F103C8T6作为核心,通过不同接口与各模块连接:
| 层级 | 模块 | 接口 | STM32引脚 |
|---|---|---|---|
| 传感器层 | DHT11温湿度 | 单总线(GPIO) | PB4 |
| 传感器层 | BMP280气压 | 软件I2C | PB10/PB11 |
| 传感器层 | MQ-2烟雾 | ADC | PA7 |
| 传感器层 | MQ-7一氧化碳 | ADC | PA6 |
| 传感器层 | MQ-135空气质量 | ADC | PA5 |
| 传感器层 | 光敏传感器 | ADC | PA4 |
| 显示交互层 | 0.96寸OLED | 软件I2C | PB6/PB7 |
| 显示交互层 | 4个独立按键 | GPIO | PB12~PB15 |
| 显示交互层 | LED+蜂鸣器 | GPIO | PA0/PA1 |
| 通信层 | ESP8266-01S | USART2 | PA2/PA3 |
设计要点:BMP280和OLED都用I2C,但本项目采用两组独立的软件I2C(BMP280接PB10/PB11,OLED接PB6/PB7),避免地址冲突,也降低了时序耦合风险。
1.2 功能概览
| 功能模块 | 具体描述 |
|---|---|
| 多参数采集 | 同时采集温度、湿度、气压、光照、烟雾、CO、空气质量共7项参数 |
| 本地显示 | OLED实时分页显示,8个数据页 + 菜单页 |
| 交互控制 | 4按键实现上移/下移/确定/返回菜单导航 |
| 无线传输 | ESP8266建立TCP服务器,手机APP实时接收数据 |
| 超限报警 | 烟雾/CO/空气质量超标时LED闪烁+蜂鸣器鸣响 |
| 双模WiFi | STA优先连接路由器,失败自动切换AP热点 |
二、元器件清单
完整的元器件清单如下,供大家参考采购。
2.1 主控核心
| 元件 | 型号规格 | 数量 | 用途 |
|---|---|---|---|
| STM32核心板 | STM32F103C8T6(Cortex-M3, 72MHz, 64KB Flash, 20KB SRAM) | 1 | 系统主控 |
| ST-Link调试器 | ST-Link V2(SWD/JTAG) | 1 | 程序下载与调试 |
2.2 环境传感器
| 元件 | 型号规格 | 数量 | 用途 |
|---|---|---|---|
| 温湿度传感器 | DHT11(0-50℃,±2℃;20-90%RH,±5%RH) | 1 | 检测温湿度 |
| 气压传感器 | BMP280(I2C地址0x76,300~1100hPa) | 1 | 检测大气压强 |
| 烟雾传感器 | MQ-2(模拟输出,5V供电) | 1 | 烟雾/LPG/甲烷检测 |
| 一氧化碳传感器 | MQ-7(模拟输出,5V供电) | 1 | CO浓度检测 |
| 空气质量传感器 | MQ-135(模拟输出,5V供电) | 1 | NH3/NOx/CO2等有害气体 |
| 光敏传感器 | 光敏电阻模块(AO+DO双输出) | 1 | 环境光照检测 |
2.3 人机交互 & 通信
| 元件 | 型号规格 | 数量 | 用途 |
|---|---|---|---|
| OLED显示屏 | 0.96寸 I2C SSD1306 128×64 | 1 | 数据显示与菜单导航 |
| 独立按键 | 12×12mm轻触开关 | 4 | 菜单导航(上移/下移/确定/返回) |
| LED | 3mm红色 + 150Ω限流电阻 | 1 | 报警指示 |
| 蜂鸣器 | 有源蜂鸣器 5V | 1 | 报警提示音 |
| WiFi模块 | ESP8266-01S(AT指令,3.3V) | 1 | WiFi数据传输 |
2.4 外围电路
| 元件 | 规格 | 数量 | 用途 |
|---|---|---|---|
| 杜邦线 | 母对母/公对母/公对公 各10根 | 1套 | 模块连线 |
| 面包板 | 830孔 | 1块 | 电路搭建 |
| 电阻 | 10kΩ×4, 150Ω×1, 1kΩ若干 | 若干 | 上拉/限流/分压 |
避坑提醒:
- ESP8266-01S严禁接5V,峰值电流可达200mA+
- MQ系列传感器需要预热几分钟才能稳定输出
三、硬件设计
3.1 引脚分配总览
STM32F103C8T6共48个引脚,本项目使用了17个GPIO:
| 引脚 | 功能 | 模式 | 连接模块 |
|---|---|---|---|
| PA0 | LED | 推挽输出 | 报警指示灯(低电平亮) |
| PA1 | 蜂鸣器 | 推挽输出 | 有源蜂鸣器(低电平响) |
| PA2 | USART2_TX | 复用推挽 | ESP8266 RXD |
| PA3 | USART2_RX | 浮空输入 | ESP8266 TXD |
| PA4 | ADC1_IN4 | 模拟输入 | 光敏传感器 |
| PA5 | ADC1_IN5 | 模拟输入 | MQ-135 |
| PA6 | ADC1_IN6 | 模拟输入 | MQ-7 |
| PA7 | ADC1_IN7 | 模拟输入 | MQ-2 |
| PB4 | GPIO | 开漏/输入 | DHT11 DATA |
| PB6 | I2C_SCL(软件) | 开漏输出 | OLED SCL |
| PB7 | I2C_SDA(软件) | 开漏输出 | OLED SDA |
| PB10 | I2C_SCL(软件) | 开漏输出 | BMP280 SCL |
| PB11 | I2C_SDA(软件) | 开漏输出 | BMP280 SDA |
| PB12 | KEY1 | 上拉输入 | 按键1-上移 |
| PB13 | KEY2 | 上拉输入 | 按键2-下移 |
| PB14 | KEY3 | 上拉输入 | 按键3-确定 |
| PB15 | KEY4 | 上拉输入 | 按键4-返回 |
引脚资源利用率约46%,还有充足空间扩展更多传感器。
3.2 关键硬件连接说明
ESP8266-01S接线(最易出错,重点注意):
| ESP8266-01S | STM32 | 说明 |
|---|---|---|
| VCC | 3.3V | 严禁接5V |
| GND | GND | 共地 |
| TXD | PA3 (USART2_RX) | 模块发送→MCU接收 |
| RXD | PA2 (USART2_TX) | MCU发送→模块接收 |
| EN/CH_PD | 3.3V | 使能引脚,高电平有效 |
四、软件设计
4.1 软件架构
main.c ├── 系统初始化层 │ ├──OLED_Init()// OLED初始化│ ├──LED_Init()// LED+蜂鸣器GPIO初始化│ ├──AD_Init()// ADC1初始化(4通道轮询)│ ├──DHT11_Init()// DHT11初始化│ ├──ESP8266_Init()// USART2+中断初始化│ ├──BMP280_Init()// BMP280软件I2C初始化│ └──Key_Init()// 按键GPIO初始化│ ├── 主循环逻辑 │ ├── 按键扫描与菜单状态机处理 │ ├── ESP8266客户端连接检测 │ ├── DHT11数据采集 │ ├── ADC四通道轮询采集 │ ├── 报警阈值判断与声光报警 │ ├── BMP280气压温度读取 │ ├── OLED显示刷新 │ └── WiFi数据推送(TCP,每2秒) │ └── 中断服务层 └── USART2_IRQHandler// ESP8266串口数据接收中断4.2 OLED分页显示
OLED采用8个数据页 + 1个菜单页的设计,每页固定4行布局:
| 页面 | 标题 | 显示内容 | 数据来源 |
|---|---|---|---|
| 0 | Temperature | 温度(℃) | BMP280/DHT11 |
| 1 | Humidity | 湿度(%) | DHT11 |
| 2 | Barometer | 气压(hPa) | BMP280 |
| 3 | Light | 光照(%) | 光敏ADC |
| 4 | Smoke | 烟雾(ppm) | MQ-2 |
| 5 | CO | CO(ppm) | MQ-7 |
| 6 | Air Quality | 空气质量(ppm) | MQ-135 |
| 7 | WiFi Info | 模式/IP/端口 | ESP8266 |
每页布局:第1行=标题栏,第2行=实时数值,第4行=传感器来源
4.3 菜单导航——按键交互
4个按键的映射关系:
| 按键 | 引脚 | 菜单模式功能 | 数据模式功能 |
|---|---|---|---|
| 按键1 | PB12 | 上移 / 翻上一页 | 切换上一个传感器页 |
| 按键2 | PB13 | 下移 / 翻下一页 | 切换下一个传感器页 |
| 按键3 | PB14 | 确定(进入数据页) | — |
| 按键4 | PB15 | — | 返回(回到菜单) |
菜单状态机逻辑:
菜单模式 (g_in_menu=1) │ │ 按键3(确定) ▼ 数据显示模式 (g_in_menu=0) │ │ 按键4(返回) ▼ 回到菜单模式菜单共8项,每页显示3项,分3页显示。关键变量:
g_menu_page:当前菜单页码(0~2)g_menu_cursor:页内光标位置(0~2)g_sensor_page = g_menu_page * 3 + g_menu_cursor:选中项索引(0~7)
// 菜单项数组staticconstchar*menu_items[]={"Temperature","Humidity","Pressure","Light","Smoke","CO","Air Quality","WiFi Info"};4.4 WiFi数据传输方案
连接策略(STA/AP自动回退)
上电初始化 │ ▼ 尝试STA模式连接路由器 │ ├── 成功 → 获取STA_IP → 启动TCP Server(端口8080) │ └── 失败 → 自动切换AP模式 │ ▼ 创建热点"STM32-Env"(密码12345678) │ ▼ 固定IP: 192.168.4.1 │ ▼ 启动TCP Server(端口8080)数据推送协议
推送周期约2秒,数据格式为纯文本:
T:28,H:65,P:1013,L:45 G2:120,G7:30,GA:60| 字段 | 含义 | 示例 |
|---|---|---|
| T | 温度(℃) | T:28 |
| H | 湿度(%) | H:65 |
| P | 气压(hPa) | P:1013 |
| L | 光照(%) | L:45 |
| G2 | 烟雾(ppm) | G2:120 |
| G7 | CO(ppm) | G7:30 |
| GA | 空气质量(ppm) | GA:60 |
手机连接方式
- STA模式:手机和STM32连同一个WiFi,用TCP调试助手连接路由器分配的IP:8080
- AP模式:手机直接连"STM32-Env"热点,访问192.168.4.1:8080
- 推荐使用「网络调试助手」或「SocketTool」等TCP工具接收数据
五、报警功能
当环境参数超标时,系统自动触发声光报警:
| 参数 | 报警阈值 | 触发动作 |
|---|---|---|
| 烟雾(MQ-2) | ≥ 240 ppm | LED闪烁 + 蜂鸣器鸣响 |
| 一氧化碳(MQ-7) | ≥ 50 ppm | LED闪烁 + 蜂鸣器鸣响 |
| 空气质量(MQ-135) | ≥ 80 ppm | LED闪烁 + 蜂鸣器鸣响 |
测试方法:用打火机在MQ-7附近释放少量气体,即可触发CO报警。
六、使用说明
6.1 硬件连接
- STM32核心板插入面包板中央
- 按引脚分配表连接各传感器(ESP8266接3.3V,MQ系列接5V)
- 4个按键一端接PB12~PB15,另一端接GND
- LED接PA0→150Ω→GND,蜂鸣器接PA1→GND
- USB供电(5V,建议≥1A)
6.2 软件烧录
- ST-Link连接SWD接口(VCC/GND/SWCLK/SWDIO)
- 打开Keil工程
Project.uvprojx - 编译(F7)确保0 Error
- 下载(F8)烧录到STM32
- 按复位键,OLED显示启动画面
6.3 首次运行流程
- 上电自检:OLED显示
--- STM32 Env --- - WiFi连接:优先STA模式,失败自动开AP热点
- 传感器初始化:检测BMP280芯片ID(0x58)
- 进入菜单:按键1/2上下移动,按键3进入详情页
- 查看数据:数据页按1/2切换,按4返回菜单
- 手机连接:TCP调试助手连接 IP:8080
七、项目文件结构
代码/ ├── Hardware/ // 硬件驱动层 │ ├── AD.c/h // ADC1多通道采集驱动 │ ├── BMP280.c/h // BMP280气压传感器驱动 │ ├── DHT11.c/h // DHT11温湿度驱动 │ ├── ESP8266.c/h // ESP8266 WiFi AT指令驱动 │ ├── Key.c/h // 4按键扫描驱动 │ ├── LED.c/h // LED+蜂鸣器驱动 │ ├── OLED.c/h // SSD1306 OLED驱动 │ └── OLED_Font.h // 8×16 ASCII字模表 ├── Library/ // STM32标准外设库 ├── Start/ // 启动文件 ├── System/ // 系统公共函数 ├── User/ │ └── main.c // 主程序(状态机+主循环) └── Project.uvprojx // Keil工程文件八、总结与展望
项目成果
本项目实现了一套基于STM32的智能家居环境监测系统,具备多参数采集、OLED分页显示、菜单导航、WiFi数据传输、超标报警等完整功能。系统采用模块化设计,各传感器驱动独立封装,便于扩展。
不足与改进方向
- MQ传感器精度:MQ系列为半导体气敏传感器,精度有限,未来可换用电化学传感器(如ME2-CO)
- 数据存储:目前数据只在手机端实时显示,可增加SD卡或云端存储历史数据
- MQTT协议:ESP8266目前用TCP透传,后续可升级为MQTT协议对接物联网平台(如阿里云IoT、OneNET)
- 手机APP:目前用TCP调试助手接收数据,后续可开发专用APP,支持图表展示和报警推送
- 低功耗:增加电池供电方案和休眠唤醒机制
资源下载
完整项目资源包已上传,包含:
| 资源 | 说明 |
|---|---|
| 完整工程代码 | Keil MDK工程,含所有驱动源码 |
| 项目文档(Word) | 系统架构、引脚分配、软件设计、使用说明 |
| 项目展示PPT | 10页,可用于答辩或项目展示 |
| 硬件设计 | 电路图和PCB制版文件 |
资源链接:https://download.csdn.net/download/2501_91784214/93217936
如果这篇文章对你有帮助,欢迎点赞收藏关注,也欢迎在评论区交流讨论!👇
开发环境:Keil MDK-ARM v5.38 + STM32标准外设库v3.5.0 + ST-Link V2
适用场景:嵌入式课程设计、物联网DIY项目