一、目的
??????? 這一節(jié)我們學(xué)習(xí)如何使用我們的ESP32開發(fā)板通過藍牙和手機進行通信。
二、環(huán)境
??????? ESP32 + 手機(筆者用的小米10) + Thonny IDE
三、藍牙介紹
??????? 這個知識大家自行百度吧,這里不再贅述什么是藍牙和藍牙的歷史,以及相關(guān)的專業(yè)知識。
四、手機藍牙調(diào)試APP
??????? 用的最多的是這三個:nRF Connect、BLE調(diào)試助手、LightBlue
筆者用的是:BLE調(diào)試助手
為什么用這個?因為小米手機應(yīng)用商店直接可以安裝,其他兩個沒搜到,哈哈。。。大家按需安裝哈!
nRF Connect GitHub 地址:
GitHub - nrfconnect/sdk-nrf: nRF Connect SDK main repositorynRF Connect SDK main repository. Contribute to nrfconnect/sdk-nrf development by creating an account on GitHub.https://github.com/nrfconnect/sdk-nrf
五、調(diào)試代碼
??????? 大家先把下面的代碼,拷貝到Thonny IDE中,保存到ESP32開發(fā)板中。
from machine import Pin
from machine import Timer
from time import sleep_ms
import bluetooth
BLE_MSG = "" # 定義一個空的變量
class ESP32_BLE():
def __init__(self, name):
self.led = Pin(2, Pin.OUT) # 創(chuàng)建LED對象,此LED為板載的藍色LED,它用的是GPIO口2
self.timer1 = Timer(0) # 定時器,ESP32有4個硬件定時器,此處使用的是0
self.name = name # 傳進來的參數(shù)name
self.ble = bluetooth.BLE() # 創(chuàng)建BLE對象
self.ble.active(True) # 啟動藍牙
self.ble.config(gap_name=name) # 配置藍牙,給藍牙起個名字
self.disconnected() # 調(diào)用函數(shù)執(zhí)行計時器
self.ble.irq(self.ble_irq) #藍牙調(diào)用中斷函數(shù)。當(dāng)手機發(fā)送數(shù)據(jù)給ESP32, ESP32藍牙收到數(shù)據(jù)后自動執(zhí)行此中斷
self.register() # 注冊
self.advertiser() # 廣播
def connected(self):
self.led.value(1) # 值為1表示藍色LED亮
self.timer1.deinit() # 取消計時器
def disconnected(self):
# 初始化定時器,設(shè)定周期100ms,模式為周期性的,回調(diào)函數(shù)
self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))
def ble_irq(self, event, data):
global BLE_MSG
if event == 1: #_IRQ_CENTRAL_CONNECT 手機已連接此設(shè)備
self.connected() # 調(diào)用函數(shù),實現(xiàn)藍牙沒連上時閃爍,連上后長亮的效果
elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手機已斷開此設(shè)備
self.advertiser() # 調(diào)用函數(shù),進行藍牙廣播
self.disconnected() # 藍牙斷開連接后,藍色LED又會閃爍
elif event == 3: #_IRQ_GATTS_WRITE 手機發(fā)送數(shù)據(jù)給此設(shè)備
buffer = self.ble.gatts_read(self.rx) # 接收來自手機的數(shù)據(jù)
BLE_MSG = buffer.decode('UTF-8').strip() # 將受到的數(shù)據(jù)安裝utf-8進行解碼,所以手機發(fā)送數(shù)據(jù)時應(yīng)該為utf-8編碼
def register(self):
service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
# 藍牙是通過服務(wù)來工作的
services = (
# 定義一個控制燈的服務(wù)
( # 這個括號里的代表一個服務(wù)
bluetooth.UUID(service_uuid), # 服務(wù)的ID
(
(bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY), # 服務(wù)類型:通知
(bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE), # 服務(wù)類型:寫入
)
),
# 下面也可以定義別的服務(wù)
# -- 其他服務(wù)
)
((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)
def send(self, data):
self.ble.gatts_notify(0, self.tx, data + '\n') # 藍牙發(fā)送通知信息
def advertiser(self): # 當(dāng)斷開連接時,開始廣播
name = bytes(self.name, 'UTF-8') # 將設(shè)備名字轉(zhuǎn)為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")
def buttons_irq(pin): # 創(chuàng)建BOOT按鍵函數(shù)
led.value(not led.value())
print('LED is ON.' if led.value() else 'LED is OFF')
ble.send('LED is ON.' if led.value() else 'LED is OFF')
if __name__ == "__main__":
ble = ESP32_BLE("ESP32 BLE") # 創(chuàng)建一個對象,帶1個實參,后面用來給BLE起名字用
but = Pin(0, Pin.IN) # 創(chuàng)建對象,ESP32開發(fā)板的USB接口的右邊的BOOT按鍵的GPIO口為0
but.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq) # 設(shè)置中斷
led = Pin(2, Pin.OUT) # 創(chuàng)建藍色LED對象
while True:
if BLE_MSG == 'led state': # 如果ESP32收到手機發(fā)來的數(shù)據(jù)
print("Query: " + BLE_MSG) # 打印出讀取到的信息
BLE_MSG = ""
print('LED is on\n' if led.value() else 'LED is off\n') # 如果燈亮輸出LED is on.
sleep_ms(8000) # 設(shè)置為5秒,大家發(fā)送查詢命令后,手機趕緊切換到通知頁面,等待接收ESP32發(fā)送的通知信息
ble.send('LED state is on' if led.value() else 'LED state is off') # 藍牙發(fā)送led數(shù)據(jù)給手機,如果燈亮發(fā)給手機“LED is on.”
elif BLE_MSG == 'led on': # 如果ESP32收到手機發(fā)來的數(shù)據(jù)
print("Command: " + BLE_MSG) # 打印出讀取到的信息
BLE_MSG = ""
if led.value() != 1:
led.value(1)
print('LED state is on\n' if led.value() else 'LED state is off\n')
elif BLE_MSG == 'led off': # 如果ESP32收到手機發(fā)來的數(shù)據(jù)
print("Command: " + BLE_MSG) # 打印出讀取到的信息
BLE_MSG = ""
if led.value() != 0:
led.value(0)
print('LED state is on\n' if led.value() else 'LED state is off\n')
sleep_ms(100)
六、調(diào)試效果
??????? 我們在Thonny中運行代碼,會看到ESP32 的藍色LED燈開始閃爍
?
?
?Thonny IDE 打印信息:
?然后我們在手機上打開BLE調(diào)試助手,連接我們的開發(fā)板
?然后看到顯示“連接成功”
?文章來源地址http://www.zghlxwxcb.cn/news/detail-460762.html
此時ESP32開發(fā)板的藍色LED燈停止閃爍 ,變?yōu)殚L亮
?然后我們就可以讀取一些信息,比如獲得開發(fā)板的名字:
?然后我們就可以控制開發(fā)板的藍色LED燈,查詢燈的狀態(tài)和控制燈的亮滅
?
然后我們切換到通知頁面,代碼會返回查詢的結(jié)果:
?
關(guān)燈:
?開燈:
?
然后我們在Thonny IDE中看到如下打印信息:
?文章來源:http://www.zghlxwxcb.cn/news/detail-460762.html
?
到了這里,關(guān)于物聯(lián)網(wǎng)開發(fā)筆記(53)- 使用Micropython開發(fā)ESP32開發(fā)板之藍牙BLE通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!