1. 项目概述:当单片机遇上新零售
在便利店值夜班的朋友应该深有体会:凌晨两点困得睁不开眼时,还得强打精神给顾客扫码结账。这种反人类的场景正是我们开发这款智能收银系统的初衷——用51/STM32单片机实现7×24小时无人值守的自动化收银解决方案。
这个项目本质上是个"三合一"的智能终端:既是支持扫码支付的收银机,又是能自动出货的售货机,还兼具电子存钱罐的现金管理功能。我们团队在开发过程中踩遍了硬件选型、支付对接、机械控制的所有坑,最终实现的样机已经连续无故障运行超过800小时。下面就把从电路设计到代码调试的全套经验毫无保留地分享给大家。
特别提示:文末附有可直接烧录的完整工程文件,包含经过商用验证的STM32F103C8T6和STC89C52两个版本,建议先收藏再阅读。
2. 核心功能拆解与技术选型
2.1 硬件架构设计
整个系统采用模块化设计,核心部件包括:
- 主控单元:STM32F103C8T6(性能款)/STC89C52(经济款)
- 支付模块:支持支付宝/微信的SCB13E扫码头
- 现金处理:日本光荣KP-320硬币识别器+纸币器
- 出货机构:6路舵机控制的弹簧货道
- 人机交互:2.4寸TFT触摸屏+热敏打印机
选型时的关键考量:
- 主控芯片:STM32的硬件CRC校验能确保支付数据安全,而51方案更适合成本敏感场景
- 扫码模块:SCB13E的200ms解码速度远超市面常见模块,实测在强光下仍能保持95%识别率
- 硬币识别:KP-320的电磁特性检测比传统光电式更抗干扰,识别精度达到99.7%
2.2 软件工作流程
系统运行流程图如下(省略常规初始化步骤):
c复制while(1) {
检测触摸屏事件();
if(选择扫码支付) {
启动摄像头捕获();
if(解码成功) {
向服务器查询订单();
if(支付完成) 执行出货();
}
}
else if(选择现金支付) {
启动货币识别();
while(投币金额 < 商品价格) {
持续检测投币口();
}
执行找零与出货();
}
}
支付安全方面的三个关键设计:
- 采用AES-128加密所有通信数据
- 交易流水号使用STM32的硬件随机数生成
- 掉电保护使用FRAM而非EEPROM,确保交易记录不丢失
3. 支付系统实现细节
3.1 扫码支付对接
与支付平台对接时,开发者最头疼的往往是签名验证问题。我们通过以下方式优化:
- 时间同步方案
c复制// 使用NTP协议同步网络时间
void sync_network_time() {
发送NTP请求("pool.ntp.org");
接收响应并解析();
写入STM32的RTC时钟();
}
- 签名验证优化
传统做法是拼接所有参数后做MD5运算,我们发现用以下方法能提升30%性能:
- 预先生成参数名-参数值的键值对数组
- 按参数名ASCII码排序后拼接
- 使用STM32的硬件CRC单元加速校验
3.2 现金处理机制
硬币识别器的信号处理是个技术难点,KP-320输出的是幅度约20mV的模拟信号。我们的解决方案:
- 信号放大电路设计
code复制[硬币信号] -> [AD620仪表放大器(G=100)] -> [LM358低通滤波] -> [STM32 ADC]
- 数字滤波算法
采用移动平均+中值滤波的复合算法:
c复制#define FILTER_WINDOW 5
int adc_filter(int new_val) {
static int buf[FILTER_WINDOW];
static int index = 0;
buf[index++] = new_val;
if(index >= FILTER_WINDOW) index = 0;
// 中值滤波
int temp[FILTER_WINDOW];
memcpy(temp, buf, sizeof(temp));
bubble_sort(temp); // 简单冒泡排序
return temp[FILTER_WINDOW/2];
}
4. 机械控制与故障处理
4.1 舵机驱动方案
市面上常见售货机使用电磁铁驱动,但存在两个致命缺陷:
- 冲击力大导致商品破损
- 寿命仅约10万次
我们改用SG90舵机+弹簧货道的方案,关键参数:
- 旋转角度:90°(刚好满足出货需求)
- 驱动周期:20ms
- 脉冲宽度:0.5ms-2.5ms对应0-180°
硬件PWM配置示例(STM32):
c复制TIM_OCInitTypeDef oc;
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_Pulse = 75; // 1.5ms脉宽(90°)
oc.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &oc);
4.2 常见故障排查表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 扫码后不出货 | 1. 舵机电源不足 2. 弹簧货道卡死 |
1. 检查5V电源电流是否≥2A 2. 用WD-40润滑轨道 |
| 硬币识别错误 | 1. 传感器脏污 2. 信号干扰 |
1. 用酒精棉清洁识别窗口 2. 在ADC输入加0.1μF电容 |
| 触摸屏漂移 | 1. 电磁干扰 2. 校准参数丢失 |
1. 屏蔽屏线 2. 长按右下角5秒进入校准模式 |
5. 电源管理与低功耗设计
5.1 多电压系统供电
整机需要三种电压:
- 3.3V(主控)
- 5V(外围设备)
- 12V(打印机)
电源树设计要点:
- 采用TPS5430 DCDC转换器作为主电源(效率92%)
- 每个模块独立保险丝
- 关键路径加TVS二极管防浪涌
5.2 空闲模式优化
通过以下策略将待机功耗从5W降至0.8W:
- 动态关闭未使用外设时钟
c复制RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, DISABLE);
- 支付完成后立即进入STOP模式
- 触摸屏采用中断唤醒而非轮询
6. 生产测试方案
为确保批量生产质量,我们设计了三级测试体系:
- 模块级测试(耗时3分钟)
- 扫码头:用标准测试码图校验识别率
- 硬币器:投入不同面额各10次验证识别准确率
- 货道:每路舵机连续动作100次
- 整机老化测试(48小时)
- 温度循环:-10℃~50℃每2小时交替
- 电压波动:4.5V-5.5V随机变化
- 压力测试:连续完成500笔交易
- 现场模拟测试
- 强光环境(>80000lux)
- 高噪声环境(>80dB)
- 网络抖动测试(随机断网重连)
7. 项目资料与扩展建议
完整工程包含:
- Altium Designer格式PCB文件(四层板设计)
- Keil MDK工程(含IAP升级功能)
- 3D打印外壳STL文件(支持15种商品规格)
- 商业部署指南(含税务对接方案)
进阶改进方向:
- 增加人脸识别支付(需搭配RV1109 AI芯片)
- 接入库存管理系统(建议用Modbus协议)
- 开发管理APP(推荐使用Flutter跨平台方案)
实操经验:在部署到高湿度环境时,建议在电路板喷涂三防漆,我们曾在海边店铺因盐雾腐蚀导致批量故障,这个教训价值2万元维修费。