2898| 2
|
树莓派餐厅自助点餐系统(三) |
本帖最后由 淄博杨广峰 于 2020-5-18 08:18 编辑 树莓派餐厅自助点餐系统是基于古德微树莓派设计的一个图形化编程应用。该程序使用RFID-RC522射频卡读取和存储用户余额,管理员可随时充值,用户消费实时扣款。借助古德微控件控制,实时传输用户点餐数据。用户通过扫二维码获得点餐界面,可以选择菜品,程序下方的对话框实时给出用户的选择。点餐结束后,可在对话框中输入大写字母Y打印交易内容。对话框中会实时显示用户本次消费的明细,消费总金额和账户余额,同时借助热敏打印机打印用户消费小票。 阅读本文前,请参照DF论坛或四五创客公众号上前两篇文章,树莓派餐厅自助点餐系统(一)RFID-RC522射频卡应用基础、树莓派餐厅自助点餐系统(二)RFID-RC522射频卡读写操作。 第三部分 树莓派餐厅自助点餐系统 在前两篇文章中,我们已经正确的连接了射频卡,并且已经学会了射频卡的读写操作,扫清了前进的障碍,我们可以真正开启我们的树莓派餐厅自助点餐系统的程序设计了。 一、控件控制 在古德微的控件控制中创建一个新的应用,名字叫树莓派餐厅自助点餐系统,添加三个图标控件,一个对话框控件。 1、创建博山酥锅图标控件: 第一个图标控件的内容如下图: 功能描述是显示在你的控制页面上的文字。自定义主题要记牢,在后续的程序中,它是我们监听和读取的对象。 2、创建博山炸肉图标控件 3、创建特色稀饭图标控件 每一个控件代表着一个菜品,大家可以尝试多加入几个。 4、创建对话框控件 与其他控件不同,对话框控件有两个主题: 第一个是发送消息的主题,在主程序中要根据这个主题来接收数据。在我们的例子中,我们设计的是发送一个大写字母Y,实现程序的打印功能。也就是说,在主程序中,我们监听这个打印小票的主题,如果这个主题的数据等于“Y”,程序就会启动打印。 第二个是接收消息的主题,我们可以通过主程序向这个主题发送消息,消息的内容会显示在这个对话框中。本例中,每选择一个菜品,下面的对话框中要实时显示我们的选择,以及所选菜品的价格。在我们向主程序发送字母“Y”时,也就代表我们要打印小票时,对话框中要显示本次点餐所有的选择、价格、累计消费金额和最终余额。 这是古德微推出的新功能———对话框,这是我们一直期待的新功能,真正实现了基于物联网的文字交互,当然,我们还期望能够有下拉列表,有图片框,能够进行页面排版等等。 二、生成网页和分享 1、完成控件控制并保存。 2、点击生成新的网页 在这个网页中,我们可以通过物联网控制我们的主程序。 3、点击分享,生成二维码 用手机微信扫描这个二维码,就会在手机上出现一个与步骤2完全相同的页面,它的出现,可以让我们脱离电脑控制我们的树莓派,甚至是远方的朋友也可以扫描这个二维码,实现真正的远程控制。 三、程序初始部分: 1、初始化射频模块,将reset引脚设为22 2、播放程序开始前的语音提示 3、创建项目列表 列表中存储了四项内容,分别代表的是三个菜品,一个打印小票,大家注意到了,这四个内容都是我们在控件控制中确定的发送主题,如果添加了更多的控件,那么就在列表后面继续添加项目吧。 4、创建价格列表 列表中也存储了四项内容,分别代表的是三个菜品的价格,当然最后一个0,没有真实的意义,只是补齐,让价格列表与项目列表一一对应。 5、设置互联网服务 全部采用默认设置。 一点说明,为什么要创建一一对应的项目列表和价格列表?在后续的程序中我们要不断的获取菜品的名称和价格,不断监听四个主题的数据,如果按照顺序执行的写法,程序会非常庞大!创建列表的目的就是想在后续程序中采用列表循环的写法,简化程序。也许在这个程序中体现的还不够明显,但是你想,如果你的菜品是几十个,或者甚至是几百个,监听主题和获取主题数据是不是会让你崩溃?而列表循环的方法不会增加1行代码! 四、餐卡充值 1、赋值当前金额为100 这里是管理员操作射频卡,给射频卡充值,数据可以由管理员根据实际收取的费用进行相应的修改。 2、将当前金额赋值给金额 3、写入数据函数 射频卡的写操作,我们封装为一个函数,叫写入数据。在这里我们将金额写入射频卡中。几点说明:一是这个函数可以写为带参数的函数,传入参数为金额。二是这里的写操作,我采用的是一次写操作,如果你的写操作不太稳定,可以考虑重复写操作直至成功的写法,具体写法参见上一篇文章。三是对于前两步的疑问: 这里的写法有重复的嫌疑,为什么不对它进行合并优化呢?这个写入数据的函数在后面还要反复调用,我们给它留了一个接口参数,叫金额。这里稍微麻烦一点,后面可能会轻松一点。 五、读取餐卡金额 1、重复读取 这里采用了重复读取直至成功的写法。 2、输出读取成功的详细信息 3、读取加等待时间 具体大家可以参见上一篇文章。 六、监听并读取主题信息 1、初始化消费金额 2、获取当前金额 将从射频卡中读取的金额赋值为当前金额。 3、创建打印信息字典 在程序的运行中经常要用到输出信息,程序的输出窗口要有输出信息,用户每一次点餐要反馈到对话框中,用户提交订单,要反馈最后结果到对话框中,打印小票还要用到输出信息。这些输出信息的内容可能还会不尽相同,如果按照程序顺序执行的思想,要创建很多变量,而且每次输出信息,还要反复进行字符串的各种拼接,整个程序最终会变得非常臃肿,让人难以阅读。 我理解,程序与人工相比最大的优势在于循环的应用。所以,随着程序的运行,把我们需要的信息集中存储起来,输出的时候,循环调用是解决上面问题的最佳方案。但是用什么数据形式存储这些需要打印的数据呢?首先想到的是我最熟悉的列表。但是,把字符串拼接后的数据存储在列表中,在循环读取的时候出现了问题。当然这不是python代码的问题,而是古德微的列表定义的问题。既然列表实现不了,那我们就换用字典来进行。 4、重复循环 5、重复监听每一个主题 为什么要在初始程序中创建项目列表?使用项目列表的监听,是不是很简练呀,试想,如果有30个菜品,你会怎样写监听呢?到这里,你一定体会到了它的好处。 6、如果物联网收到新数据 用户每一次选择操作都会触发物联网发送新数据。 7、取出当前项目 获取用户选择的菜品名称 8、取出当前价格 获取用户选择的菜品价格 为什么要让项目列表与价格列表一一对应,这里就是问题的答案。 9、判断当前主题有没有收到新数据 10、获取当前主题的新数据并赋值给点餐要求 用共同的变量点餐要求,接收不同主题,不同要求。 七、点餐要求的判断处理 1、如果点餐要求为ON 图标型控件的返回数据有ON和OFF两种,当用户点击了任何一个图标控件的ON,就表示用户选择了这一种菜品。 2、累计消费金额 一次点餐中,用户可能会选择多个菜品。 3、计算当前金额 4、创建单项信息 进行字符串的拼接,输出信息更友好。 5、播放语音信息 6、计算累计信息 7、追加数据至字典。 字典与列表不同,列表只需要传入一个信息,而字典的每一个元素需要有两个数据,第一个是键,第二个是值。这里我们用当前项目名称作为键,用单项信息作为值。 每执行一次选择操作,字典都会追加一个元素。最终,字典中会存储到用户的所有单项信息。 8、向控件中的对话框发送单项信息 这个信息会显示在对话框中,让用户的每一次操作都会获得及时反馈! 9、重新赋值金额变量 为射频卡的写操作提供参数。 八、将变化后的金额写入射频卡 用户选择了菜品,用户射频卡上的金额应该发生相应的变化。 这里再次调用写函数,将扣款后的金额写入射频卡。 这里仍然采用了反复写入直至成功的写法。 九、输出最后信息 1、如果点餐要求为“Y” 表示用户点餐全部结束,提交定单。 这里是对控件控制中的文本发送数据的判断,字母Y是自己设定的。 2、调用屏幕打印小票函数 3、调用打印机打印小票函数 重点内容是把字典中的值取出来,这个值就是我们每一步的单项信息。 至此,我们的树莓派餐厅自助消费系统就全部结束了。 但是仔细反思,关于字典,我们还有一些思考: 首先在上面的程序中,字典的键对我们来说是没有用的,我们只是取出字典所有的值。所以一开始用列表存储数据可能会更好些,只可惜列表不成功,选用字典是我们退而求其次的写法。 而且使用字典还有一个小缺陷,最终单项信息的输出与我们点餐的顺序稍有不同,这是由字典的特性所决定,因为字典是没有顺序的。当然,它只是小缺陷,无关大局。但是如果你也像我一样过度纠结于这个问题,一定要办求完美,这里,给出一个解决思路,用无序的字典加有序列表方法,实现有序的输出,大家可以自己尝试。 具体方法为:采用字典加列表的方法实现,字典是没有顺序的,但是列表是有顺序的。我们把用户在点餐过程中选择的菜品追加到一个空列表中,循环读取这个列表,就可以读出用户点餐的项目,而且这个项目是有严格顺序的。对于字典采用根据键取值的办法,键可以从项目列表中取出,因为列表是有顺序的,所以根据有顺序的键读取的值自然也会有顺序。 不再贴图了, 现在已经有了强迫症的嫌疑。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed