项目概述
本项目旨在设计并实现一个基于STM32微控制器的智能家居控制系统,该系统通过多种传感器(如温湿度、光照、人体红外)采集环境数据,并根据预设逻辑或用户指令,自动控制家中的执行器(如继电器控制的灯、风扇、窗帘等),用户可以通过手机APP、Web界面或物理按键远程监控和控制家居设备。

(图片来源网络,侵删)
系统总体架构
一个典型的智能家居系统可以分为四层:感知层、网络层、控制层和应用层。
-
感知层:
- 功能: 负责采集环境和设备状态信息。
- 组件: DHT11/DHT22 (温湿度传感器)、BH1750 (光照强度传感器)、HC-SR501 (人体红外PIR传感器)、按键等。
-
控制层:
- 功能: 系统的“大脑”,负责数据处理、逻辑判断和发出控制指令。
- 组件: STM32F103C8T6 (核心微控制器)、继电器模块 (控制强电设备)、LED (状态指示)。
-
网络层:
(图片来源网络,侵删)- 功能: 负责将STM32采集到的数据上传到服务器,并接收来自应用层的控制指令。
- 组件: ESP8266 WiFi模块 (通过UART与STM32通信)。
-
应用层:
- 功能: 用户与系统交互的界面。
- 组件: 手机APP (如Blynk、MIT App Inventor)、Web网页 (通过ESP8266创建一个简单的服务器)、物理按键 (本地手动控制)。
系统数据流:
传感器 -> STM32 (处理数据) -> ESP8266 (打包数据, 通过WiFi发送) -> 互联网 -> 服务器/云平台 -> 手机APP/Web -> 互联网 -> ESP8266 (接收指令) -> STM32 (解析指令) -> 继电器/LED (执行动作)
硬件选型与连接
核心硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 微控制器 | STM32F103C8T6 "Blue Pill" | 1 | 核心控制单元 |
| WiFi模块 | ESP8266-01S | 1 | 负责网络通信 |
| 温湿度传感器 | DHT11 | 1 | 低成本,满足基本需求 |
| 光照传感器 | BH1750 | 1 | I2C通信,精度高 |
| 人体红外传感器 | HC-SR501 | 1 | 检测是否有人移动 |
| 继电器模块 | 2路或4路 5V继电器 | 1 | 控制灯、风扇等220V设备 |
| LED | 5mm普通LED | 1 | 系统状态指示 |
| 按键 | 轻触开关 | 1 | 手动触发或模式切换 |
| 电阻 | 10kΩ (上拉), 330Ω (限流) | 各1 | 按键上拉,LED限流 |
| 开发板 | STM32F103C8T6底板 | 1 | (可选) 带有ST-Link下载和USB转串口 |
硬件连接方案
STM32 与 传感器/外设 的连接:
- DHT11:
- VCC -> 3.3V
- GND -> GND
- DATA -> PA1 (任意GPIO,配置为输入)
- BH1750:
- VCC -> 3.3V
- GND -> GND
- SCL -> PB6 (I2C1_SCL)
- SDA -> PB7 (I2C1_SDA)
- HC-SR501:
- VCC -> 5V
- GND -> GND
- OUT -> PA2 (任意GPIO,配置为外部中断输入)
- 继电器模块:
- VCC -> 5V (继电器线圈需要较大电流,最好单独供电)
- GND -> GND
- IN1 -> PA3 (控制第一个继电器)
- IN2 -> PA4 (控制第二个继电器)
- LED:
- 阳极 -> 330Ω电阻 -> PA5
- 阴极 -> GND
- 按键:
- 一端 -> PA0
- 另一端 -> GND
- PA0引脚配置为内部上拉输入模式。
STM32 与 ESP8266 的连接 (UART):

(图片来源网络,侵删)
这是关键连接,实现STM32与互联网的桥梁。
- ESP8266 TX -> STM32 PA10 (USART1_RX)
- ESP8266 RX -> STM32 PA9 (USART1_TX)
- ESP8266 CH_PD/EN -> 3V (使能模块)
- ESP8266 VCC -> 3V (注意:ESP8266工作电流较大,STM32板载3.3V可能带不动,建议使用外部5V转3.3V的LDO模块供电)
- ESP8266 GND -> GND
软件设计
开发环境
- IDE: STM32CubeIDE (官方推荐,集成了代码生成和调试功能)
- 固件库/ HAL: STM32CubeMX (用于初始化配置和生成HAL库代码)
软件架构
软件采用前后台系统的架构,简单且有效。
-
后台 (主循环
while(1)):- 调度各个功能模块。
- 处理从ESP8266接收到的指令。
- 更新设备状态。
-
前台 (中断服务ISR):
- 定时器中断: 用于周期性读取传感器数据(例如每2秒一次)。
- 外部中断: 用于检测按键按下或人体红外传感器触发。
- UART中断: 用于接收来自ESP8266的数据,不阻塞主循环。
功能模块设计
a) 传感器数据采集模块
- DHT11: 使用单总线协议,编写时序函数读取温湿度,注意DHT11较慢,读取间隔需大于1秒。
- BH1750: 使用I2C协议,初始化后,发送连续测量命令,然后读取2字节的测量结果。
- HC-SR501: 直接读取其GPIO引脚的电平,高电平表示检测到人体。
b) 执行器控制模块
- 继电器控制: 通过STM32的GPIO输出高低电平来控制继电器的吸合与断开,从而控制220V设备的开关。注意:强电操作,务必注意安全!
- LED控制: GPIO输出高低电平控制LED亮灭。
c) 通信协议设计
为了STM32和ESP8266之间能高效通信,需要定义一个简单的应用层协议。
数据格式: AT+CMD=<命令>,<参数1>,<参数2>\r\n
示例:
- STM32发送传感器数据给ESP8266:
AT+DATA=TEMP,25.5,HUMI,60.0,LIGHT,800\r\n - ESP8266接收手机APP指令,转发给STM32:
AT+CMD=RELAY1,ON\r\n或AT+CMD=RELAY2,OFF\r\n
d) 主逻辑流程
- 系统初始化: CubeMX配置时钟、GPIO、UART、I2C、TIM、EXTI等。
- ESP8266初始化: 发送AT指令配置ESP8266为Station模式,连接到WiFi,并连接到MQTT服务器或TCP服务器。
- 主循环:
- 检查UART接收缓冲区,是否有来自ESP8266的完整指令,如果有,解析并执行相应操作(如打开继电器)。
- 检查是否有定时器中断标志,如果有,清除标志,执行传感器数据采集任务。
- 根据采集到的数据和预设规则,执行自动化逻辑(如果温度>28°C且时间是白天,则打开风扇)。
- 将处理后的数据打包,通过UART发送给ESP8266,让其上传到服务器。
