基于STM32的小区供暖监控系统设计(温湿度监测+水位补水+入侵报警+远程APP)
基于STM32的小区供暖监控系统设计(温湿度监测+水位补水+入侵报警+远程APP)
北方小区冬季供暖,最怕两件事:一是供暖管道水位不足、循环不畅没人发现,屋里越住越冷;二是供暖设备间无人值守,闲杂人员随意进出留下安全隐患。传统供暖监控依赖人工巡检,监测手段单一、响应滞后。本文设计一套基于 STM32 的小区供暖监控系统:DHT11 实时采集温湿度、SR-01 监测暖气水位、红外对管守卫设备间,温度过低、水位不足、温湿度超标、非法闯入四类异常自动触发蜂鸣器报警,并联动继电器补水、步进电机通风;全部数据经 WiFi 以 MQTT 协议上传手机 APP,支持远程查看与布防设置,让供暖管理从"人巡"走向"云管"。
一、系统功能总览
| 功能模块 | 实现方式 | 功能说明 |
|---|---|---|
| 温湿度监测 | DHT11 单总线 | 实时采集环境温湿度,OLED 显示 |
| 低温报警 | 阈值判断 + 蜂鸣器 | 温度低于设定阈值触发蜂鸣器报警 |
| 通风控制 | ULN2003 驱动步进电机 | 温湿度超过阈值时启动电机模拟通风 |
| 水位监测与补水 | SR-01 + ADC + 继电器 | 水位低于阈值时继电器模拟打开水阀补水,恢复后自动关闭 |
| 非法闯入检测 | TCRT5000 红外对管 | 布防模式下检测到入侵即报警并上传 APP |
| 阈值设置 | 独立按键 | 用户自定义温湿度、水位报警阈值 |
| 数据显示 | OLED12864(I2C) | 实时显示温湿度、水位数据 |
| 远程监控 | ESP8266 WiFi + MQTT + 手机 APP | 数据远程查看,低温/入侵报警推送,支持远程布防 |
二、核心模块选型对比
2.1 主控模块选型
| 对比项 | 方案1:STM32F103C8T6 | 方案2:ESP32-WROOM-32 |
|---|---|---|
| 内核/主频 | Cortex-M3 / 72 MHz | 双核 Xtensa LX6 / 240 MHz |
| 存储 | 64KB Flash + 20KB SRAM | 4MB Flash + 520KB SRAM |
| 无线能力 | 需外接通信模块 | 内置 WiFi+蓝牙双模 |
| 开发生态 | 开发支持广泛、生态成熟 | 适合 IoT 一体化方案 |
ESP32-WROOM-32 性能强劲且自带无线,但本系统采用"主控+外置 WiFi 模块"的架构更利于模块化维护,STM32F103C8T6 的处理能力与外设接口(3 个 USART、2 个 SPI、2 个 I2C)已完全满足多传感器采集与控制需求。选择方案1:STM32F103C8T6。
2.2 温湿度检测模块选型
| 对比项 | 方案1:DHT11 | 方案2:SHT40 |
|---|---|---|
| 精度 | 满足基础监测 | 温度 ±0.3℃、湿度 ±2%RH |
| 量程 | 常规环境范围 | -40~125℃ / 0~100%RH |
| 接口 | 单总线,集成简单 | 数字接口 |
| 成本 | 经济实惠 | 价格较高 |
SHT40 精度更高,但供暖环境的温湿度监测属于基础应用,DHT11 性能够用、集成简单,可显著控制整机成本。选择方案1:DHT11。
2.3 水位检测模块选型
| 对比项 | 方案1:SR-01 电阻式 | 方案2:HSC-1000G 压力式 |
|---|---|---|
| 测量原理 | 电极间电阻随液位变化 | 液体压力换算液位 |
| 精度 | 满足导电液体检测 | 更高,适用多种液体 |
| 适用液体 | 导电液体 | 耐腐蚀、高温液体均可 |
| 成本与安装 | 成本低、结构简单、安装方便 | 价格较高 |
供暖水箱的水位检测精度要求适中,SR-01 电阻式传感器以经济实用的特性满足绝大多数导电液体的水位检测需求。选择方案1:SR-01。
2.4 红外检测模块选型
| 对比项 | 方案1:TCRT5000 | 方案2:IRM-3638 |
|---|---|---|
| 检测方式 | 近距离反射检测 | 38kHz 调制红外接收 |
| 检测距离 | 短距离、高灵敏度 | 较远距离 |
| 抗干扰 | 常规 | 内置滤波电路,抗干扰优异 |
| 典型场景 | 工业自动化、物体检测 | 遥控信号接收 |
本系统的需求是设备间出入口的短距离人体/物体检测,TCRT5000 灵敏度可调、成本低,正是近距离检测的经济高效之选。选择方案1:TCRT5000。
2.5 电机驱动模块选型
| 对比项 | 方案1:ULN2003 | 方案2:DRV8825 |
|---|---|---|
| 驱动能力 | 7 对达林顿管,单路 500mA | 最大 2.5A,支持中型电机 |
| 步进精度 | 整步/半步 | 最高 1/32 微步进,运行平稳 |
| 保护功能 | 内置飞轮二极管防反冲 | 完善的保护电路 |
| 成本 | 经济 | 价格较高 |
DRV8825 面向高精度大电流场景,本系统的步进电机仅用于模拟通风动作,ULN2003 接口简单、成本可控、保护完善,足以胜任。选择方案1:ULN2003。
2.6 数据显示模块选型
| 对比项 | 方案1:OLED12864 | 方案2:TFT LCD 240×320 |
|---|---|---|
| 分辨率 | 128×64 单色 | 240×320 彩色 |
| 接口 | I2C,配置简单 | SPI/并行,引脚多、配置复杂 |
| 功耗 | 无需背光、功耗低 | 需背光、功耗较高 |
| 成本 | 适中 | 较高 |
监控面板以数值文本显示为主,OLED12864 高对比度、低功耗、接口简洁,符合预算与功耗双重要求。选择方案1:OLED12864。
2.7 无线通信模块选型
| 对比项 | 方案1:ESP8266 | 方案2:RFM95W(LoRa) |
|---|---|---|
| 联网能力 | 内置 TCP/IP 协议栈,直连互联网 | 无直接联网能力 |
| 协议 | 支持 HTTP、MQTT 等 | LoRa 长距离低功耗 |
| 传输速率 | 高(处理速度可达 160MHz) | 最高 300kbps |
| 适用场景 | 需要网络访问与数据上传 | 大范围覆盖、长电池寿命 |
系统需要将数据上传云端并与手机 APP 实时交互,ESP8266 可直接接入 WiFi 网络并支持 MQTT 协议,是智能家居场景的主流选择。选择方案1:ESP8266。
三、系统接线总表
| 模块 | 引脚 | 连接到 STM32 | 说明 |
|---|---|---|---|
| DHT11 | DATA | GPIO(数字 I/O) | VCC 接 3.3V,GND 接地,单总线传输 |
| SR-01 水位传感器 | S(信号输出) | ADC 模拟输入引脚 | 电源脚 + 接 5V、- 接地,电阻变化输出模拟量 |
| TCRT5000 | OUT | GPIO 数字输入 | 电源接 5V,检测到人体输出低电平,与单片机共地 |
| ULN2003 | IN1~IN4 | 4 个 GPIO 输出 | OUT1~OUT4 接步进电机线圈;VCC/GND 接 5V,COM 接电源正极供保护二极管 |
| 继电器(水阀) | 控制端 | GPIO 输出 | 水位低于阈值时吸合模拟打开水阀补水 |
| OLED12864 | SCL / SDA | I2C 时钟/数据引脚 | VCC 接 3.3V,SSD1306 驱动 |
| ESP8266 | TX / RX | USART 交叉连接 | 模块 TX 接单片机 RX、RX 接 TX,115200 波特率,共地保证通信稳定 |
| 蜂鸣器 | 驱动端 | GPIO 输出 | 异常报警提示 |
| 按键 | KEY | GPIO 输入 | 设置温湿度、水位阈值及布防模式 |
四、系统软件设计
4.1 主程序流程
系统上电后完成引脚、通信方式、变量与标志位配置,使能各模块后进入主循环:采集温湿度、水位和红外数据,处理后在 OLED 显示并通过 WiFi 以 MQTT 协议上传手机 APP;随后依次判断四类工况——温度低于阈值触发蜂鸣器报警,温湿度超过阈值控制步进电机通风,水位低于阈值经继电器打开水阀补水,布防模式下红外检测到非法闯入立即报警并推送 APP,循环执行保证供暖环境始终处于受控状态。
int main(void)
{
System_Init(); // GPIO/USART/ADC/变量标志位
DHT11_Init();
ADC1_Init(); // 通道配置+校准
OLED_Init();
Motor_Init(); // ULN2003步进电机
ESP8266_Init(); // STA->透传->TCP
MQTT_Connect(); // 连接MQTT服务器
while (1)
{
/* 1. 数据采集与显示 */
DHT11_Read(&temp, &humi);
water = Get_WaterLevel(); // ADC均值->水位
ir = IR_Scan(); // 红外入侵检测
OLED_Display(temp, humi, water);
/* 2. 阈值判断与联动控制 */
if (temp < TEMP_MIN) { // 温度过低
Beep_Alarm(); // 蜂鸣器报警
MQTT_Publish("alarm", "LOW_TEMP");
}
if (temp > TEMP_MAX || humi > HUMI_MAX)
Motor_Ventilate(); // 步进电机通风
if (water < WATER_MIN) // 水位过低
Relay_WaterOn(); // 继电器开阀补水
else if (water >= WATER_OK)
Relay_WaterOff(); // 水位恢复自动关阀
if (armed && ir) { // 布防+非法闯入
Beep_Alarm();
MQTT_Publish("alarm", "INTRUSION"); // 推送APP
}
/* 3. 远程交互 */
MQTT_Publish("data", temp, humi, water); // 数据上传
MQTT_HandleCmd(); // APP下发布防/阈值指令
Key_Scan(); // 本地按键设置阈值
}
}
4.2 温湿度检测子程序(DHT11)
初始化时将 DATA 引脚设为输出模式,发送低电平启动信号(持续约 1ms)后拉高并延时 20~40μs 完成启动;随后切为输入模式等待传感器响应——80μs 低电平加 80μs 高电平表示就绪。传感器按时序发送 40 位数据(湿度整数/小数、温度整数/小数、校验和各 8 位),通过测量每位高电平持续时间区分 0 和 1;接收完毕计算校验和比对,一致则数据有效,从中提取温湿度整数与小数部分换算为实际值。
u8 DHT11_Read(u8 *temp, u8 *humi)
{
u8 buf[5], i;
DHT11_Start(); // 拉低1ms->拉高20~40us
if (DHT11_WaitAck() != 0) return 1; // 80us低+80us高响应
for (i = 0; i < 5; i++)
buf[i] = DHT11_ReadByte(); // 按高电平时长判0/1
if (buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) {
*humi = buf[0]; *temp = buf[2]; // 校验通过,提取数值
return 0;
}
return 1;
}
4.3 水位检测子程序(SR-01 + ADC)
初始化 ADC:设置时钟、工作模式、数据对齐并启动校准保证转换精度;配置通道与采样时间(239.5 个时钟周期),软件触发启动转换,循环查询完成标志位后读取 12 位结果(0~4095,对应参考电压比例)。为消除抖动干扰,多次采集取平均值,再按传感器量程换算为实际水位值。
u16 ADC_GetAvg(u8 ch, u8 times)
{
u32 sum = 0;
u8 i;
for (i = 0; i < times; i++) {
ADC_SoftwareStartConv(ch); // 软件触发转换
while (!ADC_GetFlagStatus()); // 等待转换完成
sum += ADC_GetConversionValue(); // 12位结果0~4095
}
return sum / times; // 均值滤波
}
float Get_WaterLevel(void)
{
u16 adc = ADC_GetAvg(ADC_CH_WATER, 10);
return ADC_To_Level(adc); // 按量程换算实际水位
}
4.4 红外入侵检测子程序(TCRT5000)
将红外对管输出接至单片机数字输入引脚,上电初始化时确认传感器工作正常并读取初始状态。运行中持续监测输出电平:检测到人体存在时传感器输出低电平(0V),单片机识别到电平变化即触发布防判断与报警流程;按合适的检测间隔循环执行,实时跟踪人体的出现与离开。
void IR_Polling(void)
{
u8 level = GPIO_Read(IR_PORT, IR_PIN);
if (level == 0) { // 低电平=有人
if (armed) { // 布防模式
Beep_Alarm();
MQTT_Publish("alarm", "INTRUSION");
}
}
Delay_ms(IR_INTERVAL); // 检测间隔
}
4.5 数据显示子程序(OLED)
I2C 配置时钟速率与应答参数后发送 OLED 初始化命令,依次设置显示模式、对比度、扫描方向、时钟与充电泵,最后发送 0xAF 开启显示。屏幕划分为 128 列 × 8 页(每页 8 行像素),通过设置页地址和列地址定位显示区域;填充函数遍历 0~7 页、0~127 列写入相同数据实现全屏填充(填 0 即清屏)。数据写入按"设备地址→寄存器地址→数据"顺序,每步等待应答信号确保传输正确,再调用字符串、中文与位图显示函数完成界面渲染。
void OLED_Display(float temp, float humi, float water)
{
OLED_CLS();
OLED_ShowCN(0, 0, "温度"); OLED_ShowNum(32, 0, temp);
OLED_ShowCN(0, 2, "湿度"); OLED_ShowNum(32, 2, humi);
OLED_ShowCN(0, 4, "水位"); OLED_ShowNum(32, 4, water);
OLED_ShowCN(0, 6, "布防"); OLED_ShowStr(32, 6, armed ? "ON" : "OFF");
}
4.6 无线通信子程序(ESP8266 + MQTT)
SSID 与密码写入程序,复位 GPIO 拉高初始化后,拉低复位引脚延时 500ms 再拉高,检测 “ready” 确认复位完成;发送 AT+CWMODE=1 设为 STA 模式,AT+CIPMODE=1 配置透传,AT+CIPMUX=0 关闭多路连接;随后初始化接收缓冲区,发布 TCP 连接指令(指定 IP 和端口)并等待确认,超时则报告状态;连接完成后重置缓冲区发送 AT+CIPSEND,收到 “\r\nOK\r\n\r\n” 即可透传数据,返回 0 表示链路就绪。数据层通过 MQTT 协议实现检测数据与报警信息的发布订阅,APP 端可远程查看并下发布防指令。
u8 ESP8266_ConnectTCP(void)
{
RxBuffer_Reset(); // 重置接收缓冲区
ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"IP\",PORT");
if (!WaitAck("CONNECT", TIMEOUT)) // 等待连接确认
return 1; // 连接超时
RxBuffer_Reset();
ESP8266_SendCmd("AT+CIPSEND"); // 准备发送数据
if (!WaitAck("\r\nOK\r\n\r\n>", TIMEOUT))
return 2; // 发送超时
return 0; // 透传就绪
}
五、系统实现与测试
硬件调试从电源与主控入手,确认供电电压稳定、复位正常后逐个验证传感器采集、I2C 显示与 UART 无线传输;软件基于 Keil 开发,STLink 下载调试,通过断点与变量观察验证阈值判断逻辑。功能测试结果如下:
| 测试项 | 测试方法 | 预期结果 | 实测结果 |
|---|---|---|---|
| 温湿度采集 | DHT11 读取并与标准温度计对比 | 40 位数据解析正确,校验和通过,数值准确稳定 | 通过 |
| 低温报警 | 使环境温度低于设定阈值 | 蜂鸣器及时报警,APP 收到低温报警推送 | 通过 |
| 通风控制 | 使温湿度超出设定上限 | 步进电机正确启动通风,响应及时 | 通过 |
| 水位采样 | 多次采集水位并对比实际液位 | ADC 均值采样稳定,电压准确换算为水位高度 | 通过 |
| 自动补水 | 降低水位至阈值以下再恢复 | 继电器开阀补水,水位恢复后自动关闭 | 通过 |
| 非法闯入检测 | 布防状态下人员经过红外对管 | 输出低电平被识别,蜂鸣器报警,信息上传 APP | 通过 |
| 无线通信 | 配置 WiFi 连接并模拟异常工况 | MQTT 连接稳定,数据与报警信息实时上传 APP | 通过 |
| 远程布防 | APP 下发布防/撤防指令 | 指令正确执行,布防状态 OLED 同步显示 | 通过 |
六、总结
本文设计并实现了一套基于 STM32 单片机的小区供暖监控系统,集成 DHT11 温湿度传感器、SR-01 水位传感器、TCRT5000 红外对管、OLED 显示、ULN2003 电机驱动与 ESP8266 无线通信模块,实现了温湿度实时监测、水位检测与自动补水、非法闯入报警以及数据无线传输的完整功能闭环。系统根据设定阈值快速响应异常工况,触发蜂鸣器报警、通风与补水等联动操作,并通过 MQTT 协议将数据与报警信息推送至手机 APP,支持远程查看与布防管理。硬件选型兼顾可靠性与成本效益,软件采用模块化编程,经反复调试系统运行稳定、响应迅速、各模块协同良好,为传统供暖系统的智能化升级提供了一种高性价比、可扩展的解决方案。
七、资料内容完整工程资料(原理图、PCB、代码、元件清单)
八、资料获取方式
更多推荐


所有评论(0)