Appinventor 单片机 手机蓝牙通信实现

     欢迎大家访问我的github:https://github.com/Iamttp 有问题一起讨论呀!

简介

不会java的小白,在使用的单片机的蓝牙功能时难道只能上百度下载别人的蓝牙app软件吗?幸运的是一个基于云端开发app的网站来了。
 App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。除此之外它也正式支持乐高NXT机器人,对于Android初学者或是机器人开发者来说是一大福音。因为对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。(百度百科)
 因为网上这方面的资料比较少,而自己又在这方面踩了不少坑,所以将单片机、手机常用的app蓝牙通信分享出来,希望一起学习呀!

手机发送数据到单片机实现


 首先进入其网站,这需要 _ _ (你懂的),当然也可以用App Inventor广州服务器。这里可以参考其他文章。进入后可以看到Appinventor分为界面设计(Designer)以及代码逻辑块(Blocks),可以在右上角切换中英文。

    Appinventor 单片机 手机蓝牙通信实现_第1张图片

 

  1. 首先是界面设计,不用太华丽,当然也不要像我这样难看。利用左栏的布局(Layout),可以整理按钮(Button)和标签(Label)的位置。如果要使用蓝牙还要在连接(Connectivity)里面加入蓝牙客户端(BluetoothClient)。
  2. 之后是逻辑块设计,首先是选择蓝牙以及断开蓝牙的列表选择框以及按钮逻辑设计,思路就是在手机app启动时,列表选择框(选择蓝牙)的启用为真,按钮(断开)的启用为假。选择蓝牙时将蓝牙客户端的地址及名称显示出来供用户选择。

Appinventor 单片机 手机蓝牙通信实现_第2张图片

    这样基本的蓝牙通信界面就出来了(先不要喷呀!)做到这里请先试试效果,程序不可能在你写好每个功能后,一运行,然后简直完美。程序需要逐渐壮大,一个功能一个功能的测试,这应该也是软件工程的一个基本思想。

    在整个界面的上面有一个连接(Connect)选项,推荐使用AI伴侣,要求手机下载一个Appinventor的app,然后手机和电脑在同一个局域网下,扫描二维码就可以在线调试看效果了。是不是有点小激动呀!

    上面没有错误后只需加入这类的简单代码块就可以控制单片机了(发送数据)。记得配合单片机的串口通信代码(外加蓝牙)。

Appinventor 单片机 手机蓝牙通信实现_第3张图片

单片机发送数据到手机实现

    但是万一我们需要单片机发送给手机呢?这里我踩了好多坑,网上这方面的教程几乎找不到。这也是这篇文章的重点,首先我们考虑一下如果我们一直执行数据接收,数据一定会乱套的。这样我们需要先用app发送一个数据,然后手机app方面开始执行接收数据程序,单片机则根据接收到的数据发送相应的数据。这样就可以一起配合完成数据通信了,并且不会乱套。

    而假如要一直更新某个数据怎么办呢?单片机方面可以在while(1)里面循环判断接收的数据,然后确认是否发送某个变量的值。而手机app则可以通过定时器在间隔指定时间执行指定函数,发送数据(相当于控制码,控制要接收什么数据),然后接收单片机的数据。(没错,我自己也迷糊了,可以看下面的代码块,一目了然)

  1. 在组件里面加入定时器,然后设置定时间隔单位ms,这样每隔500ms就会执行计时器计时函数块。

Appinventor 单片机 手机蓝牙通信实现_第4张图片

Appinventor 单片机 手机蓝牙通信实现_第5张图片

    2.在代码逻辑块中加入如下图代码块,具体原理上面已经解释。

Appinventor 单片机 手机蓝牙通信实现_第6张图片

    更新1(之前没注意这个问题):

    问题:这里因为定时器设置的启用定时(启用定时指一开始就定时,一直定时是指不止定时执行一次),所以会在还没有连接蓝牙客户端时就开始运行上面的代码块。

    解决方案:所以需要在”当Screen,初始化“那个代码块下添加设置定时器启用假,相应的在“当列表选择框1选择完成”那个代码快下添加设置定时器启用真。

    更新2: 这里省略了全局变量的定义块,大家自己找找这个块吧!然后省略了设置标签值为全局变量的代码块,有了这个就可以显示出全局变量了。

 

    3.之后是根据手机app编写单片机的串口通信程序,如果按照上面的代码块,则单片机的程序应该为:

while(1)
{
    if(接收为1)
    {
        发送指定变量值;
    }
    if(接收为0)
    {
        发送另一个指定变量值;
    }
}

    到了这步就可以下载试试了。文采不好,有什么问题一起交流。

 


 

2020.5.20:

找到之前的一个麦克拉姆轮小车的蓝牙APP程序 (只有发送数据到单片机上的功能):

Appinventor 单片机 手机蓝牙通信实现_第7张图片

Appinventor 单片机 手机蓝牙通信实现_第8张图片

 

 

 

Appinventor 单片机 手机蓝牙通信实现_第9张图片

 

大家评论我都看了,大部分问题集中在App Inventor的配置与前期使用上,而这篇文章初衷是希望解决单片机发送数据到APP这个关键问题上。

同时因为作者已经很久没有接触App Inventor了,原因详见https://blog.csdn.net/qq_40515692/article/details/100639331,所以也不会再更新App Inventor的入门使用。/ w \

所以希望读者通过评论和网上其他资料解决入门问题。当然如果没有解决,作者还是很欢迎大家继续评论讨论!

 

常见问题汇总:

1. 打开连接控制端后是一整块黑屏 ?

在手机设置->蓝牙里面,有一个不常用类型设备可以与买来的蓝牙模块配对,密码一般是1234,配好了再重新打开弄好的app就可以与蓝牙连接了。 总之就是需要根据你手机的蓝牙设置匹配一下,这样APP才能够检测到。

实在没有成功,你可以网上随便下一个蓝牙APP,根据你手机的蓝牙设置匹配一下,然后用下的那个APP确认连接(连接成功,蓝牙模块的指示灯闪烁速度会发生变化),确认可以正常连接后(硬件基本没问题),就再自己参考参考别人的教程或上面的教程写appinventor的程序,然后用自己写的APP连接,测试程序。

 

2. 507 错误?

如果是和HC05通信,HC05没有修改主从模式,应该不会出现这个问题。

出现这个问题,我现在推测的原因是手机-手机,手机-电脑等可能的连接方式时,因为蓝牙连接只能在服务器与客户端之间连接,所以会出现507错误。

 

3. 一次多个数据的发送接受?

详见评论:

接收单字节无符号数是:比如我下位机发个0x1D7(471),APP就接收个471吗?那我要发好几个数并接收这几个数,是用那个接收无符号字节到列表(字节数)那个控件吗?

经过我的测试接收无符号字节到列表(字节数)可以用来接收下位机发来多个数据,我那个是用多个传感器采集数据正好可以用那个控件。

 

你可能感兴趣的:(硬件相关,Appinventor,Buetooth)