蓝牙模块HC05的双设备简单配对通信
HC05采用的是AT指令进行配置, 采用串口通信进行数据传输。
指令集文档可以任意在互联网中查找到。
如何完成手机蓝牙和模块通信
电源是5V,同时采用CL/LF
连接之后,先通过
AT+ROLE=0
将其设置为从模式(slave),即可匹配(1234)
注意:
- HC05,VCC接入3.3V可能没有反应,应连到5V
- 模块和电源相连时刻,有两种方法进入AT指令状态:
- 提前一直按下HC-05上的按键,直到其灯闪烁为缓慢亮起,即可松开
- 将EN引脚置高(3.3V即可),但需要注意EN为高电平是HC05不能正常工作,只有将EN调为低电平,HC05恢复
- 波特率需要一致,建议统一38400
- 模块所有AT指令需要加上换行符号否则无效(即选择CR/LF),且尽量大写
https://combofish.github.io/2020/02/08/how-to-use-hc-05-bluetooth-module.html
#include <SoftwareSerial.h>
// Pin3为RX,接HC05的TXD
// Pin2为TX,接HC05的RXD
SoftwareSerial BT(10, 11);
char val;
int ledPin=13;
void setup() {
Serial.begin(38400);
Serial.println("BT is ready!");
// HC-05默认,38400
BT.begin(38400);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
void loop() {
if (Serial.available()) {
val = Serial.read();
BT.print(val);
}
if (BT.available()) {
val = BT.read();
Serial.print(val);
if (val == '1')
{
// 返回到手机调试程序上
// 此时的蓝牙状态应该正常模式,而不是调试模式
Serial.write("Serial--ledPin--high\n");
digitalWrite(ledPin, HIGH);
}
if (val == '2')
{
Serial.write("Serial--ledPin--low\n");
digitalWrite(ledPin, LOW);
}
}
}
双蓝牙模块连接(主从模式)
一个通过连接PC由串口通信(模拟一个设备的指令操作)
另一个采用Arduino进行点灯来作为从设备的响应动作
首先需要将其配置
这里首先采用较为安全的固定地址相连接:
将主设备调试(测试能否正常工作)
AT
如果不能,可能是串口波特率问题
调整设备通信波特率
查看波特率:
AT+UART?
发现波特率不一致为9600时进行更改,默认状态下就是两个波特率,正常模式下就是9600,这里我们将其更改为38400方便调试,当然也可能会带来一定的问题。
更改波特率:
AT+UART=38400,0,0
调整主从设备模式
AT+ROLE=1
调整连接模式:
AT+CMODE=0
绑定从机:
在获取到从机的address之后(查询从机地址指令AT+ADDR?),我们进行绑定:
注意:此处将冒号,替换成了逗号(英文状态下的逗号)
最后,(莫名)成功了,刚开始连接上后,无法正常通信,重启了就好了。
从机代码较为简单:
在对芯片作简要的波特率修正和查询addr之后采用Arduino 编程即可,代码同上不用修改。
总结
在本次的实验中,我们通过PC端连接一个蓝牙模块作为主设备(master)来通过串口发送数据,通过另一个 HC-05 传递数据,进而使得另一边的Arduino设备实现点灯功能。
主要涉及了串口收发以及对多串口应用的理解,在Arduino和PC通信(下载线)的同时又通过另一个串口和HC05通信,两串口间的数据传递以及在PC屏幕上的数据呈现,要求了我们对于不同串口的特点的理解:即该串口Print将会到何处,该串口Receive将会收到谁的,我们如何呈现到PC(即将PC和设备相连的串口进行发送或者说转发),从而进一步熟悉了数据的流动特点。
串口的首发,乃至于说数据包的收发,可以参考另一个WiFi项目的串口收发,也可看出串口通信在实际的物联网通信应用中十分广泛。