基于 STM32 的自动售货机控制系统设计
本文介绍了一种基于STM32F103ZET6的自动售货机控制系统设计。系统采用模块化架构,支持8-16个货道,兼容硬币、纸币和扫码三种支付方式,具备出货控制、库存管理、故障检测等功能。硬件设计包含核心控制、支付、货道驱动等八大模块,软件基于FreeRTOS实现商品选择、支付验证、出货控制等任务逻辑。测试显示系统出货成功率达99%,支付准确率97%以上,并针对识别率、卡货率等问题进行了优化改进。该系
一、系统设计目标与原理
本设计以 STM32F103ZET6 为控制核心,构建自动售货机控制系统,旨在实现商品的自动化售卖、支付与库存管理。核心目标是支持至少 8 个货道(可扩展至 16 个),兼容硬币、纸币、扫码支付三种支付方式,出货响应时间≤3 秒,具备库存不足报警、故障自诊断、销售数据统计功能,工作温度 - 10℃~50℃,满足公共场所 24 小时无人值守的售卖需求。
系统工作原理基于 “商品选择 - 支付验证 - 出货控制” 的闭环流程:用户通过按键或触摸屏选择商品,STM32 计算价格并驱动支付模块工作;支付完成后,STM32 控制对应货道的电机动作,推送商品至取货口;同时,系统实时更新库存数据,低库存时触发报警,销售记录存储至本地并支持远程上传。STM32 的多外设接口确保各模块协同工作,模块化设计提升系统的可维护性与扩展性。
二、硬件架构设计
硬件架构以 STM32F103ZET6 为核心,主要包含八大模块:
(一)核心控制模块
STM32F103ZET6 作为主控制器,负责系统统筹与逻辑判断,关键资源配置:
GPIOA/GPIOB:连接 8 路货道电机驱动、出货检测传感器、状态指示灯。
USART1:连接支付模块(硬币识别器、扫码模块)。
USART2:连接纸币识别器与本地打印机(可选)。
SPI1:驱动 2.4 英寸触摸屏(TFT,240×320)与外部 Flash(W25Q128)。
I2C1:连接温湿度传感器(监测机柜内部环境)与 RTC 时钟(记录交易时间)。
系统时钟:72MHz 主频,确保多任务并行处理效率。
(二)商品选择与显示模块
交互终端:2.4 英寸电容触摸屏,显示商品列表(含图片、价格、库存)、支付方式选择界面、交易状态提示。
辅助按键:8 个实体按键(对应 8 个货道),支持无触摸时的快速选择,按键带 LED 背光(选中时点亮)。
显示逻辑:触摸屏采用 GUI 库开发,支持中文显示,交易过程中实时更新支付金额与进度。
(三)支付模块
硬币系统:
硬币识别器(支持 1 元、5 角、1 角),通过 USART1 与 STM32 通信,输出识别结果(金额、是否有效)。
找零电机:2 路步进电机驱动找零口,STM32 根据交易金额计算找零数量并控制电机动作。
纸币系统:
纸币识别器(支持 1 元、5 元、10 元、20 元),通过 USART2 输出识别信号,识别时间≤1 秒。
扫码支付:
二维码模块(GM65),支持支付宝、微信扫码,通过 SPI 接口与 STM32 通信,支付结果反馈时间≤3 秒。
支付流程:生成动态二维码→用户扫码→后台验证→模块返回支付成功信号。
(四)货道与出货控制模块
货道结构:8 路弹簧货道(直径 50mm,长度 300mm),每路配 12V 直流减速电机(转速 60rpm),通过电机正转推送商品。
驱动电路:每路电机由 ULN2003 达林顿管阵列驱动,STM32 通过 GPIO 输出控制信号(正转 / 停止),电机工作电流≤500mA。
出货检测:取货口安装红外对管(TCRT5000),商品掉落时遮挡光线,输出低电平信号至 STM32(PB0-PB7),确认出货成功。
(五)库存与状态监测模块
库存检测:每路货道末端安装漫反射红外传感器(E18-D80NK),无商品时输出高电平,STM32 实时监测并更新库存数据。
环境监测:SHT30 温湿度传感器(I2C 接口),监测机柜内部温度(0-50℃)与湿度(20%-80% RH),超标时启动散热风扇。
故障诊断:检测电机堵转(通过电流传感器 ACS712)、支付模块通信中断等异常,触发对应故障代码。
(六)报警与提示模块
声光报警:
蜂鸣器:交易成功时短鸣(0.5 秒),故障或库存不足时长鸣(3 秒)。
LED 指示灯:红色(故障)、黄色(库存不足)、绿色(正常运行),对应状态常亮或闪烁。
信息提示:触摸屏显示故障代码(如 “E01:货道 1 卡货”)与处理建议,方便运维人员排查。
(七)数据存储与通信模块
本地存储:W25Q128 Flash(16MB)存储销售记录(含时间、商品 ID、支付方式、金额),最多保存 10000 条,支持掉电不丢失。
远程通信:ESP8266 WiFi 模块(USART3),通过 MQTT 协议连接云平台,上传销售数据与设备状态(每小时一次),支持远程查询库存与故障信息。
(八)电源管理模块
供电方案:220V AC 输入,经开关电源转换为多路直流:
12V/5A:供给货道电机、硬币 / 纸币识别器、散热风扇。
5V/3A:供给扫码模块、触摸屏、传感器。
3.3V/2A:供给 STM32、Flash、WiFi 模块。
电源保护:输入端加装空气开关(10A),各直流输出端串联自恢复保险丝,防止短路损坏设备。
三、软件逻辑设计
软件基于 FreeRTOS 实时操作系统,采用模块化架构,核心任务如下:
(一)商品选择与支付任务
void Select_Pay_Task(void *arg) {
uint8_t goods_id = 0;
float price = 0;
uint8_t pay_status = 0;
while(1) {
// 1. 等待商品选择(按键或触摸)
goods_id = Get_SelectedGoods();
if(goods_id == 0) {
osDelay(100);
continue;
}
// 2. 获取商品价格与库存
price = Get_GoodsPrice(goods_id);
if(Check_Stock(goods_id) == 0) {
Show_Message("库存不足");
continue;
}
// 3. 显示价格,等待支付
Show_PayInterface(price);
pay_status = Payment_Module(price); // 调用支付模块
// 4. 支付成功,执行出货
if(pay_status == PAY_SUCCESS) {
出货控制(goods_id);
Update_SalesRecord(goods_id, price); // 记录销售
Update_Stock(goods_id, -1); // 库存减1
} else {
Show_Message("支付失败,请重试");
}
}
}
(二)出货控制任务
void Delivery_Task(void *arg) {
uint8_t goods_id;
uint8_t detect_flag = 0;
while(1) {
if(xQueueReceive(delivery_queue, &goods_id, portMAX_DELAY) != pdPASS) {
continue;
}
// 1. 启动对应货道电机
Motor_Control(goods_id, 1); // 1=正转
detect_flag = 0;
// 2. 等待出货检测(超时3秒)
for(int i=0; i<30; i++) {
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0 + goods_id) == GPIO_PIN_RESET) {
detect_flag = 1;
break;
}
osDelay(100);
}
// 3. 停止电机,判断结果
Motor_Control(goods_id, 0); // 0=停止
if(detect_flag) {
Show_Message("出货成功,请取货");
Beep(1); // 短鸣提示
} else {
Show_Message("出货失败,请联系客服");
Set_ErrorFlag(goods_id, 1); // 标记货道故障
Beep(3); // 长鸣报警
}
}
}
(三)库存管理与报警任务
void Stock_Alarm_Task(void *arg) {
uint8_t stock[8];
while(1) {
// 1. 读取各货道库存
Read_AllStock(stock);
// 2. 检查低库存(≤2个)
for(int i=0; i<8; i++) {
if(stock[i] <= 2) {
Set_AlarmFlag(i, 1); // 标记低库存
Show_StockWarning(i, stock[i]);
// 远程推送低库存信息
MQTT_Publish_Stock(i, stock[i]);
}
}
// 3. 检查设备故障
if(Check_Error() != 0) {
Show_ErrorInfo();
MQTT_Publish_Error(Check_Error());
}
osDelay(5000); // 5秒检查一次
}
}
(四)数据存储与上传任务
void Data_Manage_Task(void *arg) {
SalesRecord record;
while(1) {
// 1. 读取销售记录队列
if(xQueueReceive(sales_queue, &record, portMAX_DELAY) != pdPASS) {
continue;
}
// 2. 存储至Flash
Flash_WriteRecord(&record);
// 3. 每小时上传一次数据
if(Get_HourFlag() == 1) {
Upload_SalesData(); // 通过WiFi上传
Clear_HourFlag();
}
}
}
四、系统测试与优化
在实验室模拟环境测试:
交易流程:从商品选择到出货完成平均耗时 4.5 秒(含支付时间),满足设计目标。
支付成功率:硬币识别准确率 98%,纸币识别准确率 97%,扫码支付成功率 100%(网络正常时)。
出货可靠性:连续 100 次出货测试,成功率 99%,1 次卡货被故障检测模块识别并报警。
数据稳定性:掉电后销售记录与库存数据无丢失,远程数据上传成功率 99.5%。
优化措施:
支付模块:硬币识别器增加电磁铁防抖设计,识别准确率提升 2%;扫码模块增加补光灯,弱光环境识别成功率从 90% 提升至 98%。
出货控制:电机驱动增加电流检测,堵转时自动反转 0.5 秒再正转,卡货率从 1% 降至 0.3%。
功耗优化:空闲时段(30 分钟无操作)关闭触摸屏背光与部分传感器,功耗降低 30%。
五、结语
基于 STM32 的自动售货机控制系统通过模块化设计实现了商品售卖的全流程自动化,支持多种支付方式,具备库存管理与远程监控功能,适合无人值守场景应用。系统硬件布局合理,软件逻辑严谨,可根据需求扩展货道数量与支付方式。
后续可扩展功能包括人脸识别支付(增加摄像头与 AI 模块)、商品过期提醒(结合 RTC 与进货日期)、远程补货预约等,进一步提升系统的智能化与用户体验,适应新零售场景的发展需求。
文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。




更多推荐



所有评论(0)