基于32单片机的智能家居系统设计(STM32F103C8T6实现)
本设计以STM32F103C8T6为主控,集成多传感器采集、设备控制、无线通信、人机交互与安全报警功能,实现环境监测、智能控制、远程管理一体化的智能家居系统
一、系统概述
本设计以STM32F103C8T6为主控,集成多传感器采集、设备控制、无线通信、人机交互与安全报警功能,实现环境监测、智能控制、远程管理一体化的智能家居系统。系统支持温湿度、光照、空气质量等参数监测,灯光、窗帘、空调等设备控制,通过Wi-Fi/蓝牙与手机APP交互,具备低功耗、高可靠性、易扩展特点,适用于家庭、办公室等场景。
二、系统架构与硬件设计
1. 系统架构
2. 核心硬件选型
| 模块 | 型号/参数 | 功能 |
|---|---|---|
| 主控 | STM32F103C8T6(72MHz,64KB Flash,20KB RAM) | 传感器采集、设备控制、通信协议处理 |
| 温湿度 | DHT11(单总线,±2℃/±5%RH) | 监测环境温湿度 |
| 光照 | BH1750(I2C,0-65535 lx) | 监测光照强度,自动调节灯光 |
| 空气质量 | MQ-2(模拟输出,可燃气体检测) | 检测天然气、液化气泄漏 |
| 烟雾 | MQ-135(模拟输出,烟雾检测) | 检测烟雾浓度,火灾预警 |
| 执行器 | 继电器(灯光控制)、SG90舵机(窗帘)、红外发射管(空调) | 控制灯光、窗帘、空调开关/模式 |
| 通信 | ESP8266-01S(Wi-Fi,UART) | 连接云平台,与手机APP通信(MQTT协议) |
| 显示 | 0.96寸OLED(SSD1306,I2C,128×64) | 显示环境参数、设备状态、时间 |
| 报警 | 有源蜂鸣器+红色LED | 异常时声光报警(烟雾/燃气/入侵) |
| 电源 | 5V/2A适配器+AMS1117-3.3V | 系统供电(主控/传感器3.3V,执行器5V) |
3. 关键电路设计
(1)传感器接口
-
DHT11(温湿度):数据脚接STM32的PA0(单总线,需4.7kΩ上拉电阻);
-
BH1750(光照):SCL=PB6,SDA=PB7(I2C1);
-
MQ-2/MQ-135(气体):模拟输出接STM32的PA1/PA2(ADC1通道1/2)。
(2)执行器接口
-
继电器(灯光):控制脚接PB0(GPIO输出,高电平吸合);
-
SG90舵机(窗帘):信号脚接PB1(PWM输出,20ms周期,0.5-2.5ms脉宽);
-
红外发射管(空调):通过PA3(PWM输出38kHz载波)驱动,模拟空调遥控器。
(3)通信接口
- ESP8266(Wi-Fi):TX=PA9(USART1_RX),RX=PA10(USART1_TX),波特率115200bps,VCC=3.3V(需加100μF电容滤波)。
三、软件设计(C语言实现)
1. 开发环境
-
IDE:STM32CubeIDE(V1.13.0)
-
库:STM32 HAL库(V1.11.0)、FreeRTOS(多任务调度)、MQTT客户端(paho.mqtt.embedded-c)
-
协议:MQTT(与云平台通信)、AT指令(ESP8266配置)、单总线(DHT11)
2. 主程序流程(FreeRTOS多任务)
#include "stm32f1xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
#include "dht11.h"
#include "bh1750.h"
#include "mq2.h"
#include "esp8266.h"
#include "oled.h"
#include "servo.h"
#include "relay.h"
// 系统状态
typedef struct {
float temp; // 温度(℃)
float humi; // 湿度(%RH)
uint16_t light; // 光照(lx)
uint16_t mq2_val; // 燃气浓度(ppm)
uint16_t mq135_val; // 烟雾浓度(ppm)
uint8_t light_status;// 灯光状态(0:关,1:开)
uint8_t curtain_status;// 窗帘状态(0:关,1:开)
} SystemState;
int main(void) {
HAL_Init();
SystemClock_Config(); // 72MHz主频
MX_GPIO_Init(); // GPIO初始化
MX_I2C1_Init(); // I2C1(BH1750、OLED)
MX_USART1_Init(); // USART1(ESP8266)
MX_ADC1_Init(); // ADC1(MQ-2、MQ-135)
MX_TIM2_Init(); // TIM2(舵机PWM)
// 创建FreeRTOS任务
xTaskCreate(Task_Sensor, "Sensor", 128, NULL, 3, NULL); // 传感器采集(优先级3)
xTaskCreate(Task_Control, "Control", 128, NULL, 2, NULL); // 设备控制(优先级2)
xTaskCreate(Task_Comm, "Comm", 256, NULL, 4, NULL); // 通信(优先级4)
xTaskCreate(Task_Display, "Display", 128, NULL, 1, NULL); // 显示(优先级1)
vTaskStartScheduler(); // 启动调度器
while (1);
}
3. 关键模块实现
(1)传感器数据采集(Task_Sensor)
void Task_Sensor(void *pvParameters) {
SystemState sys_state = {0};
DHT11_Data dht_data;
uint16_t bh1750_data[2];
while (1) {
// 1. 温湿度(DHT11,1秒1次)
if (DHT11_Read(&dht_data) == HAL_OK) {
sys_state.temp = dht_data.temp;
sys_state.humi = dht_data.humi;
}
// 2. 光照(BH1750,1秒1次)
BH1750_ReadLight(&bh1750_data[0]); // 连续高分辨率模式
sys_state.light = bh1750_data[0];
// 3. 燃气/烟雾(MQ-2/MQ-135,ADC采样,1秒1次)
sys_state.mq2_val = MQ2_Read();
sys_state.mq135_val = MQ135_Read();
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒周期
}
}
(2)设备控制(Task_Control)
void Task_Control(void *pvParameters) {
SystemState *sys_state = get_sys_state(); // 获取系统状态(全局变量)
while (1) {
// 1. 灯光控制(光照<50lx自动开灯)
if (sys_state->light < 50 && !sys_state->light_status) {
Relay_On(); // 开灯
sys_state->light_status = 1;
} else if (sys_state->light > 200 && sys_state->light_status) {
Relay_Off(); // 关灯
sys_state->light_status = 0;
}
// 2. 窗帘控制(时间控制:早8点开,晚8点关)
if (get_current_hour() == 8 && !sys_state->curtain_status) {
Servo_SetAngle(90); // 开帘(90°)
sys_state->curtain_status = 1;
} else if (get_current_hour() == 20 && sys_state->curtain_status) {
Servo_SetAngle(0); // 关帘(0°)
sys_state->curtain_status = 0;
}
// 3. 报警(燃气>1000ppm或烟雾>500ppm)
if (sys_state->mq2_val > 1000 || sys_state->mq135_val > 500) {
Buzzer_On();
LED_On();
} else {
Buzzer_Off();
LED_Off();
}
vTaskDelay(pdMS_TO_TICKS(500)); // 500ms周期
}
}
(3)Wi-Fi通信(Task_Comm,MQTT协议)
void Task_Comm(void *pvParameters) {
SystemState *sys_state = get_sys_state();
char mqtt_msg[128];
// 1. 初始化ESP8266(连接Wi-Fi)
ESP8266_Init("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n", 5000); // 替换为Wi-Fi账号密码
ESP8266_ConnectMQTT("mqtt.aliyun.com", 1883, "client_id", "username", "password"); // 阿里云MQTT参数
while (1) {
// 2. 发布环境数据(主题:/home/sensor)
sprintf(mqtt_msg, "{\"temp\":%.1f,\"humi\":%.1f,\"light\":%d,\"mq2\":%d,\"mq135\":%d}",
sys_state->temp, sys_state->humi, sys_state->light, sys_state->mq2_val, sys_state->mq135_val);
ESP8266_Publish("/home/sensor", mqtt_msg);
// 3. 订阅控制指令(主题:/home/control)
char *cmd = ESP8266_Subscribe("/home/control");
if (cmd != NULL) {
if (strstr(cmd, "\"light\":1")) Relay_On();
else if (strstr(cmd, "\"light\":0")) Relay_Off();
free(cmd);
}
vTaskDelay(pdMS_TO_TICKS(2000)); // 2秒周期
}
}
(4)OLED显示(Task_Display)
void Task_Display(void *pvParameters) {
SystemState *sys_state = get_sys_state();
char disp_buf[16];
OLED_Init(); // 初始化OLED
while (1) {
OLED_Clear();
// 第1行:温湿度
sprintf(disp_buf, "T:%.1fC H:%.1f%%", sys_state->temp, sys_state->humi);
OLED_ShowString(0, 0, disp_buf);
// 第2行:光照
sprintf(disp_buf, "Light:%d lx", sys_state->light);
OLED_ShowString(0, 2, disp_buf);
// 第3行:燃气/烟雾
sprintf(disp_buf, "MQ2:%d MQ135:%d", sys_state->mq2_val, sys_state->mq135_val);
OLED_ShowString(0, 4, disp_buf);
// 第4行:设备状态
sprintf(disp_buf, "Light:%d Curtain:%d", sys_state->light_status, sys_state->curtain_status);
OLED_ShowString(0, 6, disp_buf);
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒刷新
}
}
参考代码 32单片机智能家居系统设计 www.youwenfan.com/contentcss/160990.html
四、手机APP设计(Android示例)
1. 功能
-
实时监测:显示温湿度、光照、燃气/烟雾浓度;
-
设备控制:手动开关灯光、窗帘、空调;
-
报警推送:异常时接收推送通知(如燃气泄漏);
-
历史数据:查看近7天环境参数曲线。
2. 通信协议
-
数据格式:JSON(与STM32通过MQTT交互);
-
主题:
-
发布(STM32→APP):
/home/sensor(环境数据); -
订阅(APP→STM32):
/home/control(控制指令)。
3. 核心代码片段(Android Java)
// MQTT连接与数据接收
MqttAndroidClient client = new MqttAndroidClient(context, "tcp://mqtt.aliyun.com:1883", "android_client");
client.setCallback(new MqttCallback() {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
if (topic.equals("/home/sensor")) {
JSONObject data = new JSONObject(new String(message.getPayload()));
float temp = data.getFloat("temp");
float humi = data.getFloat("humi");
// 更新UI显示
runOnUiThread(() -> tvTemp.setText("温度:" + temp + "℃"));
}
}
});
// 发送控制指令(开灯)
String cmd = "{\"light\":1}";
client.publish("/home/control", new MqttMessage(cmd.getBytes()));
五、系统测试与优化
1. 测试指标
| 参数 | 指标 | 测试方法 |
|---|---|---|
| 温湿度精度 | ±1℃/±3%RH(DHT11) | 对比标准温湿度计 |
| 光照测量范围 | 0-65535 lx(BH1750) | 用照度计测试不同光照环境 |
| 燃气检测灵敏度 | 300-10000 ppm(MQ-2) | 通入标准燃气,记录浓度-电压曲线 |
| 通信距离 | ≥10米(Wi-Fi,空旷) | 手机与设备距离测试 |
| 续航时间 | ≥24小时(5V/2000mAh电池) | 连续工作电流测试(平均50mA) |
2. 优化方向
-
低功耗:STM32空闲时进入Stop模式(电流<10μA),传感器/执行器分时唤醒;
-
抗干扰:传感器信号加软件滤波(如中值滤波),通信数据加CRC校验;
-
扩展性:预留Zigbee接口(如CC2530),支持更多设备接入;
-
安全性:MQTT通信启用TLS加密,设备认证采用动态令牌。
六、总结
本设计基于STM32F103C8T6实现了低成本、高集成度的智能家居系统,通过多传感器融合实现环境智能感知,FreeRTOS多任务确保实时控制,Wi-Fi+MQTT实现远程管理,具备易开发、易扩展、低功耗特点。系统可进一步集成语音控制(如LD3320)、视频监控(如OV2640) 等功能,满足更复杂的智能家居需求。
更多推荐
所有评论(0)