一、系统概述

本设计以STM32F103C8T6为主控,集成多传感器采集、设备控制、无线通信、人机交互与安全报警功能,实现环境监测、智能控制、远程管理一体化的智能家居系统。系统支持温湿度、光照、空气质量等参数监测,灯光、窗帘、空调等设备控制,通过Wi-Fi/蓝牙与手机APP交互,具备低功耗、高可靠性、易扩展特点,适用于家庭、办公室等场景。

二、系统架构与硬件设计

1. 系统架构

I2C/单总线

GPIO/PWM

UART

I2C

GPIO

MQTT/HTTP

JSON

按键输入

供电

供电

供电

供电

供电

供电

传感器层

STM32F103C8T6主控

执行器层 灯光/窗帘/空调

通信模块 ESP8266 Wi-Fi

显示模块 OLED

报警模块 蜂鸣器/LED

云平台 阿里云

手机APP/Web

电源管理 5V/3.3V

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) 等功能,满足更复杂的智能家居需求。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐