LabVIEW控制Arduino采集DHT11溫濕度數(shù)值(進(jìn)階篇—4)
1
項(xiàng)目概述
在多數(shù)情況下,測(cè)量溫度的同時(shí)需要測(cè)量濕度,本篇博文將介紹使用DHT11溫濕度傳感器、Arduino Uno和LabVIEW組成溫濕度測(cè)量系統(tǒng),可用于糧倉(cāng)等場(chǎng)合的溫濕度監(jiān)控。
DHT11數(shù)字溫濕度傳感器,是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,采用專(zhuān)用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性,內(nèi)部包含一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件。DHT11傳感器都經(jīng)過(guò)實(shí)驗(yàn)室校準(zhǔn),校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些校準(zhǔn)系數(shù)。采用單線制串行接口,超小的體積、極低的功耗,使系統(tǒng)集成變得簡(jiǎn)易快捷,信號(hào)傳輸距離可達(dá)20米以上。
關(guān)于LabVIEW控制Arduino在基礎(chǔ)篇已經(jīng)講解過(guò)很多種類(lèi)溫度傳感器的采集方法。具體可參見(jiàn)以下鏈接:
LabVIEW控制Arduino采集LM35溫度傳感器數(shù)值(基礎(chǔ)篇—12)
LabVIEW控制Arduino采集熱敏電阻溫度數(shù)值(基礎(chǔ)篇—13)
LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值(進(jìn)階篇—3)
2
項(xiàng)目架構(gòu)
溫濕度測(cè)量系統(tǒng)框圖如下圖所示:
在整個(gè)系統(tǒng)中,Arduino Uno作為下位機(jī),負(fù)責(zé)DHT11的讀寫(xiě)以及數(shù)據(jù)傳輸,LabVIEW編寫(xiě)的顯示軟件作為上位機(jī),上下位機(jī)利用USB-TTL接口實(shí)現(xiàn)通信。
3
硬件環(huán)境
需要將將DHT11溫濕度模塊的VCC、GND、DOUT引腳分別接至Arduino Uno控制板上的+5V、GND、數(shù)字端口2,還需要在DOUT與VCC之間串聯(lián)5KΩ的上拉電阻。濕度測(cè)量系統(tǒng)硬件連接圖如下所示:
4
Arduino功能設(shè)計(jì)
Arduino Uno控制器負(fù)責(zé)讀取LabVIEW上位機(jī)發(fā)來(lái)的溫度和濕度采集命令,并讀取DHT11從而獲取溫度或濕度的數(shù)據(jù),通過(guò)串口發(fā)送回上位機(jī)LabVIEW軟件。ArduinoUno控制器的程序代碼如代碼如下所示:
#include <dht11.h> #define Temperature_COMMAND 0x10 //采集命令字#define Humidity_COMMAND 0x11 //采集命令字 /*-----( Declare objects )-----*/dht11 DHT11; /*-----( Declare Constants, Pin Numbers )-----*/#define DHT11PIN 2 byte comdata[3]={0}; //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù) void receive_data(void); //接受串口數(shù)據(jù)void test_do_data(void); //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù) void setup(){ Serial.begin(9600); }void loop(){ while (Serial.available() > 0) //不斷檢測(cè)串口是否有數(shù)據(jù) { receive_data(); //接受串口數(shù)據(jù) test_do_data(); //測(cè)試數(shù)據(jù)是否正確并更新標(biāo)志位 }}void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失, delay(2); }} void test_do_data(void){ if(comdata[0] == 0x55) //0x55和0xAA均為判斷是否為有效命令 { if(comdata[1] == 0xAA) { switch (comdata[2]) { case Temperature_COMMAND: DHT11.read(DHT11PIN); Serial.println((float)DHT11.temperature, 2); break; case Humidity_COMMAND: DHT11.read(DHT11PIN); Serial.println((float)DHT11.humidity, 2); break; } } }}
5
LabVIEW功能設(shè)計(jì)
LabVIEW上位機(jī)部分需要完成以下功能:
1、向下位機(jī)Arduino控制器發(fā)送溫度采集命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成溫度數(shù)據(jù)的采集之后將數(shù)據(jù)回傳,LabVIEW軟件將回傳的溫度數(shù)據(jù)顯示在前面板上;
2、向下位機(jī)Arduino控制器發(fā)送濕度采集命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成濕度數(shù)據(jù)的采集之后將數(shù)據(jù)回傳,LabVIEW軟件將回傳的濕度數(shù)據(jù)顯示在前面板上。
5.1、前面板設(shè)計(jì)
LabVIEW前面板分為溫度和濕度顯示,溫濕度測(cè)量系統(tǒng)的LabVIEW上位機(jī)前面板如下圖所示:
5.2、程序框圖設(shè)計(jì)
LabVIEW上位機(jī)主程序的結(jié)構(gòu)為順序結(jié)構(gòu)+While循環(huán)。首先,在順序結(jié)構(gòu)中的第-幀中,通過(guò)設(shè)置的串口號(hào)來(lái)初始化串口通信。然后,程序進(jìn)入While循環(huán)和順序結(jié)構(gòu),依次向Arduino Uno控制器發(fā)送溫度和濕度測(cè)量的命令碼,接收到返回的溫度和濕度數(shù)據(jù)之后,顯示在前面板上。最后,關(guān)閉串口通信。
為了保證通信的正確性,在數(shù)據(jù)幀中設(shè)置0X55和0XAA為校驗(yàn)幀,0X11為溫度采集命令碼,0X10為濕度采集命令碼。LabVIEW上位機(jī)程序框圖如下圖所示:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。