博客專欄

EEPW首頁(yè) > 博客 > LabVIEW Arduino ZigBee無(wú)線氣象站(項(xiàng)目篇—3)

LabVIEW Arduino ZigBee無(wú)線氣象站(項(xiàng)目篇—3)

發(fā)布人:美男子玩編程 時(shí)間:2022-08-18 來(lái)源:工程師 發(fā)布文章

1


項(xiàng)目概述


目前,國(guó)內(nèi)氣象站對(duì)地面氣象數(shù)據(jù)的采集大多采用傳統(tǒng)的有線方式,其布線成本高,維護(hù)不方便,尤其對(duì)于山區(qū)等一些復(fù)雜的地形來(lái)說(shuō),這種缺點(diǎn)更為明顯。傳統(tǒng)的無(wú)線通信方式有很多,無(wú)線電、微波、紅外線、藍(lán)牙、射頻等,在某些只需簡(jiǎn)單的無(wú)線連接的應(yīng)用領(lǐng)域?qū)?shù)據(jù)速率的要求并不很高,設(shè)備的功耗是更需要考慮的問(wèn)題。ZigBee網(wǎng)絡(luò)是低功耗、低成本、高可靠性的無(wú)線傳感器網(wǎng)絡(luò),其在環(huán)境檢測(cè)等領(lǐng)域中有著廣闊的應(yīng)用前景。



2


項(xiàng)目架構(gòu)


本篇博文將要介紹一種基于Arduino、LabVIEW和ZigBee的個(gè)人小型無(wú)線自動(dòng)氣象站,可以實(shí)現(xiàn)自主采集溫度、濕度、氣壓、粉塵濃度,并且將數(shù)據(jù)實(shí)時(shí)上傳至LabVIEW上位機(jī)軟件。氣象站終端設(shè)備采用Arduino作為控制核心,上位機(jī)軟件采用LabVIEW,兩者通過(guò)基于ZigBee技術(shù)的XBee模塊實(shí)現(xiàn)無(wú)線通信。


個(gè)人小型氣象站的總體框圖如下圖所示:


圖片



3


傳感器選型


3.1、溫濕度傳感器


SHT11是瑞士Sensirion公司推出的一款數(shù)字溫濕度傳感器芯片,將傳感元件和信號(hào)處理電路集成在一塊微型電路板上,輸出完全標(biāo)定的數(shù)字信號(hào),采用CMOSens專利技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器芯片內(nèi)部包括一個(gè)電容性聚合體測(cè)濕敏感元件、一個(gè)用能隙材料制成的測(cè)溫元件,并在同一芯片上與14位的A/D轉(zhuǎn)換器以及串行接口電路實(shí)現(xiàn)無(wú)縫連接。因此,具有品質(zhì)卓越、響應(yīng)迅速、抗干擾能力強(qiáng)、性價(jià)比高等優(yōu)點(diǎn),廣泛應(yīng)用于暖通空調(diào)、汽車、消費(fèi)電子、自動(dòng)控制等領(lǐng)域。


每個(gè)傳感器芯片都在極為精確的濕度腔室中進(jìn)行標(biāo)定,校準(zhǔn)系數(shù)以程序形式儲(chǔ)存在OTP內(nèi)存中,用于內(nèi)部的信號(hào)校準(zhǔn)。兩線制的串行接口與內(nèi)部的電壓調(diào)整,使外圍系統(tǒng)集成變得快速而簡(jiǎn)單。微小的體積、極低的功耗,使SHT11成為各類應(yīng)用的首選。


圖片


拓展學(xué)習(xí):

LabVIEW控制Arduino采集熱電偶溫度數(shù)值(進(jìn)階篇—2)

LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值(進(jìn)階篇—3)

LabVIEW控制Arduino采集DHT11溫濕度數(shù)值(進(jìn)階篇—4)


3.2、壓力傳感器


氣壓是指作用在單位面積上的大氣壓力,它等于單位面積上到大氣上界的垂直空氣柱的重量,大氣壓力測(cè)量的基本單位是帕斯卡(Pa,即牛頓每平方米)。此處采用BMP085氣壓傳感器實(shí)現(xiàn)氣壓的測(cè)量。


BMP085是一款高精度、超低能耗的壓力傳感器,可以應(yīng)用在移動(dòng)設(shè)備中。它的性能卓越,絕對(duì)精度最低可以達(dá)到0.03hPa,并且耗電極低,只有3uA。BMP085采用強(qiáng)大的8-pin陶瓷無(wú)引線芯片承載(LCC)超薄封裝,可以通過(guò)I2C總線直接與各種微處理器相連。而且,BMP085利用溫度補(bǔ)償來(lái)提高氣壓的測(cè)量精度,反應(yīng)時(shí)間7.5ms,待機(jī)電流0.1uA,無(wú)需外部時(shí)鐘電路,無(wú)鉛,符合RoHS規(guī)范。BMP085氣壓傳感器模塊如下圖所示:


圖片


3.3、空氣質(zhì)量傳感器


粉塵是指懸浮在空氣中的固體微粒。按照國(guó)際標(biāo)準(zhǔn)化組織規(guī)定,粒徑小于75um的固體懸浮物定義為粉塵。大氣中粉塵的存在是保持地球溫度的主要原因之一,大氣中過(guò)多或過(guò)少的粉塵將對(duì)環(huán)境產(chǎn)生災(zāi)難性的影響。但在生活和工作中,過(guò)多的粉塵是人類健康的天敵,是誘發(fā)多種疾病的主要原因。


隨著經(jīng)濟(jì)的發(fā)展,環(huán)境污染越發(fā)嚴(yán)重,隨著生活水平的提高,人們的健康意識(shí)也越來(lái)越強(qiáng),在小型氣象站中增加粉塵傳感器,用于監(jiān)測(cè)空氣中的粉塵等可吸入固體顆粒。


GP2Y1010AU0F是夏普公司的光學(xué)空氣質(zhì)量傳感器,可以測(cè)量空氣中塵埃的含量。該裝置中包含一個(gè)紅外發(fā)光二極管和光電晶體管,且呈對(duì)角布置,允許其檢測(cè)的反射光在空氣中的灰塵,可以非常有效地檢測(cè)比較微小的顆粒,如香煙煙霧,并且是常用的空氣凈化器系統(tǒng)。GP2Y1010AU0F實(shí)物圖效果如下圖所示:


圖片



4


硬件環(huán)境


將SHT11溫濕度傳感器的VCC、GND、SCK、DATA分別接至Arduino Uno控制板上的+5V、GND、模擬端口A2和A3。


將BMP085氣壓傳感器的VCC、GND、SCL、SDA分別接至Arduino Uno控制板上的3.3V、GND、SCL和SDA。若Arduino Uno控制板上沒有標(biāo)注的SCL和SDA端口,則將BMP085的SCL和SDA分別接至模擬端口A5和A4上。


GP2Y1010AU0F粉塵傳感器VLED串聯(lián)150Ω電阻接至Arduino Uno控制板上的+5V,LED-GND接至GND,LED接至數(shù)字引腳D2,S-GND接至GND,Vo接至模擬輸入A0,Vcc接至5V。


Arduino Uno控制器與XBee模塊、BMP085和SHT11的硬件連接,如下圖所示:


圖片



5


Arduino功能設(shè)計(jì)


在基于Arduino與LabVIEW的個(gè)人小型氣象站中,Arduino Uno控制器需要完成兩個(gè)功能:接收和判斷命令,采集和傳輸溫濕度、氣壓、粉塵濃度的數(shù)據(jù),Arduino Uno控制器通過(guò)XBee模塊接收上位機(jī)發(fā)來(lái)的命令,分析得到有效命令,讀取溫濕度、氣壓、粉塵濃度等數(shù)據(jù),并上傳給LabVIEW軟件。


個(gè)人氣象站Arduino控制器程序代碼如下所示:





























































































#include <Wire.h>#include <BMP085.h>#include <SHT1x.h> #define temp_Command      0x10   //采集命令字#define humidity_Command  0x20   //A1采集命令字#define pressure_Command  0x30   //D0采集命令字#define dust_Command      0x40   //D1采集命令字 // Specify data and clock connections and instantiate SHT1x object#define dataPin  A3#define clockPin A2SHT1x sht1x(dataPin, clockPin);BMP085 bmp;  byte comdata[3]={0};      //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù)float temp_c;float humidity;int dustPin=0;int dustVal=0;int PressureVal=0; int ledPower=2;int delayTime=280;int delayTime2=40;float offTime=9680;  void receive_data(void);      //接受串口數(shù)據(jù)void test_do_data(void);         //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù) void setup(){  Serial.begin(9600);        pinMode(2, INPUT);  pinMode(3, INPUT);  pinMode(ledPower,OUTPUT);  pinMode(4, OUTPUT);  analogReference(INTERNAL);  bmp.begin();  }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] == 0xFF)     {        switch(comdata[2])          {               case temp_Command:                   temp_c = sht1x.readTemperatureC();                Serial.print(temp_c, 2);                   break;            case humidity_Command:                    humidity = sht1x.readHumidity();                 Serial.print(humidity,2);                 break;            case pressure_Command:                    PressureVal=bmp.readPressure();                 Serial.print(PressureVal,2);                                     break;            case dust_Command:                    digitalWrite(ledPower,LOW); // power on the LED                 delayMicroseconds(delayTime);                 dustVal=analogRead(dustPin); // read the dust value via pin 5 on the sensor                 delayMicroseconds(delayTime2);                 digitalWrite(ledPower,HIGH); // turn the LED off                 delayMicroseconds(offTime);                 Serial.println(dustVal);                                              break;                         }       }   }}



6


LabVIEW功能設(shè)計(jì)


LabVIEW上位機(jī)部分需要完成以下功能:

1、向下位機(jī)Arduino控制器發(fā)送溫度、濕度、氣壓數(shù)據(jù)的采集命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成相應(yīng)的數(shù)據(jù)采集之后并將采集的數(shù)據(jù)回傳,LabVIEW軟件將回傳的數(shù)據(jù)顯示在前面板上。

2、向下位機(jī)Arduino控制器發(fā)送粉塵濃度的采集命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成粉塵濃度的電壓采集之后并將采集的電壓數(shù)據(jù)轉(zhuǎn)換為粉塵濃度,LabVIEW軟件接收Arduino返回的粉塵濃度并顯示在前面板上,同時(shí)將粉塵濃度的變化顯示在波形圖上。


6.1、前面板設(shè)計(jì)


LabVIEW前面板分為儀表盤顯示和波形圖顯示兩個(gè)部分,儀表盤部分用于顯示當(dāng)前的數(shù)據(jù),包括溫度、濕度、氣壓和粉塵濃度;波形圖顯示部分用于顯示粉塵濃度的變化趨勢(shì)。基于Arduino與LabVIEW的個(gè)人小型氣象站的LabVIEW上位機(jī)前面板,如下圖所示:


圖片


6.2、程序框圖設(shè)計(jì)


在LabVIEW上位機(jī)的程序設(shè)計(jì)中,溫度、濕度、氣壓和粉塵濃度的采集需要向Arduino Uno控制器發(fā)送不同的命令碼,并獲取Arduino Uno控制器返回的測(cè)量數(shù)據(jù),為了使得程序結(jié)構(gòu)更加清晰明朗,此處將溫度、濕度、氣壓和粉塵濃度采集分別編寫成子VI。


溫度采集子程序的前面板和程序框圖,如下圖所示:


圖片


圖片


濕度采集子程序的前面板和程序框圖,如下圖所示:


圖片


圖片


氣壓采集子程序的前面板和程序框圖,如下圖所示:


圖片


圖片


粉塵濃度采集子程序的前面板和程序框圖,如下圖所示:


圖片


圖片


采用條件結(jié)構(gòu)+移位寄存器的狀態(tài)機(jī)來(lái)實(shí)現(xiàn)LabVIEW上位機(jī)主程序,將主程序劃分為5個(gè)狀態(tài):0狀態(tài)為串口初始化,1狀態(tài)為溫度測(cè)量,2狀態(tài)為濕度測(cè)量,3狀態(tài)為氣壓測(cè)量,4狀態(tài)為粉塵濃度測(cè)量,且初始狀態(tài)為0狀態(tài)(串口初始化)。


在0狀態(tài)中,通過(guò)設(shè)置的串口號(hào)來(lái)初始化串口通信。在1狀態(tài)中,讀取溫度數(shù)據(jù)并顯示,在2狀態(tài)中,讀取濕度數(shù)據(jù)并顯示,在3狀態(tài)中,讀取氣壓數(shù)據(jù)并顯示,在4狀態(tài)中,讀取粉塵濃度數(shù)據(jù)并顯示在波形圖上。最后,關(guān)閉串口通信。


串口初始化程序框圖如下所示:


圖片


溫度采集程序框圖如下所示:


圖片


濕度采集程序框圖如下所示:


圖片


氣壓采集程序框圖如下所示:


圖片


粉塵濃度采集程序框圖如下所示:


圖片


本節(jié)介紹的基于ZigBee的個(gè)人小型氣象站可以通過(guò)無(wú)線方式實(shí)現(xiàn)溫濕度、氣壓和粉塵濃度的測(cè)量,如需要增加其他的測(cè)量參數(shù),則需要添加相應(yīng)的傳感器即可。

另外,利用ZigBee的組網(wǎng)技術(shù),在一定的區(qū)域內(nèi)布置多個(gè)測(cè)量站點(diǎn),可以實(shí)現(xiàn)區(qū)域性的氣象參數(shù)的測(cè)量。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

電容式接近開關(guān)相關(guān)文章:電容式接近開關(guān)原理
光電開關(guān)相關(guān)文章:光電開關(guān)原理


關(guān)鍵詞: LabVIEW

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉