基于单片机的智能家居系统设计方案
系统概述
本项目旨在设计一个低成本、高可靠性和可扩展性的智能家居系统,该系统以STM32F103C8T6单片机作为核心控制器,通过各类传感器采集家居环境数据(如温湿度、光照强度),并控制执行器(如继电器、LED灯)实现自动化控制,用户可以通过OLED显示屏实时查看环境信息,并通过蓝牙模块(HC-05)与手机APP进行无线通信,实现远程监控和控制。

(图片来源网络,侵删)
核心目标:
- 环境感知: 实时监测室内温湿度、光照强度。
- 自动化控制: 根据环境数据自动控制家电(如风扇、灯光)。
- 人机交互: 通过本地OLED屏显示信息,通过手机APP进行远程操控。
- 系统扩展: 硬件和软件设计具备良好的可扩展性,方便未来增加更多功能。
系统总体设计
1 系统架构图
系统采用“感知层-控制层-应用层”的三层架构。
graph TD
subgraph 感知层
A[温湿度传感器 DHT11] --> D{STM32 主控};
B[光敏电阻/光照传感器 BH1750] --> D;
C[人体红外传感器 HC-SR501] --> D;
end
subgraph 控制层
D --> E[继电器模块 (控制灯、风扇)];
D --> F[蜂鸣器 (报警)];
D --> G[LED指示灯];
D <--> H[蓝牙模块 HC-05];
D <--> I[OLED显示屏];
end
subgraph 应用层
H --> J[智能手机APP];
I --> K[用户本地查看];
end
2 核心控制器选型
- 选择:STM32F103C8T6
- 理由:
- 高性能: 基于 ARM Cortex-M3 内核,主频高达 72MHz,计算能力强,足以处理多任务。
- 丰富外设: 集成多个 UART、I2C、SPI、ADC、TIMERS 等外设,方便连接各种传感器和模块。
- 高性价比: 价格低廉,社区支持庞大,资料丰富,是学习和项目开发的理想选择。
- 足够I/O口: 拥有足够多的GPIO引脚,为未来扩展预留了空间。
硬件设计
1 主要元器件清单
| 模块名称 | 型号/规格 | 数量 | 功能描述 |
|---|---|---|---|
| 主控板 | STM32F103C8T6 (或最小系统板) | 1 | 系统核心,负责数据处理和逻辑控制 |
| 温湿度传感器 | DHT11 | 1 | 采集环境温度和湿度 |
| 光照传感器 | BH1750 (I2C) 或 光敏电阻+ADC | 1 | 采集环境光照强度 |
| 人体红外传感器 | HC-SR501 | 1 | 检测是否有人体移动 |
| 继电器模块 | 5V单路/多路继电器 | 1 | 控制交流/直流大功率设备(如灯、风扇) |
| 蓝牙模块 | HC-05 | 1 | 实现与手机的无线串口通信 |
| 显示屏 | 96寸 OLED (I2C, SSD1306驱动) | 1 | 本地显示温湿度、光照等信息 |
| 蜂鸣器 | 无源/有源 5V | 1 | 用于报警或提示音 |
| LED灯 | 普通 5mm LED | 1 | 状态指示灯 |
| 面包板 & 杜邦线 | - | 1套 | 用于搭建和连接原型电路 |
2 硬件连接方案
以下是各模块与STM32的引脚连接示例(具体引脚可根据开发板实际布局调整):
| 模块 | STM32引脚 | 备注 |
|---|---|---|
| DHT11 | PA0 (GPIO) |
数据线,需接上拉电阻 |
| BH1750 (I2C) | PB6 (SCL) |
I2C时钟线 |
PB7 (SDA) |
I2C数据线 | |
| HC-SR501 | PA1 (GPIO) |
输出高/低电平信号 |
| 继电器 | PA2 (GPIO) |
控制继电器吸合/断开 |
| 蓝牙HC-05 | PA9 (USART1_TX) |
串口发送 |
PA10 (USART1_RX) |
串口接收 | |
| OLED显示屏 | PB6 (SCL) |
与BH1750共用I2C总线 |
PB7 (SDA) |
与BH1750共用I2C总线 | |
| 蜂鸣器 | PA3 (GPIO) |
高电平或PWM驱动 |
| LED | PA4 (GPIO) |
状态指示 |
注意:

(图片来源网络,侵删)
- I2C总线共享: BH1750和OLED都使用I2C通信,可以共享SCL和SDA线,但需注意总线上设备的地址不能冲突。
- 继电器模块: 继电器模块通常带有光耦隔离,控制端为5V TTL电平,可以直接由STM32的GPIO控制。
- 电源: 确保所有模块的供电电压和电流需求,必要时使用外部电源(如5V/2A适配器)为系统供电。
软件设计
1 开发环境
- IDE: Keil MDK (ARM) 或 STM32CubeIDE
- 编程语言: C语言
- 库/中间件: STM32 HAL库 (推荐) 或 标准库
- 调试工具: ST-Link/J-Link
2 软件架构设计
软件采用模块化设计,将不同功能封装成独立的模块,便于维护和扩展。
graph TD
subgraph 主函数 main.c
A[系统初始化] --> B[主循环 while(1)];
B --> C[传感器数据采集];
B --> D[逻辑判断与控制];
B --> E[OLED数据显示];
B --> F[蓝牙数据处理];
end
subgraph 驱动层
subgraph DHT11驱动
C1[DHT11_ReadData()];
end
subgraph BH1750驱动
C2[BH1750_ReadValue()];
end
subgraph HC-SR501驱动
C3[PIR_Read()];
end
subgraph 继电器/LED驱动
D1[Relay_SetState()];
D2[LED_SetState()];
end
subgraph 蓝牙驱动
F1[UART_SendString()];
F2[UART_ReceiveData()];
end
subgraph OLED驱动
E1[OLED_Init()];
E2[OLED_ShowString()];
E3[OLED_ShowNum()];
end
end
C --> C1;
C --> C2;
C --> C3;
D --> D1;
D --> D2;
F --> F1;
F --> F2;
E --> E1;
E --> E2;
E --> E3;
3 核心功能代码逻辑(伪代码)
// main.c
#include "stm32f1xx_hal.h"
#include "dht11.h"
#include "bh1750.h"
#include "oled.h"
#include "bluetooth.h"
#include "relay.h"
// 全局变量
float temperature, humidity;
uint16_t light_value;
uint8_t pir_state;
int main(void) {
// 1. 系统初始化
HAL_Init();
SystemClock_Config();
OLED_Init(); // 初始化OLED
UART_Init(); // 初始化蓝牙串口
DHT11_Init(); // 初始化DHT11
BH1750_Init(); // 初始化BH1750
PIR_Init(); // 初始化PIR
Relay_Init(); // 初始化继电器
// 2. 主循环
while (1) {
// 3. 数据采集
DHT11_ReadData(&temperature, &humidity);
light_value = BH1750_ReadValue();
pir_state = PIR_Read();
// 4. 自动化逻辑判断与控制
// 规则1: 如果温度 > 28°C 且有人,则打开风扇
if (temperature > 28.0 && pir_state == 1) {
Relay_SetState(RELAY_ON);
} else {
Relay_SetState(RELAY_OFF);
}
// 规则2: 如果光照强度 < 100 (暗) 且有人,则打开灯
if (light_value < 100 && pir_state == 1) {
LED_SetState(LED_ON);
} else {
LED_SetState(LED_OFF);
}
// 5. 本地数据显示
OLED_Clear();
OLED_ShowString(0, 0, "Temp: ");
OLED_ShowNum(50, 0, (int)temperature, 2);
OLED_ShowString(80, 0, "C");
OLED_ShowString(0, 2, "Humi: ");
OLED_ShowNum(50, 2, (int)humidity, 2);
OLED_ShowString(80, 2, "%");
OLED_ShowString(0, 4, "Light: ");
OLED_ShowNum(50, 4, light_value, 4);
OLED_ShowString(90, 4, "lx");
HAL_Delay(2000); // 刷新间隔
// 6. 蓝牙数据处理
if (UART_Data_Available()) {
uint8_t cmd = UART_ReadByte();
switch (cmd) {
case 'F': // Fan On
Relay_SetState(RELAY_ON);
break;
case 'f': // Fan Off
Relay_SetState(RELAY_OFF);
break;
case 'L': // Light On
LED_SetState(LED_ON);
break;
case 'l': // Light Off
LED_SetState(LED_OFF);
break;
case 'S': // Send Status
char buf[100];
sprintf(buf, "T:%.1f,H:%.1f,L:%d\n", temperature, humidity, light_value);
UART_SendString(buf);
break;
}
}
}
}
功能实现详解
-
环境监测:
- 温湿度: 通过DHT11的时序读取数据,STM32模拟单总线通信协议获取40位数据,校验后分解出温度和湿度值。
- 光照: 使用I2C协议读取BH1750传感器的数字值,无需复杂的AD转换,精度高。
-
自动化控制:
- “人来灯亮/扇开,人走灯灭/扇关”: 结合PIR传感器和温湿度/光照阈值,实现人来后自动开启设备,人走后延时关闭。
- 阈值控制: 设定温度、光照的上下限,当环境参数超出范围时,自动启动或关闭相应设备。
-
远程控制 (蓝牙APP):
(图片来源网络,侵删)- 通信协议: 定义简单的ASCII码命令,如 'F' 开风扇,'f' 关风扇,'S' 请求状态。
- 手机APP: 可以使用 Arduino Bluetooth Controller 或 Serial Bluetooth Terminal 等现成APP进行测试,也可以使用MIT App Inventor自己开发一个简单的图形化APP。
- 数据交互: APP发送指令给STM32,STM32执行相应操作;STM32也可以主动将环境数据打包发送给APP。
-
本地显示:
使用I2C接口的OLED屏,通过SSD1306驱动芯片,将采集到的温湿度、光照等数据格式化后显示在屏幕上,方便用户直接查看。
系统扩展与未来展望
本系统具有良好的扩展性,未来可以从以下几个方面进行升级:
-
增加更多传感器:
- 烟雾/燃气传感器 (MQ-2): 实现火灾和燃气泄漏报警。
- 门窗磁传感器: 监测门窗是否被非法打开。
- PM2.5传感器: 监测室内空气质量。
-
增加更多执行器:
- 舵机: 控制窗帘、百叶窗的开合。
- 步进电机: 实现更精确的机械控制。
- RGB LED灯: 实现颜色可调的氛围灯。
-
升级网络连接:
- Wi-Fi模块 (ESP8266): 将蓝牙替换为Wi-Fi,接入家庭局域网和互联网,这样就可以通过外网IP或云平台(如阿里云IoT、腾讯云IoT)进行远程控制,实现真正的智能家居。
- ZigBee/Z-Wave模块: 组建Mesh网络,实现低功耗、自组网的无线传感器网络,适合大面积、多节点的家居环境。
-
引入人工智能:
- 数据记录与分析: 记录长期的环境数据,分析用户习惯,实现更智能的自动化,学习”到用户通常晚上10点回家,则提前开启空调和灯光。
- 语音控制: 集成语音识别模块(如LD3320)或通过Wi-Fi模块连接云语音服务(如阿里云、讯飞开放平台),实现语音控制。
