热度57|
在电脑上,我用labview制作了一个酷界面,显示着宜昌城区的室内气候,显然温度和湿度都比较宜人,原因是几天的大雨。电脑屏幕前是Arduino温湿度采样器,采样器左侧部分是Arduino控制器,上面层叠着蓝牙模块,右侧部分是DHT11温湿度传感器,传感器把温度和湿度通过蓝牙上传到了上位机Labview仪表盘中显示出来。有了无线蓝牙通信,PC机仪表面板与采样器之间可以脱离开有线的束缚。现在把采样器拿到了5米以外的空间,对着DHT11传感器,哈气,一股潮湿的暖流向它袭来,再看电脑屏幕上的仪表盘指针行动起来了,温湿度值同时开始上升。好玩!又一次亲身体验到了科技的乐趣。
DF-Bluetooth V3模块与PC机的蓝牙连接
这篇文章着重介绍DFRobot公司出品的Bluetooth模块应用。DF-BluetoothV3蓝牙模块采用独特双层板设计,即美观又防止静电损坏模块,设计两个电源输入口,宽电压供电(3.5V~8V)和3.3V供电,可适用于各种场合。STATE和LINK指示灯清晰明亮,用于显示模块工作状态和联机状态。自带高效板载天线,信号质量好发射距离更远,透明串口协议,可与各种蓝牙适配器、蓝牙手机配对使用,人性化的设计为二次开发提供了便利。
通过蓝牙模块DF-BluetoothV3,建立起PC机与Arduino单片机之间无线通信的流程图如下。(双击图片,都可以放大观看的,这样看得清楚些!)
图2 PC机与Arduino单片机的无线通信的流程图
图2中DF-BluetoothV3蓝牙模块,它可以层叠在Arduino控制器上,我蛮欣赏DFRobot公司的电路板层叠设计的理念,这样可以把作品的电控部分集成在一起,为作品腾出了更多的创意空间。DFRobot中国官网:http://goo.gl/g4oQB。
把Arduino控制器和DHT11温湿度传感器用双面胶带粘在电池盒背面,再把电池盒的电源插头插到Arduino UNO的电源插座里,给蓝牙温湿度采样器供电,于是采样器的硬件系统就这样快速搭建完成了,如图3所示。
图3 蓝牙温湿度采样器
厂家把DF-BluetoothV3蓝牙模块,默认设置为从机模式,波特率为9600 b / s,通过AT指令可以修改波特率和主从机模式,将2个模块分别设置为主模块和从模块后,2个模块就可以自由配对进行数据传输,非常适用于2个单片机之间的数据通讯。
如果仅是PC机与Arduino单片机的蓝牙通信,就用出厂默认设置即可,即从机模式,波特率为9600 b / s,所以不需要用AT指令进行事先特别设置,对于两个单片机之间主从机蓝牙通信实验,我会在今后的文章中介绍的。
DF-BluetoothV3模块有两个拨码开关,1号开关LED Off是LINK灯的开关,可以关闭LINK省电,拨到ON为开,拨到1端为关;2号开关AT Mode是AT命令模式开关,拨到ON,进入AT命令模式,拨到2端,退出AT命令模式。在进行PC机与Arduino单片机之间进行蓝牙无线通信实验前,仔细看图4中蓝牙模块电路板的标识文字,要把1号开关LED Off拨到ON,把2号开关AT Mode拨到2端。
图4 DF-BluetoothV3模块的拨码开关
PC机与Arduino控制器之间进行蓝牙无线通信不仅需要DF-BluetoothV3模块,而且还需要把蓝牙适配器插在PC机USB插座里,市面上大多数蓝牙适配器都可以与DF-BluetoothV3模块成功配对。插上蓝牙适配器,电脑会自动搜索新设备,安装蓝牙驱动,并映射出两个COM串口,可以在设备管理器的“端口(COM和LPT)”目录里,看到它们,这些不是我们需要的端口,但千万不要把它们卸载了!
使用蓝牙适配器和DF-Bluetooth V3配对时,DF-Bluetooth V3必须设置为从机模式,蓝牙适配器不需要驱动程序,配对密码“1234”。 我用Windows XP自带的蓝牙组件“LINK”联机DF-Bluetooth V3蓝牙模块,不成功。采用IVT BlueSoleil 1.6蓝牙管理软件联机是成功的!IVT软件请下载:http://115.com/file/e7xrv2ou# IVT Bluesoleil 1.6.zip。
安装IVT BlueSoleil 1.6蓝牙管理软件时,它会让您安装蓝牙设备驱动,还有多个蓝牙虚拟串口,不管它,都安装上,如下图。
安装完IVT软件,然后我们用它一步步地把蓝牙适配器与DF-Bluetooth V3蓝牙模块进行联机“LINK”。
打开IVT BlueSoleil软件,橘色的球体就是蓝牙适配器,在黄色的球体上,点右键→搜索蓝牙设备,这时软件界面里会出现一个带问号的Bluetooth V3图标,它就是搜索到的DF-Bluetooth V3蓝牙模块。在Bluetooth V3图标上,点右键→配对,会出现“配对”对话框,要求填写口令“1234”,填好后点确定,配对后蓝牙硬件模块的STATE指示灯会一闪一闪的。
在Bluetooth V3 图标上,点右键→刷新服务,IVT软件界面的串口图标会高亮显示,如图6所示。接下来进行最后一个“LINK”步骤,Bluetooth V3图标上,点右键→连接→蓝牙串行端口服务,随之出现 “快速连接”对话框,对话框显示的串行端口就是联机生成的串口号。联机成功后,橘色的球体与Bluetooth V3图标之间有一条绿色虚线出现,表示正在传输数据。同时DF-Bluetooth V3蓝牙模块的绿色“LINK”指示灯会持续点亮,指示联机成功!
图6显示,Windows 操作系统桌面右下角出现提示文字,“我的蓝牙端口COM16(COM16)已与远程设备建立连接”,当然您具体联机操作,最后生成的串口号不一定是COM16,要记住您生成的串口号,这个虚拟出的蓝牙串口号是PC机与Arduino控制器之间通信的唯一通道。这时再打开Windows设备管理器的“端口(COM和LPT)”目录,您可以把多余的串行端口给卸载掉了,如图。
蓝牙适配器与DF-Bluetooth V3蓝牙模块联机成功后,生成了串口号COM16,现在就可以用RS232串口协议进行无线通信,我感觉就像用RS232有线通信一样,搞无线通信。
蓝牙虚拟测量仪上位机软件设计
看看,温度上升到了50°C,而湿度被蒸发下降到了25%。夏日里,我们并不缺乏对温度和湿度的定性感受,但如果能清晰直观地观测到定量值,相信对温湿度,可以做到更加心里有数,就如您随时看手表,了解现在的时间几点几分了。
Labview前面板的UI设计比较酷,但支撑它的后台框图程序,却很简单,花短短20分钟来设计这个程序足以,初学者除外。
蓝牙温湿度测量仪PC机仪表面板框图程序如下:
要编写串口通信程序,不仅要具备Labview软件,还必须另外安装NI_VISA串口通讯协议驱动。安装完NI_VISA,在框图程序界面右击鼠标,出现函数工具库面板,再点击“仪表I/O”→“串口”,就会出现串口函数VI子面板,如下图。
框图程序是采用NI_VISA“串口”函数来访问和控制串口的。VISA中的“串口”函数库里包含如图11所示的八个子函数VI。本设计用到的三个VISA串口子函数分别是VISA 配置串口、VISA读取和VISA关闭。
VISA 配置串口函数的作用是完成串口参数的初始化设置,包括了串口资源名称,波特率,奇偶校验、数据比特、是否启用终止符等,图10中该函数连接了两个输入变量,它们分别连在串口资源名称和波特率参数端子上,变量值由前面板上的相应控件来设定,另外该函数在“是否启用终止符”的端子上还连接了一个布尔常量,常量值为false,含义是不启用终止符,其它输入参数采用默认值。VISA串口配置函数有两个输出端子,它的图标上面输出端子输出的是串口资源名称,下面输出端子输出的是错误码,输出端子向下游函数传递信息。
图10中VISA读取函数包含在一个While循环结构中,每20ms从串口读取两个字节,并从该函数的中间输出端子,以字符串的形式输出。VISA读取函数图标上面输出端子输出的是串口资源名称,下面的输出端子输出的是错误码,继续向下游函数传递信息。在前面板按下“EXIT”按钮,可结束While 循环。
VISA关闭函数的作用是当程序停止时,必须要把所用到的串口设备关闭,若不关闭,其他程序就不能使用该设备。
从VISA读取函数输出的字符串,通过“字符串至字符数组转换”函数把字符串转换为字符数组,再通过“索引数组”函数,把第0元素从字符数组取出,是湿度值,送到湿度仪表控件里显示,把第1元素从字符数组取出,是温度值,送到温度仪表控件里显示,于是您就看到了DHT11传感器的温湿度直观地显示在PC机屏幕的Labview前面板仪表上了!当然对仪表控件还要通过属性对话框进行数据范围和数据类型的设置。
Labview程序请下载:http://115.com/file/an86rv29#蓝牙虚拟温湿度仪.zip
另外用修饰控件进一步美化前面板。修饰控件的提取方法如图。
蓝牙虚拟测量仪下位机软件设计
费了半天劲,写完了Lavbiew上位机程序,接下来,下位机Arduino的程序如何设计?Arduino程序的任务有两点:一、把DHT11传感器的温湿度值采样出来,处理成字节数据;二、把湿度和温度字节数据通过串口上传给上位机。
由于DHT11传感器是采用单线制串行通讯的方法进行采样数据的,要配合时序,一位位从单条通讯线传过来,再合成8位字节,然后还要进行校验和,所以厂家自带程序,比较复杂冗长,看起来头疼! 实际上有的时候,我们琢磨一个东西,可以大刀阔斧,没必要转牛角尖,所以从下面Arduino程序中,您找到所需的温度值和湿度值,就行了,dht11_dat[2]为温度值整数部分,dht11_dat[0]为湿度值整数部分,然后把湿度和温度字节数据通过RS232通讯协议,上传给PC机串口COM。
下位机蓝牙温湿度采样器Arduino程序:
#define DHT11_PIN 0 //DHT11连接在Arduino UNO 模拟端口PIN 0
byte read_dht11_dat() //“读取DHT11的温湿度值”子函数
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN))); // wait '1' finish
}
return result;
}
//初始化
void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600); //串口通讯启动
}
//主程序
void loop()
{
byte dht11_dat[5];//存储从DHT11传感器采样的温湿度值的数组
byte dht11_in;
byte i;
// start condition
// 1. pull-down i/o pin from 18ms
//启动采样
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
delayMicroseconds(80);
// 读取来自DHT11传感器的5个字节温湿度值
//第一个字节是湿度值整数部分,dht11_dat[0]
//第二个字节是湿度值小数部分
//第三个字节是温度值整数部分,dht11_dat[2]
//第四个字节是温度值小数部分
//第五个字节是校验值,可以判断数据传送是否正确
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
//检测校验值,判断是否采样出错
/*if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}*/
//把湿度值整数部分上传上位机
Serial.print(dht11_dat[0], BYTE);
//把温度值整数部分上传上位机
Serial.print(dht11_dat[2], BYTE);
delay(500);//延时0.5s
}
Arduino程序请下载:http://115.com/file/an86r28u#bluetooth-DHT11.zip。