1. 项目概述
这个基于STM32单片机的红外感应自动门系统,是我去年为本地一家小型超市设计的解决方案。老板想要一个既智能又经济的自动门系统,既能自动感应顾客进出,又能在停电或维修时手动操作。经过多次调试和改进,最终实现的这个系统成本不到300元,却完美满足了需求。
系统核心是通过红外传感器检测人体信号,STM32F103C8T6作为主控芯片处理信号并控制电机运转,配合1602液晶屏实时显示状态。特别设计了自动/手动双模式切换功能,自动模式下完全由红外感应控制门开关,手动模式下则通过物理按键操作,兼顾了智能化和可靠性。
2. 硬件设计与选型
2.1 主控芯片选择
我选择了STM32F103C8T6这款Cortex-M3内核的芯片,主要考虑以下几点:
- 72MHz主频足够处理传感器信号和电机控制
- 丰富的GPIO接口可连接所有外设
- 内置定时器方便实现PWM电机控制
- 价格仅10元左右,性价比极高
实际使用中,这款芯片的性能完全满足需求,甚至还有余量可以添加更多功能。
2.2 红外传感器选型与安装
经过对比测试,最终选用HC-SR501人体红外感应模块:
- 检测距离可调(3-7米)
- 工作电压3.3-20V,与STM32兼容
- 输出数字信号,直接连接GPIO
- 价格仅5-8元
安装时要注意:
- 高度建议1.2-1.5米,这是普通人腰部位置
- 避免正对阳光或热源,防止误触发
- 检测区域要覆盖出入口但不要过大
2.3 电机驱动方案
门体驱动选用常见的L298N电机驱动模块:
- 可驱动两个直流电机或一个步进电机
- 最大输出电流2A,足够推动小型自动门
- 内置二极管保护,防止电机反电动势损坏电路
- 支持PWM调速,实现门的平稳启停
实际接线时,记得在电机两端并联一个100uF的电解电容,能有效减少电火花干扰。
2.4 显示与人机交互
显示部分使用经典的1602液晶屏:
- 2行16字符显示足够展示必要信息
- 背光可调,适应不同光照环境
- 并行接口连接简单
操作方面设置了三个按键:
- 模式切换键(自动/手动)
- 开门键(手动模式下)
- 关门键(手动模式下)
3. 系统软件设计
3.1 主程序流程
系统软件采用状态机设计,主循环结构如下:
c复制while(1) {
check_mode(); // 检查当前模式
read_sensor(); // 读取红外传感器
update_display(); // 更新LCD显示
if(auto_mode) {
auto_control(); // 自动控制逻辑
} else {
manual_control(); // 手动控制逻辑
}
power_manage(); // 电源管理
}
3.2 红外信号处理
红外传感器的信号处理需要特别注意防抖:
c复制#define DEBOUNCE_TIME 50 // 防抖时间50ms
void read_sensor() {
static uint32_t last_time = 0;
if(HAL_GetTick() - last_time < DEBOUNCE_TIME) return;
if(HAL_GPIO_ReadPin(IR_GPIO_Port, IR_Pin) == GPIO_PIN_SET) {
// 确认是有效触发
if(sensor_state == IDLE) {
sensor_state = DETECTED;
last_detect_time = HAL_GetTick();
}
} else {
sensor_state = IDLE;
}
last_time = HAL_GetTick();
}
3.3 电机控制逻辑
电机控制采用缓启动策略,避免电流冲击:
c复制void motor_control(int direction) {
// direction: 0-停止, 1-开门, 2-关门
// 先停止电机
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
if(direction == 1) { // 开门
for(int i=0; i<100; i+=5) {
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, i);
HAL_Delay(10);
}
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
}
else if(direction == 2) { // 关门
for(int i=0; i<100; i+=5) {
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, i);
HAL_Delay(10);
}
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_SET);
}
}
3.4 显示界面设计
LCD显示内容分为两行:
- 第一行:模式 + 门状态
- AUTO OPEN / AUTO CLOSE
- MANUAL OPEN / MANUAL CLOSE
- 第二行:传感器状态或操作提示
- DETECTED / IDLE
- PRESS TO OPEN/CLOSE
更新显示时要注意避免频繁刷新,我设置了200ms的刷新间隔。
4. 系统调试与优化
4.1 红外传感器调试
调试中发现几个常见问题:
- 误触发:通过调整传感器上的两个电位器,将灵敏度调到适中位置
- 检测延迟:修改了检测算法,加入二次确认逻辑
- 环境干扰:给传感器加了遮光罩,避免阳光直射
4.2 电机控制优化
最初的直接启停导致门体晃动严重,改进措施:
- 加入PWM缓启动,让电机逐渐加速
- 在门体行程终点前提前减速
- 增加限位开关,防止过冲
4.3 电源管理
为降低待机功耗,实现了以下优化:
- 无操作5分钟后进入STOP模式
- 通过红外传感器中断唤醒
- LCD背光自动调节,光线充足时降低亮度
实测待机电流从80mA降到了15mA左右。
5. 实际应用与问题排查
5.1 安装注意事项
在实际安装中总结了几个要点:
- 电机与门体的连接要牢固,最好用联轴器
- 走线要整齐,避免被门体运动拉扯
- 控制盒要安装在干燥、通风位置
- 预留检修口,方便后期维护
5.2 常见故障处理
使用中遇到的典型问题及解决方法:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 门不动作 | 电源问题 | 检查12V电源是否正常 |
| 门只开不关 | 传感器故障 | 检查传感器输出信号 |
| LCD无显示 | 对比度问题 | 调整LCD对比度电位器 |
| 电机发热 | 负载过大 | 检查门体是否卡住 |
5.3 安全考虑
为确保使用安全,实现了多重保护:
- 电机电流检测,过流立即停止
- 关门时遇到阻力自动反转
- 紧急停止按钮,按下立即断电
- 手动优先原则,任何模式下都可手动操作
6. 扩展与改进方向
这个基础版本完成后,还可以考虑以下增强功能:
- 增加RFID卡识别,实现员工专用通道
- 添加蓝牙模块,用手机APP控制
- 集成温湿度传感器,自动调节门开关策略
- 加入网络功能,实现远程监控
实际测试中,这个系统在小型商业场所运行稳定,日均开关200次以上无故障。相比市面上的成品自动门,成本只有1/5到1/10,特别适合预算有限的小型商户。
