基于STM32的智慧民宿环境监测系统设计
若该文为原创文章,转载请注明原文出处。
一、引言
(一)研究背景及意义
随着旅游业和共享经济的蓬勃发展,特色民宿已成为越来越多旅行者的住宿选择。然而,民宿通常地处偏远、管理分散,其在安全防护(火灾、非法入侵)、环境舒适度(温湿度、空气质量)等方面的管理相比传统酒店更为薄弱。传统的管理方式高度依赖人工巡检,效率低下且无法实现实时监控与预警,存在巨大的安全隐患和管理漏洞。因此,利用物联网技术构建一套集环境监测、安全预警、智能控制和远程管理于一体的智慧民宿系统迫在眉睫。本项目基于高性能的STM32单片机,融合多种传感器与执行器,通过Wi-Fi接入云平台,旨在为民宿提供全天候、全方位的智能化守护,极大提升住户的安全感和满意度,同时降低运营者的管理成本,具有显著的经济价值和社会意义。
(二)国内外研究现状
目前,智能家居和楼宇自动化系统技术已较为成熟,但针对民宿这一特定场景的定制化解决方案仍处于探索阶段。国外已有一些智能安防和环境控制产品,但系统集成度不高且成本昂贵。国内相关研究多集中于单一功能,如独立的烟雾报警器或智能门锁,未能将安防、环境、设备控制有机融合。将火灾监测、人体入侵检测、有害气体监测与温湿度自动调节通过一个低成本、高可靠性的STM32主控进行统一管理,并实现本地与远程双模式控制,是目前技术应用的一个创新点。本研究旨在填补这一空白,提供一个专为民宿场景设计的综合性解决方案。
二、系统总体设计
(一)系统架构
本系统采用“感知-决策-执行-云控”的四层架构。
感知层:由DHT11、火焰传感器、人体红外传感器(HC-SR501)、MQ-4气体传感器组成,构成全方位的环境与安全信息采集网络。
决策层:STM32主控制器作为系统核心,负责处理所有传感器数据,并根据当前工作模式(自动/手动/布控)执行预设的逻辑判断算法。
执行层:包括蜂鸣器、继电器(控制水泵、风扇、空调、加湿器)、LED指示灯,负责执行报警和调节动作。
云控层:基于ESP8266 Wi-Fi模块与云平台(如OneNET、阿里云)连接,实现手机App远程数据监控、历史查询、设备控制和阈值设置。
(二)功能模块划分
环境监测模块:DHT11(温湿度) + MQ-4(有害气体)。
安防监测模块:火焰传感器 + 人体红外传感器。
报警执行模块:蜂鸣器 + 水泵(灭火)。
环境调节模块:继电器控制风扇、空调、加湿器。
人机交互模块:按键 + OLED显示屏。
通信模块:ESP8266 Wi-Fi模块。
电源管理模块:为各模块提供稳定供电。
三、硬件设计与实现
(一)系统硬件框架图
各模块与STM32的连接关系表:
功能模块 | 具体型号/类型 | 通信接口/引脚 | STM32引脚连接 | 说明 |
---|---|---|---|---|
温湿度检测 | DHT11 | GPIO (单总线) | PA0 (Data) | 检测环境温湿度,用于控制空调和加湿器。 |
火焰检测 | 火焰传感器(模拟) | ADC 或 GPIO (数字) | PA1 | 检测明火。模拟量可判断火焰大小,数字量输出为开关信号(有/无)。 |
人体检测 | HC-SR501 | GPIO (数字输出) | PA2 | 检测是否有人存在。布防模式下,有人则报警。 |
有害气体检测 | MQ-4 (模拟) | ADC | PA3 | 检测天然气(CH4)、甲烷等可燃气体浓度。模拟量输入,STM32的ADC读取电压值。 |
空调控制 | 继电器模块 | GPIO (输出) | PA4 | 高电平有效,控制继电器通断,从而模拟控制空调的开关。注意:继电器控制220V空调,务必做好强弱电隔离! |
加湿器控制 | 继电器模块 | GPIO (输出) | PA5 | 控制加湿器的开关。 |
风扇控制 | 继电器模块 | GPIO (输出) | PA6 | 控制风扇的开关,用于通风。 |
水泵控制 | 水泵模块/继电器 | GPIO (输出) | PA7 | 检测到明火时,启动水泵进行灭火。 |
报警器 | 有源蜂鸣器 | GPIO (输出) | PA8 | 任何异常情况(明火、入侵、燃气泄漏)下报警。 |
本地显示 | 0.96" OLED (SSD1306) | I2C | PB6 (SCL), PB7 (SDA) | 显示温湿度、燃气浓度、系统模式(自动/手动/布防)、设备状态等信息。 |
本地控制 | 按键 | GPIO (输入) | PB0 , PB1 , PB10 , PB11 | 用于切换自动/手动模式、进入/退出布防、设置阈值、手动开关设备等。启用内部上拉电阻。 |
云平台通信 | ESP-01S (Wi-Fi) | UART | PA9 (TX1), PA10 (RX1) | 连接云平台,实现数据上传和指令接收。 |
电源部分:
核心警告:继电器模块控制的空调、加湿器、风扇、水泵通常是220V交流电设备。STM32系统使用的是5V/3.3V直流弱电。
强制要求:必须进行强弱电隔离!继电器模块本身就是一种隔离器件,但布线时务必确保高压部分(220V)与低压控制板(STM32)物理隔离,防止触电危险。
建议使用多个电源供电:一个5V电源适配器给STM32和传感器供电;另一个电源给继电器模块和水泵供电。
(二)主控模块选型及介绍
主控芯片选用STM32F103C8T6。其资源分配如下:
1路ADC:用于采集MQ-4的模拟信号。
多个GPIO:用于连接数字传感器、驱动继电器、按键输入和蜂鸣器。
1个I2C:用于驱动OLED显示屏。
1个UART:用于与ESP8266通信。
其性能完全满足本系统多外设、实时性要求高的需求,是性价比最优的选择。
(三)传感器模块选型及电路设计
DHT11:数字温湿度传感器,单总线协议,电路简单,数据引脚需上拉4.7K电阻。
火焰传感器:对特定波长的火焰敏感。选用数字输出型,当检测到火焰时,DO引脚输出低电平。直接与STM32 GPIO连接。
人体红外传感器(HC-SR501):基于热释电效应,检测人体移动。输出高电平信号当检测到人时。其灵敏度、延时时间可调。输出端直接接STM32 GPIO。
MQ-4气体传感器:对甲烷、天然气等可燃气体灵敏度高。输出模拟电压信号,浓度越高电压越高。将其AO引脚接至STM32的ADC引脚。
(四)通信模块选型及配置
选用ESP-01S模块。配置流程:
STM32通过AT指令集初始化ESP8266:
AT+CWMODE=1
(STA模式)。AT+CWJAP="SSID","password"
(连接路由器)。AT+CIPSTART="TCP","api.heclouds.com",80
(连接OneNET HTTP服务器) 或配置MQTT连接。连接成功后,按照云平台API要求,拼接数据包并通过
AT+CIPSEND
发送。
(五)执行模块选型及驱动电路
继电器模块:选用4路继电器模块,输入侧为低电平触发。STM32 GPIO输出低电平时,继电器吸合。强电警告:继电器输出侧连接的水泵、风扇、空调、加湿器等为220V高压设备,接线必须规范,做好绝缘处理,防止触电危险。
蜂鸣器:有源蜂鸣器,通过一个NPN三极管(如S8050)驱动,基极串联1k电阻接STM32的PB0引脚。
水泵:选用小型直流潜水泵(5V或12V),由对应的继电器控制其电源的通断。
(六)显示模块选型及接口电路
选用0.96寸I2C接口的OLED显示屏,用于实时显示温度、湿度、气体浓度、当前模式(自动/手动/布控)、设备状态及报警信息。
(七)电源模块设计
系统包含数字电路和继电器负载,采用双路隔离供电方案最为安全可靠:
一路5V电源:经AMS1117-3.3稳压后,为STM32、传感器、OLED、ESP8266供电。
另一路5V或12V电源:专门为继电器线圈和水泵供电。
重要:继电器输出侧控制的220V市电,必须与低压控制电路完全物理隔离。
四、软件设计与实现
(一)开发环境搭建
IDE: Keil uVision5
库: STM32HAL库
协议: cJSON库用于拼接JSON数据包。
(二)系统软件流程图
(三)系统初始化(代码片段)
// main.c
#include "dht11.h"
#include "ssd1306.h"
#include "esp8266.h"// 定义全局变量
SystemMode_TypeDef sys_mode = MODE_AUTO; // 系统模式
ArmingMode_TypeDef arm_mode = DISARMED; // 布防模式
float temp_threshold_high = 28.0;
float temp_threshold_low = 18.0;
// ... 其他阈值int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();MX_USART2_UART_Init();MX_I2C1_Init();OLED_Init();DHT11_Init();ESP8266_Init();// ... 从Flash读取保存的阈值和模式while (1) {Main_Task();HAL_Delay(1000); // 主循环周期1秒}
}
(四)传感器数据采集与处理(代码片段)
void Sensor_ReadTask(void) {// 1. 读取DHT11if (DHT11_ReadTempHumidity(&humi, &temp) == DHT11_OK) {// 成功读取}// 2. 读取火焰传感器 (数字输入)flame_detected = (HAL_GPIO_ReadPin(FLAME_GPIO_Port, FLAME_Pin) == GPIO_PIN_RESET);// 3. 读取人体红外 (数字输入)human_detected = (HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin) == GPIO_PIN_SET);// 4. 读取MQ-4 (ADC)HAL_ADC_Start(&hadc1);gas_adc_value = HAL_ADC_GetValue(&hadc1);gas_concentration = (gas_adc_value / 4095.0) * 100.0; // 转换为百分比浓度HAL_ADC_Stop(&hadc1);
}
(五)控制功能实现(代码片段)
void Control_Task(void) {// 1. 安防相关(最高优先级,不受模式影响)if (flame_detected) {Buzz_Enable(1); // 蜂鸣器急响Relay_Control(PUMP_RELAY, ON); // 启动水泵MQTT_Publish("alert", "Fire!");} else {Relay_Control(PUMP_RELAY, OFF);}if ((arm_mode == ARMED) && human_detected) {Buzz_Enable(2); // 蜂鸣器另一种响法MQTT_Publish("alert", "Intruder detected!");}if (gas_concentration > gas_threshold) {Buzz_Enable(1);Relay_Control(FAN_RELAY, ON);MQTT_Publish("alert", "Gas leak!");}// 2. 环境调节(仅在自动模式下生效)if (sys_mode == MODE_AUTO) {// 温度控制if (temp > temp_threshold_high) {Relay_Control(AC_RELAY, ON); // 开启空调制冷} else if (temp < temp_threshold_low) {// Relay_Control(AC_HEATER_RELAY, ON); // 如需制热,需另一路继电器} else {Relay_Control(AC_RELAY, OFF);}// 湿度控制if (humi < humi_threshold_low) {Relay_Control(HUMIDIFIER_RELAY, ON);} else {Relay_Control(HUMIDIFIER_RELAY, OFF);}}// 如果是在手动模式,则所有环境调节设备的开关由APP或手动按键控制
}
(六)远程控制功能实现(代码片段)
// 数据上传函数
void Cloud_UploadTask(void) {cJSON *root = cJSON_CreateObject();cJSON_AddNumberToObject(root, "temp", temperature);cJSON_AddNumberToObject(root, "humi", humidity);cJSON_AddNumberToObject(root, "gas", gas_concentration);cJSON_AddBoolToObject(root, "flame", flame_detected);cJSON_AddBoolToObject(root, "human", human_detected);cJSON_AddStringToObject(root, "mode", (sys_mode == MODE_AUTO) ? "auto" : "manual");cJSON_AddStringToObject(root, "arm", (arm_mode == ARMED) ? "armed" : "disarmed");char *json_str = cJSON_Print(root);ESP8266_HTTPPost("api.heclouds.com", "80", "/devices/XXXX/datapoints", json_str, "API-KEY");cJSON_Delete(root);free(json_str);
}// 指令接收解析(在串口中断中处理ESP8266返回的数据)
void UART2_RxCpltCallback(void) {if (strstr(esp8266_rx_buffer, "+MQTTSUBRECV:")) { // 假设使用MQTT// 解析消息, 例如: {"command":"set_mode", "value":"manual"}cJSON *root = cJSON_Parse(找到消息体的起始位置);if (root) {cJSON *cmd = cJSON_GetObjectItem(root, "command");cJSON *val = cJSON_GetObjectItem(root, "value");if (cmd && val) {if (strcmp(cmd->valuestring, "set_mode") == 0) {if (strcmp(val->valuestring, "auto") == 0) sys_mode = MODE_AUTO;if (strcmp(val->valuestring, "manual") == 0) sys_mode = MODE_MANUAL;} else if (strcmp(cmd->valuestring, "set_arm") == 0) {if (strcmp(val->valuestring, "arm") == 0) arm_mode = ARMED;if (strcmp(val->valuestring, "disarm") == 0) arm_mode = DISARMED;} else if (strcmp(cmd->valuestring, "control") == 0) {// 解析控制具体设备,如 {"command":"control", "device":"fan", "value":"on"}}// 保存新设置到Flash}cJSON_Delete(root);}}
}
五、系统测试与优化
(一)测试方案
功能测试:
安全测试:用打火机测试火焰报警与水泵联动;在布防模式下走动测试人体报警;喷洒酒精测试气体报警与风扇联动。
环境测试:用热风枪和加湿器改变环境温湿度,测试空调和加湿器是否按阈值正确启停。
模式测试:切换自动/手动/布防模式,验证逻辑是否正确。
通信测试:断开Wi-Fi,测试重连机制;测试App控制指令的响应速度和成功率。
可靠性测试:连续上电运行72小时,观察系统是否稳定,有无死机或误报警。
(二)测试结果与分析
预计测试结果:系统能实现所有基本功能。测试重点和难点在于:
传感器抗干扰:人体红外传感器易受宠物、热源干扰;MQ-4对酒精敏感,需合理安装位置和算法滤波。
执行器联动可靠性:特别是水泵的启停,需确保水源充足且电路安全。
网络稳定性:需优化AT指令交互流程,增加心跳包机制,保证长期在网。
(三)系统优化
软件滤波:对MQ-4的ADC值进行滑动平均滤波,减少数据跳变引起的误报。
报警延时判断:为火焰和人体检测增加短暂的延时判断(如持续检测到1秒才确认),有效过滤瞬时干扰。
看门狗:启用STM32的独立看门狗(IWDG),在程序跑飞时自动复位,提高系统可靠性。
本地日志:添加EEPROM芯片,记录重要的报警事件和时间,网络恢复后上传。
六、结论与展望
(一)未来展望
多协议网关:增加蓝牙模块,使住户手机能直接连接并控制室内设备,作为网络中断时的备份。
能源管理:增加电量计量模块,监测民宿各房间能耗,为节能提供数据支持。
人脸识别门禁:升级人体传感器为摄像头,实现人脸识别开门和身份登记,提升安全性便捷性。
平台集成:与主流民宿管理平台(如Airbnb、美团民宿)的API对接,实现订单信息自动同步、智能门锁下发密码、退房后自动进入布防模式等深度联动功能。
如有侵权,或需要完整代码,请及时联系博主。