1. 项目概述
这个教室监控系统设计项目,是我去年为本地一所中学完成的实际案例。当时校方提出了一个很具体的需求:在不更换现有教室基础设施的前提下,实现教室环境的智能化监控。经过多方比较,最终选择了基于单片机的解决方案,因为它成本低、稳定性好,而且完全可以根据学校的具体需求进行定制化开发。
这个系统最核心的功能是实时监测教室内的温度、湿度、光照强度和人员活动情况。所有数据都会通过无线模块传输到后台服务器,教师和管理员可以通过网页端实时查看各个教室的环境状况。当检测到异常情况(比如温度过高或教室内无人但灯还亮着)时,系统会自动发送告警信息。
2. 系统设计方案
2.1 硬件选型与配置
主控芯片我们选择了STM32F103C8T6,这是一款性价比极高的ARM Cortex-M3内核单片机。它的72MHz主频完全能满足我们的数据处理需求,而且内置的ADC模块可以直接连接各类传感器。
传感器部分我们配置了:
- DHT22温湿度传感器(精度±0.5℃,±2%RH)
- BH1750光照传感器(量程1-65535lux)
- HC-SR501人体红外感应模块
- MQ-2烟雾传感器(可选配)
数据传输采用ESP8266 WiFi模块,通过MQTT协议与服务器通信。整个系统的供电采用5V/2A的电源适配器,考虑到教室环境,我们还增加了防雷和过压保护电路。
2.2 软件架构设计
系统软件分为三个主要部分:
- 单片机端固件:使用Keil MDK开发,基于FreeRTOS实时操作系统
- 服务器端:采用Node.js + MySQL架构
- 前端界面:Vue.js实现的响应式Web应用
数据采集周期设置为30秒一次,但当检测到异常情况(如温度突变或有人进入)时会立即上报。所有数据在单片机端会先进行简单的滤波处理,再上传到服务器。
3. 核心功能实现
3.1 环境数据采集
温湿度采集使用了DHT22的单总线协议。这里有个关键点需要注意:DHT22对时序要求非常严格,必须严格按照数据手册上的时序图来操作。我们在实际调试中发现,如果中断处理不当,很容易导致数据读取失败。
c复制// DHT22数据读取示例代码
void DHT22_ReadData(float *temperature, float *humidity) {
// 主机拉低总线至少1ms
DHT22_GPIO_LOW();
delay_ms(2);
// 释放总线,等待传感器响应
DHT22_GPIO_HIGH();
delay_us(30);
// 检测传感器响应信号
if(DHT22_Wait_Response() == SUCCESS) {
// 读取40位数据
uint8_t data[5] = {0};
for(int i=0; i<5; i++) {
for(int j=0; j<8; j++) {
while(DHT22_GPIO_READ() == LOW); // 等待高电平
delay_us(40);
if(DHT22_GPIO_READ() == HIGH) {
data[i] |= (1 << (7-j));
while(DHT22_GPIO_READ() == HIGH); // 等待低电平
}
}
}
// 校验数据
if(data[4] == (data[0]+data[1]+data[2]+data[3])) {
*humidity = (data[0]<<8 | data[1]) * 0.1;
*temperature = ((data[2]&0x7F)<<8 | data[3]) * 0.1;
if(data[2]&0x80) *temperature = -(*temperature);
}
}
}
3.2 无线数据传输
ESP8266模块通过AT指令配置为Station模式,连接到学校的无线网络。我们选择了MQTT协议而不是HTTP,主要考虑以下几点:
- MQTT的发布/订阅模式更适合物联网场景
- 协议开销小,节省流量
- 支持QoS等级,保证重要数据不丢失
在实际部署中,我们发现学校无线网络的信号强度在不同教室差异很大。为此,我们在代码中增加了信号强度检测和自动重连机制:
c复制void WiFi_Check_Connection() {
static uint32_t lastCheckTime = 0;
if(HAL_GetTick() - lastCheckTime > 30000) { // 每30秒检查一次
lastCheckTime = HAL_GetTick();
int8_t rssi = ESP8266_Get_RSSI();
if(rssi < -75) { // 信号较弱
ESP8266_Reconnect();
}
}
}
4. 系统优化与问题解决
4.1 功耗优化
虽然系统是常电供电,但我们还是做了以下优化:
- 传感器采用间歇工作模式(采集时供电,其余时间断电)
- ESP8266模块在无数据传输时进入睡眠模式
- 单片机主频根据负载动态调整
这些优化使得系统整体功耗降低了约40%,特别是在夜间和假期时段效果更为明显。
4.2 常见问题排查
在实际运行中,我们遇到了几个典型问题:
-
数据跳变问题:
- 现象:温湿度数据偶尔会出现异常跳变
- 原因:传感器受到空调直吹或阳光直射
- 解决:调整传感器安装位置,增加软件滤波算法
-
WiFi频繁断开:
- 现象:在部分教室ESP8266经常掉线
- 原因:该区域存在同频干扰
- 解决:调整AP信道,增加重试机制
-
误报警问题:
- 现象:无人教室偶尔会误报有人
- 原因:HC-SR501对小型动物也有反应
- 解决:调整感应灵敏度,增加触发持续时间判断
5. 系统部署与效果
整个系统部署过程分为三个阶段:
-
硬件安装:
- 每个教室安装一个监控终端,位置选择在教室后上方
- 避免安装在空调出风口、窗户边等干扰大的位置
- 电源从教室的插座取电,走线尽量隐蔽
-
网络配置:
- 为系统单独开设一个VLAN,与其他校园网设备隔离
- 设置QoS策略,保证监控数据的传输优先级
- 配置固定IP地址,便于管理
-
软件调试:
- 逐个教室测试数据采集和传输稳定性
- 校准传感器,确保数据准确性
- 设置合理的报警阈值
系统运行半年后,学校反馈效果显著:
- 教室空调使用更加合理,电费节省约15%
- 通过光照监测,纠正了多个教室照明不足的问题
- 发现并处理了3起下班后未关设备的隐患
6. 扩展功能探讨
基于现有系统,还可以进一步扩展以下功能:
-
能耗分析:
通过长期监测数据,建立教室能耗模型,找出节能潜力点。 -
智能控制:
与教室的空调、照明系统联动,实现自动调节。 -
考勤辅助:
结合课表信息,分析教室使用率,为排课提供参考。 -
空气质量监测:
增加CO2、PM2.5等传感器,提升教室环境质量。
在实际扩展时需要注意:
- 新增传感器要考虑接口资源和供电能力
- 控制类功能要确保安全可靠,避免误操作
- 数据处理算法要考虑单片机的运算能力限制
这个项目给我的最大启示是:物联网系统设计必须紧密结合实际场景。比如在教室环境中,就要考虑课间的人员流动、上课时的设备使用等特点。只有深入理解用户需求,才能设计出真正实用的系统。