1. 项目背景与核心需求
最近在整理工作室的电子元件时,翻出了几块闲置的STC89C52RC单片机,突然想到可以做个实用的小项目。考虑到当前公共场所的防疫需求,我决定开发一个低成本的人流量统计系统。这个系统的核心功能是通过红外对管检测人员进出,实时统计场所内的人数,并在LCD屏上显示当前人数和预警状态。
这个项目的难点在于要准确识别人员进出方向,避免重复计数。经过多次实验,我最终采用双红外对管配合状态机算法的方式,实现了95%以上的识别准确率。整个系统成本不到50元,非常适合小商铺、社区活动室等场所使用。
2. 硬件设计与元件选型
2.1 主控芯片选择
我选择了STC89C52RC作为主控芯片,主要基于以下几点考虑:
- 价格低廉(约5元/片)
- 完全满足本项目需求
- 熟悉的开发环境(Keil uVision)
- 丰富的IO口资源
- 内置EEPROM可保存历史数据
提示:虽然STM32性能更强,但对于这种简单应用,51单片机完全够用,还能节省成本。
2.2 传感器方案
经过对比测试,最终选用了两组E18-D80NK红外避障传感器:
- 检测距离3-80cm可调
- 数字量输出(检测到障碍物输出低电平)
- 抗干扰能力强
- 价格实惠(约3元/个)
安装时需要注意:
- 两个传感器间距建议15-20cm
- 安装高度距地面80-100cm(适合大多数成年人)
- 传感器轴线略微向下倾斜(约15度)
2.3 显示模块
选用LCD1602液晶屏作为显示模块:
- 价格便宜(约8元)
- 接口简单(并行4线模式)
- 显示内容清晰可见
如果预算充足,可以考虑OLED屏,显示效果更好但价格要贵3-4倍。
3. 系统电路设计
3.1 电源电路
采用AMS1117-5.0稳压芯片,将外部9V电源转换为5V:
- 输入:9V电池或适配器
- 输出:5V/800mA
- 成本:约1元
注意:AMS1117有最小压差要求(约1V),输入电压不能低于6V。
3.2 传感器接口电路
红外传感器直接连接单片机IO口,无需额外电路:
- VCC接5V
- GND接地
- OUT接单片机P3.2和P3.3(外部中断0和1)
3.3 显示模块接口
LCD1602采用4线并行模式连接:
- RS -> P2.0
- RW -> GND(只写模式)
- EN -> P2.1
- D4-D7 -> P2.4-P2.7
4. 软件设计与算法实现
4.1 主程序流程
系统上电后执行以下初始化:
- 定时器0初始化(用于按键扫描)
- 外部中断0和1初始化(用于传感器检测)
- LCD1602初始化
- 从EEPROM读取历史数据
- 进入主循环
主循环主要处理:
- 按键扫描
- 超时处理
- 显示刷新
4.2 人员方向识别算法
这是本项目的核心难点,我采用状态机方式实现:
c复制enum {IDLE, ENTER_START, EXIT_START, ENTER_CONFIRM, EXIT_CONFIRM} state;
void EXTI0_IRQHandler() { // 传感器1中断
switch(state) {
case IDLE:
state = ENTER_START;
break;
case EXIT_START:
state = EXIT_CONFIRM;
break;
}
}
void EXTI1_IRQHandler() { // 传感器2中断
switch(state) {
case IDLE:
state = EXIT_START;
break;
case ENTER_START:
state = ENTER_CONFIRM;
break;
}
}
4.3 防抖动处理
红外传感器容易受到环境光干扰,需要软件防抖:
- 中断触发后延时10ms再次检测
- 只有两次检测都有效才确认触发
- 设置300ms的触发间隔(防止同一人反复触发)
5. 系统功能实现
5.1 基础计数功能
当检测到人员进入时:
- 当前人数+1
- 检查是否超过设定阈值
- 更新显示
当检测到人员离开时:
- 当前人数-1(不低于0)
- 更新显示
5.2 预警功能
当人数超过设定阈值时:
- LCD背光变红
- 蜂鸣器报警(可选)
- 显示"OVER LIMIT!"
5.3 数据存储
每天23:59自动将以下数据存入EEPROM:
- 当日最高人数
- 当日总人流量
- 当前日期
可存储最近30天的数据,通过按键可查看历史记录。
6. 系统调试与优化
6.1 传感器调试
调试时发现的主要问题及解决方案:
- 误触发:调整传感器灵敏度旋钮,找到最佳位置
- 漏检:确保两个传感器轴线有部分重叠区域
- 方向误判:增加状态超时机制(1秒未确认则重置)
6.2 软件优化
为提高系统响应速度,做了以下优化:
- 中断服务程序尽量简短
- 显示刷新改为定时刷新(每秒1次)
- 关键变量使用volatile修饰
- 状态机超时使用定时器中断处理
6.3 功耗优化
为延长电池供电时间:
- 空闲时关闭LCD背光
- 降低主频到6MHz
- 使用睡眠模式(未检测到人员时)
7. 实际应用效果
在社区活动室进行了为期一周的测试:
- 平均每天检测120人次
- 误检率<2%
- 漏检率<3%
- 电池续航约2周(使用2000mAh锂电池)
主要问题:
- 儿童身高较低可能漏检
- 多人同时进出可能漏计
- 强光直射可能干扰传感器
改进方案:
- 增加第三组传感器检测低处
- 改用TOF传感器提高检测精度
- 增加防阳光干扰的遮光罩
8. 项目扩展方向
这个基础系统还可以进一步扩展:
- 增加蓝牙/WiFi模块实现远程监控
- 添加温度检测功能
- 与门禁系统联动
- 开发手机APP查看数据
- 增加人脸识别功能(需换主控)
我个人在实际使用中发现,对于小型场所,这个简单系统已经能满足基本需求。最重要的是传感器安装位置要合理,调试时需要耐心找到最佳参数。如果要做商业化产品,建议改用STM32主控,增加更多传感器提高准确性。