1. 硬件准备与连接避坑指南
搞Arduino蓝牙通信,第一步就是硬件连接。别看只是几根线的事儿,这里面的坑我踩过不止一次。先说最基本的硬件清单:Arduino Nano开发板、HC-05蓝牙模块、杜邦线若干、还有你的智能手机。这些都是必备的,少一样都玩不转。
HC-05模块上有几个关键引脚需要特别注意:VCC接5V电源,GND接地,TXD和RXD负责数据收发。这里有个大坑——电平匹配问题。Arduino Nano是5V电平,而HC-05是3.3V设备。如果你直接把Nano的TXD接到HC-05的RXD,时间长了可能会烧模块。我当初就这么干过,损失了一个HC-05。
安全连接方案:最简单的办法是用两个电阻做分压电路。拿一个1kΩ和2kΩ的电阻串联,1kΩ接Nano的TXD,2kΩ接地,从中间抽头接到HC-05的RXD。这样5V信号就降到约3.3V了。如果嫌麻烦,也可以用现成的电平转换模块,某宝上几块钱一个。
接线时还有个细节:HC-05的STATE引脚可以告诉你连接状态。未连接时输出低电平,连接后变高电平。这个引脚可以接个LED指示灯,很实用。EN引脚用于切换工作模式和AT命令模式,一般通过按钮控制,调试时才会用到。
提示:给HC-05供电时最好单独供电,或者从Nano的5V引脚取电,不要用3.3V引脚,因为HC-05工作电流最大能达到30mA,Nano的3.3V引脚可能带不动。
2. 软件环境搭建与基础代码
硬件连好了,接下来是软件部分。你需要先安装Arduino IDE,这个没啥好说的,官网下载安装就行。重点在于代码编写和库的使用。
HC-05通常用SoftwareSerial库来模拟串口通信,这样既能避免占用硬件串口,又方便调试。我建议把蓝牙模块接到D10和D11引脚,因为这两个引脚中断功能比较完善,通信稳定。
先来看个最基础的示例代码:
#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
BTserial.begin(38400); // HC-05默认波特率
Serial.println("蓝牙已就绪,等待连接...");
}
void loop() {
// 从手机接收数据
if (BTserial.available()) {
char receivedChar = BTserial.read();
Serial.print("收到: ");
Serial.println(receivedChar);
// 回声测试
BTserial.print("Echo: ");
BTserial.println(receivedChar);
}
// 从串口监视器发送数据
if (Serial.available()) {
char sendChar = Serial.read();
BTserial.print("From PC: ");
BTserial.println(sendChar);
}
}
这段代码实现了最基本的回声功能:手机发什么,Arduino就回什么,同时在串口监视器显示。上传代码前,记得先把蓝牙模块的TX和RX线拔掉,否则可能会干扰程序上传。这是我踩过的另一个坑,上传失败了好几次才发现问题所在。
波特率设置:HC-05默认波特率通常是38400,但也可能是9600,具体看版本。如果不确定,可以先用AT命令查询(后面会讲怎么进入AT模式)。代码中的波特率一定要和模块设置一致,否则收到的全是乱码。
3. HC-05的AT命令配置详解
AT命令是配置HC-05的关键,但很多人卡在这一步。要进入AT模式,需要先在模块通电前按住按钮(或者将EN引脚拉高),然后上电。这时候模块指示灯会慢闪(约每秒一次),表示进入了AT模式。
进入AT模式后,需要用串口工具发送AT命令。我推荐用Arduino IDE自带的串口监视器,记得把行结束符改为"Both NL & CR",否则模块可能不响应。
常用AT命令清单:
- AT:测试通信,正常应返回OK
- AT+NAME?:查询模块名称
- AT+NAME=MyBT:设置名称为MyBT
- AT+PSWD?:查询配对密码
- AT+PSWD="1234":设置密码为1234
- AT+UART?:查询波特率
- AT+UART=9600,0,0:设置波特率为9600
注意:发送AT命令时,波特率要设置为38400(大多数HC-05的AT模式波特率),如果没反应,可以试试9600或115200。
我建议先用AT+NAME修改模块名称,这样在手机蓝牙列表中更容易识别。密码也可以改,但一定要记住,否则以后连不上。波特率建议设为9600,这个速率最稳定,兼容性也好。
常见问题:有时候发送AT命令没反应,可能是接线问题。AT模式下,Arduino的TX要接HC-05的TX,RX接RX,与正常通信时相反。这个反接逻辑坑了不少人,包括当年的我。
4. 手机端APP选择与使用技巧
手机端需要个蓝牙串口APP,商店里一搜一大把。Android我用过十几款,实测下来"Serial Bluetooth Terminal"最好用,界面简洁功能全。iOS推荐"BlueSerial",虽然收费但值这个价。
安装好APP后,先到手机系统设置里配对蓝牙模块。打开蓝牙,搜索设备,应该能看到你的HC-05(或者你改的名字)。点击配对,输入密码(默认1234),配对成功后就能在APP里看到了。
APP使用技巧:
- 连接前先进入APP设置,把发送新行(Newline)选项打开,这样每发送一条消息都会自动加换行符
- 编码格式选UTF-8,中文不会乱码
- 可以保存常用指令,比如开关命令,一键发送
如果连接不上,试试关闭手机蓝牙再重新打开,或者重启APP。有时候蓝牙协议栈会卡住,重启能解决90%的连接问题。
高级用法:很多APP支持按键自定义,你可以设置几个按钮,分别对应不同的控制指令。比如我做智能小车时,就设置了前进、后退、左转、右转四个按钮,每个发送不同的字符代码。
5. 双向通信实战与数据解析
基础的通信用回声测试没问题后,就该玩点真正的应用了。双向通信才是蓝牙模块的价值所在。
Arduino端代码升级:
#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11);
String inputString = ""; // 存储接收到的字符串
boolean stringComplete = false; // 字符串接收完成标志
void setup() {
Serial.begin(9600);
BTserial.begin(9600);
inputString.reserve(200); // 预留200字节内存
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// 处理从手机收到的数据
if (stringComplete) {
Serial.print("收到指令: ");
Serial.println(inputString);
if (inputString == "LED_ON") {
digitalWrite(LED_BUILTIN, HIGH);
BTserial.println("LED已开启");
} else if (inputString == "LED_OFF") {
digitalWrite(LED_BUILTIN, LOW);
BTserial.println("LED已关闭");
} else {
BTserial.print("未知指令: ");
BTserial.println(inputString);
}
inputString = "";
stringComplete = false;
}
// 读取传感器数据发送到手机
static unsigned long lastSendTime = 0;
if (millis() - lastSendTime > 2000) { // 每2秒发送一次
int sensorValue = analogRead(A0);
BTserial.print("SENSOR:");
BTserial.println(sensorValue);
lastSendTime = millis();
}
}
void serialEvent() {
while (BTserial.available()) {
char inChar = (char)BTserial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
这段代码实现了指令解析和定时发送传感器数据。手机发送"LED_ON"和"LED_OFF"控制LED,Arduino每2秒发送一次模拟引脚A0的读数。
数据格式建议:简单的项目可以用字符串指令,复杂点的建议用JSON格式。比如:
{"cmd":"setLED","value":1}
解析起来更规范,扩展性也好。
6. 常见问题排查与解决方案
玩蓝牙通信难免遇到各种问题,我总结了几类常见故障和解决方法。
连接问题:
- 手机搜不到模块:检查HC-05指示灯是否快闪(每秒2次),如果不是,可能是供电不足或模块故障
- 配对失败:确认密码是否正确,试试默认1234或0000
- 连接经常断开:可能是距离太远或有干扰,蓝牙Class2理论距离10米,实际隔墙就减半
数据问题:
- 收到乱码:检查波特率是否一致,Arduino、HC-05、手机APP三处的波特率要相同
- 数据丢失:尝试降低波特率或缩短发送间隔,蓝牙串口有流量限制
- 中文乱码:确保手机APP和Arduino代码都使用UTF-8编码
稳定性问题:
- 偶尔死机:给Arduino和HC-05的电源引脚加滤波电容,我用100μF电解电容并联0.1μF瓷片电容,效果很好
- 距离短:避免模块靠近金属物体或电源线,这些都会屏蔽信号
提示:如果问题实在解决不了,尝试用AT命令恢复出厂设置:AT+ORGL。这会重置所有参数,包括波特率、名称、密码等。
7. 项目拓展与实用案例
基础通信搞定后,可以做一些实际项目了。我最开始用蓝牙做无线传感器网络,后来玩智能家居控制,到现在做了不少有意思的东西。
智能家居控制器:用手机控制家里的灯、风扇等电器。需要加继电器模块,代码里根据收到的指令控制相应继电器开关。我做的时候加了定时功能,可以用手机设定开关时间。
环境监测站:接上温湿度传感器(DHT11/DHT22),实时把数据发送到手机。还可以加空气质量传感器、光照传感器等。数据多了可以用手机APP做图表显示,直观多了。
蓝牙遥控车:这是最经典的项目了。用手机控制小车前进后退,需要电机驱动模块(L298N或TB6612)。进阶版可以加超声波避障、摄像头图传等功能。
无线编程:没想到吧?HC-05还可以用来给Arduino无线下载程序。需要先用有线方式烧录个引导程序,之后就能通过蓝牙上传代码了。适合设备安装好后不方便接线的情况。
每个项目都要注意电源问题。电机之类的大功率设备最好单独供电,不要从Arduino上取电,否则电压波动可能导致模块重启或通信中断。
我做这些项目最大的体会是:开始简单,慢慢深入。先从控制一个LED开始,逐步增加功能,遇到问题解决问题,积累经验最重要。蓝牙通信是个很实用的技能,玩熟了还能用在其他无线项目中。
882



被折叠的 条评论
为什么被折叠?



