极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 7。

超声波测距+蓝牙传输+LCD1602应用教程

[复制链接]
发表于 2013-1-25 17:55:24 | 显示全部楼层 |阅读模式
对于单片机来说我们玩无线最方便的就是蓝牙模块,因为可以直接接在串口上,使用的还是直接当串口通信就好,设置好AT命令后从主机能直接连接,个人觉得是初学者玩无线的一个门子。基本不用考虑太多东西,以前发过关于蓝牙模块的帖子,这次发次实用点的。
这次实验我用的东东:
2块arduino板子(UNO兼容类的)
2个蓝牙模块(从机主机)
1602液晶
超声波测距模块(淘宝经常看到最便宜的那种)
几块mini面包板
线!

    一般来说买到蓝牙模块如果是从主一体的都要通过AT命令来配置。比如我之前帖子那个
OJ的蓝牙模块
不过这次我使用的是只能硬件设置从主的蓝牙模块,直接在蓝牙模块的SET口接3.3V就是做主机使用了。虽然方便不过不得不说我是被奸商坑的。关于蓝牙模块的配置我就不多说了。毕竟每一家的配置方法都不一样,具体要看配套的使用手册才知道。
     


首先,把超声波测距和蓝牙模块连接arduino。

从机代码如下:

  1. cnst int TrigPin = 2;    //超声波的trig接arduino的2号数字口
  2. const int EchoPin = 3;  //超声波的Echo接3号口
  3. float cm;
  4. void setup()
  5. {
  6. Serial.begin(9600);     //设置串口通信波特率,这个看你使用的蓝牙模块,一般为9600
  7. pinMode(TrigPin, OUTPUT);
  8. pinMode(EchoPin, INPUT);
  9. }
  10. void loop()
  11. {
  12. digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin    这一部分为测距部分,可以得到距离。
  13. delayMicroseconds(2);
  14. digitalWrite(TrigPin, HIGH);
  15. delayMicroseconds(10);
  16. digitalWrite(TrigPin, LOW);
  17. cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
  18. cm = (int(cm * 100.0)) / 100.0; //保留两位小数


  19. Serial.print('+');  
  20. Serial.print(cm);
  21. Serial.print("cm");
  22. Serial.print('=');
  23. delay(500);
  24. }

  25. //从机代码结束
复制代码

PS:这里说明一下我认为蓝牙通信一个很重要的地方。不知道是串口缓冲区的问题还是怎样,有时候总会出现一条指令不能被从机完全读取的情况。比如“2.45cm”只能读一个“2”;为了确保每一条指令的完整,我这里设置一个起始符号“+”和一个终止符号“=”。当从机的程序读取玩一次命令后检查命令开头和结尾是否为“+”和“=”,是则执行相应输出,不是则舍弃这条指令。

由于蓝牙模块占用arduino的串口,所以,下载程序的时候记得吧TX RX的接口悬空哦!不然程序下载会出现问题。
···························································分割一下的线···············································································
下面到从机,从机我连接的是一块1602液晶,液晶的连接和驱动方式我完全照抄论坛里的精华教程   arduino学习笔记16 - PS2摇杆/游戏摇杆实验

上图:

把图中摇杆的连接无视就是我这里1602的连接方式~= =不懂私自盗图会不会被版主秒,如果有如规定请管理通知一声。。。
然后把蓝牙连接上去,在SET口接一个3.3V设定为蓝牙主机,下程序还是记得把arduino的TX RX断开。


主机程序:

  1. #include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库
  2. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);    //设置1602液晶接口
  3. String comdata="";   //用于存放蓝牙传输过来的命令,初始为""
  4. byte mark=0;   //用于确认是否有命令输入,有则让1602液晶显示
  5. void setup()
  6. {
  7.   Serial.begin(9600);     //开启串口设置波特率
  8.   lcd.begin(16, 2);  //初始化LCD
  9.   delay(1000);   
  10. }

  11. void loop()
  12. {
  13.   while(Serial.available()>0)  // 检测是否有内容发送过来,有则进入循环
  14.   {
  15.     char t=char(Serial.read());  //读取一个字符(串口读取只能一个个字符读取,这里的方法也是用论坛精华帖的)
  16.     comdata+=t; //将读取的字符存为字符串
  17.     delay(2);     //延迟否则读取会出错
  18.     if(t=='=') break;   //如果读到终止符号则停止,跳出循环
  19.     mark=1;     //标记有命令输入
  20.   }
  21.   if(comdata[0]!='+' || comdata[comdata.length()-1]!='=') mark=0;    //判断命令合法性
  22.   
  23. if(mark==1)    //如果命令合法则让1602液晶输出
  24.   {
  25.     lcd.clear(); //清屏
  26.     lcd.setCursor(0,0);    //设置光标在第一行第一格
  27.     lcd.print("D=");       //输出“D=”
  28.     for(int i=1;i<comdata.length()-1;i++)     //输出距离
  29.       lcd.print(comdata[i]);
  30.     lcd.print("     ");                                 
  31.   }
  32.   mark=0;      //复位标记

  33.   comdata="";    //复位命令字符串
  34.   delay(300);
  35. }
  36. //主机程序结束
复制代码

最终完成图:
  

本次实验的成品实用性不高,不过掌握了这个通信的方法确实能实现很多事情,比如无线控制门禁,无线控制小车无线控制各种电器等等,只要命令能正确传递过去。感觉论坛的蓝牙教程不多,我就来充充数吧,教程肯定有很多的不足,写那么多也是为了和大家交流~有什么问题和不足欢迎指出哈O(∩_∩)O哈!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-1-25 18:07:15 | 显示全部楼层
{:soso_e144:}sofa.看来我把蓝牙模块借你还是有好处的~
回复 支持 反对

使用道具 举报

发表于 2013-3-27 16:15:43 | 显示全部楼层
刚好需要
回复 支持 反对

使用道具 举报

发表于 2013-5-28 18:27:23 | 显示全部楼层
还是没搞清楚蓝牙模块在这里面起什么作用,谁能告诉我,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 22:46:36 | 显示全部楼层
prince 发表于 2013-5-28 18:27
还是没搞清楚蓝牙模块在这里面起什么作用,谁能告诉我,谢谢。

是这样的。超声波检测到的数据传回第一块arduino,然后第一块arduino通过蓝牙无线模块传送到第二块arduino上,再由第二块arduino控制LCD1602输出数据。其实这个只是一个实验,因为是初学,就当验证下自己的学习水平而已,没啥太大的实用性。
回复 支持 反对

使用道具 举报

发表于 2013-5-29 13:13:51 | 显示全部楼层
哦哦,现在明白了,谢谢。
回复 支持 反对

使用道具 举报

发表于 2013-6-2 14:31:58 | 显示全部楼层
能告诉我这个项目具体在那些方面有应用吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-30 22:36:44 | 显示全部楼层
prince 发表于 2013-6-2 14:31
能告诉我这个项目具体在那些方面有应用吗?

看你怎么想了。因为蓝牙是用串口的所以连接非常方便,你可以作为短距离的无线传输,比如弄个门禁系统,别人没钥匙的话你在房间里就能开门,不用走过去。类似一个短距离的无线控制
回复 支持 反对

使用道具 举报

发表于 2013-8-17 09:28:19 | 显示全部楼层
这个论坛主要是基于安卓的?   怎么都是安卓的作品呀   好厉害呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 16:26:09 | 显示全部楼层
快乐之神 发表于 2013-8-17 09:28
这个论坛主要是基于安卓的?   怎么都是安卓的作品呀   好厉害呀

不是呀,这个不是安卓是arduino。不是android
回复 支持 反对

使用道具 举报

发表于 2013-11-14 19:57:05 | 显示全部楼层
资料还是有点不详细,希望楼主继续补充,
回复 支持 反对

使用道具 举报

发表于 2015-1-14 11:43:37 | 显示全部楼层
很实用啊,赞
回复 支持 反对

使用道具 举报

发表于 2017-3-24 10:56:23 | 显示全部楼层
3Q for sharing.
有試過距離可以測多遠(多長)? 謝謝
回复 支持 反对

使用道具 举报

发表于 2017-3-25 12:48:15 | 显示全部楼层
jasonwang1208 发表于 2017-3-24 10:56
3Q for sharing.
有試過距離可以測多遠(多長)? 謝謝

这款超声波模块是淘宝上最便宜那种。。。感觉50cm以内还是可以的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 18:08 , Processed in 0.044933 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表