搜索
bottom↓
回复: 0

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

[复制链接]

出0入234汤圆

发表于 2024-9-2 10:56:10 | 显示全部楼层 |阅读模式
2.jpg
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
1.png
3.png

第三十六章 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蓝牙的构造对象方法如下:
  1. class bluetooth.BLE()
  2. 使用示例:ble = bluetooth.BLE()
复制代码
       返回值:BLE蓝牙对象。

       二、BLE库的方法

       ①:激活或停用蓝牙,返回当前状态。
       其方法原型如下:
  1. ble.active([is_active])
复制代码
       该函数的参数描述,如下表所示。

1.png
表36.1.2.1 ble.active方法参数描述

       ②:配置蓝牙参数。
       其方法原型如下:
  1. ble.config('gap_name', /)
复制代码
       该方法的参数描述,如下表所示。

2.png
表36.1.2.2 ble.config方法参数描述

       ③:设置蓝牙中断。
       其方法原型如下:
  1. ble.irq(handler, /)
复制代码
       该函数的参数描述,如下表所示。
3.png
表36.1.2.3 ble.irq方法参数描述

       ④:接收蓝牙数据。
       其方法原型如下:
  1. ble.gatts_read(value_handle, /)
复制代码
       该方法的参数描述,如下表所示。

4.png
表36.1.2.3 ble.atts_read方法参数描述

       ⑤:发送蓝牙数据。
       其方法原型如下:
  1. ble.gatts_notify(conn_handle, value_handle, data=None, /)
复制代码
       该方法的参数描述,如下表所示。

5.png
表36.1.2.4 ble.gatts_notify方法参数描述

       ⑥:注册蓝牙服务器。
       其方法原型如下:
  1. ble.gatts_register_services(services_definition, /)
复制代码
       该方法的参数描述,如下表所示。

6.png
表36.1.2.5 ble.gatts_register_services方法参数描述

       ⑦:允许设备向周围的其他BLE设备发送广播信号,以便它们可以发现并连接到该设备。
       其方法原型如下:
  1. ble.gap_advertise(interval_us, adv_data=None, *)
复制代码
       该方法的参数描述,如下表所示。

7.png
表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 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。

第三十六章 BLE实验2073.png
图36.3.1.1 程序流程图

       36.3.2 程序解析
       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。BLE实验main.py源码如下:
  1. from machine import Pin,Timer
  2. import time
  3. import bluetooth


  4. # 定义全局变量
  5. BLE_MESSAGE = ""

  6. """
  7. * @brief       蓝牙类
  8. * @param       无
  9. * @retval      无
  10. """
  11. class ESP32S3_BLE():

  12.     def __init__(self, name):
  13.         # 获取定时器0句柄
  14.         self.timer1 = Timer(0)
  15.         self.name = name
  16.         # 初始化蓝牙
  17.         self.ble = bluetooth.BLE()
  18.         # 开启蓝牙
  19.         self.ble.active(True)
  20.         # 设置蓝牙名称
  21.         self.ble.config(gap_name=name)
  22.         # 配置定时器0且开启定时器
  23.         self.disconnected()
  24.         # 配置蓝牙回调函数
  25.         self.ble.irq(self.ble_irq)
  26.         # 注册蓝牙
  27.         self.register()
  28.         self.advertiser()

  29.     # 蓝牙连接时,点亮LED且关闭定时器0
  30.     def connected(self):
  31.         led.value(1)
  32.         self.timer1.deinit()

  33.     # 蓝牙断开时,闪烁LED
  34.     def disconnected(self):        
  35.         self.timer1.init(period=1000, mode=Timer.PERIODIC,
  36. callback=lambda t: led.value(not led.value()))

  37.     # 蓝牙回调函数
  38.     def ble_irq(self, event, data):
  39.         
  40.         global BLE_MESSAGE
  41.         # _IRQ_CENTRAL_CONNECT 蓝牙终端链接了此设备
  42.         if event == 1:
  43.             self.connected()
  44.         # _IRQ_CENTRAL_DISCONNECT 蓝牙终端断开此设备
  45.         elif event == 2:
  46.             self.advertiser()
  47.             self.disconnected()
  48.         # _IRQ_GATTS_WRITE 蓝牙终端向ESP32-S3发送数据,接收数据处理
  49.         elif event == 3:  
  50.             buffer = self.ble.gatts_read(self.rx)
  51.             BLE_MESSAGE = buffer.decode('UTF-8').strip()
  52.             
  53.     def register(self):
  54.         service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
  55.         reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
  56.         sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
  57.         services = (
  58.             (
  59.                 bluetooth.UUID(service_uuid),
  60.                 (
  61.                     (bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY),
  62.                     (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE),
  63.                 )
  64.             ),
  65.         )
  66.         ((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)
  67.     # 向蓝牙APP发送数据
  68.     def send(self, data):
  69.         self.ble.gatts_notify(1, self.tx, data + '\n')
  70.     def advertiser(self):
  71.         name = bytes(self.name, 'UTF-8')
  72.         adv_data = bytearray('\x02\x01\x02', 'UTF-8') + bytearray((len(name)
  73. + 1, 0x09), 'UTF-8') + name
  74.         self.ble.gap_advertise(100, adv_data)

  75. """
  76. * @brief       程序入口
  77. * @param       无
  78. * @retval      无
  79. """
  80. if __name__ == "__main__":
  81.    
  82.     led = Pin(1, Pin.OUT,value = 1)
  83.     # 创建蓝牙对象且设置蓝牙名称
  84.     ble = ESP32S3_BLE("ESP32-S3 BLE")
  85.    
  86.     while True:
  87.         
  88.         # 打开LED
  89.         if BLE_MESSAGE == 'LED ON':
  90.             led.value(0)
  91.             print('LED is ON.')
  92.             ble.send('LED is ON.')
  93.             BLE_MESSAGE = ""
  94.         # 关闭LED
  95.         elif BLE_MESSAGE == 'LED OFF':
  96.             led.value(1)
  97.             print('LED is OFF.')
  98.             ble.send('LED is OFF.')
  99.             BLE_MESSAGE = ""
  100.         
  101.         time.sleep_ms(100)
复制代码
       在上述源码中,作者创建了一个名为“ESP32-S3 BLE”的蓝牙对象。通过调用该对象内部的方法,作者成功地构建了一个蓝牙服务器,并向周围的设备发送了广播信号。当某个APP或其他蓝牙设备与ESP32-S3的蓝牙连接成功建立时,系统会进入等待状态,直到APP发送“LED ON”或“LED OFF”命令。一旦接收到这些命令,系统会相应地控制LCD的亮灭,并向APP发送确认消息。

       36.4 下载验证
       程序下载至开发板之后,我们可在手机蓝牙管理找到ESP32-S3 BLE,如下图所示。

第三十六章 BLE实验5277.png
图36.4.1 搜索蓝牙设备

       搜索到ESP32-S3蓝牙设备之后,在手机的应用商店APP下载BLE调试助手,如下图所示。

第三十六章 BLE实验5340.png
图36.4.2 下载BLE调试助手

       打开BLE调试助手,在Scanner界面下往下刷新界面(搜索蓝牙设备),接着,找到“ESP32-S3 BLE”蓝牙设备,点击“CONNECT”连接设备,如下图所示。

第三十六章 BLE实验5443.png
图36.4.3 连接设备

       连接成功之后,我们点击Unknown Service项目栏下的Unknown Characteristic选项下发数据至ESP32-S3开发板,如下图所示。

第三十六章 BLE实验5537.png
图36.4.4 下发数据的入口

       点击上图中的向上箭头,选择发送数据模式和消息内容,如果我们下发“LED ON”消息时,则点亮开发板的LED;如果我们下发“LED OFF”消息,则熄灭开发板的LCD。

第三十六章 BLE实验5639.png
图36.4.5 下发数据

       温馨提示:接收数据入口在图36.4.4中的“Unknown Characteristic”选项。

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-17 16:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表