App Inventor+掌控板:远程感知与控制
在之前的三篇文章中,我们介绍了用App Inventor开发与硬件通信的应用:通过在掌控板上部署tinyWebDB服务器,在局域网中(室内),用手机可以感知硬件的状态,或控制硬件的输出,如图1所示。
图1 在局域网中实现手机与掌控板之间的通信
本片文章将应用的场景从室内转向户外,假设你在远离“家”的某处,可以用手机访问互联网,此时,你可以给“家”中的掌控板发送指令,让它完成某个任务,例如,在炎热的夏季,在到家之前打开空调开关;或者,用手机访问掌控板连接的某个设备或部件,了解它当前的状态,例如,天黑了,家中的灯是否点亮(访问光传感器的读数)?
这些功能的实现,首先要依赖于一项互联网服务,这项服务可以同时服务于手机及掌控板。本文采用的服务基于17coding版本的TinyWebDB服务器,其网址为http://tinywebdb.17coding.net。
一、设置掌控板
除了tinyWebDB服务器之外,还需要为掌控板编写程序,以实现掌控板与tinyWebDB之间的数据读写操作。为了实现这一功能,张路老师编写了一段python程序——tinyWebIO.py,这段程序需要事先刷入到掌控板中。在本文结尾处有相关文件的下载链接。此外,还需要对掌控板的启动文件main.py进行设置,具体设置方法如图2所示。开发者只需设置wifi的登陆名及密码,下面的两行代码用于设置可读写的掌控板的部件及端口,开发者不必修改。
图2 需要在main.py中设置wifi的登陆名及密码
完成以上设置后,请将tinyWebIO.py及main.py刷入掌控板(刷入方法请参见此前的入门文章),然后按下掌控板背面的硬启动按钮,重新启动掌控板,如图3所示。掌控板启动成功后,即可在掌控板的屏幕上看到它的ip地址。
图3 文件烧录完成后,硬启动掌控板
此时掌控板已经开始了与tinyWebDB服务器之间的数据通信,它每秒钟向服务器发送一次自己的状态,即,传送光传感器、声传感器及加速度传感器的读数,对应于图2中的light、sound、accelerometer。同时,掌控板每秒钟读取一次服务器的控制指令,例如,如果此时读取到的buzz值为on,则让蜂鸣器发出鸣叫声。控制指令的种类对应于图2中下面的第二行代码。
二、读取掌控板ID
掌控板与tinyWebDB之间的通信是单通道的。每块掌控板都有一个独一无二的设备ID,当掌控板访问tinyWebDB服务器时,这个设备ID就成为URL地址的组成部分。点击mPython IDE中的“交互”按钮,直到屏幕下方显示图4中的信息(如果不成功,按下掌控板的硬启动按钮再试,也许需要多试几次)。图中右下角被选中的文本就是我手头这块掌控板的ID,将整个url地址复制粘贴到App Inventor的文本块中,稍后会将其设置为tinyWebDB组件的服务器地址。
图4 查看掌控板的设备ID
三、开发安卓应用
本应用实现两个最基本的功能,一是远程控制蜂鸣器的打开与关闭,二是远程读取光传感器的数值,这两个功能用于解释远程感知及控制的实现方法。
在App Inventor中新建一个项目,命名为“远程感知与控制”,向项目中添加两个按钮(分别命名为“感知”及“控制”)、一个标签和一个网络数据库(tinyWebDB)组件,用户界面如图5所示。然后将开发工具切换到编程视图,开始编写程序。
图5 感知与控制应用的用户界面
1、屏幕初始化
在屏幕初始化时,设置网络数据库组件的服务器地址为刚才复制的那段URL地址。如图6所示。
图6 设置网络数据库组件的服务器地址
2、实现感知功能
利用网络数据库组件的请求数据功能,当用户点击“感知”按钮时,向tinyWebDB服务器发送请求,将其中的标记设置为“light”。当网络数据库组件收到数据时,用标签显示收到的数据。代码如图7所示。
图7 实现感知功能的代码
3、实现控制功能
利用网络数据库组件的保存数据功能,将控制指令发送给tinyWebDB服务器。当用户点击“控制”按钮时,如果按钮上的文本为“控制”,则发送“buzz on”指令,其中buzz为标记,on为指令的值。相反,当按钮上的文本不等于“控制”时,则发送“buzz off”指令,代码如图8所示。
图8 实现控制功能的代码
4、测试
打开手机上的AI伴侣进行测试,测试结果如图9所示,图中只显示了“感知”的结果,对于蜂鸣器开关的测试,请读者自行完成。
图9 感知功能测试
附:文件下载地址:https://roadlabs.gitee.io/tinywebio/(点击页面上的“下载”即可)
入门文章链接: