对于单片机来说我们玩无线最方便的就是蓝牙模块,因为可以直接接在串口上,使用的还是直接当串口通信就好,设置好AT命令后从主机能直接连接,个人觉得是初学者玩无线的一个门子。基本不用考虑太多东西,以前发过关于蓝牙模块的帖子,这次发次实用点的。
这次实验我用的东东:
2块arduino板子(UNO兼容类的)
2个蓝牙模块(从机主机)
1602液晶
超声波测距模块(淘宝经常看到最便宜的那种)
几块mini面包板
线!
一般来说买到蓝牙模块如果是从主一体的都要通过AT命令来配置。比如我之前帖子那个
OJ的蓝牙模块。
不过这次我使用的是只能硬件设置从主的蓝牙模块,直接在蓝牙模块的SET口接3.3V就是做主机使用了。虽然方便不过不得不说我是被奸商坑的。关于蓝牙模块的配置我就不多说了。毕竟每一家的配置方法都不一样,具体要看配套的使用手册才知道。
首先,把超声波测距和蓝牙模块连接arduino。
从机代码如下: - cnst int TrigPin = 2; //超声波的trig接arduino的2号数字口
- const int EchoPin = 3; //超声波的Echo接3号口
- float cm;
- void setup()
- {
- Serial.begin(9600); //设置串口通信波特率,这个看你使用的蓝牙模块,一般为9600
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- void loop()
- {
- digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin 这一部分为测距部分,可以得到距离。
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
- cm = (int(cm * 100.0)) / 100.0; //保留两位小数
- Serial.print('+');
- Serial.print(cm);
- Serial.print("cm");
- Serial.print('=');
- delay(500);
- }
- //从机代码结束
复制代码
PS:这里说明一下我认为蓝牙通信一个很重要的地方。不知道是串口缓冲区的问题还是怎样,有时候总会出现一条指令不能被从机完全读取的情况。比如“2.45cm”只能读一个“2”;为了确保每一条指令的完整,我这里设置一个起始符号“+”和一个终止符号“=”。当从机的程序读取玩一次命令后检查命令开头和结尾是否为“+”和“=”,是则执行相应输出,不是则舍弃这条指令。
由于蓝牙模块占用arduino的串口,所以,下载程序的时候记得吧TX RX的接口悬空哦!不然程序下载会出现问题。
···························································分割一下的线···············································································
下面到从机,从机我连接的是一块1602液晶,液晶的连接和驱动方式我完全照抄论坛里的精华教程 arduino学习笔记16 - PS2摇杆/游戏摇杆实验
上图:
把图中摇杆的连接无视就是我这里1602的连接方式~= =不懂私自盗图会不会被版主秒,如果有如规定请管理通知一声。。。
然后把蓝牙连接上去,在SET口接一个3.3V设定为蓝牙主机,下程序还是记得把arduino的TX RX断开。
主机程序: - #include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库
- LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //设置1602液晶接口
- String comdata=""; //用于存放蓝牙传输过来的命令,初始为""
- byte mark=0; //用于确认是否有命令输入,有则让1602液晶显示
- void setup()
- {
- Serial.begin(9600); //开启串口设置波特率
- lcd.begin(16, 2); //初始化LCD
- delay(1000);
- }
- void loop()
- {
- while(Serial.available()>0) // 检测是否有内容发送过来,有则进入循环
- {
- char t=char(Serial.read()); //读取一个字符(串口读取只能一个个字符读取,这里的方法也是用论坛精华帖的)
- comdata+=t; //将读取的字符存为字符串
- delay(2); //延迟否则读取会出错
- if(t=='=') break; //如果读到终止符号则停止,跳出循环
- mark=1; //标记有命令输入
- }
- if(comdata[0]!='+' || comdata[comdata.length()-1]!='=') mark=0; //判断命令合法性
-
- if(mark==1) //如果命令合法则让1602液晶输出
- {
- lcd.clear(); //清屏
- lcd.setCursor(0,0); //设置光标在第一行第一格
- lcd.print("D="); //输出“D=”
- for(int i=1;i<comdata.length()-1;i++) //输出距离
- lcd.print(comdata[i]);
- lcd.print(" ");
- }
- mark=0; //复位标记
- comdata=""; //复位命令字符串
- delay(300);
- }
- //主机程序结束
复制代码
最终完成图:
本次实验的成品实用性不高,不过掌握了这个通信的方法确实能实现很多事情,比如无线控制门禁,无线控制小车无线控制各种电器等等,只要命令能正确传递过去。感觉论坛的蓝牙教程不多,我就来充充数吧,教程肯定有很多的不足,写那么多也是为了和大家交流~有什么问题和不足欢迎指出哈O(∩_∩)O哈! |