基于ESP32单片机的自动售货机设计
(1.泰山科技学院,山东泰安 271038;2.山东省人民政府机关政务保障中心,山东济南 250000)
摘要:文章设计了一款基于ESP32单片机的自动售货机。该售货机采用步进电机和弹簧货道的方式,出货口增加弹簧软垫,保证出货的安全。采用ESP32单片机保证智能控制,可以实现投币和电子支付。在电子支付日益普及的背景下,既能满足售货机的全部功能,又能增加安全保证和电子支付,满足了设计初衷。
关键词:ESP32单片机;安全;电子支付
中图分类号:TP368.1 文献标志码:A
1 背景
自动售货机可以便捷地提供各种商品,极大地方便了居民的生活。美中不足的是传统的货物输出通道采用推送后掉落至出口的方式,这对柔软的零食类商品没有任何影响,但是,如果商品为碳酸饮料,掉落会产生大量的二氧化碳,在拧开瓶盖的刹那,饮料喷涌而出,污染消费者的衣服甚至伤害面部,存在极大的隐患。因此,采用步进电机和弹簧货道的方式,并且在出货口增加弹簧软垫,将会最大限度地提升安全系数,同时,采用ESP32单片机进行智能优化和控制,保证了自动售货机可以实现投币和电子支付,更能紧跟社会潮流。
2 设计思路
本文设计的自动售货机,分为商品选择、投入货币、商品送出和找零等4个步骤。
开启默认显示商品属性、价格,每个商品的货架有独立有货/售完指示灯,消费者购物时,系统会根据被选中的商品的种类,在液晶显示屏上自动显示商品的价格和数量,并等待消费者付款。
在选择界面如果30s未投币会跳转到主界面,如果投币则会对商品价格进行计算,已投的币值小于购买商品的金额,按下确认键会提示投币不足且继续开始投币检测;已投的币值大于或等于购买商品的金额,则开启送货程序,对应饮料货架的步进电机驱动的弹簧货道进行顺时针旋转一周并且开启货物掉落检测。当距离传感器检测有物品掉落后进入下一步。
最后找零模式,投入的币值会与商品价格进行相减,找零的币值会在LCD液晶屏上显示,相应的找零LED灯也会亮起。此时按下确定键或者等待30s会返回主界面,继续等待货架货物选择按钮的按下。自动售货机运行流程,如图1所示。

图1 自动售货机运行流程
3 系统组成
(1)硬件部分包括:单片机ESP32-S和3个74HC595组成控制模块,ULN2003电机驱动芯片与步进电机组成安全输出模块,ST7735s和LCD液晶屏组成输出显示模块。
(2)软件采用Arduino为程序开发环境,以类似C语言的编程语句为基础。软件部分包括LCD显示程序、按键按下检测程序、货币累加程序、步进电机驱动程序和找零程序。
(3)本设计可以实时显示商品信息、商品选择、找零、出货以及商品剩余数量。显示屏的组态界面以文字和图片结合的形式,向顾客展示货物的存货情况以及价格等参数。顾客可以通过按键进行商品选择、投币或电子支付。步进电机、传动机构和垫片组成的出货系统完成安全出货功能。
4 硬件设计
4.1 控制模块
自动售货机主控单元采用乐鑫公司的产品ESP32-S模块,26个I/O引脚功能见表1。
表1 ESP32引脚功能
引脚 功能 引脚 功能
1.GND 电源负极 24.IO2 电子支付
2.3V3 电源正极输入 25.IO0 烧录/运行模式引脚
3.EN 使能引脚 26.IO4 10元投币按钮
4.SENSOR_VP 红外测距ADC引脚 27.IO16 5元投币按钮
8.IO32 A商品选择按键 28.IO17 1元投币按钮
9.IO33 B商品选择按键 29.IO5 5角投币按钮
10.IO25 C商品选择按键 30.IO18 选择确认按键
11.IO26 D商品选择按键 31.IO19 显示器MOSI引脚
12.IO27 E商品选择按键 33.IO21 显示器CLK引脚
13.IO14 F商品选择按键 34.RX 串口RX引脚
14.IO12 SHCP引脚 35.TX 串口TX引脚
16.IO13 STCP引脚 36.IO22 显示器DC引脚
23.IO15 74HC595数据引脚 37.IO23 显示器CS引脚
ESP32的26个I/O引脚,无法满足无人售货机控制的要求,现增加3个74HC595芯片,以此可以扩展24个I/O口,I/O分配见表2。
表2 74HC595 I/O分配
芯片 引脚 功能
74HC595-1 15 A商品的步进电机启动引脚
1 B商品的步进电机启动引脚
2 C商品的步进电机启动引脚
3 D商品的步进电机启动引脚
4 E商品的步进电机启动引脚
5 F商品的步进电机启动引脚
6 A商品有货/无货显示
7 B商品有货/无货显示
74HC595-2 15 C商品有货/无货显示
1 D商品有货/无货显示
2 E商品有货/无货显示
3 F商品有货/无货显示
4 步进电机A步信号输出
5 步进电机B步信号输出
6 步进电机C步信号输出
7 步进电机D步信号输出
74HC595-3 15 5角LED输出
1 1元LED输出
2 2元LED输出
3 3元LED输出
4 4元LED输出
5 5元LED输出
6 电子支付完成输出
7 无
3个74HC595的SHCP引脚并联后接入单片机IO12引脚,STCP引脚并联后接入单片机IO13引脚。将74HC595-1的数据输入接入单片机,数据输出脚接到74HC595-2的数据输入脚,再将74HC595-2的数据输出接到74HC595-3即可。
4.2 电机及安全输出模块
本设计采用28YBj-48步进电机。该步进电机为弹簧货道的旋转提供动力,使得弹簧货道旋转推送最前端的商品掉落出货。加之弹簧垫片的减振作用,可以有效减少商品晃动。步进电机驱动芯片采用ULN2003,出货检测模块采用GP2Y0A51SK0F红外测距模块。
无人售货机有6个出货仓,因此有6套步进电机以及ULN2003控制模块。若为每个ULN2003都配备4个信号输入,会导致I/O占用数量太多,本产品将6ULN2003的信号输入全部并联接入单片机,使用一个N-MOS将ULN2003的GND引脚与N-MOS的D脚相连,N-MOS的S脚与电路的负极相连。如此只需要进行4个信号输入脚和6个N-MOS控制脚的控制,即可完成对6路步进电机的控制。
4.3 输出显示模块
为了直观显示每个货物格子的有货/缺货状态,采用两个LED灯来显示,红色LED灯亮起代表缺货,绿色LED灯亮起代表有货。
此次设计的自动售货机采用一块18英寸的LCD屏幕,主控为ST7735S,通过SPI总线直接与单片机连接,用于无人售货机的产品、数量、进行的步骤等参数的显示。
5 软件设计
自动售货机软件采用Arduino开发环境。初始化程序调用ST7735显示器的库,将ST7735初始化,将对应按键的引脚设置为输入上拉,将74HC595的信号引脚设置为输出模式,货物LED灯初始化。
5.1 主逻辑部分
自动售货机的程序是按照一整套逻辑的顺序控制,通过最初定义一个变量zt在开机时定义为0,当前步骤完成后,变量zt的数值加1。单片机通过检测zt的数值执行对应的程序,从而进入相应的步骤,当完成一个循环后,当前变量会初始化为0,进入主界面,等待进入下一个循环步骤。
5.2 关键模块
程序的按键部分在初始时将引脚设置为输入上拉模式。将开关一脚接单片机对应引脚,另一脚接地,即可读取当前按键状态,会返回一个为0或者1的值,如果按键按下,引脚返回的值为0,如果没被按下会返回1。单片机通过检测zt的数值,进入数值对应的步骤,以此打开不同的按键检测子程序,以完成选择货物和投币等功能。
5.3 显示模块
界面显示通过定义一个变量ye,初始ye=0,系统会显示主界面。当系统检测到商品选择按键返回的值为0时,被检测到的按键会映射到A~F的商品选择,ye会变为对应的1~6,单片机通过检测这个变量的数值,对应跳转到不同的二级子界面,以此显示商品详细的信息。
5.4 74HC595驱动程序
外设通过74HC595与单片机连接。定义一个函数数组bs,通过74HC595输出。bs数组共有24位数,分别对应3个74HC595的各8个输出接口。这24位数从小到大对应:空、电子支付完成输出、五元LED显示、四元LED显示、三元LED显示、二元LED显示、一元LED显示、五角LED显示、步进电机A步、步进电机B步、步进电机C步、步进电机D步、F商品LED有货/无货显示、E商品LED有货/无货显示、D商品LED有货/无货显示、C商品LED有货/无货显示、B商品LED有货/无货显示、A商品LED有货/无货显示、F步进电机MOS管开关、E步进电机MOS管开关、D步进电机MOS管开关、C步进电机MOS管开关、B步进电机MOS管开关、A步进电机MOS管开关。
5.5 步进电机与出货
步进电机通过74HC595输出的信号驱动,只需改变bs的数值即可驱动步进电机,将bs数组中对应电机相的信号位设置为“1”,其余位设置为“0”,则步进电机的A步信号、B步信号、C步信号和D步信号即可输出。步进电机主轴旋转一圈需要4096个对应脉冲,因为每个循环包括4步,所以只需要1024个循环,即可驱动电机旋转一周。
出货检测程序使用GP2Y0A51SK0F红外测距模块,使用AnalogRead程序检测模块检测ESP32 ADC引脚输出电压,ESP32的ADC(数模转换器)是12位检测精度,命令会返回一个0~4095的值对应0~3.3V的电压,获得的电压会与距离成反比,以此通过实际距离测算设定一个阈值。只需要不断检测引脚电压,通过与设定阈值进行比较,即可进行出货检测。当单片机检测到已经出货,则变量zt加1,继续执行下一步骤。
5.6 LED显示程序
开机时系统自动校准当前货物状态,并实时显示在组态界面中。当程序运行到出货步骤时,对应的货物减1,并会进行货物数量检测,当检测到货物数量为0时,数组bs的对应位置为0,此时输出低电平,红灯亮表示缺货;当货物大于0时,数组bs的对应位置为1,此时输出高电平,绿灯亮表示有货。
5.7 找零与货物减少
系统的找零程序是通过已投的币额减去商品价格的数存入zhaoling函数中,zhaoling函数的值分别与找零币额度5,4,3,2,1,0.5分别作比较,当比较完后如大于对应值则会与对应值作差,直至差值为0,每次比较完后不为0时,会使数组bs对应找零位值为1,最后通过74HC595输出直接驱动找零输出。
当消费者选中商品,按下选择键时,函数ye会写入1~6号商品对应的数字,进入付款环节。当投入货币时,会存入yitoubi这个变量中,系统会调用函数DigitalRead不断扫描投币按键与确认按键是否按下。每次投币按键按下时,变量yitoubi的数值会不断累加。当已付款确认按键按下时,变量yitoubi的数值减去选中商品的价格,两者的差值会存入变量zhaoling中;当变量zhaoling的数值小于0时,表示已投的币值不足以购买商品,继续进入投币与确认键检测;当变量zhaoling的数值大于等于0,直接进入找零模式,变量zhaoling分别与5,4,3,2,1,0.5分别做减法运算;当差值大于0时,差值存入变量zhaoling中,直至变量zhaoling的数值为0,完成找零运算。在找零完成后,会检测变量ye的值,界面显示的对应A~F商品数量减1。
5.8 电子支付
选中商品后,LED显示屏出现对应的价格,选择电子支付方式,扫码付款,直接跳过投币识别和找零程序,执行货物减少程序,同时,商品执行出货程序,此时,步进电机动作,商品安全出货。
6 总结与展望
本设计实现了自动售货机的安全售卖功能,同时,投币支付和电子支付两种支付方式更为消费者提供了便利。但是,在设计中仍有不足,比如,缺少食品的生产日期和保质期检测功能,过期食品仍有可能被消费者获得。因此,本款自动售货机在安全售卖功能上仍有提升空间,希望在新款设计中增加智能文字识别功能,自动剔除过期食品,进一步提升自动售货机的安全售卖功能。
参考文献
[1]邵华梅.基于STM32的散装食品自动售货机设计[J].机械制造与自动化,2021(2):226-229.
[2]吕颖利.基于单片机的步进电机控制系统研究[J].南方农机,2022(8):136-138.
[3]查明皓.一种基于单片机的自动售货机设计[J].软件,2020(11):50-52.
[4]金薇.基于PLC的自动售货机控制系统设计[J].中国新技术新产品,2020(14):20-21.
[5]王晓丽.一种基于PLC的自动售货机系统的设计[J].集成电路应用,2019(2):80-81.
作者简介:王惠(1990—),男,山东泰安人,硕士研究生,工程师,主要研究方向为计算机控制。