📱 BLE 蓝牙开发入门:用手机控制开发板 LED
学 BLE,不从点灯开始,等于白学。
这一篇,我们用最经典、成功率最高的 BLE Demo:
手机 → 蓝牙 → 单片机 → 控制 LED帮你真正入门 BLE,而不是只停留在"概念层"。
一、BLE 到底在干嘛?先用一句话讲清楚
BLE(Bluetooth Low Energy)本质是:
通过"属性(Attribute)"读写数据,实现设备之间的交互。
点灯这件事,本质上就是:
- 手机 写一个值
- MCU 收到这个值
- MCU 根据值控制 GPIO
二、BLE 架构速览(新手必懂)
在 BLE 中,有 3 个关键角色:
| 名称 | 作用 |
|---|---|
| Central | 手机(主控) |
| Peripheral | 开发板 |
| GATT Server | 提供服务与特征 |
本例中:
- 手机 = Central
- 开发板 = Peripheral + GATT Server
三、整体方案设计(先有全局观)
我们要做什么?
- 开发板广播 BLE
- 手机扫描并连接
- 手机写 LED 控制指令
- MCU 收到写事件
- 控制 LED 亮 / 灭
数据设计(非常重要)
我们设计一个最简单的协议:
| 写入值 | 含义 |
|---|---|
| 0x00 | LED OFF |
| 0x01 | LED ON |
四、准备工作说明
硬件
- 任意支持 BLE 的 MCU
(如 EFR32 / nRF52 / ESP32 / STM32WB) - 一个 LED(板载即可)
软件
-
MCU 官方 BLE SDK
-
手机 BLE 调试 App
推荐:
- nRF Connect
- LightBlue
五、BLE 服务与特征设计(核心)
BLE 通信的核心是:
Service + Characteristic
1️⃣ 自定义 LED Service
text
Service UUID: 0xFFF0
2️⃣ LED Control Characteristic
text
Characteristic UUID: 0xFFF1
Property: Write / Write Without Response
六、MCU 端关键实现思路
1️⃣ 初始化 BLE 并开始广播
逻辑上等价于:
c
ble_init();
ble_start_advertising();
手机能扫描到你,说明这一步成功了。
2️⃣ 处理手机写特征值事件(重点)
BLE SDK 一般会给你一个 写事件回调:
c
void on_led_char_write(uint8_t *data, uint16_t len)
{
if(data[0] == 0x01)
{
LED_ON();
}
else
{
LED_OFF();
}
}
注意几点:
- 不要在这里做复杂逻辑
- 只解析数据 + 控 GPIO
- 保证执行快
七、手机端操作步骤(新手成功率 100%)
-
打开 nRF Connect
-
扫描设备
-
找到你的开发板
-
点击连接
-
展开 GATT
-
找到
FFF1特征 -
写入:
01→ LED 亮00→ LED 灭
如果 LED 跟着变化------
🎉 恭喜,BLE 通了。
八、为什么 BLE 点灯是"入门必做"?
因为这个例子:
-
覆盖了 BLE 全流程
-
能验证:
- 广播是否成功
- 连接是否稳定
- GATT 是否正确
- 数据链路是否可用
一句话:
点亮 LED,等于验证了 BLE 的 80%。
九、新手最常踩的 8 个坑
❌ 扫描不到设备
- 广播没开
- UUID 配错
- 手机没开蓝牙
❌ 能连上但写无效
- Characteristic 没开 Write
- 回调函数没注册
❌ 写一次就断开
- 回调里做了阻塞操作
- 栈溢出
❌ LED 状态不对
- GPIO 没初始化
- 高低电平反了
❌ 手机上写的是字符串 "01"
👉 BLE 是 字节,不是 ASCII。
十、这个 Demo 的工程价值
它不是玩具。
它是后续所有 BLE 项目的基础:
- BLE 控制继电器
- BLE 控制电机
- BLE 参数配置
- BLE OTA
- BLE 智能家居
十一、下一步可以怎么进阶?
- LED 状态 Notify 回手机
- 多个 LED / 多路 IO
- 加入密码 / 加密
- BLE + RTOS
- BLE 低功耗优化
十二、总结一句话
BLE 学习的第一道门槛,
就是让"手机写的数据,真的能控制硬件"。
当你用手机点亮 LED 的那一刻,
你已经真正走进了 BLE 工程开发。