项目概述
核心思想: 以STM32微控制器作为主控核心,通过各类传感器采集家居环境数据(如温度、湿度、光照),通过执行器(如继电器、电机)控制家电设备,并利用无线通信模块(如Wi-Fi、蓝牙)将数据上传至云端或手机App,实现远程监控、自动化控制和智能联动。

(图片来源网络,侵删)
项目架构图:
核心模块解析
一个完整的STM32智能家居系统通常由以下几个部分组成:
主控制器
- 作用: 大脑,负责处理所有数据、执行逻辑、控制外设。
- 选型建议:
- 入门级: STM32F103C8T6 ("蓝丸"),性价比极高,资源足够(Flash 64KB, RAM 20KB),拥有丰富的外设(GPIO, UART, I2C, SPI, ADC等),社区支持庞大,是学习和项目的首选。
- 进阶级: STM32F407VGT6 / STM32F429IGT6,性能更强,主频更高,内存更大(SRAM 192KB+),适合运行更复杂的系统(如RTOS、轻量级Linux),并拥有LCD接口,可以方便地驱动显示屏。
- 低功耗级: STM32L4系列,如果项目对电池供电有要求(如无线传感器节点),L4系列的超低功耗特性是最佳选择。
传感器模块
用于感知环境状态。
- 温湿度传感器: DHT11 (低成本,精度一般), DHT22 (精度高), SHT30 (I2C接口,精度高)。
- 光照传感器: BH1750 (I2C接口,数字输出,方便)。
- 人体红外传感器: HC-SR501,用于检测是否有人移动,实现人来灯亮、人走灯灭。
- 烟雾/燃气传感器: MQ-2/MQ-7,用于安全监测。
- 其他可选: 土壤湿度传感器、门窗磁传感器等。
执行器模块
用于控制物理设备。

(图片来源网络,侵删)
- 继电器模块: 控制大功率电器(如灯泡、风扇、空调插座)。注意: 继电器是高压部件,务必做好隔离,确保低压控制端(STM32)和高压负载端电气隔离!
- LED灯: 用于状态指示或作为可控光源。
- 舵机/步进电机: 用于控制窗帘、百叶窗等需要精确角度控制的设备。
- 蜂鸣器: 用于报警提示。
通信模块
实现与外界的信息交互。
- Wi-Fi模块:
- ESP8266 (ESP-01/ESP-12E): 成本极低,功能强大,可以作为STM32的“Wi-Fi串口透传模块”,STM32通过UART发送AT指令控制ESP8266连接Wi-Fi、建立TCP连接或发送HTTP请求,这是最常见和最经济的方案。
- ESP32: 自带Wi-Fi和蓝牙,性能更强,甚至可以取代STM32作为主控,实现“单芯片”方案。
- 蓝牙模块: HC-05 / HC-06,适合短距离、点对点的控制,可以开发一个简单的手机App进行本地控制。
- 以太网模块: W5500,如果项目有有线网络环境,且对稳定性要求高,可以选择此方案。
- 其他可选: LoRa/NB-IoT (用于远距离、低功耗的广域网)。
电源模块
- 作用: 为整个系统提供稳定可靠的电力。
- 方案:
- USB供电: 最简单,适合原型开发。
- 5V/2A电源适配器: 适合固定安装的设备。
- 锂电池 + 充电管理模块: 适合便携或需要断电续用的场景。
软件架构
软件是项目的灵魂,可以分为以下几个层次:
底层驱动
直接操作STM32的寄存器或使用标准库/ HAL库来控制外设。
- GPIO: 控制继电器、LED的开关。
- UART: 与ESP8266等串口模块通信。
- I2C: 读取DHT22、BH1750等I2C传感器数据。
- ADC: 读取MQ-2等模拟传感器的值。
- TIM: 产生PWM波控制舵机转速/角度。
中间件
在驱动和应用之间提供抽象和功能服务。
- FreeRTOS: 强烈推荐!对于多任务系统(如:同时处理传感器数据、网络通信和用户输入),使用RTOS可以极大地简化逻辑,提高系统的实时性和稳定性,可以创建独立的任务:
SensorTask,NetworkTask,ControlTask。 - AT指令解析器: 如果使用ESP8266,需要编写一个库来封装和解析复杂的AT指令。
- JSON解析器: 在与云端通信时,数据通常以JSON格式传输,需要一个小型的JSON库(如
cJSON)来解析和生成数据。
应用逻辑
这是项目的核心算法和业务逻辑。
- 传感器数据读取与处理: 定时读取各传感器数据,并进行滤波、校准等处理。
- 设备控制逻辑: 根据预设规则(如:如果温度>28°C,则打开空调)或云端/App下发的指令来控制执行器。
- 自动化/联动规则: 实现更复杂的场景,如“回家模式”(同时开灯、开窗帘、开空调)、“安防模式”(检测到有人且在非正常时间则报警)。
- 状态机: 用于管理设备的不同工作状态。
具体实现步骤(以STM32 + ESP8266为例)
第一步:硬件搭建
- 连接主控和传感器:
- DHT22数据引脚 -> STM32的PAx (任意GPIO)
- BH1750 SCL/SDA引脚 -> STM32的I2C引脚 (如PB6/PB7)
- 连接主控和执行器:
- 继电器模块IN引脚 -> STM32的GPIO (如PCx),注意继电器模块通常是低电平触发。
- LED正极 -> 限流电阻 -> STM32的GPIO。
- 连接主控和通信模块:
- ESP8266的TXD -> STM32的RXD (UART1_RX)
- ESP8266的RXD -> STM32的TXD (UART1_TX)
- ESP8266的CH_PD/EN -> 3.3V
- ESP8266的VCC -> 3.3V
- ESP8266的GND -> GND
- 连接电源:
使用5V电源适配器,同时为STM32和继电器模块供电,注意,继电器模块通常需要5V供电,而ESP8266和STM32使用3.3V,需要做好电平转换或使用3.3V稳压模块。
第二步:软件开发 (基于STM32CubeIDE + HAL库)
-
创建项目与配置:
- 新建STM32项目,选择你的芯片型号(如STM32F103C8T6)。
- 使用图形化配置工具:
- SYS: 设置Debug模式为Serial Wire。
- RCC: 配置外部晶振(如果使用)。
- GPIO: 配置控制继电器、LED的引脚为
GPIO_Output。 - USART1: 配置UART,用于和ESP8266通信,设置波特率为
115200(ESP8266常用波特率)。 - I2C1: 配置I2C,用于连接BH1750等传感器。
- TIM: 配置定时器,用于周期性读取传感器数据。
- 生成代码。
-
编写驱动代码:
- DHT22驱动: 编写一个函数
DHT22_Read(),通过单总线协议读取温湿度数据。 - BH1750驱动: 编写一个函数
BH1750_Read(),通过I2C协议读取光照数据。 - ESP8266 AT指令驱动: 编写函数
ESP8266_SendATCommand()、ESP8266_ConnectWiFi()、ESP8266_ConnectTCP()等。
- DHT22驱动: 编写一个函数
-
实现应用逻辑:
- 在
main.c中,或在FreeRTOS的任务中:- 初始化所有外设。
- 启动一个定时器中断(或FreeRTOS软件定时器),周期性(如每5秒)执行以下操作:
- 调用
DHT22_Read()和BH1750_Read()获取数据。 - 将数据格式化为JSON字符串,
{"temp":25.6, "humid":60.2, "light":800}。 - 通过串口向ESP8266发送AT指令,将JSON数据上传到你的MQTT服务器或HTTP API。
- 调用
- 编写一个函数,用于接收来自云端/App的指令(通过TCP socket接收 "RELAY_ON" 或 "RELAY_OFF" 字符串)。
- 根据接收到的指令,控制相应的GPIO引脚,从而继电器开关。
- 在
第三步:云端与App对接
- 云端平台 (推荐MQTT):
- 选择平台: 阿里云IoT、腾讯云IoT、ThingsBoard、Blynk、EMQX等,国内推荐阿里云/腾讯云,有免费套餐且文档齐全。
- 配置: 在云平台上创建产品、设备,获取三元组(ProductKey, DeviceName, DeviceSecret)。
- STM32端: 使用ESP8266连接到云平台的MQTT Broker,并使用三元组进行身份认证,之后,就可以发布传感器数据到主题
设备名/data,并订阅控制指令主题设备名/control。
- 手机App开发:
- 使用Blynk、Tasmota等现成的IoT App框架,它们通常提供简单的可视化界面,只需配置一下即可。
- 使用MIT App Inventor(图形化编程,无需代码基础)或Android Studio/Flutter(专业开发)开发自己的App,App通过MQTT协议订阅云端数据,并发布控制指令。
进阶方向与挑战
- 引入RTOS: 当功能变多时,使用FreeRTOS进行任务管理,如创建独立的任务处理传感器、网络和UI,使代码结构更清晰。
- 本地联动: 在STM32上实现更复杂的本地逻辑,减少对云端的依赖,提高响应速度和可靠性,实现本地定时器、传感器阈值触发等。
- 语音控制: 集成语音识别模块(如LD3320)或对接云平台提供的语音服务(如天猫精灵、小爱同学),实现语音控制。
- 增加显示界面: 使用带TFT-LCD屏的STM32(如F4/F7系列),开发一个本地的人机交互界面,显示当前状态和进行本地设置。
- 网络安全: 如果涉及远程控制,务必重视网络安全,使用TLS/SSL加密通信,对设备进行身份验证,防止被非法控制。
- 低功耗优化: 对于电池供电的节点,可以配置STM32进入低功耗模式(如Stop模式),通过外部中断(如人体红外传感器触发)唤醒。
基于STM32的智能家居项目是一个绝佳的综合实践平台,它涵盖了从底层硬件驱动、实时操作系统到上层网络通信和云应用的全栈技术。
建议的学习路径:
- 点亮一个LED: 熟悉GPIO和开发环境。
- 读取一个传感器数据: 掌握I2C/UART等通信协议。
- 控制一个继电器: 学会用STM32驱动执行器。
- 通过串口助手控制继电器: 实现本地人机交互。
- 集成ESP8266,将数据发送到电脑串口: 掌握AT指令和无线通信基础。
- 将数据上传到阿里云/腾讯云,并用手机App查看和控制: 完成端到端的IoT项目。
祝你项目顺利,享受创造的乐趣!
