我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MicroPython开发ESP32入门笔记 -- 蓝牙篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MicroPython开发ESP32入门笔记 -- 蓝牙篇

文章目录


前言

博主之前学习了用C语言去开发了51单片机,虽然没有将各种外设和传感器都玩遍,但博主基本将一些重要的外设和传感器通过原理学习加小项目实验的方式比较深入地玩了一下。众所周知,51单片机是相对底层的,用来开发一些大项目的效率会比较低,所以我们很有必要学习一下stm32、esp32的开发。

博主希望下来学习用MicroPython来开发esp32,先从esp32的特色功能蓝牙和WiFi玩起,再接触一下之前没有玩过的传感器和外设:DHT11温湿度传感器、超声波传感器、MG60s舵机、PIR红外传感器等。整个过程中,我们都会通过MQTT、蓝牙、WiFi的形式让esp32和其他设备进行交互。

一、 ESP32 和 Micropython 简介

在这里插入图片描述

ESP32是一系列低成本,低功耗的单片机微控制器,集成了Wi-Fi和双模蓝牙。 ESP32系列采用Tensilica Xtensa LX6微处理器,包括双核心和单核版本,内置天线开关,RF射频模块,功率放大器,低噪声接收放大器,滤波器和电源管理模块。ESP32 可作为独立系统运行应用程序或作为主机 MCU 的从设备,通过 SPI / SDIO 或 I2C / UART 接口提供 Wi-Fi 和蓝牙功能。

MicroPython是一种非常小巧的Python解释器,它能运行于微控制器和其他嵌入式系统中。它的设计使得它可以轻易地运行于微处理器上,并且拥有丰富的类库,特别适合开发嵌入式应用程序。MicroPython的核心功能可以在几秒钟内完成,允许开发者快速构建完整的嵌入式系统,而不必编写大量的代码。MicroPython还可以被用于在微控制器上控制传感器和执行其他操作,可以帮助开发者利用微控制器的全部功能。此外,MicroPython还可以被用作与互联网连接的IoT设备的开发平台,以及其他复杂的嵌入式应用程序。博主这里用的MicroPython的IDE是Thonny和Upycraft。

二、蓝牙模组通讯原理简介

在这里插入图片描述

蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主端,另一为从端,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。

蓝牙主端设备发起呼叫,首先是查找周围可被查找的蓝牙设备。主端设备找到从端蓝牙设备后,与从端蓝牙设备进行配对时输入从端设备的PIN 码,也有设备不需要输入PIN码。配对完成后,从端蓝牙设备会记录主端设备的信任信息,此时主端即可向从端设备发起呼叫,已配对的设备在下次呼叫不需要重新配对。已配对的设备,做为从端的蓝牙耳机也可以发起建链请求,但做数据通讯的蓝牙模块一般不发起呼叫。 链路建立成功后,主从两端之间即可进行双向的数据通讯。在通信状态下,主端和从端设备都可以发起断链,断开蓝牙链路。

蓝牙设备在出厂前即提前设好两个蓝牙设备之间的配对信息,主端预存有从端设备的PIN 码、 地址等,两端设备加电即自动建链,透明串口传输,无需外围电路干预。一对一应用中从端设备可以设为两种类型,一是静默状态,即只能与指定的主端通信,不被别的蓝牙模组查找;二是开发状态,既可被指定主端查找,也可以被别的蓝牙设备查找建链。蓝牙通讯和I2C通讯有相似之处,都存在主机和从机,主机和从机的应答都遵照一定的标准,都有唯一的地址来进行寻找配对。

蓝牙技术利用短距离、低成本的无线连接替代了电缆连接,从而为现存的数据网络和小型的外围设备接口提供了统一的连接。

在这里插入图片描述

三、手机端和ESP32蓝牙通讯

1. ESP32蓝牙呼吸灯代码

首先要定义一个蓝牙的类,蓝牙的类包括初始化函数,连接函数,连接状态判断函数,地址注册函数,发送数据函数,广播函数,然后实例化为ble,先调用状态判断函数接收其他终端返回的数据,然后按UTF-8解码,如果消息是开灯就以打开呼吸灯,如果消息是关灯就以关闭呼吸灯

from machine import Pin, PWMfrom machine import Timerfrom time import sleep_msimport bluetoothBLE_MSG = ""class ESP32_BLE():    def __init__(self, name):        self.led = PWM(Pin(2))        self.freq = PWM(Pin(2)).freq(1000)        self.timer1 = Timer(0)        self.name = name        self.ble = bluetooth.BLE()        self.ble.active(True)        self.ble.config(gap_name=name)        self.disconnected()        self.ble.irq(self.ble_irq)        self.register()        self.advertiser()    def connected(self):        self.led.duty(1023)        self.timer1.deinit()    def disconnected(self):        self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: led.duty(500))            def ble_irq(self, event, data):        global BLE_MSG        if event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备            self.connected()        elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备            self.advertiser()            self.disconnected()        elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据             buffer = self.ble.gatts_read(self.rx)            BLE_MSG = 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)    def send(self, data):        self.ble.gatts_notify(0, self.tx, data + '\n')    def advertiser(self):        name = bytes(self.name, 'UTF-8')        adv_data = bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name        self.ble.gap_advertise(100, adv_data)        print(adv_data)        print("\r\n")if __name__ == "__main__":    ble = ESP32_BLE("ESP32BLE")    led = PWM(Pin(2))    while True:        if BLE_MSG == 'LED ON':            print(BLE_MSG)            for i in range(0,1023):                led.duty(i)                sleep_ms(3)            BLE_MSG = ""            print('LED is ON.')            ble.send('LED is ON.')                elif BLE_MSG == 'LED OFF':            print(BLE_MSG)            for i in range(1023,-1,-1):                led.duty(i)                sleep_ms(3)            BLE_MSG = ""            print('LED is OFF.')            ble.send('LED is OFF.')        sleep_ms(100)

2. 手机端准备

在这里插入图片描述
手机端要下载LightBlue这个软件,下载后需要搜索esp32的蓝牙名称然后连接上

在这里插入图片描述

连接上后将16进制编码转换成UTF-8编码的格式,要与esp32端保持一致

在这里插入图片描述

然后写入esp32端编好的命令,即"LED ON" 和 “LED OFF” ,然后点击按钮就可以发现esp32上自带的灯以呼吸灯的方式打开或者关闭

在这里插入图片描述

允许监听后就可以收到esp32发来的数据,实验中每次你在手机端发出打开或者关闭呼吸灯的命令后,你的手机都会收到esp32发来的对应的提醒

在这里插入图片描述

总结

以上就是今天esp32蓝牙篇的入门笔记,本片笔记简单地介绍了esp32蓝牙通讯的应用,但举一反三地我们可以将该原理应用于其他方面,比如esp32通过蓝牙给手机端传输超声波传感器的距离、手机通过蓝牙控制esp32上的舵机等,有趣的实验等待小伙伴们挖掘。

来源地址:https://blog.csdn.net/m0_55202222/article/details/129252154

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MicroPython开发ESP32入门笔记 -- 蓝牙篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Android】蓝牙快速开发工具包-入门级

开头语 方便快速开发蓝牙,封装常用的操作。 需要以下三个权限: android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN android.permission.ACCES
2022-06-06

零基础入门篇之Linux及Arm-Linux程序开发笔记

前言:本文记录了自己从一个完全不懂Linux的人如何一步步学会Linux程序开发的过程。当然也希望本文能够达到它的目的,让那些和我一样没有任何基础的人也能快速入门Linux程序开发。 一、Arm-Linux程序开发平台简要介绍Arm-Lin
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录