ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > 《ESP32-S3使用指南—MicroPython版 V1.0》第三十六章 BLE实验

《ESP32-S3使用指南—MicroPython版 V1.0》第三十六章 BLE实验

原创 嵌入式/内核开发 作者:正点原子 时间:2024-11-26 09:19:42 0 删除 编辑

第三十六章 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库的方法


       ①:激活或停用蓝牙,返回当前状态。

       其方法原型如下:

ble.active([is_active])

       该函数的参数描述,如下表所示。


表36.1.2.1 ble.active方法参数描述


       ②:配置蓝牙参数。

       其方法原型如下:

ble.config('gap_name', /)

        该方法的参数描述,如下表所示。


表36.1.2.2 ble.config方法参数描述


       ③:设置蓝牙中断。

       其方法原型如下:

ble.irq(handler, /)

        该函数的参数描述,如下表所示。


表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”选项。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3051168/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-30

  • 博文量
    588
  • 访问量
    764028