使用蓝牙测试app和Web Bluetooth API(web蓝牙)连接arduino蓝牙模块并通信

NO.1
前言

前面的arduino操作都是建立在usb串口通信上的,然而有线的操作不仅不方便,还受限设备数量,数据传输速率等其他因素影响.

无线的通信方式更加方便快捷,连接数量和通信方式更是提升好几个量级,从距离上就占据了优势

  • 传统蓝牙有效距离约为10米,蓝牙5.0最远可为150米

  • WIFI的有效距离一般为50-100米

数据线的有效距离则完全取决于其长度,一般而言,要想达到1米以上的效果,不仅贵而且还不太现实.

考虑到学习难度和通信方式(蓝牙和wifi的优缺点对比),优先推荐蓝牙模块的使用.

NO.2
蓝牙模块

本文使用的模块为JDY-16 BLE

arduino

线路图如图所示

arduino

参数备注

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连接上蓝牙模块后,指示灯闪烁

arduino

NO.3
安卓手机蓝牙

android手机安装蓝牙测试app

apk下载地址

https://httpsimg.dsx2020.com/BLETestToos.apk

手机上先开启蓝牙

然后打开蓝牙调试app

arduino

点击上图第三图的第一个列表(或者其他随意)->点击写入->输入文字->点击发送

arduino

arduino的串口监视器就会收到并打印字符

arduino

同时arduino也可以通过蓝牙发送消息

在串口监视器的输入框输入字符,点击发送

arduino

接着查看蓝牙调试app的界面

arduino在发送的时候,确保蓝牙是连接的,并停留在下图界面

收到的消息会实时显示在红框的区域,以下为显示的内容

arduino

至此,安卓手机通过蓝牙和arduino通信就完成了

NO.4
web蓝牙

本文使用的为Web Bluetooth API

参考地址https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API

兼容性

arduino

操作方式

  1. 确保当前笔记本或者台式主机有蓝牙功能,没有的需要先买一个usb蓝牙

  2. 按兼容性使用对应支持蓝牙api的浏览器,建议使用最新版chrome浏览器

  3. 将本文web蓝牙代码写入本地html文件,按蓝牙调试app中截图说明的数据,替换代码中的蓝牙参数,然后使用浏览器打开

  4. 点击文字bl,开启蓝牙:蓝牙功能的使用只能是通过人为操作才生效,如果直接在js中用方法自动调用,会报错.

上述操作后,如果蓝牙配对成功,会自动发送给arduino字符~大师兄,并打印在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的通信完成

NO.5
总结

本文描述了

  1. arduino蓝牙模块的线路图连接方式

  2. arduino蓝牙调试的代码和安卓蓝牙调试apk下载

  3. arduino和安卓手机来回通信演示

  4. web蓝牙和arduino通信演示

第4点的操作是直接通过web界面来控制arduino功能的前提,如控制LED灯开关灯

前面演示的usb串口显示实时温度仪表盘也可以通过蓝牙通信来实现,而且更为方便(不需要开启flask服务器和socket,只需要蓝牙通信即可)

END.