Cookie发行设备“ Cook 3000”



大家好! 我在一家开发设备的公司工作,该设备用于监控石油钻机,采矿场,柴油发电机组和其他无聊的东西。 但是这次我们自动化了其他东西。 因此,遇到:“ Cook 3000”-向最佳员工发放cookie的设备。

该设备是由PVC和一些零件制成的结构:
带有驱动器(用于供应货物),屏幕,硬币接收器和整个结构的大脑的螺旋-Wiren Board 6控制器。




点击查看大图。 点击查看大图。
点击查看大图。 点击查看大图。

萤幕


作为WB6的屏幕我使用Nextion屏幕模块(NEXTION ENHANCED NX4832K035)。

该模块配备了AVR处理器。 具有3.5英寸TFT显示屏,分辨率为480 * 320,内部存储器为32Mb,1024字节EEPROM,8192字节RAM。

该设备可存储和显示图形,为界面元素设置动画并处理点击。 仅事件代码通过UART传输到控制器,这使得配置不同复杂性的接口变得容易。

为了将必要的设置和图形加载到屏幕模块中,提供了Nextion Editor界面的可视化编辑器。 您可以在itead官方网站上下载它。

点击查看大图。

创建新项目时,必须指定模型,屏幕位置和字符编码。 为了正确显示西里尔字母,请选择iso-8859-5。

点击查看大图。 点击查看大图。

左侧是工具栏。 在这里,您可以找到用于创建界面的最必要元素。

点击查看大图。

让我们点击按钮。 条件按钮将出现在编辑框中。 拉伸它,编辑文本和标题。 要显示文本,必须添加字体。 我们将在“工具”选项卡中使用“字体创建器”工具。 在“事件”字段中,您必须编写将在事件上播放的代码。

例如,如果您在“ Touch press event”选项卡中编写了打印“ button press \ r”按钮,那么当您单击按钮时,设备将发送到UART:按下按钮并输入换行符。

点击查看大图。

可以在该屏幕的文档中找到代码的描述和示例。 对于调试,可以使用Debug函数。 该窗口允许您在填写屏幕本身之前测试所有固件功能。

点击查看大图。

如果一切正常,则可以通过USB / UART适配器将显示器连接到计算机,然后单击“上传”按钮来填写固件。

点击查看大图。
但是,现在我们如何与WB6交朋友呢?
您可以通过同一USB \ UART适配器将屏幕连接至控制器上的USB端口之一,或直接连接至控制器板上的扩展插槽之一。
我们对引脚TX,RX,5V和GND感兴趣。

点击查看大图。

将屏幕连接到控制器后,我们将直接通过串行端口接收事件数据。

为了以某种方式响应这些事件,让我们编写一个小脚本,该脚本会将有关事件的所有数据发送到MQTT主题。 首先,在控制器的根文件夹中创建一个文件,并将其命名为serial.sh

串口
#!/bin/bash #  /dev/ttyMOD3 stty -F /dev/ttyMOD3 ospeed 9600 ispeed 9600 raw clocal -parenb -echo cs8 CR="$(echo -e '\r')" exec 4<> /dev/ttyMOD3 cat <&4 | while : do IFS="$CR" read -r line case "$line" in quit*) break ;; *) if [[ -n "$line" ]]; then echo $line #    MQTT mosquitto_pub -t /devices/screen/controls/raw/meta/type -r -m text mosquitto_pub -t /devices/screen/controls/raw/on -r -m "$line" fi ;; esac done 


如果一切操作正确,则在单击按钮运行脚本后,在控制器的Web界面中,您将看到一个主题,其中包含屏幕模块发送的数据。

在Wiren Board控制器上,提供了一个规则系统-wb -rules 。 规则是通过Web界面创建的,并以类似于Javascript的简单语言编写。

在WB6 Web界面中,转到“脚本”选项卡,然后通过单击“新建...”按钮创建新脚本,将其命名为“ screen_button.js”或其他名称。 接下来,我们将编写一条规则:更改屏幕/原始主题时(正是他从屏幕上发送数据给他),将发生某些操作。 在这种情况下,当您单击屏幕时,我们将在Web界面的调试窗口中看到“按钮按下”消息:

screen_button.js
 defineVirtualDevice("screen", { //    title: "nextion screen", cells: { raw: { type: "text", value: "" }, } }); defineRule("screen_button", { whenChanged: "screen/raw", then: function(newValue, devName, cellName) { log(newValue); if (newValue == "button pressed") { //     «button pressed» log(" "); //     . } else if (newValue == "button released") { log("  "); } dev["screen"]["raw"] = ""; // . } }); 


太好了 为了处理屏幕上的点击,我们弄清楚了。 现在让我们讨论一下如何使用WB6控制屏幕。 例如,更改按钮文本。 屏幕接受UART命令。 在屏幕文档中可以找到命令的列表和说明。

要确定命令的结束,屏幕将等待三个特殊字符(\ xff \ xff \ xff)。 为了将来简化任务:在根文件夹bash中创建一个脚本。 我们称它为text.sh:

text.sh
 #!/bin/bash TEXT=""; UNIT=""; while [ -n "$1" ] do case "$1" in -a) UNIT=$2;; -b) TEXT=$2;; esac shift done echo -en "$UNIT.txt=\"$TEXT\"\xff\xff\xff" > /dev/ttyMOD3 exit 0 



现在,为了更改按钮文本,我们只需要使用参数调用脚本:
bash /mnt/data/root/text.sh -a b0 -b 'Some Text'
其中b0是屏幕上按钮的名称,而Some Text是所需的文本。

使用WB6规则引擎的示例:

 var txt1 = "some text"; runShellCommand("bash /mnt/data/root/text.sh -a b0 -b '" + txt1+ "'"); 


同样,您可以更改屏幕上当前显示的页面,各种元素,变量和其他参数上的文本。 在这里,我不会画出屏幕模块的所有功能。 上面已经写的信息对于我们的项目已经足够了。

投币器


作为一个硬币接收器,我使用中文版本,该版本在速卖通的大笔交易中售价为400卢布。

通过连接,一切都很简单。 + 12v和一个脉冲输出将连接到干触点扩展模块WBE2-DI-DR-3 。 此外,要确定硬币,我们只需要计算脉冲数即可。 为此,请在规则引擎中创建一个新脚本:

money.js
 var timeout_ms = 1 * 200; var timer_id = null; var timerTime = Date.now(); var timerLast = 0; var countMoney = 0; defineRule("money", { whenChanged: "wb-gpio/MOD1_IN2", then: function(newValue, devName, cellName) { if (newValue) { timerLast = Date.now() if ((timerLast - timerTime) >= 500) { // ? timerTime = Date.now(); countMoney = 1; } else { timerTime = Date.now(); //     countMoney++; } if (timer_id) { clearTimeout(timer_id); } timer_id = setTimeout(function() { //       if (countMoney == 5) { log("10 ") } else if (countMoney == 4) { log("5 ") } else if (countMoney == 3) { log("2 ") } else if (countMoney == 2) { log("1 ") } timer_id = null; }, timeout_ms); } } }); 


很简单的规则。 也许不是最准确的。

Bitrix24


现在,可能是最有趣的了。 让我们尝试找出如何翻译“做得好。 从架子上拿一个饼干。 我们公司使用Bitrix24系统作为CRM。 这个想法是,对于bitrix中的每个完成的任务(任务),员工都会收到一些电子积分。 这些相同的点可以用作我们设备的货币。 让我们弄清楚如何连接到Bitrix24并监视员工的成功。

点击查看大图。

我们将使用bitrix24-python-sdk作为基础。
使用以下命令在控制器上安装SDK
pip install bitrix24-python-sdk

接下来,在根文件夹中创建一个python脚本,将其命名为bitrix.py:

bitrix.py
 #!/usr/bin/python3 import pprint from bitrix24 import bitrix24 import sys import subprocess b24_webhook_key = 'some_key' #   ,    . b24_webhook_user = 1 # ID  -    . b24_domain = 'some_domain' #  . page = 1 user_id = [16, 10, 6, 55, 8, 14, 67, 20] #  ,     ord_status = 5 # 5 -   order_list = 0 total_orders = 0 bx24 = bitrix24.Bitrix24(b24_domain, webhook_key=b24_webhook_key, webhook_user=b24_webhook_user) def get_order_list_len(_user_id): result_ = bx24.call( 'task.item.list', {'ORDER': {'DEADLINE': 'desc'}}, {'FILTER': {'RESPONSIBLE_ID': _user_id,'REAL_STATUS': ord_status}}, {'PARAMS': {'NAV_PARAMS': {'nPageSize': 50, 'iNumPage': page}}} ) if result_: return (len(result_['result'])) for user in user_id: while True: order_list = get_order_list_len(user) total_orders = total_orders + order_list page = page + 1 if(order_list < 50): subprocess.call("mosquitto_pub -t /devices/%s/controls/orders_finished/on -r -m %s" % (user, total_orders), shell=True) #    MQTT. page = 1 total_orders = 0 break 


该脚本请求给定用户列表中的所有已完成任务,将其考虑后将其发送给mqtt中的主题。 接下来,我们只能将获得的金额与以前的值进行比较,如果新数据更多,则为工作完成的员工加分。

蓝牙功能


对于扫描BLE设备,我使用Bluez。 该程序已安装在控制器上。 为了扫描ble设备,只需在控制台中输入一些命令:

 hciconfig hci0 up hcitool lescan --duplicates 

但是,这对我们来说还不够。 建议您查看信号电平。 为此,请安装其他hcidump实用程序:

 apt-get install bluez-hcidump 

并补充我们的团队:

 hciconfig hci0 up hcitool lescan --duplicates | hcidump -a | grep -E 'bdaddr|RSSI' 

在输出中,我们获得附近的MAC地址和RSSI蓝牙(ble)设备。

点击查看大图。

这两行可以精美地包装在bash脚本中,并将输出发送到MQTT。
第二种方法是aioblescan脚本
它要求使用Python 3,最好是3.5。 该脚本的优点是您可以监视特定的MAC地址,而不是监视通过窗口的所有智能手表和智能手机。 为了方便使用规则引擎,脚本输出还将重定向到MQTT。

点击查看大图。

现在我们知道了如何使用屏幕模块与WB6进行交互,我们可以计数硬币,监视Bitrix中员工的成功,扫描设备及其信号电平。 剩下的就是将其收集在一个堆中并规定某种逻辑。 我不会绘制该项目的所有脚本。 一切都可以在公共领域的链接上找到。 也许你们中的一个会发现一个更有用,更聪明的应用程序。

房屋


主体由10mm泡沫PVC制成。 这种塑料以片状出售。 适度柔软。 您可以用钢锯或直尺上的普通文具刀切割。

点击查看大图。

作为紧固件,使用了儿童金属零件“构造器”和短的自攻螺钉。 在该套件中,几乎需要组装箱体的所有东西。

点击查看大图。

驱动器


螺旋桨和驱动器是在B \ U应用程序在线商店中购买的。 自动售货机零件。 由24v电源供电。 它通过扩展模块WBE2-DO-R6C-1的继电器连接。

点击查看大图。 点击查看大图。 点击查看大图。

功能性


功能类似于普通自动售货机。 不仅要花钱买饼干。


设备启动时,屏幕上会显示带有徽标的初始屏幕,然后翻转到主屏幕,我们可以在其中购买饼干或玩游戏。

用户使用的游戏是免费的,但是您可以为动机设置一个小的价格。 规则很简单。 该播放器可以解决三个简单的问题。 如果他给出了三个正确答案,他将获得Cookie形式的奖励。 也许这就是您需要了解的所有信息。 让我们回到主菜单,然后单击“购买Cookie”。

接下来,系统会提示您选择一种付款方式。 选择付款方式“ For Money”时,屏幕上会出现一个窗口,显示价格和付款金额,当您将钱存入硬币接收器时会增加。

只要金额足以购物,设备就会自动关闭此窗口并分发商品。

但是,正如我之前说的,还提供了另一种货币-这些是Bitrix24系统中员工成功所获得的积分。 如果员工完成分配给他的任务,将获得积分。 同样,可以将积分奖励给老板,以取得特别出色的效果。

点击查看大图。点击查看大图。
点击查看大图。点击查看大图。

要偿还积分,员工需要选择“购买积分”项目,然后设备将尝试确定谁站在它前面。 为此,他扫描了周围的蓝牙设备,如果他看到属于该员工并已进入数据库的设备的MAC地址,并且信号电平足够强到可以假设他站在附近,则该员工帐户状态的数据将显示在屏幕上,名称和报价以积分支付Cookie。

如果系统无法确定单个熟悉的设备,则它将发出警告,并提示您从列表中选择您的名字,然后输入您的PIN码。

如果输入正确,则会在同一窗口中打开该窗口,其中包含有关用户帐户状态和产品成本的数据。 确认购买后,将从用户帐户中扣除所需的积分,然后设备发货。

仅此而已。 该项目是专门为教育目的而创建的,目的是表明Wiren Board控制器的应用仅受想象力的限制。 在链接中可以找到所有文件和脚本。

Source: https://habr.com/ru/post/zh-CN420831/


All Articles