1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
第三十六章 BLE实验
前面作者也讲解到,ESP32-S3是一款专为物联网应用设计的芯片,支持Wi-Fi和蓝牙功能,应用领域贯穿移动设备、可穿戴电子设备、智能家居等。本章,作者使用MicroPython提供的BLE特定库驱动ESP32-S3内部的蓝牙设备,并实现控制板载的LED灯及接收ESP32-S3设备发送的数据。
36.1 BLE特定库
36.2 硬件设计
36.3 软件设计
36.4 下载验证
36.1 BLE特定库
16.1.1 BLE特定库简介
MicroPython的bluetooth模块是一种在MicroPython环境中用于处理蓝牙连接和通信的模块。它提供了在MicroPython设备之间,以及MicroPython设备与其他蓝牙设备之间进行无线通信的功能。通过使用bluetooth模块,MicroPython用户可以搜索附近的蓝牙设备、建立与这些设备的连接、发送和接收数据,以及进行其他相关的蓝牙通信操作。该模块支持蓝牙低功耗协议(BLE),也支持经典蓝牙协议。
在MicroPython中使用bluetooth模块,需要正确配置和设置相应的硬件和软件。具体来说,需要确保MicroPython设备支持蓝牙功能,并且已经正确连接到蓝牙模块或适配器。此外,用户还需要了解如何使用bluetooth模块提供的函数和方法来进行具体的蓝牙通信操作。
36.1.2 BLE特定库的构造与方法
一、BLE库构造方法
BLE蓝牙的构造对象方法如下:
- class bluetooth.BLE()
- 使用示例:ble = bluetooth.BLE()
复制代码 返回值:BLE蓝牙对象。
二、BLE库的方法
①:激活或停用蓝牙,返回当前状态。
其方法原型如下:
该函数的参数描述,如下表所示。
表36.1.2.1 ble.active方法参数描述
②:配置蓝牙参数。
其方法原型如下:
- ble.config('gap_name', /)
复制代码 该方法的参数描述,如下表所示。
表36.1.2.2 ble.config方法参数描述
③:设置蓝牙中断。
其方法原型如下:
该函数的参数描述,如下表所示。
表36.1.2.3 ble.irq方法参数描述
④:接收蓝牙数据。
其方法原型如下:
- ble.gatts_read(value_handle, /)
复制代码 该方法的参数描述,如下表所示。
表36.1.2.3 ble.atts_read方法参数描述
⑤:发送蓝牙数据。
其方法原型如下:
- ble.gatts_notify(conn_handle, value_handle, data=None, /)
复制代码 该方法的参数描述,如下表所示。
表36.1.2.4 ble.gatts_notify方法参数描述
⑥:注册蓝牙服务器。
其方法原型如下:
- ble.gatts_register_services(services_definition, /)
复制代码 该方法的参数描述,如下表所示。
表36.1.2.5 ble.gatts_register_services方法参数描述
⑦:允许设备向周围的其他BLE设备发送广播信号,以便它们可以发现并连接到该设备。
其方法原型如下:
- ble.gap_advertise(interval_us, adv_data=None, *)
复制代码 该方法的参数描述,如下表所示。
表36.1.2.6 ble.gap_advertise方法参数描述
以上是MicroPython bluetooth模块常用的方法(函数),其他BLE函数可参看MicroPython官方在线文档。
36.2 硬件设计
1. 例程功能
本章实验功能简介:通过BLUE调试APP来控制LED,当接收“LED ON”命令时,系统打开LED;当接收“LED_OFF”命令时,系统关闭LED。
2. 硬件资源
1)ESP32-S3内部蓝牙
3. 原理图
本章实验使用的BLE为ESP32-S3的片上资源,因此并没有相应的连接原理图。
36.3 软件设计
36.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。
图36.3.1.1 程序流程图
36.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。BLE实验main.py源码如下:
- from machine import Pin,Timer
- import time
- import bluetooth
- # 定义全局变量
- BLE_MESSAGE = ""
- """
- * @brief 蓝牙类
- * @param 无
- * @retval 无
- """
- class ESP32S3_BLE():
- def __init__(self, name):
- # 获取定时器0句柄
- self.timer1 = Timer(0)
- self.name = name
- # 初始化蓝牙
- self.ble = bluetooth.BLE()
- # 开启蓝牙
- self.ble.active(True)
- # 设置蓝牙名称
- self.ble.config(gap_name=name)
- # 配置定时器0且开启定时器
- self.disconnected()
- # 配置蓝牙回调函数
- self.ble.irq(self.ble_irq)
- # 注册蓝牙
- self.register()
- self.advertiser()
- # 蓝牙连接时,点亮LED且关闭定时器0
- def connected(self):
- led.value(1)
- self.timer1.deinit()
- # 蓝牙断开时,闪烁LED
- def disconnected(self):
- self.timer1.init(period=1000, mode=Timer.PERIODIC,
- callback=lambda t: led.value(not led.value()))
- # 蓝牙回调函数
- def ble_irq(self, event, data):
-
- global BLE_MESSAGE
- # _IRQ_CENTRAL_CONNECT 蓝牙终端链接了此设备
- if event == 1:
- self.connected()
- # _IRQ_CENTRAL_DISCONNECT 蓝牙终端断开此设备
- elif event == 2:
- self.advertiser()
- self.disconnected()
- # _IRQ_GATTS_WRITE 蓝牙终端向ESP32-S3发送数据,接收数据处理
- elif event == 3:
- buffer = self.ble.gatts_read(self.rx)
- BLE_MESSAGE = buffer.decode('UTF-8').strip()
-
- def register(self):
- service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
- reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
- sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
- services = (
- (
- bluetooth.UUID(service_uuid),
- (
- (bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY),
- (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE),
- )
- ),
- )
- ((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)
- # 向蓝牙APP发送数据
- def send(self, data):
- self.ble.gatts_notify(1, self.tx, data + '\n')
- def advertiser(self):
- name = bytes(self.name, 'UTF-8')
- adv_data = bytearray('\x02\x01\x02', 'UTF-8') + bytearray((len(name)
- + 1, 0x09), 'UTF-8') + name
- self.ble.gap_advertise(100, adv_data)
- """
- * @brief 程序入口
- * @param 无
- * @retval 无
- """
- if __name__ == "__main__":
-
- led = Pin(1, Pin.OUT,value = 1)
- # 创建蓝牙对象且设置蓝牙名称
- ble = ESP32S3_BLE("ESP32-S3 BLE")
-
- while True:
-
- # 打开LED
- if BLE_MESSAGE == 'LED ON':
- led.value(0)
- print('LED is ON.')
- ble.send('LED is ON.')
- BLE_MESSAGE = ""
- # 关闭LED
- elif BLE_MESSAGE == 'LED OFF':
- led.value(1)
- print('LED is OFF.')
- ble.send('LED is OFF.')
- BLE_MESSAGE = ""
-
- time.sleep_ms(100)
复制代码 在上述源码中,作者创建了一个名为“ESP32-S3 BLE”的蓝牙对象。通过调用该对象内部的方法,作者成功地构建了一个蓝牙服务器,并向周围的设备发送了广播信号。当某个APP或其他蓝牙设备与ESP32-S3的蓝牙连接成功建立时,系统会进入等待状态,直到APP发送“LED ON”或“LED OFF”命令。一旦接收到这些命令,系统会相应地控制LCD的亮灭,并向APP发送确认消息。
36.4 下载验证
程序下载至开发板之后,我们可在手机蓝牙管理找到ESP32-S3 BLE,如下图所示。
图36.4.1 搜索蓝牙设备
搜索到ESP32-S3蓝牙设备之后,在手机的应用商店APP下载BLE调试助手,如下图所示。
图36.4.2 下载BLE调试助手
打开BLE调试助手,在Scanner界面下往下刷新界面(搜索蓝牙设备),接着,找到“ESP32-S3 BLE”蓝牙设备,点击“CONNECT”连接设备,如下图所示。
图36.4.3 连接设备
连接成功之后,我们点击Unknown Service项目栏下的Unknown Characteristic选项下发数据至ESP32-S3开发板,如下图所示。
图36.4.4 下发数据的入口
点击上图中的向上箭头,选择发送数据模式和消息内容,如果我们下发“LED ON”消息时,则点亮开发板的LED;如果我们下发“LED OFF”消息,则熄灭开发板的LCD。
图36.4.5 下发数据
温馨提示:接收数据入口在图36.4.4中的“Unknown Characteristic”选项。 |