在電腦上,我用Labview制作了一個酷界面,顯示著宜昌城區(qū)的室內(nèi)氣候,顯然溫度和濕度都比較宜人,原因是幾天的大雨。電腦屏幕前是Arduino溫濕度采樣器,采樣器左側(cè)部分是Arduino控制器,上面層疊著藍(lán)牙模塊,右側(cè)部分是DHT11溫濕度傳感器,傳感器把溫度和濕度通過藍(lán)牙上傳到了上位機(jī)Labview儀表盤中顯示出來。有了無線藍(lán)牙通信,PC機(jī)儀表面板與采樣器之間可以脫離開有線的束縛?,F(xiàn)在把采樣器拿到了5米以外的空間,對著DHT11傳感器,哈氣,一股潮濕的暖流向它襲來,再看電腦屏幕上的儀表盤指針行動起來了,溫濕度值同時開始上升。好玩!又一次親身體驗(yàn)到了科技的樂趣。 DF-Bluetooth V3模塊與PC機(jī)的藍(lán)牙連接 這篇文章著重介紹DFRobot公司出品的Bluetooth模塊應(yīng)用。DF-BluetoothV3藍(lán)牙模塊采用獨(dú)特雙層板設(shè)計(jì),即美觀又防止靜電損壞模塊,設(shè)計(jì)兩個電源輸入口,寬電壓供電(3.5V~8V)和3.3V供電,可適用于各種場合。STATE和LINK指示燈清晰明亮,用于顯示模塊工作狀態(tài)和聯(lián)機(jī)狀態(tài)。自帶高效板載天線,信號質(zhì)量好發(fā)射距離更遠(yuǎn),透明串口協(xié)議,可與各種藍(lán)牙適配器、藍(lán)牙手機(jī)配對使用,人性化的設(shè)計(jì)為二次開發(fā)提供了便利。 通過藍(lán)牙模塊DF-BluetoothV3,建立起PC機(jī)與Arduino單片機(jī)之間無線通信的流程圖如下。(雙擊圖片,都可以放大觀看的,這樣看得清楚些!)
圖2 PC機(jī)與Arduino單片機(jī)的無線通信的流程圖 圖2中DF-BluetoothV3藍(lán)牙模塊,它可以層疊在Arduino控制器上,我蠻欣賞DFRobot公司的電路板層疊設(shè)計(jì)的理念,這樣可以把作品的電控部分集成在一起,為作品騰出了更多的創(chuàng)意空間。DFRobot中國官網(wǎng):http:///g4oQB。 把Arduino控制器和DHT11溫濕度傳感器用雙面膠帶粘在電池盒背面,再把電池盒的電源插頭插到Arduino UNO的電源插座里,給藍(lán)牙溫濕度采樣器供電,于是采樣器的硬件系統(tǒng)就這樣快速搭建完成了,如圖3所示。
圖3 藍(lán)牙溫濕度采樣器 廠家把DF-BluetoothV3藍(lán)牙模塊,默認(rèn)設(shè)置為從機(jī)模式,波特率為9600 b / s,通過AT指令可以修改波特率和主從機(jī)模式,將2個模塊分別設(shè)置為主模塊和從模塊后,2個模塊就可以自由配對進(jìn)行數(shù)據(jù)傳輸,非常適用于2個單片機(jī)之間的數(shù)據(jù)通訊。 雙單片機(jī)藍(lán)牙通信的文章,《樂高8275科技套件B模型的Arduino電控改造(雙單片機(jī)藍(lán)牙通信)》,網(wǎng)址: http://www./zhang700309/blog/12-07/281931_aa45c.html 。 如果僅是PC機(jī)與Arduino單片機(jī)的藍(lán)牙通信,就用出廠默認(rèn)設(shè)置即可,即從機(jī)模式,波特率為9600 b / s,所以不需要用AT指令進(jìn)行事先特別設(shè)置,對于兩個單片機(jī)之間主從機(jī)藍(lán)牙通信實(shí)驗(yàn),我會在今后的文章中介紹的。 DF-BluetoothV3模塊有兩個撥碼開關(guān),1號開關(guān)LED Off是LINK燈的開關(guān),可以關(guān)閉LINK省電,撥到ON為開,撥到1端為關(guān);2號開關(guān)AT Mode是AT命令模式開關(guān),撥到ON,進(jìn)入AT命令模式,撥到2端,退出AT命令模式。在進(jìn)行PC機(jī)與Arduino單片機(jī)之間進(jìn)行藍(lán)牙無線通信實(shí)驗(yàn)前,仔細(xì)看圖4中藍(lán)牙模塊電路板的標(biāo)識文字,要把1號開關(guān)LED Off撥到ON,把2號開關(guān)AT Mode撥到2端。 圖4 DF-BluetoothV3模塊的撥碼開關(guān) PC機(jī)與Arduino控制器之間進(jìn)行藍(lán)牙無線通信不僅需要DF-BluetoothV3模塊,而且還需要把藍(lán)牙適配器插在PC機(jī)USB插座里,市面上大多數(shù)藍(lán)牙適配器都可以與DF-BluetoothV3模塊成功配對。插上藍(lán)牙適配器,電腦會自動搜索新設(shè)備,安裝藍(lán)牙驅(qū)動,并映射出兩個COM串口,可以在設(shè)備管理器的“端口(COM和LPT)”目錄里,看到它們,這些不是我們需要的端口,但千萬不要把它們卸載了! 使用藍(lán)牙適配器和DF-Bluetooth V3配對時,DF-Bluetooth V3必須設(shè)置為從機(jī)模式,藍(lán)牙適配器不需要驅(qū)動程序,配對密碼“1234”。 我用Windows XP自帶的藍(lán)牙組件“LINK”聯(lián)機(jī)DF-Bluetooth V3藍(lán)牙模塊,不成功。采用IVT BlueSoleil 1.6藍(lán)牙管理軟件聯(lián)機(jī)是成功的!IVT軟件請下載:http:///file/e7xrv2ou# IVT Bluesoleil 1.6.zip。 安裝IVT BlueSoleil 1.6藍(lán)牙管理軟件時,它會讓您安裝藍(lán)牙設(shè)備驅(qū)動,還有多個藍(lán)牙虛擬串口,不管它,都安裝上,如下圖。 圖5 IVT BlueSoleil軟件的藍(lán)牙虛擬串口安裝
安裝完IVT軟件,然后我們用它一步步地把藍(lán)牙適配器與DF-Bluetooth V3藍(lán)牙模塊進(jìn)行聯(lián)機(jī)“LINK”。 打開IVT BlueSoleil軟件,橘色的球體就是藍(lán)牙適配器,在黃色的球體上,點(diǎn)右鍵→搜索藍(lán)牙設(shè)備,這時軟件界面里會出現(xiàn)一個帶問號的Bluetooth V3圖標(biāo),它就是搜索到的DF-Bluetooth V3藍(lán)牙模塊。在Bluetooth V3圖標(biāo)上,點(diǎn)右鍵→配對,會出現(xiàn)“配對”對話框,要求填寫口令“1234”,填好后點(diǎn)確定,配對后藍(lán)牙硬件模塊的STATE指示燈會一閃一閃的。 在Bluetooth V3 圖標(biāo)上,點(diǎn)右鍵→刷新服務(wù),IVT軟件界面的串口圖標(biāo)會高亮顯示,如圖6所示。接下來進(jìn)行最后一個“LINK”步驟,Bluetooth V3圖標(biāo)上,點(diǎn)右鍵→連接→藍(lán)牙串行端口服務(wù),隨之出現(xiàn) “快速連接”對話框,對話框顯示的串行端口就是聯(lián)機(jī)生成的串口號。聯(lián)機(jī)成功后,橘色的球體與Bluetooth V3圖標(biāo)之間有一條綠色虛線出現(xiàn),表示正在傳輸數(shù)據(jù)。同時DF-Bluetooth V3藍(lán)牙模塊的綠色“LINK”指示燈會持續(xù)點(diǎn)亮,指示聯(lián)機(jī)成功! 步驟一:
步驟二:
步驟三:
步驟四:
步驟五:
步驟六:
圖6 DF-Bluetooth V3藍(lán)牙模塊與藍(lán)牙適配器的聯(lián)機(jī)
圖6顯示,Windows 操作系統(tǒng)桌面右下角出現(xiàn)提示文字,“我的藍(lán)牙端口COM16(COM16)已與遠(yuǎn)程設(shè)備建立連接”,當(dāng)然您具體聯(lián)機(jī)操作,最后生成的串口號不一定是COM16,要記住您生成的串口號,這個虛擬出的藍(lán)牙串口號是PC機(jī)與Arduino控制器之間通信的唯一通道。這時再打開Windows設(shè)備管理器的“端口(COM和LPT)”目錄,您可以把多余的串行端口給卸載掉了,如圖。 圖7 卸載多余的串行端口
藍(lán)牙適配器與DF-Bluetooth V3藍(lán)牙模塊聯(lián)機(jī)成功后,生成了串口號COM16,現(xiàn)在就可以用RS232串口協(xié)議進(jìn)行無線通信,我感覺就像用RS232有線通信一樣,搞無線通信。 藍(lán)牙虛擬測量儀上位機(jī)軟件設(shè)計(jì) 現(xiàn)在談?wù)勏挛粰C(jī)Arduino控制器如何把DHT11傳感器的溫濕度,通過藍(lán)牙串口上傳到上位PC機(jī)的labview里,顯示在前面板上??梢钥纯次覟檫@個作品設(shè)計(jì)的Labview儀表盤,蠻酷的
這個儀表盤外形控件看起來很棒,是Labview軟件自帶的嗎?不是,您需要下載“VI封裝管理器”軟件VIPM,VIPM是管理Labview附加組件的Labview官方軟件,Labview附加組件有些像Arduino第三方庫文件。我用這個軟件下載和安裝了一個金屬風(fēng)格控件庫組件。VIPM下載地址:http://www./vipm。
在Windows桌面上,點(diǎn)擊VIPM圖標(biāo),運(yùn)行程序。在其菜單欄的“Window”菜單項(xiàng)里,選擇Show LabVIEW Tools Network,如果這時您的電腦已經(jīng)連上了互聯(lián)網(wǎng),就會緊跟著出現(xiàn)一個更直觀的VI附加組件的介紹和安裝窗口。 選擇Sort By為“Rating”,再一頁頁地翻看,找到下圖我用矩形框標(biāo)注的金屬風(fēng)格控件庫組件,點(diǎn)擊下載,并安裝。
圖8 金屬風(fēng)格主題控件庫組件的下載
安裝完后,Labview的控件工具庫面板里就會出現(xiàn)這個金屬風(fēng)格的控件庫組件,控件包括:儀表盤、按鈕、開關(guān)、圖表等。有了這個控件庫組件,您再設(shè)計(jì)的人機(jī)交互面板是不是會比以前更酷,我喜歡通過某種“利器”放大自己能力的感覺。 恩,現(xiàn)在我來做一個實(shí)驗(yàn),找出一個打火機(jī),要干嘛?別緊張!點(diǎn)火來“烤”DHT11溫濕度傳感器,猜猜電腦屏幕上的Labview儀表盤上溫度和濕度指針如何行動?看下圖。
圖9 火烤試驗(yàn)下藍(lán)牙溫濕度測量儀前面板的溫濕度顯示
看看,溫度上升到了50°C,而濕度被蒸發(fā)下降到了25%。夏日里,我們并不缺乏對溫度和濕度的定性感受,但如果能清晰直觀地觀測到定量值,相信對溫濕度,可以做到更加心里有數(shù),就如您隨時看手表,了解現(xiàn)在的時間幾點(diǎn)幾分了。 Labview前面板的UI設(shè)計(jì)比較酷,但支撐它的后臺框圖程序,卻很簡單,花短短20分鐘來設(shè)計(jì)這個程序足以,初學(xué)者除外。 藍(lán)牙溫濕度測量儀PC機(jī)儀表面板框圖程序如下: 圖10 藍(lán)牙溫濕度測量儀的后臺框圖程序
要編寫串口通信程序,不僅要具備Labview軟件,還必須另外安裝NI_VISA串口通訊協(xié)議驅(qū)動。安裝完NI_VISA,在框圖程序界面右擊鼠標(biāo),出現(xiàn)函數(shù)工具庫面板,再點(diǎn)擊“儀表I/O”→“串口”,就會出現(xiàn)串口函數(shù)VI子面板,如下圖。 圖11 VISA串口函數(shù)VI子面板
框圖程序是采用NI_VISA“串口”函數(shù)來訪問和控制串口的。VISA中的“串口”函數(shù)庫里包含如圖11所示的八個子函數(shù)VI。本設(shè)計(jì)用到的三個VISA串口子函數(shù)分別是VISA 配置串口、VISA讀取和VISA關(guān)閉。 VISA 配置串口函數(shù)的作用是完成串口參數(shù)的初始化設(shè)置,包括了串口資源名稱,波特率,奇偶校驗(yàn)、數(shù)據(jù)比特、是否啟用終止符等,圖10中該函數(shù)連接了兩個輸入變量,它們分別連在串口資源名稱和波特率參數(shù)端子上,變量值由前面板上的相應(yīng)控件來設(shè)定,另外該函數(shù)在“是否啟用終止符”的端子上還連接了一個布爾常量,常量值為false,含義是不啟用終止符,其它輸入?yún)?shù)采用默認(rèn)值。VISA串口配置函數(shù)有兩個輸出端子,它的圖標(biāo)上面輸出端子輸出的是串口資源名稱,下面輸出端子輸出的是錯誤碼,輸出端子向下游函數(shù)傳遞信息。 VISA讀取函數(shù)有三個輸入端子,圖中VISA讀取函數(shù)圖標(biāo)的上面輸入端子是前面VISA 配置串口函數(shù)傳遞的串口資源名稱,下面的輸入端子傳遞的是錯誤碼,意思是若前面的函數(shù)出錯了,會往這里輸入一個錯誤碼,然后繼續(xù)往下面?zhèn)鬟f,有錯誤碼出現(xiàn)時程序是不會工作的。中間輸入端子是每次從串口讀取的字符串字節(jié)數(shù),本文串口通信的字節(jié)數(shù)應(yīng)設(shè)置為2。
圖10中VISA讀取函數(shù)包含在一個While循環(huán)結(jié)構(gòu)中,每20ms從串口讀取兩個字節(jié),并從該函數(shù)的中間輸出端子,以字符串的形式輸出。VISA讀取函數(shù)圖標(biāo)上面輸出端子輸出的是串口資源名稱,下面的輸出端子輸出的是錯誤碼,繼續(xù)向下游函數(shù)傳遞信息。在前面板按下“EXIT”按鈕,可結(jié)束While 循環(huán)。 VISA關(guān)閉函數(shù)的作用是當(dāng)程序停止時,必須要把所用到的串口設(shè)備關(guān)閉,若不關(guān)閉,其他程序就不能使用該設(shè)備。 從VISA讀取函數(shù)輸出的字符串,通過“字符串至字符數(shù)組轉(zhuǎn)換”函數(shù)把字符串轉(zhuǎn)換為字符數(shù)組,再通過“索引數(shù)組”函數(shù),把第0元素從字符數(shù)組取出,是濕度值,送到濕度儀表控件里顯示,把第1元素從字符數(shù)組取出,是溫度值,送到溫度儀表控件里顯示,于是您就看到了DHT11傳感器的溫濕度直觀地顯示在PC機(jī)屏幕的Labview前面板儀表上了!當(dāng)然對儀表控件還要通過屬性對話框進(jìn)行數(shù)據(jù)范圍和數(shù)據(jù)類型的設(shè)置。 Labview程序請下載:http:///file/an86rv29#藍(lán)牙虛擬溫濕度儀.zip 另外用修飾控件進(jìn)一步美化前面板。修飾控件的提取方法如圖。
藍(lán)牙虛擬測量儀下位機(jī)軟件設(shè)計(jì) 費(fèi)了半天勁,寫完了Lavbiew上位機(jī)程序,接下來,下位機(jī)Arduino的程序如何設(shè)計(jì)?Arduino程序的任務(wù)有兩點(diǎn):一、把DHT11傳感器的溫濕度值采樣出來,處理成字節(jié)數(shù)據(jù);二、把濕度和溫度字節(jié)數(shù)據(jù)通過串口上傳給上位機(jī)。 由于DHT11傳感器是采用單線制串行通訊的方法進(jìn)行采樣數(shù)據(jù)的,要配合時序,一位位從單條通訊線傳過來,再合成8位字節(jié),然后還要進(jìn)行校驗(yàn)和,所以廠家自帶程序,比較復(fù)雜冗長,看起來頭疼! 實(shí)際上有的時候,我們琢磨一個東西,可以大刀闊斧,沒必要轉(zhuǎn)牛角尖,所以從下面Arduino程序中,您找到所需的溫度值和濕度值,就行了,dht11_dat[2]為溫度值整數(shù)部分,dht11_dat[0]為濕度值整數(shù)部分,然后把濕度和溫度字節(jié)數(shù)據(jù)通過RS232通訊協(xié)議,上傳給PC機(jī)串口COM。 下位機(jī)藍(lán)牙溫濕度采樣器Arduino程序: #define DHT11_PIN 0 //DHT11連接在Arduino UNO 模擬端口PIN 0 byte read_dht11_dat() //“讀取DHT11的溫濕度值”子函數(shù) { 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傳感器采樣的溫濕度值的數(shù)組 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個字節(jié)溫濕度值 //第一個字節(jié)是濕度值整數(shù)部分,dht11_dat[0] //第二個字節(jié)是濕度值小數(shù)部分 //第三個字節(jié)是溫度值整數(shù)部分,dht11_dat[2] //第四個字節(jié)是溫度值小數(shù)部分 //第五個字節(jié)是校驗(yàn)值,可以判斷數(shù)據(jù)傳送是否正確 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]; //檢測校驗(yàn)值,判斷是否采樣出錯 /*if(dht11_dat[4]!= dht11_check_sum) { Serial.println("DHT11 checksum error"); }*/ //把濕度值整數(shù)部分上傳上位機(jī) Serial.print(dht11_dat[0], BYTE); //把溫度值整數(shù)部分上傳上位機(jī) Serial.print(dht11_dat[2], BYTE); delay(500);//延時0.5s } Arduino程序請下載:http:///file/an86r28u#bluetooth-DHT11.zip 與這篇文章相關(guān)的內(nèi)容: |
|