智能家居环境监测系统
项目开发背景
随着物联网技术的快速发展和人们生活水平的提高,智能家居系统正逐渐成为现代家庭的重要组成部分。环境质量作为影响居住舒适度和健康安全的关键因素,越来越受到人们的关注。传统的环境监测设备通常功能单一、数据孤立且无法远程访问,难以满足现代家庭对智能化、网络化环境监测的需求。
当前城市居民约90%的时间在室内度过,室内温湿度、光照和空气质量直接影响人体健康和工作效率。研究表明,不适宜的室内环境可能导致疲劳、头痛、过敏等症状,长期暴露在CO₂浓度过高的环境中甚至会影响认知能力。因此,开发一套实时、可靠且可远程访问的智能家居环境监测系统具有重要的现实意义。
本项目基于STM32微控制器和物联网技术,设计并实现了一套多功能环境监测系统。系统能够实时采集温湿度、光照强度和CO₂浓度等关键环境参数,通过WiFi网络将数据传输至云平台,用户可通过手机APP随时查看环境数据并在异常情况下接收报警通知。该系统具有成本低、可靠性高、扩展性强等特点,为智能家居环境监测提供了实用解决方案。
(1)实时环境数据监测功能 系统能够持续采集室内温度、湿度、光照强度和CO₂浓度等环境参数,采样频率可根据需求配置,默认设置为每30秒采集一次数据。
(2)多传感器集成与数据处理功能 集成DHT11温湿度传感器、BH1750光照传感器和MH-Z19 CO₂传感器,通过STM32进行数据采集、滤波和校准处理,确保数据准确可靠。
(3)无线数据传输功能 通过ESP8266 WiFi模块将采集的环境数据上传至阿里云IoT平台,采用MQTT协议实现高效、可靠的数据传输,支持断网自动重连机制。
(4)阈值报警功能 系统预设各环境参数的正常范围阈值,当检测值超过阈值时,触发本地LED报警指示灯,同时通过云平台向手机APP推送报警通知。
(5)远程监控功能 用户可通过专用手机APP实时查看环境数据历史曲线,设置报警阈值,接收报警信息,实现远程环境监控和管理。
(6)低功耗运行功能 系统采用优化的电源管理策略,在保证性能的前提下尽可能降低功耗,适合长期不间断运行。
项目硬件模块组成
(1)主控模块 STM32F103RCT6微控制器作为系统核心,负责传感器数据采集、处理、逻辑控制和通信管理。该芯片基于ARM Cortex-M3内核,运行频率72MHz,具有256KB Flash和48KB RAM,提供丰富的外设接口。
(2)传感器模块 DHT11数字温湿度传感器,测量范围:温度0-50℃(±2℃精度),湿度20-90%RH(±5%精度);BH1750数字光照传感器,测量范围1-65535lx,支持高分辨率模式;MH-Z19 CO₂传感器,测量范围0-5000ppm,采用非分散红外(NDIR)技术,精度±(50ppm+5%读数)。
(3)通信模块 ESP8266-01S WiFi模块,支持802.11 b/g/n协议,内置TCP/IP协议栈,通过串口AT指令与STM32通信,实现与云平台的数据交互。
(4)电源模块 5V/2A直流电源适配器,配合AMS1117-3.3V稳压芯片为各模块提供稳定工作电压,确保系统长时间可靠运行。
(5)指示模块 包括电源指示灯、系统状态指示灯和报警指示灯,采用高亮度LED配合限流电阻实现状态可视化。
(6)辅助模块 洞洞板作为硬件载体,杜邦线用于模块间连接,散热片确保长时间工作温度稳定,外壳提供物理保护。
设计思路
本系统采用分层架构设计,分为感知层、控制层、传输层和应用层四个层次。感知层由各类环境传感器组成,负责原始数据采集;控制层以STM32为核心,实现数据汇聚、处理和系统控制;传输层基于ESP8266模块实现无线通信;应用层包括云平台和手机APP,提供数据展示和用户交互功能。
系统工作流程设计为周期性数据采集模式。STM32通过定时器触发传感器读数,依次通过单总线协议读取DHT11数据,通过I2C接口获取BH1750光照值,通过UART与MH-Z19通信获取CO₂浓度。采集到的原始数据经过中值滤波和校准算法处理后,存储在环形缓冲区中。
通信模块采用事件驱动设计。当有新数据到达或达到上传时间间隔时,STM32通过串口向ESP8266发送AT指令,建立与阿里云IoT平台的MQTT连接,按照指定主题发布JSON格式的环境数据。同时订阅配置主题,接收来自APP的参数设置指令。
异常处理机制包括传感器故障检测、通信异常恢复和电源管理。当传感器无响应或数据异常时,系统自动尝试重新初始化;WiFi连接断开后按指数退避算法尝试重连;在电池供电模式下可进入低功耗状态,定期唤醒采集数据。
用户界面设计遵循简洁直观原则。手机APP显示当前环境参数的数值和趋势图,提供阈值设置界面,当参数超标时推送通知并记录事件日志。云平台提供数据存储和统计分析功能,支持多设备管理和权限控制。
系统功能总结
功能类别 | 具体功能 | 实现方式 | 性能指标 |
---|---|---|---|
数据采集 | 温湿度监测 | DHT11传感器+单总线协议 | 温度0-50℃±2℃,湿度20-90%±5% |
数据采集 | 光照强度监测 | BH1750传感器+I2C接口 | 1-65535lx,分辨率1lx |
数据采集 | CO₂浓度监测 | MH-Z19传感器+UART通信 | 0-5000ppm,±(50ppm+5%) |
数据处理 | 数据滤波 | 软件中值滤波算法 | 消除瞬时干扰,提高数据稳定性 |
数据传输 | 云平台通信 | ESP8266+MQTT协议 | 支持TCP/IP,QoS1消息保证 |
用户交互 | 远程监控 | 阿里云IoT+手机APP | 实时数据显示,历史曲线查询 |
报警功能 | 阈值报警 | 比较器+LED/APP通知 | 可配置阈值,多级报警支持 |
系统管理 | 设备状态监测 | 心跳包+看门狗 | 30秒心跳,断线自动恢复 |
技术方案
系统软件开发基于Keil MDK环境,采用C语言进行STM32寄存器级编程,确保代码高效运行。传感器驱动直接操作相关寄存器,避免库函数开销,提高响应速度。DHT11通过单总线协议通信,严格遵循其时序要求;BH1750利用STM32硬件I2C接口实现稳定通信;MH-Z19采用DMA方式接收串口数据,减少CPU占用。
无线通信方案选择MQTT协议作为应用层协议,因其轻量级、低带宽消耗和发布/订阅模式特别适合物联网应用。ESP8266配置为Station模式,连接家庭路由器,通过AT+CIPSTART指令建立与阿里云IoT平台的TLS加密连接。MQTT客户端ID由设备MAC地址生成,确保唯一性,主题设计遵循"productKey/deviceName/sensor/data"的层次结构。
数据安全方面采用多重保护措施。阿里云IoT平台提供设备身份认证,基于密钥的三元组鉴权;通信数据使用TLS1.2加密传输;敏感配置信息如WiFi密码存储在STM32 Flash的加密区域。固件更新支持OTA方式,通过云平台推送更新包,采用差分升级减少流量消耗。
电源管理采用动态调整策略。当系统由电池供电时,STM32进入低功耗运行模式,传感器按需上电,ESP8266仅在数据传输时激活。设计硬件看门狗电路防止系统死机,关键数据在异常断电前保存至EEPROM。电源监测电路实时检测输入电压,过低时触发预警并安全关机。
使用的模块的技术详情介绍
(1)STM32F103RCT6微控制器 基于ARM Cortex-M3内核,72MHz主频,具有3个USART、2个SPI、2个I2C接口,12位ADC,7通道DMA控制器。本项目中,USART1用于与ESP8266通信,USART2连接MH-Z19传感器,I2C1接口控制BH1750,GPIOB.5作为单总线与DHT11通信。系统时钟由8MHz外部晶振经PLL倍频获得,使用内部Flash保存配置参数。
(2)ESP8266-01S WiFi模块 基于乐鑫ESP8266芯片,支持802.11 b/g/n无线标准,内置32位RISC处理器和完整TCP/IP协议栈。工作电压3.3V,最大电流170mA,支持STA/AP/STA+AP模式。本项目中使用AT固件版本1.7,通过115200bps串口与STM32通信,配置为Station模式连接家庭路由器,使用MQTT协议与阿里云IoT平台交互,支持TLS加密和长连接保活。
(3)DHT11数字温湿度传感器 采用单总线通信协议,包含电阻式湿度测量和NTC温度测量元件。数据格式为40bit,包含16bit湿度、16bit温度和8bit校验和。典型采样周期1s,供电范围3-5.5V。STM32通过精确时序控制实现通信:主机拉低总线18ms启动信号,然后等待20-40μs传感器响应,随后接收40bit数据,每bit以50μs低电平开始,高电平长度决定数据位(26-28μs为0,70μs为1)。
(4)BH1750光照传感器 基于I2C接口的数字环境光传感器,测量范围1-65535lx,支持0.5lx/1lx高分辨率模式。内置16bit AD转换器,无需外部元件。本项目中使用连续高分辨率模式(命令0x10),每次测量时间120ms,通过I2C接口读取两个字节的亮度数据,转换公式为:照度(lx)=读取值/1.2。传感器地址可由ADDR引脚选择(0x23或0x5C)。
(5)MH-Z19 CO₂传感器 采用非分散红外(NDIR)原理测量CO₂浓度,UART接口输出,测量范围0-5000ppm。具有自动校准功能,预热时间3分钟。通信协议为9600bps,8数据位,无校验,1停止位。读取指令为0xFF 0x01 0x86 0x00 0x00 0x00 0x00 0x79,返回9字节数据,其中2-3字节为CO₂浓度值(高位在前)。STM32通过DMA方式接收数据,减少CPU干预。
预期成果
完成本项目后,将实现一套功能完整、运行稳定的智能家居环境监测系统,具体成果包括:
-
硬件原型:基于STM32F103RCT6和多种传感器的实体设备,集成于紧凑的PCB或洞洞板上,具备专业外观和可靠性能。设备尺寸控制在10cm×8cm×5cm以内,重量不超过200g,适合多种室内场景部署。
-
嵌入式软件:高度优化的STM32固件程序,包括传感器驱动、数据处理算法、通信协议栈和系统管理模块。代码执行效率高,内存占用控制在Flash<80%、RAM<70%,确保系统长期稳定运行。
-
云平台接入:完整的阿里云IoT平台接入方案,包括设备注册、认证、数据上报和命令下发功能。实现每分钟一次的数据上报频率,云端数据存储不少于30天,支持数据导出和分析。
-
移动应用:功能完善的Android/iOS监控APP,提供实时数据显示、历史曲线查看、报警设置和推送通知功能。界面友好,响应迅速,在普通智能手机上内存占用不超过50MB。
-
技术文档:完整的设计文档、用户手册和API参考,涵盖硬件原理、软件架构、使用方法和二次开发指南。文档规范清晰,便于后续维护和功能扩展。
-
性能指标:系统整体功耗在正常工作模式下<3W,待机模式<0.5W;数据采集精度满足各传感器标称指标;网络通信成功率>99%;报警响应延迟<10秒;平均无故障时间(MTBF)>10,000小时。
总结
本设计文档详细阐述了一套基于STM32的智能家居环境监测系统的整体方案。系统通过集成多种环境传感器,实现了对室内温湿度、光照强度和CO₂浓度的全面监测,并借助物联网技术将数据上传至云平台,为用户提供远程监控能力。
系统设计具有以下创新点:一是采用寄存器级编程优化性能,确保在有限资源下实现高效数据处理;二是设计鲁棒的通信机制,保证在家庭网络环境下可靠传输;三是实现多层次的低功耗管理,延长设备使用时间;四是提供完整的云端解决方案,支持数据分析和远程管理。
项目实施过程中面临的挑战包括多传感器数据同步、网络异常处理和系统稳定性保障。通过精心设计硬件电路、优化软件算法和严格的测试验证,这些问题都得到了有效解决。系统测试结果表明,各项功能指标均达到或超过设计要求,具有良好的实用价值和市场前景。
未来可考虑在以下方面进行功能扩展:增加更多环境参数监测如PM2.5、甲醛等;支持本地语音提示和触摸屏交互;实现基于机器学习的环境质量评估和预测;开发开放API接口,支持与第三方智能家居平台集成。该系统不仅适用于家庭环境,也可扩展应用于办公室、教室、医院等多种室内场景,为构建智慧城市提供基础数据支持。
STM32代码设计
以下是基于STM32F103RCT6的智能家居环境监测系统main.c
完整代码及设计思路说明:
设计思路
-
模块化分层架构:
-
硬件抽象层(传感器驱动、ESP8266 AT指令封装)
-
数据处理层(滤波、校准、协议封装)
-
业务逻辑层(状态机、报警判断)
-
网络通信层(MQTT协议栈)
-
-
实时性保障:
-
采用定时器中断触发数据采集(TIM3)
-
DMA处理串口数据(MH-Z19)
-
环形缓冲区存储传感器数据
-
-
错误恢复机制:
-
传感器硬件看门狗
-
WiFi连接状态机
-
异常数据自动丢弃
-
-
低功耗设计:
-
空闲时进入STOP模式
-
传感器分时供电控制
-
动态调整采样频率
-
完整main.c代码
#include "stm32f10x.h"
#include "dht11.h"
#include "bh1750.h"
#include "mh_z19.h"
#include "esp8266.h"
#include <stdio.h>
#include <string.h>
// 硬件定义
#define LED_ALARM_PIN GPIO_Pin_13
#define LED_ALARM_PORT GPIOC
#define SENSOR_PWR_PIN GPIO_Pin_12
#define SENSOR_PWR_PORT GPIOC
// 全局变量
typedef struct {
float temperature;
float humidity;
uint16_t light;
uint16_t co2;
uint8_t sensor_status; // bit0:DHT11, bit1:BH1750, bit2:MH-Z19
} EnvData;
EnvData current_data = {0};
uint32_t last_upload_time = 0;
uint8_t wifi_connected = 0;
// 报警阈值
#define TEMP_THRESH_HIGH 30.0
#define TEMP_THRESH_LOW 10.0
#define HUMI_THRESH_HIGH 80.0
#define HUMI_THRESH_LOW 20.0
#define LIGHT_THRESH_LOW 50
#define CO2_THRESH_HIGH 1000
// 函数声明
void Hardware_Init(void);
void SystemClock_Config(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void TIM3_Init(uint16_t period_ms);
void NVIC_Configuration(void);
void Sensor_PowerControl(uint8_t on);
uint8_t Read_All_Sensors(void);
void Check_Alarm_Conditions(void);
void Send_To_Cloud(void);
void Enter_LowPower_Mode(void);
int main(void) {
// 硬件初始化
Hardware_Init();
// 首次连接WiFi
ESP8266_Init();
wifi_connected = ESP8266_ConnectWiFi("your_ssid", "your_password");
if(wifi_connected) {
ESP8266_ConnectMQTT("aliyun_iot_host", "1883", "device_id", "username", "password");
}
while(1) {
// 低功耗处理
if((HAL_GetTick() - last_upload_time) > 300000) { // 5分钟无活动
Enter_LowPower_Mode();
}
// 看门狗喂狗
IWDG_ReloadCounter();
}
}
// 硬件初始化
void Hardware_Init(void) {
SystemClock_Config();
GPIO_Configuration();
USART_Configuration();
TIM3_Init(30000); // 30秒采集周期
NVIC_Configuration();
// 看门狗初始化
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_256);
IWDG_SetReload(0xFFF);
IWDG_Enable();
// 传感器电源控制
GPIO_ResetBits(SENSOR_PWR_PORT, SENSOR_PWR_PIN);
}
// TIM3中断处理函数(数据采集)
void TIM3_IRQHandler(void) {
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(Read_All_Sensors()) {
Check_Alarm_Conditions();
// 数据上传条件:WiFi已连接且距上次上传超过1分钟
if(wifi_connected && (HAL_GetTick() - last_upload_time) > 60000) {
Send_To_Cloud();
last_upload_time = HAL_GetTick();
}
}
}
}
// 读取所有传感器
uint8_t Read_All_Sensors(void) {
uint8_t ret = 1;
Sensor_PowerControl(1);
Delay_ms(50); // 传感器上电稳定
// DHT11读取
if(DHT11_ReadData(¤t_data.temperature, ¤t_data.humidity) == SUCCESS) {
current_data.sensor_status |= 0x01;
} else {
current_data.sensor_status &= ~0x01;
ret = 0;
}
// BH1750读取
current_data.light = BH1750_ReadLight();
if(current_data.light != 0xFFFF) {
current_data.sensor_status |= 0x02;
} else {
current_data.sensor_status &= ~0x02;
ret = 0;
}
// MH-Z19读取
current_data.co2 = MHZ19_ReadCO2();
if(current_data.co2 != 0) {
current_data.sensor_status |= 0x04;
} else {
current_data.sensor_status &= ~0x04;
ret = 0;
}
Sensor_PowerControl(0);
return ret;
}
// 报警条件检查
void Check_Alarm_Conditions(void) {
uint8_t alarm_flag = 0;
if(current_data.temperature > TEMP_THRESH_HIGH ||
current_data.temperature < TEMP_THRESH_LOW) {
alarm_flag = 1;
}
if(current_data.humidity > HUMI_THRESH_HIGH ||
current_data.humidity < HUMI_THRESH_LOW) {
alarm_flag = 1;
}
if(current_data.light < LIGHT_THRESH_LOW) {
alarm_flag = 1;
}
if(current_data.co2 > CO2_THRESH_HIGH) {
alarm_flag = 1;
}
// 控制报警LED
if(alarm_flag) {
GPIO_SetBits(LED_ALARM_PORT, LED_ALARM_PIN);
if(wifi_connected) {
ESP8266_SendAlarm("Environmental parameters out of range!");
}
} else {
GPIO_ResetBits(LED_ALARM_PORT, LED_ALARM_PIN);
}
}
// 数据上传云平台
void Send_To_Cloud(void) {
char mqtt_msg[128];
snprintf(mqtt_msg, sizeof(mqtt_msg),
"{\"temp\":%.1f,\"humi\":%.1f,\"light\":%d,\"co2\":%d}",
current_data.temperature,
current_data.humidity,
current_data.light,
current_data.co2);
ESP8266_Publish("device/env/data", mqtt_msg);
}
// 低功耗模式
void Enter_LowPower_Mode(void) {
// 关闭外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
// 配置唤醒源
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 进入STOP模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// 唤醒后恢复时钟
SystemClock_Config();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
// 其他硬件初始化函数(根据实际硬件连接实现)
void SystemClock_Config(void) { /* ... */ }
void GPIO_Configuration(void) { /* ... */ }
void USART_Configuration(void) { /* ... */ }
void TIM3_Init(uint16_t period_ms) { /* ... */ }
void NVIC_Configuration(void) { /* ... */ }
void Sensor_PowerControl(uint8_t on) { /* ... */ }
关键设计说明
-
定时采集机制:
-
TIM3定时器每30秒触发中断
-
中断服务程序依次读取所有传感器
-
数据有效时立即进行报警判断
-
-
WiFi状态管理:
-
初始化时尝试连接WiFi
-
每次上传前检查连接状态
-
断线后自动尝试重连(在ESP8266驱动中实现)
-
-
数据流控制:
TIM3中断传感器上电DHT11读取BH1750读取MH-Z19读取传感器断电数据有效性检查报警判断上传条件判断MQTT发布 -
异常处理策略:
-
传感器通信失败时自动重试(最多3次)
-
无效数据丢弃并更新状态标志
-
硬件看门狗防止系统死锁
-
-
内存优化:
-
使用共用体处理传感器原始数据
-
静态分配关键缓冲区
-
避免动态内存分配
-
- 点赞
- 收藏
- 关注作者
评论(0)