零基础学ESP32:蓝牙BLE快速上手——用手机APP控制ESP32!
前面我们学了WiFi连接、远程控制,但WiFi需要连接路由器,配置起来稍显麻烦。今天要学一种更简单、更直接的通信方式——蓝牙BLE!
不需要路由器,不需要网络配置,手机打开蓝牙就能直接和ESP32通信。智能手环、蓝牙耳机、智能门锁……这些设备用的都是蓝牙技术。
今天这节课,我们就用ESP32 + 手机APP,实现蓝牙无线通信!
第一步:找到课程,看看成品效果
打开逗脑IDE,点击顶部 “文档”,在 “课程” → “ESP32 + MicroPython” 分类下,找到蓝牙BLE快速上手这节课。

打开课件,你会看到本节课的最终效果:手机通过蓝牙连接ESP32,发送指令read_LED,ESP32收到后回复LED当前状态;按下ESP32上的按键,手机也能实时收到通知。

第二步:什么是BLE?
蓝牙是一种短距离无线通讯技术,可以实现固定设备、移动设备之间的数据交换。
| 类型 | 说明 |
|---|---|
| 传统蓝牙(BR/EDR) | 蓝牙3.0之前的标准,功耗较高 |
| 低功耗蓝牙(BLE) | 蓝牙4.0规范下的LE蓝牙,功耗极低 |
本节课我们使用的是BLE(低功耗蓝牙),它的特点是:
- ✅ 功耗极低:适合电池供电的设备
- ✅ 连接快速:不需要复杂的配对过程
- ✅ 兼容性好:手机、平板、电脑都支持


第三步:手机APP准备
本节课使用安卓手机上的蓝牙调试APP(课件中推荐的是安卓手机的“蓝牙工坊”,其他类似APP也可以)。
APP需要具备以下功能:
- 搜索BLE设备
- 连接设备
- 查看服务列表(Service)
- 向特征值(Characteristic)写入数据
- 接收通知(Notify)

第四步:动手写代码——ESP32端
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)
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):
"""手机连接后,LED常亮"""
self.led.value(1)
self.timer1.deinit()
def disconnected(self):
"""手机断开后,LED闪烁提示"""
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: # 手机连接了此设备
self.connected()
elif event == 2: # 手机断开了此设备
self.advertiser()
self.disconnected()
elif event == 3: # 手机发送了数据
buffer = self.ble.gatts_read(self.rx)
BLE_MSG = buffer.decode('UTF-8').strip()
def register(self):
"""注册BLE服务"""
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)
# 按键中断:按下按键时,LED状态翻转并通知手机
def buttons_irq(pin):
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("ESP32BLE")
but = Pin(0, Pin.IN)
but.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq)
led = Pin(2, Pin.OUT)
while True:
if BLE_MSG == 'read_LED':
print(BLE_MSG)
BLE_MSG = ""
print('LED is ON.' if led.value() else 'LED is OFF')
ble.send('LED is ON.' if led.value() else 'LED is OFF')
sleep_ms(100)
代码核心逻辑:
| 部分 | 作用 |
|---|---|
register() | 注册BLE服务(Nordic UART Service) |
advertiser() | 开始广播,让手机能搜索到 |
ble_irq() | 中断处理:连接、断开、收到数据 |
send() | 向手机发送通知 |
buttons_irq() | 按键中断,LED翻转并通知手机 |
📌 版本要求: 请使用最新的MicroPython固件(推荐v1.19.1及以上)。
第五步:保存运行,手机搜索连接!
保存代码到开发板,命名 ble.py

点击运行按钮,ESP32开始广播BLE信号。
第六步:手机APP操作——搜索并连接ESP32
步骤1:打开APP,选择“低功耗蓝牙(BLE)”
打开安卓APP(如“蓝牙工坊”),点击右上角的“+”号,选择 “低功耗蓝牙(BLE)”。

步骤2:搜索设备,找到“ESP32BLE”
APP会开始扫描附近的BLE设备。在设备列表中找到名为 “ESP32BLE” 的设备(信号强度较高),点击“添加”。

步骤3:连接成功
点击连接后,APP显示“连接成功,等待发现服务…”,随后显示“连接成功,并发现服务”。

步骤4:查看服务列表
在APP中展开服务列表,可以看到如下的串口服务,选择 TX Characteristic 和 RX Characteristic
| 服务/特征 | UUID | 属性 |
|---|---|---|
| Nordic UART Service | 6e400001-... | - |
| TX Characteristic | 6e400003-... | 通知(N) |
| RX Characteristic | 6e400002-... | 写(W) |

第七步:手机向ESP32发送数据
在APP底部的写入区域输入数据 read_LED,点击“写入”。

ESP32收到后:
- 终端打印
read_LED - 终端打印
LED is ON.或LED is OFF. - 手机APP收到通知消息
第八步:ESP32向手机发送通知
按下ESP32开发板上的 BOOT按键(GPIO0),LED状态翻转,同时手机APP收到通知消息。

按下BOOT按键后:
- 终端打印
LED is ON.或LED is OFF. - 手机APP收到通知消息
通信协议说明
本节课使用了Nordic UART Service(NUS) 标准协议:
| UUID | 名称 | 用途 |
|---|---|---|
6E400001 | Service | 服务UUID |
6E400002 | RX | 手机→ESP32(写) |
6E400003 | TX | ESP32→手机(通知) |
简单理解:
- RX(写):手机往这里写数据,ESP32就能收到
- TX(通知):ESP32往这里发数据,手机就能收到通知
蓝牙BLE能做什么?
| 应用场景 | 用途 |
|---|---|
| 智能手环 | 手机同步健康数据 |
| 蓝牙门锁 | 手机开锁 |
| 遥控小车 | 手机控制方向 |
| 智能家居 | 手机控制灯光、风扇 |
| 无线调试 | 不用插线就能调试 |
| 数据采集 | 传感器数据实时传到手机 |
全程回顾
| 步骤 | 操作 | 效果 |
|---|---|---|
| 找到课程 | 文档→课程→ESP32+MicroPython→蓝牙BLE | 了解BLE原理 |
| 打开代码 | 点击“打开”按钮 | 代码进入编辑器 |
| 保存运行 | Ctrl+S → 选择ESP32 → 运行 | ESP32开始广播 |
| 手机搜索 | APP中选择BLE,搜索到“ESP32BLE” | 找到设备 |
| 连接设备 | 点击“ESP32BLE”连接 | 连接成功 |
| 查看服务 | 展开服务列表 | 看到TX和RX特征 |
| 发送数据 | 向ESP32写入“read_LED” | ESP32收到并回复 |
| 接收通知 | 手机收到LED状态通知 | 双向通信成功! |
更多推荐

所有评论(0)