树莓派pico MicroPython与HC-05蓝牙模块连接实战
树莓派Pico + HC-05蓝牙模块:从零实现无线串口通信
你有没有试过这样的场景?
手里的树莓派Pico正在安静地读取传感器数据,却只能通过USB线把结果显示在电脑终端上——一旦断开连接,就“失联”了。如果能让它像手机一样, 无线收发信息 ,是不是瞬间就有了“智能设备”的感觉?
今天我们就来解决这个问题:用一块成本不到10元的 HC-05蓝牙模块 ,给你的Pico装上“无线电台”,实现和手机之间的双向通信。
整个过程不需要复杂的协议栈、不依赖安卓开发经验,只需几根杜邦线、一段MicroPython代码,就能打通物理世界与移动终端的链路。无论你是刚入门嵌入式的新手,还是想快速搭建原型的开发者,这套方案都值得收藏。
为什么选HC-05?它真的过时了吗?
市面上蓝牙模块五花八门:BLE(低功耗蓝牙)、Wi-Fi+蓝牙二合一、支持Mesh网络……相比之下,HC-05基于老式的 Bluetooth 2.0 + EDR ,既不省电也不支持现代手机主流的低功耗特性。那它还有存在的价值吗?
答案是: 有,而且很关键。
✅ 它赢在“简单”
- 协议透明 :只跑SPP(串口配置文件),所有数据当作普通串口字节流处理。
- 调试方便 :随便下个“Serial Bluetooth Terminal”类APP(Android平台搜一下就有),配对即用。
- 无需App开发 :不用写Java/Kotlin,也不需要注册蓝牙服务UUID。
- 价格便宜 :批量采购单价不到8元,适合教学套件或学生项目。
换句话说, 它是为“学会通信原理”而生的工具,而不是为了产品量产。
想象一下学开车时,教练车虽然老旧,但离合、油门、档位一个不少——HC-05就是嵌入式通信里的“教练车”。
硬件怎么接?别再搞反RX/TX了!
这是最常见的翻车点:明明程序没问题,可就是收不到数据。十有八九,是因为 TX和RX接错了方向 。
记住这个黄金法则:
发送方的TX → 接收方的RX
所以,树莓派Pico要和HC-05对话,就得交叉连线:
| Pico 引脚 | 连接到 | HC-05 引脚 |
|---|---|---|
| GP4 (UART1 TX) | → | RXD |
| GP5 (UART1 RX) | ← | TXD |
| GND | —— | GND |
| VBUS 或 外部3.3V | → | VCC |
📌 特别注意电压问题 :
- HC-05标称支持3.3V~6V供电,可以用Pico的VBUS(5V)直接供,但部分模块稳定性不佳。
- 更稳妥的做法是使用AMS1117-3.3V稳压芯片单独供电,尤其是后续要接入其他外设时。
- IO电平方面放心:HC-05的逻辑高电平为3.3V,与Pico完全兼容, 无需电平转换器 。
📌 EN/KEY脚怎么处理?
- 正常通信时:悬空或接地(GND)
- 需要进入AT命令模式修改参数时:拉高至VCC(可用按钮触发)
MicroPython代码实战:让Pico听懂蓝牙指令
现在轮到软件出场了。我们使用的不是C++也不是Arduino,而是更适合初学者的 MicroPython 。
先来看核心代码,后面逐行解析:
from machine import UART, Pin
import time
# 初始化UART1:使用GP4(TX), GP5(RX),波特率9600
uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5), bits=8, parity=None, stop=1)
# 板载LED,用于指示通信状态
led = Pin(25, Pin.OUT)
print("等待蓝牙连接...")
while True:
if uart.any(): # 缓冲区中有数据?
data = uart.read().decode('utf-8').strip()
print("收到:", data)
# 回复客户端
uart.write(f"Echo: {data}\r\n")
# 闪烁LED表示响应成功
led.on()
time.sleep(0.1)
led.off()
time.sleep(0.01) # 小延时,释放CPU资源
🔍 关键点拆解
UART(1) 是什么意思?
RP2040芯片有两个硬件UART控制器:
- UART0:默认占用GP0/GP1(常用于USB转串口调试)
- UART1:可用GP4/GP5、GP8/GP9等(我们选择前者)
这里指定 UART(1) 并手动绑定Pin(4)和Pin(5),系统会自动启用对应的硬件串口功能。
波特率必须一致!
HC-05出厂默认波特率通常是 9600bps ,也有部分版本是38400。如果你发现乱码,请优先怀疑这一点。
可以在AT模式下用指令设置统一速率:
AT+BAUD8 # 设置为9600
AT+BAUD4 # 设置为19200
AT+BAUD1 # 设置为38400
uart.any() 的妙用
这是一个非阻塞查询函数,返回缓冲区中是否有待读取的数据。相比 read() 可能阻塞等待,它更适合放在主循环里轮询,避免卡死。
中文乱码怎么办?
确保手机端串口APP设置编码为UTF-8。若仍异常,可在接收后尝试 .decode('latin1') 或添加错误容错:
try:
msg = data.decode('utf-8').strip()
except UnicodeError:
msg = data.decode('latin1').strip() # 兼容性更强
手机端怎么连?推荐这款神器APP
Android用户强烈推荐使用开源应用: Serial Bluetooth Terminal
它的优点非常明显:
- 界面简洁,支持十六进制/文本双模式收发
- 自动列出已配对设备
- 可保存常用命令按钮(比如控制小车前进后退)
- 完全免费无广告
操作步骤如下:
1. 打开APP → 点击“Connect a device” → 选择“Paired Devices”
2. 找到名为 HC-05 或你自定义名称的设备(如BlueTooth)
3. 输入配对密码(一般是 1234 或 0000 )
4. 连接成功后,在输入框敲字符,点击发送
你会看到Pico立刻回传:“Echo: xxx”,同时板载LED闪一下——恭喜,你们已经建立了第一条无线通信链路!
常见坑点 & 调试秘籍
别以为接上线就能通,下面这些问题是新手必踩的“雷区”:
❌ 问题1:搜索不到HC-05设备
排查思路 :
- 模块是否正常上电?观察LED是否慢闪(未连接)或快闪(尝试连接)?
- 是否误入AT模式?检查KEY脚是否被意外拉高。
- 模块是否已被绑定?某些旧版固件会自动重连上次主机,导致新设备无法接入。
🔧 解决方法:
- 断电重启模块
- 使用AT指令 AT+RESET 重置
- 删除手机蓝牙缓存记录再重试
❌ 问题2:能连上,但收到一堆乱码
典型症状:显示“çþûþÿ”之类的符号。
原因几乎可以锁定: 波特率不匹配!
🔧 解决方法:
1. 确认Pico代码中 baudrate=9600
2. 用USB-TTL模块进入HC-05的AT模式,执行:
bash AT # 应返回OK AT+NAME? # 查看当前名称 AT+BAUD? # 查看当前波特率
3. 如不符,用 AT+BAUD8 强制改为9600
⚠️ 注意:AT指令需逐条发送,每条后加回车(\r\n),且一次只能发一条。
❌ 问题3:只能单向通信(能发不能收,或反之)
常见于电源不足或线路干扰。
🔧 解决建议:
- 改用外部稳压电源供电(不要靠USB线“带载”)
- TX/RX线上加1kΩ电阻做阻抗匹配
- 增加 time.sleep(0.01) 防止循环过快导致丢包
- 检查串口APP是否开启了“自动换行”或“发送换行符”
实战升级:不只是回声测试
当你完成了基础通信,就可以开始玩些更实用的功能了。
🎮 场景1:蓝牙遥控小车
if "FORWARD" in data:
motor_forward()
elif "LEFT" in data:
turn_left()
elif "STOP" in data:
stop_all()
手机APP设置几个按钮,分别发送 FORWARD 、 LEFT 、 STOP ,Pico解析后驱动L298N电机模块即可。
🌡️ 场景2:无线温湿度监控
配合DHT11传感器,定时上报环境数据:
import dht
sensor = dht.DHT11(Pin(16))
def send_env_data():
sensor.measure()
temp = sensor.temperature()
humi = sensor.humidity()
uart.write(f"T:{temp}°C H:{humi}%\r\n")
手机端就能实时看到室内温湿度变化曲线。
💡 场景3:远程开关灯
relay = Pin(17, Pin.OUT)
if "ON" in data:
relay.on()
uart.write("Relay ON\r\n")
elif "OFF" in data:
relay.off()
uart.write("Relay OFF\r\n")
结合继电器模块,实现简单的智能家居控制。
设计进阶:不只是“能用”,更要“可靠”
当你从小实验走向实际项目,以下几个工程细节值得关注:
🔋 供电设计
- 不要用Pico的3.3V引脚带动HC-05 + 其他负载,容易造成电压跌落。
- 推荐使用独立的AMS1117或LM1117-3.3V模块,并加0.1μF陶瓷电容滤波。
🛡️ 抗干扰措施
- TX/RX走线尽量短,远离电机、继电器等噪声源。
- 在HC-05电源脚附近并联10μF电解电容 + 0.1μF瓷片电容,抑制纹波。
- 高可靠性场合可加入TVS二极管防ESD静电击穿。
🔧 参数定制化(AT指令大全)
进入AT模式后,你可以个性化配置模块行为:
| 指令 | 功能 |
|---|---|
AT | 测试通信是否正常 |
AT+NAME=MyPico | 修改设备名称 |
AT+PIN=8888 | 修改配对密码 |
AT+ROLE=1 | 设为主机模式 |
AT+CMODE=0 | 固定连接特定地址 |
AT+UART=9600,0,0 | 设置波特率、停止位、校验位 |
📌 提示:不同HC-05固件版本AT指令略有差异,建议先发 AT 确认响应。
总结:这不仅仅是一次通信实验
我们完成的不只是“Pico和手机通了个信”,而是构建了一个完整的 无线交互闭环系统 :
- 物理层:UART串口 + 蓝牙射频
- 协议层:SPP透明传输
- 控制层:MicroPython事件响应
- 用户层:移动端可视化操作
这套组合拳的核心意义在于: 让你第一次真正感受到“设备能对外界做出反应”的乐趣。
未来你可以沿着这条路继续深入:
- 加入WiFi模块(ESP-01S)接入MQTT服务器
- 升级为BLE模块(HM-10)适配iOS生态
- 结合Web界面打造远程监控平台
但请记住—— 每一个复杂的物联网系统,都是从一个最简单的“Hello World”开始的。
你现在写的这段回声程序,也许就是你下一个智能项目的起点。
如果你动手实现了这个项目,欢迎在评论区分享你的成果照片或遇到的问题。也可以告诉我你想控制什么设备?我们可以一起设计下一步玩法。
更多推荐



所有评论(0)