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, PWM
from machine import Timer
from time import sleep_ms

import bluetooth

BLE_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上的舵机等,有趣的实验等待小伙伴们挖掘。

2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
MicroPython-ESP32 是一个专门为 ESP32 设计的 MicroPython 库,它提供了许多 ESP32 的驱动程序和功能模块,可以方便地在 ESP32开发 MicroPython 项目。 MicroPython-ESP32 库包含了以下功能模块: - machine:提供了访问 GPIO、ADC、PWM、I2C、SPI、UART 等硬件资源的方法。 - network:提供了访问 WiFi、Ethernet 等网络资源的方法。 - time:提供了时间相关的方法,如获取当前时间、延时等。 - uos:提供了文件系统相关的方法,如创建文件、删除文件等。 - ujson:提供了 JSON 编码和解码的方法。 - urequests:提供了访问 HTTP 网络资源的方法。 - usocket:提供了访问 Socket 网络资源的方法。 - ustruct:提供了字节序列和 C 结构体之间转换的方法。 - utime:提供了时间相关的方法,如获取当前时间、延时等。 使用 MicroPython-ESP32 库很简单,只需要将库文件拷贝到 ESP32 上,并在 MicroPython 代码中引入需要的模块即可。例如,以下代码演示了如何使用 MicroPython-ESP32 库中的 machine 模块控制 ESP32 的 GPIO: ```python import machine # 配置GPIO 2为输出模式 p2 = machine.Pin(2, machine.Pin.OUT) # 将GPIO 2输出高电平 p2.value(1) # 将GPIO 2输出低电平 p2.value(0) ``` 需要注意的是,MicroPython-ESP32 库的使用需要先安装 MicroPython 固件。可以从 MicroPython 官方网站下载 ESP32MicroPython 固件,并使用 esptool.py 工具将固件烧录到 ESP32 上。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szu_ljm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值