7。 发表于 2013-1-25 17:55:24

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

对于单片机来说我们玩无线最方便的就是蓝牙模块,因为可以直接接在串口上,使用的还是直接当串口通信就好,设置好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!='+' || comdata!='=') 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);
    lcd.print("   ");                                 
}
mark=0;      //复位标记

comdata="";    //复位命令字符串
delay(300);
}
//主机程序结束

最终完成图:


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

cnkids 发表于 2013-1-25 18:07:15

{:soso_e144:}sofa.看来我把蓝牙模块借你还是有好处的~

笑望晨晖 发表于 2013-3-27 16:15:43

刚好需要

prince 发表于 2013-5-28 18:27:23

还是没搞清楚蓝牙模块在这里面起什么作用,谁能告诉我,谢谢。

7。 发表于 2013-5-28 22:46:36

prince 发表于 2013-5-28 18:27 static/image/common/back.gif
还是没搞清楚蓝牙模块在这里面起什么作用,谁能告诉我,谢谢。

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

prince 发表于 2013-5-29 13:13:51

哦哦,现在明白了,谢谢。

prince 发表于 2013-6-2 14:31:58

能告诉我这个项目具体在那些方面有应用吗?

7。 发表于 2013-7-30 22:36:44

prince 发表于 2013-6-2 14:31 static/image/common/back.gif
能告诉我这个项目具体在那些方面有应用吗?

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

快乐之神 发表于 2013-8-17 09:28:19

这个论坛主要是基于安卓的?   怎么都是安卓的作品呀   好厉害呀

7。 发表于 2013-9-15 16:26:09

快乐之神 发表于 2013-8-17 09:28 static/image/common/back.gif
这个论坛主要是基于安卓的?   怎么都是安卓的作品呀   好厉害呀

不是呀,这个不是安卓是arduino。不是android

学慧放弃 发表于 2013-11-14 19:57:05

资料还是有点不详细,希望楼主继续补充,

213菜鸟 发表于 2015-1-14 11:43:37

很实用啊,赞

jasonwang1208 发表于 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以内还是可以的。
页: [1]
查看完整版本: 超声波测距+蓝牙传输+LCD1602应用教程