设计背景与意义
随着物联网和嵌入式技术的普及,智能家居正从简单的远程控制向环境感知与自主决策演进。当前市面上的产品多为分立模块,缺乏整体化的环境监测与多条件联动能力,且扩展性较差。本系统旨在解决上述问题,通过数据驱动控制逻辑,实现从'被动控制'到'主动管理'的转变。
硬件功能与选型
系统以 STM32F103C8T6 为核心,集成多种传感器与执行机构,支持本地 OLED 显示及机智云平台远程监控。
核心功能
- 传感器检测:涵盖烟雾、空气质量、一氧化碳、温湿度及光照强度。
- 数据显示:采用 0.96 寸 OLED 屏幕实时反馈数据。
- 执行控制:步进电机模拟窗户/风扇开关,声光报警提示异常。
- 联网通信:ESP8266 WiFi 模块接入云端,支持 App 远程操控与阈值设定。
- 双模式运行:支持手动(App 控制)与自动(阈值触发)两种工作模式。
元器件清单
- 主控:STM32F103C8T6
- 显示:0.96 OLED 屏幕
- 通信:ESP8266 WiFi 模块
- 传感器:DHT11(温湿度)、MQ-2(烟雾)、MQ-7(一氧化碳)、MQ-135(空气质量)、光敏电阻
- 外设:风扇、步进电机、蜂鸣器声光报警
系统架构与实物展示
主框图展示了各模块间的连接关系,软件流程图则体现了数据采集与状态判断的逻辑闭环。


PCB 设计兼顾了信号完整性与布局合理性,实际焊接效果如下:


软件程序设计
程序主要包含初始化、数据采集、WiFi 协议处理及用户交互逻辑。在代码实现上,我们采用了模块化设计,将传感器驱动与业务逻辑分离,便于维护与移植。
以下是核心代码实现,重点展示了阈值判断与设备联动逻辑:
u32 STM32_xx0 = 0X4E4C4A; u32 STM32_xx1 = 0X364B1322; u32 STM32_xx2 = 0X132D13;
u8 buff[];
u8 count;
dataPoint_t currentDataPoint;
u8 wifi_sta;
u8 mode = ;
u8 NTP_sta = ;
u8 display_contrl = ;
u8 curtain_flag = ;
u8 last_curtain_flag = ;
u8 DHT11_Temp, DHT11_Hum;
u16 Pre;
u16 gz_value;
u16 m2_value;
u16 m7_value;
u16 m135_value;
u16 A_DHT11_Temp = ;
u16 A_DHT11_Hum = ;
u16 A_pre = ;
u16 A_gz_value = ;
u16 A_m2_value = ;
u16 A_m7_value = ;
u16 A_m135_value = ;
{
TIM3_Int_Init(, );
usart3_init();
((*)¤tDataPoint, , (dataPoint_t));
gizwitsInit();
}
{
currentDataPoint.valueLED = !LED0;
currentDataPoint.valueCurtain = curtain_flag;
currentDataPoint.valueTemp = DHT11_Temp;
currentDataPoint.valueHum = DHT11_Hum;
currentDataPoint.valuePre = Pre;
currentDataPoint.valueGZ_Value = gz_value;
currentDataPoint.valueMQ2_Value = m2_value;
currentDataPoint.valueMQ7_Value = m7_value;
currentDataPoint.valueMQ135_Value = m135_value;
}
{
u8 t = ;
key_value;
uart_init();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Adc1_Channe_Init();
KEY_Init();
bmp280Init();
(DHT11_Init());
LED_Init();
OLED_Init();
OLED_Clear();
Gizwits_Init();
BEEP = ;
() {
Get_Data();
(gz_value <= A_gz_value && mode == ) {
LED0 = ; curtain_flag = ;
} (gz_value > A_gz_value && mode == ) {
LED0 = ; curtain_flag = ;
}
(last_curtain_flag != curtain_flag && mode == ) {
BUJING_Cotrol(curtain_flag, , );
last_curtain_flag = curtain_flag;
}
(last_curtain_flag != currentDataPoint.valueCurtain && mode == ) {
BUJING_Cotrol(currentDataPoint.valueCurtain, , );
curtain_flag = currentDataPoint.valueCurtain;
last_curtain_flag = currentDataPoint.valueCurtain;
}
(mode == ) {
LED0 = !currentDataPoint.valueLED;
}
(DHT11_Temp >= A_DHT11_Temp || DHT11_Hum <= A_DHT11_Hum || Pre >= A_pre ||
m135_value <= A_m135_value || m2_value >= A_m2_value || m7_value >= A_m7_value) {
} {
BEEP = ;
}
key_value = KEY_Scan();
(key_value == ) { display_contrl++; }
(display_contrl % == && t >= ) {
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , DHT11_Temp); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , DHT11_Hum); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , Pre); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , gz_value); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
} (display_contrl % == && t >= ) {
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , m2_value); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , m7_value); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
((*)buff, , gz_value); OLED_ShowString(, , buff, );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , ); OLED_ShowCHinese(, , );
}
(t > ) {
(m135_value > ) {
OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , );
BEEP = !BEEP;
} {
OLED_ShowCHinese(, , );
OLED_ShowCHinese(, , );
BEEP = ;
}
}
userHandle();
WIFI_Contection(key_value);
gizwitsHandle((dataPoint_t *)¤tDataPoint);
Canshu_Change(key_value);
t++;
delay_ms();
}
}
{
(key == ) {
();
gizwitsSetMode(WIFI_AIRLINK_MODE);
}
(key == ) {
();
gizwitsSetMode(WIFI_RESET_MODE);
}
}
{
u8 obj = ;
(key == ) {
BEEP = ; OLED_Clear();
() {
key = KEY_Scan();
(key == ) {
obj++;
(obj >= ) obj = ;
}
(( *)buff, , mode); OLED_ShowString(, , buff, );
(( *)buff, , A_DHT11_Temp); OLED_ShowString(, , buff, );
(( *)buff, , A_DHT11_Hum); OLED_ShowString(, , buff, );
(( *)buff, , A_pre); OLED_ShowString(, , buff, );
(( *)buff, , A_gz_value); OLED_ShowString(, , buff, );
(( *)buff, , A_m2_value); OLED_ShowString(, , buff, );
(( *)buff, , A_m7_value); OLED_ShowString(, , buff, );
(( *)buff, , A_m135_value); OLED_ShowString(, , buff, );
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { OLED_ShowString(, , , ); }
(obj == ) { (key == ) A_DHT11_Temp += ; (key == ) A_DHT11_Temp -= ; }
(obj == ) { (key == ) A_DHT11_Hum += ; (key == ) A_DHT11_Hum -= ; }
(obj == ) { (key == ) A_pre += ; (key == ) A_pre -= ; }
(obj == ) { (key == ) A_gz_value += ; (key == ) A_gz_value -= ; }
(obj == ) { (key == ) A_m2_value += ; (key == ) A_m2_value -= ; }
(obj == ) { (key == ) A_m7_value += ; (key == ) A_m7_value -= ; }
(obj == ) { (key == ) A_m135_value += ; (key == ) A_m135_value -= ; }
(obj == ) { (key == ) mode += ; (key == ) mode -= ; (mode >= ) mode = ; }
(key == ) { OLED_Clear(); ; }
}
}
}
{
bmp280_press, bmp280;
DHT11_Read_Data(&DHT11_Temp, &DHT11_Hum);
bmp280GetData(&bmp280_press, &bmp280, &bmp280);
Pre = bmp280_press;
gz_value = - get_Adc_Value();
m2_value = get_Adc_Value();
m7_value = get_Adc_Value();
m135_value = - get_Adc_Value();
}
{
(mode == ) {
(count--) {
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
}
}
(mode == ) {
(count--) {
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
BUJ1 = ; BUJ2 = ; BUJ3 = ; BUJ4 = ; delay_ms(time);
}
}
}


