原文链接:https://dsx2016.com/?p=1505
公众号:大师兄2016
前言
前面的arduino操作都是建立在usb串口通信上的,然而有线的操作不仅不方便,还受限设备数量,数据传输速率等其他因素影响.
无线的通信方式更加方便快捷,连接数量和通信方式更是提升好几个量级,从距离上就占据了优势
-
传统蓝牙有效距离约为10米,蓝牙5.0最远可为150米
-
WIFI的有效距离一般为50-100米
数据线的有效距离则完全取决于其长度,一般而言,要想达到1米以上的效果,不仅贵而且还不太现实.
考虑到学习难度和通信方式(蓝牙和wifi的优缺点对比),优先推荐蓝牙模块的使用.
蓝牙模块
本文使用的模块为JDY-16 BLE
线路图如图所示
参数备注
Arduino UNO | JDY16 蓝牙模块 |
---|---|
VCC | +5V |
GND | GND |
3 | TXD |
2 | RXD |
arduino蓝牙代码
保存,编译并上传到arduino,并打开编辑器的串口监视器
#include <SoftwareSerial.h>
#define Software_TX 2
#define Software_RX 3
byte read_dat, jdy_dat;
SoftwareSerial BLE_JDY_16(Software_RX, Software_TX);//
void setup()
{
Serial.begin(9600);
BLE_JDY_16.begin(9600);
Serial.println("Ble Test");
}
void loop()
{
if (BLE_JDY_16.available()) {
jdy_dat = BLE_JDY_16.read();
delay(2);
Serial.write(jdy_dat);
}
if (Serial.available() > 0)
{
read_dat = Serial.read();
delay(2);
BLE_JDY_16.write(read_dat);
}
}
arduino连接上蓝牙模块后,指示灯闪烁
安卓手机蓝牙
android手机安装蓝牙测试app
apk下载地址
https://httpsimg.dsx2020.com/BLETestToos.apk
手机上先开启蓝牙
然后打开蓝牙调试app
点击上图第三图的第一个列表(或者其他随意)->点击写入->输入文字->点击发送
arduino的串口监视器就会收到并打印字符
同时arduino也可以通过蓝牙发送消息
在串口监视器的输入框输入字符,点击发送
接着查看蓝牙调试app的界面
arduino在发送的时候,确保蓝牙是连接的,并停留在下图界面
收到的消息会实时显示在红框的区域,以下为显示的内容
至此,安卓手机通过蓝牙和arduino通信就完成了
web蓝牙
本文使用的为Web Bluetooth API
参考地址https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API
兼容性
操作方式
-
确保当前笔记本或者台式主机有蓝牙功能,没有的需要先买一个usb蓝牙
-
按兼容性使用对应支持蓝牙api的浏览器,建议使用最新版chrome浏览器
-
将本文web蓝牙代码写入本地html文件,按蓝牙调试app中截图说明的数据,替换代码中的蓝牙参数,然后使用浏览器打开
-
点击文字bl,开启蓝牙:蓝牙功能的使用只能是通过人为操作才生效,如果直接在js中用方法自动调用,会报错.
上述操作后,如果蓝牙配对成功,会自动发送给arduino字符~大师兄,并打印在arduino串口监视器
web蓝牙html代码
具体细节参考代码注释
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BL</title>
</head>
<body>
<!-- 只有通过真实点击才能连接蓝牙 -->
<div onclick="blList()">bl</div>
</body>
<script>
// 定义连接蓝牙方法
async function blList() {
navigator.bluetooth
.requestDevice({
// 蓝牙名称前缀
filters: [{ namePrefix: "JDY" }],
// 蓝牙uuid
optionalServices: [0xffe0],
})
.then(async (device) => {
console.log("Name: " + device.name, device);
// 连接设备
let server = await device.gatt.connect();
console.log(`server`, server);
// 获取蓝牙uuid相关内容
let service = await server.getPrimaryService(0xffe0);
console.log(`service`, service);
// 获取可以读写字符流的服务
let characteristic = await service.getCharacteristic(
0xffe1
);
// 写入字节(括号中的方法为把字符串转为字符流,传输给蓝牙)
characteristic.writeValue(
new Uint8Array(
new TextEncoder("utf-8").encode("大师兄")
)
);
})
.catch(function (error) {
// 监听错误
console.log("Something went wrong. " + error);
});
}
// blList();
</script>
</html>
至此web蓝牙和arduino的通信完成
总结
本文描述了
-
arduino蓝牙模块的线路图连接方式
-
arduino蓝牙调试的代码和安卓蓝牙调试apk下载
-
arduino和安卓手机来回通信演示
-
web蓝牙和arduino通信演示
第4点的操作是直接通过web界面来控制arduino功能的前提,如控制LED灯开关灯
前面演示的usb串口显示实时温度仪表盘也可以通过蓝牙通信来实现,而且更为方便(不需要开启flask服务器和socket,只需要蓝牙通信即可)
END.