去年帮朋友改造他的小商铺时,发现传统门铃存在几个痛点:机械式触发容易漏检、语音提示单一呆板、无法区分进出方向。于是萌生了用STM32做个智能迎客系统的想法,这个项目最终实现了当顾客靠近时自动播放定制化欢迎语,离开时播送感谢词,还能根据时段切换不同语音内容。
相比市面上的成品,这套系统有三个独特优势:一是采用双红外对管实现方向识别,成本不到商用方案的1/5;二是语音内容可随时通过SD卡更换,店主自己就能操作;三是待机功耗仅3.8mA,两节18650电池能连续工作三个月。下面分享具体实现过程,硬件成本控制在50元以内,软件全部开源。
主控选用STM32F103C8T6最小系统板,这块蓝色小板子虽然只要12块钱,但72MHz主频足够处理红外信号和音频解码。实测同时运行红外检测、MP3解码、GPIO控制时CPU占用率不到40%。
红外传感部分比较了三种方案:
语音输出选用DFPlayer Mini模块(9.9元),直接驱动3W喇叭,支持MP3/WAV格式。比VS1053方案便宜20元,虽然音质稍差但迎客语音完全够用。
电源部分采用TP4056充电管理+升压模块,实现锂电池充放电管理。关键是在升压模块输出端并联2200μF电容,解决DFPlayer启动时的电流冲击问题。
红外传感电路有个细节:在接收管输出端加装1nF电容滤波,并用10K可调电阻调整灵敏度。实际调试发现,调节电阻使检测距离稳定在1.2米最合适——太近容易漏检,太远可能误触发。
重要提示:所有数字电路和模拟电路要分开供电,红外接收管的VCC最好经过LC滤波,否则STM32的GPIO噪声可能引起误触发。
核心逻辑是用两个GPIO中断分别捕获两路红外信号,通过时间差判断方向。具体实现时发现几个坑:
c复制// 载波检测伪代码
if(GPIO_IRQ1 && TIM_CountPulse(IR1) == 38kHz){
ir1_time = GetMicrosecond();
}
DFPlayer模块通过串口控制,但直接调用库函数有时会卡死。我的解决方案是:
时段判断逻辑也很实用:
c复制// 根据RTC时间选择不同语音
if(6<=hour && hour<12){
PlayTrack(1); // 上午欢迎语
} else if(12<=hour && hour<18){
PlayTrack(2); // 下午欢迎语
} else {
PlayTrack(3); // 晚间欢迎语
}
采用STOP模式+RTC唤醒,每50ms唤醒一次检测红外信号。关键配置:
c复制void Enter_STOP_Mode(void){
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后需要重新初始化时钟
SystemClock_Config();
}
实测电流从8mA降到3.8mA,配合2000mAh电池理论待机时间从10天提升到21天。实际店铺使用中,由于触发次数较多,最终续航约2个月。
遇到最多的问题是误触发,可通过以下步骤诊断:
另一个典型问题是语音播放不完整,通常是电源问题:
这套系统在朋友店铺运行半年后,顾客反馈欢迎语让购物体验更温馨。后续打算增加人数统计功能,用OLED屏显示当日客流量。所有源码和电路图已上传GitHub,搜索"STM32-IR-Voice"即可找到。