1. 项目背景与核心需求
教室里的人数统计一直是个看似简单却颇具挑战性的实际问题。传统的人工点名方式效率低下,而基于摄像头的视觉识别方案又存在隐私争议和成本问题。这个基于单片机的红外计数系统,正是为了解决这些痛点而生。
红外计数技术的核心优势在于非接触式检测。当学生进出教室时,人体会自然遮挡红外光束,系统通过记录遮挡次数就能准确统计人数。我在实际测试中发现,这种方案在教室场景下能达到95%以上的准确率,而成本仅为视觉方案的1/5。
这个系统最关键的三个需求指标是:
- 实时性:人数变化要在3秒内更新显示
- 准确性:连续进出20人误差不超过1人
- 稳定性:连续工作8小时不出现误触发
2. 硬件系统设计详解
2.1 红外传感器选型
对比测试了三种常见红外对管:
- TCRT5000(反射式):成本低但易受环境光干扰
- E18-D80NK(对射式):检测距离可调,抗干扰强
- ITR-9909(槽型光电):安装方便但检测距离短
最终选用E18-D80NK,主要考虑:
- 教室门宽约1米,其0-80cm检测距离完全够用
- 自带灵敏度调节旋钮,可适应不同光照条件
- 实测误触发率低于0.5次/小时
安装时要注意对射两端保持水平,建议使用激光笔辅助校准。我在初期测试中就因为3°的倾斜角导致检测距离缩短了15cm。
2.2 单片机核心电路
采用STM32F103C8T6最小系统板,其优势在于:
- 72MHz主频足够处理双路红外信号
- 内置12位ADC可读取光照传感器
- 成本仅15元左右
关键外围电路设计:
c复制// 红外接收电路
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == IN1_Pin) {
// 进人计数逻辑
}
else if(GPIO_Pin == IN2_Pin) {
// 出人计数逻辑
}
}
2.3 电源与抗干扰设计
教室环境存在三大干扰源:
- 日光灯50Hz频闪
- 手机信号辐射
- 电动窗帘电机启停
采取的对策:
- 使用LM2596稳压模块+1000μF电容滤波
- 红外接收端加装104瓷片电容
- 所有信号线采用双绞线传输
3. 软件算法实现
3.1 双路判向算法
通过两套红外对管形成"光幕",根据遮挡顺序判断进出方向:
code复制A管 ────────────────┐
│→ 1.5m间距
B管 ────────────────┘
进人:A先触发→B后触发
出人:B先触发→A后触发
状态机实现代码:
c复制typedef enum {
IDLE,
A_TRIGGERED,
B_TRIGGERED
} State;
State currentState = IDLE;
void handleTrigger(uint8_t sensor) {
switch(currentState) {
case IDLE:
if(sensor == A) currentState = A_TRIGGERED;
break;
case A_TRIGGERED:
if(sensor == B) {
personIn++;
currentState = IDLE;
}
break;
// 出人逻辑类似...
}
}
3.2 防重触发机制
实测发现当人缓慢通过时,可能产生多次触发。采用200ms的消抖时间窗口:
c复制uint32_t lastTriggerTime = 0;
void EXTI_IRQHandler() {
if(HAL_GetTick() - lastTriggerTime > 200) {
// 处理有效触发
lastTriggerTime = HAL_GetTick();
}
}
3.3 数据存储与显示
使用AT24C02 EEPROM存储当前人数,防止断电丢失。显示部分采用0.96寸OLED,实时显示:
- 当前人数
- 教室容量比
- 最后更新时间
4. 安装调试实战经验
4.1 现场安装要点
最佳安装位置选择:
- 距地面1.2-1.5米(避免书包误触发)
- 避开阳光直射区域
- 与门框保持10cm以上距离
我用3D打印了专用支架,包含:
- 15°仰角设计避免地面反射
- 走线槽隐藏线缆
- 磁吸式固定方便调整
4.2 参数校准方法
通过串口调试工具设置关键参数:
code复制# 设置教室容量
set capacity 60
# 调整红外灵敏度
set sensitivity 75
# 查看实时计数
get count
4.3 常见问题排查
-
计数不准:
- 检查两路红外是否平行
- 测试触发顺序是否正确
- 适当增大消抖时间
-
显示乱码:
- 检查OLED的I2C地址(通常0x78或0x7A)
- 确认上拉电阻已接(4.7KΩ)
-
频繁误触发:
- 加装遮光罩
- 开启环境光补偿
- 检查电源纹波(<50mV)
5. 系统优化方向
在实际部署后,我总结了三个升级方向:
-
无线传输模块:添加ESP8266实现数据上传,通过微信小程序查看各教室人数。测试发现需要优化功耗,否则电池供电只能维持2周。
-
多传感器融合:在前后门各装一套系统,通过软件同步数据。关键是要解决时间同步问题,我采用NTP协议校准,误差控制在±1秒内。
-
节能模式:当检测到30分钟无人进出时,自动关闭OLED背光,整体功耗从85mA降至12mA。
这个项目最让我意外的是红外方案的可靠性——在三个月的连续运行中,累计统计12万人次,系统误差仅37次,且基本都是由于两人紧贴同时通过导致。对于教室管理这类精度要求不极端的场景,这种低成本方案确实展现出了不错的性价比。
