单片机智能家居系统设计方案
项目概述
1 项目目标 设计并实现一个基于单片机的智能家居系统原型,该系统应具备以下核心功能:

(图片来源网络,侵删)
- 环境监测: 实时采集并显示室内温度、湿度、光照强度。
- 智能控制: 能够根据环境数据或用户指令,自动控制继电器模块(模拟灯光、风扇等)的开关。
- 用户交互: 通过按键或手机APP进行手动控制,并实时查看系统状态。
- 网络通信(可选): 实现与互联网的连接,实现远程监控和控制。
- 低功耗设计(可选): 在非活动状态下进入低功耗模式,以延长电池供电设备的续航时间。
2 设计原则
- 模块化: 硬件和软件设计均采用模块化思想,便于功能扩展和系统维护。
- 高性价比: 在满足功能需求的前提下,选择性价比最高的元器件。
- 可靠性: 确保系统在长时间运行下的稳定性和抗干扰能力。
- 易用性: 用户界面(APP或OLED)直观友好,操作简单。
方案论证与核心选型
1 主控制器选型 主控制器是系统的“大脑”,选择至关重要。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| STM32系列 (如STM32F103) | 性能强大,资源丰富(GPIO, ADC, UART, I2C, SPI),社区支持好,性价比高。 | 相对51单片机学习曲线稍陡。 | 推荐方案,功能复杂、需要处理多种外设和通信协议的首选。 |
| ESP32系列 | 双核处理器,自带Wi-Fi和蓝牙,性能强大,可直接连接网络,性价比极高。 | 功耗相对较高(除非使用低功耗模式)。 | 强烈推荐方案,如果需要网络功能,ESP32是“一站式”解决方案,无需额外添加通信模块。 |
| Arduino (如UNO/Nano) | 社区庞大,编程简单,上手快,适合快速原型验证。 | 性能和资源有限,不适合处理复杂任务。 | 学习和入门首选,不适合作为最终产品的主控。 |
- 不要求网络功能: 选择 STM32F103C8T6 (俗称“蓝丸”),性价比之王。
- 要求网络功能: 首选ESP32,它集成了所有必要的功能,极大简化了硬件设计和软件开发。
2 传感器选型
| 传感器 | 常用型号 | 接口 | 特点 |
|---|---|---|---|
| 温湿度传感器 | DHT11 / DHT22 / SHT30 | 单总线 / I2C | DHT11最便宜,精度一般;DHT22/SHT30精度更高,推荐使用。 |
| 光照传感器 | BH1750 | I2C | 数字输出,精度高,使用方便。 |
| 人体红外传感器 | HC-SR501 | GPIO | 模拟人体移动,用于自动感应(如人来灯亮)。 |
- 温湿度: SHT30 (I2C接口,稳定可靠)。
- 光照: BH1750 (I2C接口,精度高)。
- 人体感应: HC-SR501 (经典实用)。
3 执行器选型

(图片来源网络,侵删)
| 执行器 | 常用型号 | 接口 | 特点 |
|---|---|---|---|
| 继电器模块 | 5V单路/多路继电器模块 | GPIO | 可控制220V交流设备(如灯、风扇),注意安全隔离。 |
| LED指示灯 | - | GPIO | 用于状态指示,如网络连接、设备工作状态。 |
- 继电器模块: 选择带有光耦隔离的模块,安全性更高。
4 通信模块选型 (如果主控不带网络)
- Wi-Fi模块: ESP-01S (基于ESP8266),通过UART与主控通信,实现TCP/IP连接。
- 以太网模块: W5500,通过SPI接口,适合有线网络环境。
如果使用STM32,ESP-01S 是性价比最高的Wi-Fi解决方案。
5 用户交互模块选型
| 模块 | 常用型号 | 接口 | 特点 |
|---|---|---|---|
| OLED显示屏 | 96寸 SSD1306 | I2C | 体积小,功耗低,可显示文字、图标,非常适合本地状态显示。 |
| 按键 | - | GPIO | 用于手动切换模式、设置阈值等。 |
| 蓝牙模块 | HC-05/HC-06 | UART | 用于与手机APP短距离通信。 |
- 本地显示: SSD1306 OLED (I2C)。
- 远程控制: 如果主控是ESP32,直接使用其内置蓝牙;如果主控是STM32,可外接 HC-05。
硬件系统设计
1 系统总体框图

(图片来源网络,侵删)
graph TD
subgraph "核心控制层"
MCU[主控制器<br/>(STM32 / ESP32)]
end
subgraph "感知层"
SHT30[温湿度传感器<br/>(SHT30)]
BH1750[光照传感器<br/>(BH1750)]
PIR[人体红外传感器<br/>(HC-SR501)]
end
subgraph "执行层"
Relay[继电器模块<br/>(控制灯光/风扇)]
LED[状态指示灯]
end
subgraph "交互层"
OLED[OLED显示屏<br/>(SSD1306)]
Button[按键]
end
subgraph "通信层 (可选)"
WiFi[Wi-Fi模块<br/>(ESP-01S / ESP32内置)]
BT[蓝牙模块<br/>(HC-05 / ESP32内置)]
end
MCU -- I2C --> SHT30
MCU -- I2C --> BH1750
MCU -- GPIO --> PIR
MCU -- GPIO --> Relay
MCU -- GPIO --> LED
MCU -- I2C --> OLED
MCU -- GPIO --> Button
MCU -- UART --> WiFi
MCU -- UART --> BT
style MCU fill:#f9f,stroke:#333,stroke-width:2px
2 核心电路连接 (以STM32F103为例)
| 外设 | STM32引脚 | 备注 |
|---|---|---|
| SHT30 (I2C) | SCL: PB6 SDA: PB7 |
使用STM32的硬件I2C |
| BH1750 (I2C) | SCL: PB6 SDA: PB7 |
可与SHT30共用I2C总线 |
| OLED (I2C) | SCL: PB6 SDA: PB7 |
可与SHT30、BH1750共用I2C总线 |
| HC-SR501 (PIR) | IN: PA0 | 检测到高电平表示有人 |
| 继电器模块 | IN: PA1 | 高电平触发 |
| 状态LED | LED: PC13 | STM32自带LED |
| 按键 | KEY: PA2 | 低电平触发,建议加一个10K上拉电阻 |
| ESP-01S (UART) | TX: PA9 RX: PA10 |
用于串口通信,注意交叉连接 |
| VCC/GND | 3V / 5V / GND | 注意各模块的工作电压,部分模块需要5V |
注意:
- I2C总线: 多个I2C设备可以并联到同一条SCL和SDA总线上,但每个设备必须有唯一的I2C地址,SHT30、BH1750和SSD1306地址不同,可以共用。
- 串口通信: STM32的TX连接ESP-01S的RX,STM32的RX连接ESP-01S的TX。
- 继电器安全: 继电器模块控制的是高压部分,务必做好物理隔离,防止触电!
软件系统设计
软件设计采用模块化思想,将不同功能封装成独立的函数或文件。
1 软件总体架构
main.c (主程序)
├── bsp_i2c.c (I2C驱动层)
├── bsp_uart.c (UART驱动层)
├── bsp_gpio.c (GPIO驱动层)
├── dht11.c / sht30.c (温湿度传感器驱动)
├── bh1750.c (光照传感器驱动)
├── oled.c (OLED显示驱动)
├── relay.c (继电器控制)
└── app.c (应用逻辑层)
├── sensor_task.c (传感器数据采集)
├── control_logic.c (核心控制逻辑)
├── ui_task.c (界面刷新)
└── network_task.c (网络通信,可选)
2 核心算法流程 (伪代码)
// main.c
void main() {
// 1. 硬件初始化
HAL_Init(); // HAL库初始化
SystemClock_Config(); // 配置系统时钟
bsp_gpio_init(); // 初始化GPIO
bsp_i2c_init(); // 初始化I2C
bsp_uart_init(); // 初始化UART
oled_init(); // 初始化OLED
relay_init(); // 初始化继电器
// 2. 变量定义
float temp, humidity;
int light_value;
int mode = AUTO_MODE; // 默认自动模式
int pir_state;
// 3. 主循环
while (1) {
// 任务1: 传感器数据采集 (可定时器触发)
read_sht30(&temp, &humidity);
read_bh1750(&light_value);
pir_state = read_pir();
// 任务2: 核心控制逻辑
if (mode == AUTO_MODE) {
// 自动模式逻辑
if (pir_state == 1 && light_value < 500) { // 天黑且有人
relay_on(); // 开灯
} else {
relay_off(); // 关灯
}
// 可以增加温度控制风扇的逻辑
if (temp > 28.0) {
relay_on(); // 开风扇
} else {
relay_off(); // 关风扇
}
} else if (mode == MANUAL_MODE) {
// 手动模式逻辑,根据按键或APP指令控制
// ...
}
// 任务3: UI更新 (节流,避免频繁刷新)
update_oled_display(temp, humidity, light_value, relay_state);
// 任务4: 网络通信 (可选)
// send_data_to_server(temp, humidity, light_value);
// 短暂延时,避免CPU空转
HAL_Delay(1000);
}
}
3 关键功能模块详解
- 传感器驱动:
- SHT30: 遵循其数据手册时序,通过I2C发送命令(如0x2400单次测量),然后读取2字节的温度和2字节的湿度数据,并进行CRC校验和转换。
- BH1750: 同样通过I2C,先发送连续测量模式命令(如0x23),然后读取2字节的光照强度值。
- OLED显示:
- 使用SSD1306的驱动库,通常提供
oled_show_string(x, y, "Hello")等函数。 - 在主循环中,将采集到的温湿度、光照值格式化成字符串,分页显示在OLED上。
- 使用SSD1306的驱动库,通常提供
- 控制逻辑:
- 这是系统的“灵魂”,设置规则:“当PIR传感器检测到有人 且 当前光照强度低于阈值 且 当前时间为晚上时,打开客厅灯”。
- 可以设计成有限状态机,处理不同的工作模式(自动、手动、定时、离家等)。
- 网络通信 (以ESP32连接MQTT为例):
- 连接Wi-Fi。
- 连接到MQTT Broker(如EMQ X, Mosquitto, 阿里云IoT平台)。
- 订阅 控制主题(如
home/living_room/light/control),当收到消息(如 "ON" 或 "OFF")时,解析并控制继电器。 - 发布 传感器数据主题(如
home/living_room/sensor/data),定时将JSON格式的数据({"temp":25.5, "hum":60.2})发布到服务器。
系统扩展与未来展望
一个完整的智能家居系统是不断演进的,本项目可以作为基础进行扩展。
-
增加更多传感器:
- 烟雾/燃气传感器 (MQ-2): 实现火灾和燃气泄漏报警。
- 门窗磁传感器: 监测门窗开关状态。
- PM2.5传感器: 监测空气质量。
-
增加更多执行器:
- 舵机/步进电机: 控制窗帘、百叶窗的开合。
- 蜂鸣器: 实现声音报警。
- RGB灯带: 实现氛围灯光控制。
-
引入更高级的控制逻辑:
- 场景模式: “回家模式”(开灯、开空调、开窗帘)、“离家模式”(关所有设备、启动安防)。
- 定时任务: 定时开关灯、定时浇水等。
- 学习与联动: 学习用户习惯,在每天固定时间自动开启空调。
-
云平台与大数据:
- 将数据上传到云平台(如阿里云IoT、腾讯云IoT、ThingsBoard),实现:
- 远程Web/APP控制: 不再局限于手机APP,可以通过网页在任何地方控制。
- 数据可视化: 用图表展示历史温湿度、用电量等数据。
- 智能分析与告警: 当数据异常时,通过短信或邮件发送告警。
- 将数据上传到云平台(如阿里云IoT、腾讯云IoT、ThingsBoard),实现:
-
语音控制:
- 集成 ESP32-S3 或 ESP32-A1S(带音频DAC),接入科大讯飞、阿里云等语音识别SDK,实现语音控制。
本设计方案提供了一个从零开始构建单片机智能家居系统的完整蓝图,从核心选型、硬件连接到软件架构,都给出了具体可行的建议。
- 对于初学者: 建议从 STM32 + SHT30 + BH1750 + OLED + 继电器 的基础版本开始,先实现本地环境监测和手动控制,再逐步加入自动逻辑。
- 对于进阶者: 直接使用 ESP32,一步到位实现网络功能,探索与云平台和语音控制的结合,打造一个功能强大的智能家居原型。
这个项目不仅涵盖了单片机开发的各个方面(GPIO, ADC, I2C, UART, 中断,定时器),还涉及了传感器技术、执行器控制、嵌入式网络通信等,是一个极佳的综合实践项目,祝您设计顺利!
