博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arduino---HC-05 蓝牙模块
阅读量:4345 次
发布时间:2019-06-07

本文共 3454 字,大约阅读时间需要 11 分钟。

蓝牙基础知识回顾:

(一)Arduino和HC-05连接

注意:Arduino通过TX与HC-05进行通信,而Arduino的电压为5V,HC-05的允许电压为3.3V。短时间通信无妨(长时间可能烧毁HC-05)<接分压电路>

U = 5*20/30 = 3.3VI = 5V/(10K+20K) = 0.16mA

(二)Arduino和HC-05和手机通信

1.手机发送信息给蓝牙 2.蓝牙将信息通过TX口发送给Arduino的串口缓冲区(Arduino可以接收) 3.Arduino只需要Serial.read()操作就可以取出蓝牙传过来的数据

 

缺点:使用Serial.read()读取数据,可能也会读取到电脑串口发送的数据(导致数据混乱)

所以推荐使用SoftwareSerial.h头文件进行蓝牙操作(操作方法下面有使用)--------软件串行接口

补充:串口透传---透明传输

蓝牙传输数据使用透明传输:在传输过程中数据不发生任何形式的变化,仿佛传输过程是透明的,数据原封不动的从发送方传输到接收端

补充:硬件串行接口和软件串行接口

Serial---硬件串行接口SoftwareSerial---软件串行接口

一:问题

(一)出现在AT模式下只有第一个命令可以正确返回OK,其他返回ERROR(0)

(二)出现手机和蓝牙相连发送数据始终乱码,不正确问题

二:解决问题1:进入AT模式

(一)HC-05在AT模式下的频率必须是38400

(二)注意在命令结束后面都需要我们加上回车符

(三)arduino下设置代码,进入AT模式

//HC-05进入设置AT模式#include 
SoftwareSerial BT(8,9);void setup(){ //开启电脑通信串口,因为HC-05的波特率为38400,两者通信保持一致 Serial.begin(38400);  //开启蓝牙,设置波特率38400,进入AT模式 BT.begin(38400); //告诉电脑,蓝牙准备好了 Serial.println("BT is ready!");}char AT_Cmd,AT_Rec;void loop(){ //若是电脑发送信息 if(Serial.available()>0) { //读取信息,并且将信息发送给蓝牙,进行AT设置 AT_Cmd = Serial.read(); BT.print(AT_Cmd); } //若是接收到蓝牙返回的信息:一般设置后返回OK if(BT.available()>0) { AT_Rec = BT.read(); Serial.print(AT_Rec); }}
疑惑:为什么在BT.available下,电脑依旧会一直显示蓝牙回收的信息(难道蓝牙在一直发送响应信息)?

(四)重点:解决问题一(除了第一个以外的其他命令返回error)

HC-05的EN脚先接3.3V,接着按着KEY键不放,然后给模块上电(供5V)后,这一瞬间模块进入了AT命令响应状态, 你才可以在串口调试助手里面输入一条AT命令; 如果想再输入一条AT命令,你必须重复刚才的过程(断电后再按KEY键再上电), 也就是说模块在进入了AT命令响应状态后只能响应一条AT命令(原因不明,不知道是不是只有我的这样)

按住先断开HC-05的vcc接线(断电),然后一直按住Key,再接上vcc进行通电,通电后1s可以松开Key。每当需要发送一条AT数据,都需要重复上面操作

(五)其他方法解决问题1

1.使用其他串口工具(未使用)

2.在调试代码中直接写入AT指令(测试可用)

#include 
SoftwareSerial BT(8,9);void setup(){ //开启电脑通信串口,因为HC-05的波特率为38400,两者通信保持一致 Serial.begin(38400); BT.begin(38400); //告诉电脑,蓝牙准备好了 Serial.println("BT is ready!"); BT.println("AT"); delay(100); BT.println("AT+NAME=HC-05");//命名模块名 delay(100); BT.println("AT+ROLE=0");//设置主从模式:0从机,1主机 delay(100); BT.println("AT+PSWD=1233");//设置配对密码,如1234 delay(100); BT.println("AT+UART=9600,0,0");//设置波特率9600,停止位1,校验位无 delay(100); BT.println("AT+RMAAD");//清空配对列表}
只需要开始先断电一次,才可以进入AT模式,后面不需要断电操作

注意:只有当蓝牙模块没有和其他设备(除了开发板之外)连接AT指令才会执行给蓝牙模块本身,否则会被当成数据发送给其他设备

三:解决问题2:手机连接蓝牙后传输数据乱码

(一)原因:HC-05的默认频率可能是38400,而手机的频率为9600,两种的频率不同,数据传输出错

(二)解决方法:进入AT模式,设置频率为9600(如上面的设置)

BT.println("AT+UART=9600,0,0");//设置波特率9600,停止位1,校验位无

(三)补充部分AT指令(注意:不同模块AT指令不同05,06就有所差别)

AT+UART?  查询波特率
AT+UART=参数1,参数2,参数3 设置波特率,停止位,校验位
更多指令可查:

四:案例使用---蓝牙点亮小灯

void setup() {  // put your setup code here, to run once:  Serial.begin(9600);  pinMode(11,OUTPUT);}char ch;void loop() {  // put your main code here, to run repeatedly:  if(Serial.available()>0)  {    ch = Serial.read();    if(ch=='1')        digitalWrite(11,HIGH);  //开启小灯    else        digitalWrite(11,LOW); //关闭小灯    Serial.print(ch);  }}
代码推荐使用SoftwareSerial实现
#include 
SoftwareSerial BT(8,9);char ch;void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(11,OUTPUT); BT.begin(9600);}void loop() { // put your main code here, to run repeatedly: if(Serial.available()>0) { ch = Serial.read(); BT.print(ch); } if(BT.available()>0) { ch = BT.read(); Serial.print(ch); if(ch=='1') { digitalWrite(11,HIGH); BT.println("Command: LED ON"); delay(5); } else { digitalWrite(11,LOW); BT.println("Command: LED OFF"); delay(5); } }}

五:Arduino无线蓝牙模块HC06安卓应用Arduino Bluetooth Controller下载()《或者手机应用下载蓝牙串口》

转载于:https://www.cnblogs.com/ssyfj/p/10843598.html

你可能感兴趣的文章
Nginx 安装配置
查看>>
在 tornado 中异步无阻塞的执行耗时任务
查看>>
Android中的GridView
查看>>
12.创建一个Point类,有成员变量x,y,方法getX(),setX(),还有一个构造方 法初始化x和y。创建类主类A来测试它。...
查看>>
fastjson解析文本
查看>>
C#多线程Thread.Join()的详解
查看>>
ELK学习总结(1-3)倒排索引
查看>>
Progress and Prospect of target detection technology based on deep learning
查看>>
YUI Array 之dedupe(快速去重)
查看>>
javascript中parseInt函数的用法
查看>>
Linux文件结构及基本文件夹
查看>>
注册表使用总结
查看>>
python 函数(二)
查看>>
javascript小技巧:同步服务器时间、同步倒计时
查看>>
我该如何自学软件测试?
查看>>
20145201李子璇 《网络对抗》 Web安全基础实践
查看>>
Alpha 冲刺 (7/10)
查看>>
ORACLE__Linux下Oracle数据库的卸载、删除
查看>>
摆脱控件之新手2
查看>>
Dos命令
查看>>