⼿机与Arduino蓝⽛串⼝通讯实验及完整例程
安卓⼿机与Arduino之间采⽤蓝⽛串⼝通讯,是很多智能装置和互动装置常⽤的控制⽅法,简单⽽有效,⽆需⽹络环境,很实⽤的技术。
实验采⽤Arduino UNO板,加了⼀块1602LCD屏做显⽰(因为只有⼀个串⼝,⽤来做蓝⽛通讯,再⽤串⼝助⼿不⽅便,也不直观)。蓝⽛模块使⽤⼗⼏元⼀个的HC-06。⼀个LED接在11脚作为演⽰。⼿机端做了⼀个简单的界⾯,有按键和滑动条。⽤按键控制LED点亮和熄灭,演⽰开关量控制。滑动条控制LED的亮度,演⽰模拟量控制(0-100范围)。LCD屏实时显⽰传送的数据。模块接线按标准接法,⼤家都玩过的,请参考各种教程或书籍。硬件图⽚如下。
<ignore_js_op>
关于蓝⽛串⼝通讯的⼏个要点:
1. Arduino的串⼝,print()和println()函数都是⽤ASCII字符的⽅式传送数据,⽆论是int、float还是string,都⾃动转换成ASCII码传送。其中println()函数在传送的数据后⾯加了回车和换⾏符("\r"和"\n")。换⾏符正好可以作为结束符来让⼿机端识别。
2. 蓝⽛串⼝是异步传输⽅式,每次ad()只读⼀个字节,在⼀个loop()循环中可能收不全⼀条数据信
息,必须要有⼀个全局变量来收集接收到的字符。如果要通讯可靠,使⽤结束符来确定收到了⼀条完整的信息,是⾮常必要的。⼿机端也是⼀样。
3. 例程中⽤的Serial.parseInt()函数,作⽤是在收到的字符流中,到数字字符,并累积在⼀起,直到收到⼀个⾮数字字符时,将前⾯收到的数字字符转换成⼀个整数。如果要传送多个数值,中间⽤逗号等分隔符隔开即可。⽐如三个数值,”12,325,993“,后⾯加⼀个⾃定义的结束符,作为字符串发给Arduino。(例程中⽤字符"X”作为结束符。)这样接收数据完整⽽可靠。接收float可以⽤Serial.parseFloat()函数,⽤法⼀样。
安卓⼿机端可以⽤蓝⽛串⼝助⼿APP。但是建议⾃⼰写⼀个简单的APP,才真正完整的知道怎么通讯。再说了,如果真的做⼀个产品或服务,总是要⾃⼰做⼿机端APP的,蓝⽛串⼝助理不能当产品⽤。
Arduino完整例程如下。IDE 1.6.3编译通过,运⾏正常。欢迎⼤家修改使⽤,完全开源。例程内有详细注释。
/* 本例程演⽰从⼿机蓝⽛串⼝接收指令,点亮或熄灭11脚
的LED,或者调整亮度。
* 接收指令格式:“101X”点亮,“102X"熄灭,”000X"调整亮度。(000为0-100的
整数,表⽰亮度值,X是结束符。)
* 串⼝是异步接收的,⽤parseInt()查第⼀个有效整数,检测到结束符后开始处
理。
* 接收数据显⽰在1602LCD屏上。
* 点亮或熄灭LED后,将收到数据回传给⼿机。⽤pringln()函数,数据后⾯加
了"\r"和"\n"两个字符,可以⽤作结束符。
* 串⼝传送的是ASCII字符,数据格式可以⾃动转换。
*/
#include <Wire.h> // 包含LCD库。
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // 初始化LCD对象,地址为0x27,每⾏16个字
符,共两⾏。
int p; // 定义整数型全局变量,保存接收的数据。
void setup() {
lcd.init(); // 初始化LCD。
lcd.backlight(); // 打开LCD背光。
Serial.begin(9600); // 打开串⼝(蓝⽛)
pinMode(11,OUTPUT); // 定义11脚为输出。(数字或PWM)
}
void loop() {
while (Serial.available() > 0) { // 串⼝收到字符数⼤于零。
p = Serial.parseInt(); // 在串⼝数据流中查⼀个有效整数。
if (ad() == 'X') { // 收到结束符后开始处理数据。
lcd.clear(); // LCD清屏。
lcd.print(p); // LCD显⽰收到的数据(整数)。
switch (p) { // 判断数据内容。
case 101:
digitalWrite(11,HIGH); // 点亮LED。
Serial.println(p); // 回传数据。
break;
case 102:
digitalWrite(11,LOW); // 熄灭LED。
Serial.println(p); // 回传数据。
break;
default:
p = map(p,0,100,0,255); // 转换数据范围到PWM输出值。
analogWrite(11,p); // 调整LED亮度。(PWM)
}
}
}
}
机端编程⽤的是E4A中⽂安卓编程软件,简单省⼒。基本功能都是齐全的。现在版本是4.7
/* 本例程通过蓝⽛串⼝发送指令给Arduino,点亮或熄灭LED,也可
以通过滑块调整LED亮度.
* ⼿机界⾯上的按键1发送"101X",点亮LED,按键2发送"102X",熄灭LED.
* 拖动界⾯上的滑块后,发送0-100之间的整数,表⽰亮度值,后⾯加⼀个"X"为
结束符..
* 接收Arduino传回的数据,收到"101X",滑块到最⼤位置.收到"102X",滑块的最⼩位置.
* 蓝⽛串⼝接收是异步的,必须在收到数据事件中累积收到的ASCII字符,检测到结束符后再处理.
* Arduino的println()函数发出的数据后⾯会加上回车和换⾏符,可以作为结束符使⽤.
* 处理数据时或转换格式时,要去掉回车换⾏符.(字符长度要减2).
*/
变量返回值为⽂本型 // 定义全局变量,保存接收数据.
事件主窗⼝.创建完毕()
返回值 = ""
如果蓝⽛1.是否已开启() = 假则 //开启⼿机蓝⽛.
蓝⽛1.开启蓝⽛()
结束如果
结束事件
事件蓝⽛1.蓝⽛设置完毕(设置结果为整数型)
判断设置结果
分⽀ 1 //蓝⽛已开启.
弹出提⽰("蓝⽛已开启")
蓝⽛1.置可被发现() //置可被发现
分⽀ 2 '蓝⽛未开启
信息框("信息","蓝⽛未被开启,程序将退出!","确定")
结束程序()
分⽀ 3 //已置可被发现
弹出提⽰("蓝⽛已设置为可被发现")
分⽀ 4 //不可被发现
信息框("信息","蓝⽛未被设置为可被发现,程序将退出!","确定")
结束程序()
结束判断
蓝⽛1.置⼯作模式(1) //置⼯作模式为串⼝通讯.
结束事件
事件按钮10.被单击()
蓝⽛1.搜索设备() //搜索设备
弹出提⽰("正在搜索")
结束事件
事件蓝⽛1.发现设备(设备名称为⽂本型,设备地址为⽂本型,是否已配对为逻辑型) //发现蓝⽛设备.
列表框1.可视 = 真 //显⽰列表框.
列表框1.添加项⽬(设备名称 & "_" & 设备地址 & "_" & 是否已配对) //列表框显⽰搜索到的蓝⽛设备.
结束事件
事件列表框1.表项被单击(项⽬索引为整数型) //单击列表框选择要通讯的设备.
变量设备信息为⽂本型
变量⽂本数组为⽂本型()
变量设备地址为⽂本型
设备信息 = 列表框1.取项⽬内容(项⽬索引)
⽂本数组 = 分割⽂本(设备信息,"_") //可以⾃定义分隔符,不要与设备名称重复即可..
设备地址 = ⽂本数组(1)
弹出提⽰(设备地址)
蓝⽛1.连接设备(设备地址) //连接设备
弹出提⽰("正在连接")
结束事件
事件蓝⽛1.连接完毕(连接结果为逻辑型,设备名称为⽂本型,设备地址为⽂本型,连接模式为整数型)
如果连接结果 = 真则 //已连接设备,关闭列表框显⽰.
列表框1.可视 = 假
主窗⼝.标题 = "已连接:" & 设备名称
弹出提⽰("连接成功")
否则
弹出提⽰("连接失败") //连接失败,可以点击列表框再次连接.
结束如果
结束事件
事件蓝⽛1.收到数据(数据为字节型(),设备名称为⽂本型,设备地址为⽂本型) //收到串⼝数据
返回值 = 返回值 & 字节到⽂本(数据,"UTF8") //累积到⽂本变量中.
如果取⽂本右边(返回值,1) = "\n" 则 //发现结束符后开始处理数据.
判断取⽂本左边(返回值,取⽂本长度(返回值)-2) //去掉回车换⾏符,
分⽀ "101" //滑块到最⼤值.
⽔平滑块条1.位置 = 100
分⽀ "102" //滑块到最⼩值.arduino字符串转数组
⽔平滑块条1.位置 = 0
结束判断
返回值 = "" //清空接收字符串,等待下⼀次接收.
结束如果
结束事件
事件按钮1.被单击()
蓝⽛1.发送数据(⽂本到字节("101X","UTF8")) //按键1发送.
结束事件
事件按钮11.被单击() //结束按钮点击处理.
蓝⽛1.发送数据(⽂本到字节("102X","UTF8")) //关掉LED.
蓝⽛1.断开连接() //退出处理,释放资源,结束内部处理线程
结束程序()
结束事件
事件按钮2.被单击()
蓝⽛1.发送数据(⽂本到字节("102X","UTF8")) //按键2发送.
结束事件
事件⽔平滑块条1.停⽌拖动() //滑块动作处理.
变量数值为⽂本型
数值 = 整数到⽂本(⽔平滑块条1.位置) & "X" //添加结束符.
蓝⽛1.发送数据(⽂本到字节(数值,"UTF8")) //发送滑块位置数据.
结束事件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论