博客專欄

EEPW首頁 > 博客 > LabVIEW Arduino TCP/IP遠(yuǎn)程智能家居系統(tǒng)(項(xiàng)目篇—5)

LabVIEW Arduino TCP/IP遠(yuǎn)程智能家居系統(tǒng)(項(xiàng)目篇—5)

發(fā)布人:美男子玩編程 時(shí)間:2022-09-06 來源:工程師 發(fā)布文章

1


項(xiàng)目概述


智能家居是以家為平臺(tái),兼?zhèn)浣ㄖ谝惑w的高效、舒適、安全、便利的家居環(huán)境。它是采用家庭控制總線、互聯(lián)網(wǎng)、通信、人工智能、單片機(jī)、傳感器等一系列高新技術(shù)將家居設(shè)備控制,安防管理生活信息及資訊管理,家居互聯(lián)網(wǎng)通信等與我們?nèi)粘I钕⑾⑾嚓P(guān)的常用生活元素全面并縝密地結(jié)合在一起,能夠高度地提升我們的日常生活質(zhì)量、便利性、安全性、舒適性和豐富性,是實(shí)現(xiàn)真正意義上的數(shù)字化、網(wǎng)絡(luò)化、信息化和智能化家庭的一種全新的系統(tǒng)。它是依托于住宅這個(gè)平臺(tái),能夠科學(xué)統(tǒng)籌管理家居生活的各個(gè)方面,讓家居生活“"智慧"起來。


這個(gè)管理過程的實(shí)現(xiàn)要依賴于計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)、通信技術(shù)和綜合布線技術(shù)等關(guān)鍵技術(shù)。其目的是為了給人們提供一個(gè)更加舒適、更加安全、更加便利的環(huán)境,從而真正地提高人們的生活品質(zhì),讓人們感受到現(xiàn)代化時(shí)尚便利式的生活。


智能家居系統(tǒng)是實(shí)現(xiàn)對(duì)家用電器、數(shù)據(jù)采集設(shè)備和安防設(shè)備進(jìn)行智能化監(jiān)控的系統(tǒng),它包含入侵報(bào)警、煤氣檢測、數(shù)據(jù)采集以及家電控制等功能模塊。其中,具有安防功能的煤氣檢測、入侵報(bào)警模塊是為家庭提供安全方面的保障;數(shù)據(jù)采集模塊用于對(duì)溫度濕度等物理量的采集,把數(shù)據(jù)發(fā)送到控制模塊,通過控制模塊對(duì)空調(diào)、照明燈具和電動(dòng)窗簾等設(shè)備進(jìn)行控制,該模塊實(shí)現(xiàn)的目的是為用戶提供舒適、便捷、安全的家居環(huán)境。



2


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


本篇博文主要介紹一個(gè)基于TCP/IP網(wǎng)絡(luò)的遠(yuǎn)程智能家居系統(tǒng),采用Arduino Uno控制器作為下位機(jī),采用LabVIEW作為遠(yuǎn)程監(jiān)控軟件,兩者通過網(wǎng)絡(luò)實(shí)現(xiàn)通信。


圖片



3


傳感器選型


3.1、氣體傳感器


為了防止廚房內(nèi)的煤氣發(fā)生泄露,引發(fā)煤氣中毒和火災(zāi)等危險(xiǎn)的發(fā)生,本系統(tǒng)在廚房中安裝氣體傳感器,以檢測是否有天然氣泄露。


氣體傳感器選用MQ-X系列氣體傳感器,此款傳感器采用MQ-X型氣敏元件,可以很靈敏地檢測到空氣中的煙霧以及甲烷氣體。結(jié)合蜂鳴器模塊與繼電器模塊,可以制作煙霧報(bào)警器、甲烷泄露報(bào)警器、自動(dòng)煙霧排風(fēng)機(jī)等產(chǎn)品,是使室內(nèi)的空氣達(dá)到環(huán)保標(biāo)準(zhǔn)的理想傳感器。


MQ-2是一種氣體電阻控制型的氣敏器件,其阻值隨被測氣體的濃度(成分)而變化。氣敏器件是一種“氣—電"傳感器件,它將被測氣體的濃度(成分)信號(hào)轉(zhuǎn)變成相應(yīng)的電信號(hào),而且氣敏器件阻值與氣體濃度之間一般為非線性關(guān)系,但在固定濃度域的氣體檢測時(shí)可近似認(rèn)為是線性的,在一定的濃度范圍內(nèi)的檢測是有效的。

氣敏器件一般都是在加熱條件下工作,但工作溫度不宜太高(一般不要超過35℃),否則會(huì)造成性能衰減,降低氣敏靈敏度。


器件放置一段時(shí)間后,再通電使用時(shí),阻值是先下降,然后又上升,通電大約10分鐘后(初期穩(wěn)定時(shí)間),才能穩(wěn)定到與氣氛狀態(tài)相應(yīng)的阻值。為了避免通電開始時(shí)的誤報(bào)動(dòng)作,應(yīng)特別注意要設(shè)置十幾分鐘的延遲時(shí)間。器件的響應(yīng)時(shí)間約為10秒,恢復(fù)時(shí)間約為30~60秒。使用時(shí),要避免油浸或油垢污染,更不要將氣敏器件長時(shí)間放在腐蝕氣體中。長時(shí)間使用時(shí),要有防止灰塵堵塞不銹鋼網(wǎng)的措施。


MQ-2氣體傳感器實(shí)物圖如下圖所示:


圖片


3.2、溫度傳感器


DS18B20是美國DALLAS半導(dǎo)體公司的數(shù)字化單總線智能溫度傳感器,與傳統(tǒng)的熱敏電阻相比,它能夠直接讀出被測溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。從DS18B20讀出信息或?qū)懭胄畔H需要一根線(單總線)讀寫,總線本身也可以向所掛接的設(shè)備供電,而無需額外電源。


拓展學(xué)習(xí):LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值(進(jìn)階篇—3)


3.3、熱釋電紅外傳感器


熱釋電紅外傳感器主要由一種高熱電系數(shù)的材料,如錯(cuò)鈦酸鉛系陶瓷、擔(dān)酸鋰、硫酸三甘鈦等制成尺寸為2mm×1mm的探測元件。在每個(gè)探測器內(nèi)裝入一個(gè)或兩個(gè)探測元件,并將兩個(gè)探測元件以反極性串聯(lián),以抑制由于自身溫度升高而產(chǎn)生的干擾。由探測元件將探測并接收到的紅外輻射轉(zhuǎn)變成微弱的電壓信號(hào),經(jīng)裝在探頭內(nèi)的場效應(yīng)管放大后向外輸出。為了提高探測器的探測靈敏度以增大探測距離,一般在探測器的前方裝設(shè)一個(gè)菲涅爾透鏡,該透鏡用透明塑料制成,將透鏡的上、下兩部分各分成若干等份,制成一種具有特殊光學(xué)系統(tǒng)的透鏡,它和放大電路相配合,可將信號(hào)放大70dB以上,這樣就可以測出10~20米范圍內(nèi)人的行動(dòng)。


熱釋電紅外傳感器的窗口接收光線,濾波片對(duì)自然界中的白光信號(hào)具有抑制作用,因此只有特定波長的紅外信號(hào)才能透過濾波片照射在熱釋電元件上。熱釋電元件被光照后,由于熱釋電元件的上下表面受到的光照不同,產(chǎn)生電子并且形成電流,使兩塊黑色涂膜產(chǎn)生不同的熱釋電,電流經(jīng)過場效應(yīng)管后放大輸出電壓信號(hào)。


熱釋電紅外傳感器具有不發(fā)任何類型的輻射、器件功耗很小、隱蔽性好、價(jià)格低廉等優(yōu)點(diǎn),其缺點(diǎn)如下:

1、容易受各種熱源、光源干擾;

2、被動(dòng)紅外穿透力差,人體的紅外輻射容易被遮擋,不易被探頭接收;

3、環(huán)境溫度和人體溫度接近時(shí),探測和靈敏度明顯下降,有時(shí)造成短時(shí)失靈。


圖片


3.4、繼電器


繼電器是一種電控制器件,當(dāng)輸入量(激勵(lì)量)的變化達(dá)到規(guī)定要求時(shí),在電氣輸出電路中使被控量發(fā)生預(yù)定的階躍變化。它具有控制系統(tǒng)(又稱輸入回路)和被控制系統(tǒng)(又稱輸出回路)之間的互動(dòng)關(guān)系,通常應(yīng)用于自動(dòng)化的控制電路中,實(shí)際上是用小電流去控制大電流運(yùn)作的一種“自動(dòng)開關(guān)”。


電磁繼電器一般由鐵芯、線圈、銜鐵、觸點(diǎn)簧片等組成。只要在線圈兩端加上一定的電壓,線圈中就會(huì)流過一定的電流,從而產(chǎn)生電磁效應(yīng),銜鐵就會(huì)在電磁力吸引的作用下克服返回彈簧的拉力吸向鐵芯,從而帶動(dòng)銜鐵的動(dòng)觸點(diǎn)與靜觸點(diǎn)(常開觸點(diǎn))吸合。當(dāng)線圈斷電后,電磁的吸力也隨之消失,銜鐵就會(huì)在彈簧的反作用力下返回原來的位置,使動(dòng)觸點(diǎn)與原來的靜觸點(diǎn)(常閉觸點(diǎn))釋放。這樣吸合、釋放,從而達(dá)到了在電路中的導(dǎo)通、切斷的目的。對(duì)于繼電器的“常開、常閉"觸點(diǎn),可以這樣來區(qū)分:繼電器線圈未通電時(shí)處于斷開狀態(tài)的靜觸點(diǎn),稱為“常開觸點(diǎn)”;處于接通狀態(tài)的靜觸點(diǎn)稱為“常閉觸點(diǎn)”。


圖片



4


硬件環(huán)境


將DS18B20溫度傳感器的Vcc和GND分別連接至Arduino Uno控制器的+5V和GND,以給DS18B20提供電源,DS18B20的DQ引腳接至ArduinoUno控制器數(shù)字引腳D2,且連接4.7KΩ的上拉電阻,因?yàn)镈S18B20的DQ引腳正常工作需要添加上拉電阻。


將MQ-2氣體傳感器的兩個(gè)H引腳分別接至加熱電源的正負(fù)極,并調(diào)整電源模塊輸出+5V電壓;將A端、B端分別接至Arduino Uno控制器的+5V、模擬輸入AO,并且在B端與GND之間串接負(fù)載電阻。


將固態(tài)繼電器模組的控制端分別接至Arduino Uno控制板上的數(shù)字端口D3、D4、D5、D6、GND。硬件連接圖上只表示了一路繼電器,其余的類似。


將熱釋電紅外傳感器的VCC、OUT、GND分別接至Arduino Uno控制板上的5V、數(shù)字接口D7和GND。此處沒有在硬件連接圖上表示出來。


遠(yuǎn)程智能家居系統(tǒng)部分硬件連接如下圖所示:


圖片



5


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


在基于Arduino與LabVIEW的遠(yuǎn)程家庭監(jiān)控系統(tǒng)中,Arduino Uno控制器需要完成以下功能:

1、通過W5100網(wǎng)絡(luò)模塊接收并判斷命令,采集和傳輸溫度、煤氣濃度、熱釋電傳感器的數(shù)據(jù),并通過W5100網(wǎng)絡(luò)模塊上傳給LabVIEW軟件;

2、通過W5100網(wǎng)絡(luò)模塊接收并判斷命令、控制多路繼電器模組的斷開與閉合,以控制家用電器的關(guān)閉與工作。


遠(yuǎn)程智能家居系統(tǒng)Arduino控制器程序代碼如下所示:

























































































































#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2     //DS18B20接至Arduino數(shù)字口2OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);
#define gas_Command        0x81   #define temp_Command       0x82   #define infrared_Command   0x80   #define SW1_ON_Command     0x11   #define SW1_OFF_Command    0x10   #define SW2_ON_Command     0x21   #define SW2_OFF_Command    0x20   #define SW3_ON_Command     0x31   #define SW3_OFF_Command    0x30   #define SW4_ON_Command     0x41   #define SW4_OFF_Command    0x40   
#include <SPI.h>#include <Ethernet.h>// Adresses MAC et IP à changer suivant vos besoinsbyte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress ip(192,168,1,177);
// Initialisation de la librairie ethernet// et création d'un objet "Server" qui va accepter// les connexions extérieures à l'adresse IP defini plus// haut et sur le port indiqué (ici 8000)EthernetServer server(8000);
byte comdata[3]={0};void test_do_data(void);    //測試串口數(shù)據(jù)是否正確并執(zhí)行命令
int SW1=3;int SW2=4;int SW3=5;int SW4=6;int inrared_Pin=7;
void setup(){  Ethernet.begin(mac, ip);      // Initialisation de la pile TCP/IP  server.begin();               // Démarrage du serveur  sensors.begin();  pinMode(SW1, OUTPUT);   pinMode(SW2, OUTPUT);   pinMode(SW3, OUTPUT);   pinMode(SW4, OUTPUT); } void loop(){   int i ;  // Attente des connexions et création d'un objet client s'il y a lieu  EthernetClient client = server.available();  if (client) {                                // Un client existe    while (client.connected()) {               // il est connecté      if (client.available()) {                // et il a envoyé des caractères             for(i=0;i<3;i++)         {              comdata[i] =client.read();               //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失              delay(2);           }          test_do_data();        }      // on renvoie au client une chaine de caractère qui représente le résultat de      // la conversion AN (par ex: '236') suivi des caractères CR+LF        }    client.stop();                             // Fermeture de la connexion  }}void test_do_data(){  if(comdata[0] == 0x55)    //0x55和0xAA均為判斷是否為有效命令   {     if(comdata[1] == 0xAA)     {       switch (comdata[2])        {            case temp_Command:             sensors.requestTemperatures();            server.print(sensors.getTempCByIndex(0),2);                break;            case infrared_Command:                   server.print(digitalRead(inrared_Pin)*5/1024,2);             break;            case gas_Command:              server.print(analogRead(A0));                  break;            case SW1_ON_Command:              digitalWrite(SW1, HIGH);                    break;            case SW1_OFF_Command:              digitalWrite(SW1, LOW);                    break;            case SW2_ON_Command:              digitalWrite(SW2, HIGH);                    break;            case SW2_OFF_Command:            digitalWrite(SW2, LOW);                    break;            case SW3_ON_Command:              digitalWrite(SW3, HIGH);                    break;            case SW3_OFF_Command:              digitalWrite(SW3, LOW);                    break;            case SW4_ON_Command:              digitalWrite(SW4, HIGH);                    break;            case SW4_OFF_Command:              digitalWrite(SW4, LOW);                    break;         }      }   }}



6


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


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

1、當(dāng)家用電器的開關(guān)觸發(fā)時(shí),向下位機(jī)Arduino控制器發(fā)送指定家電的狀態(tài)切換命令,Arduino控制器通過W5100模塊讀取上位機(jī)的命令,進(jìn)而控制固態(tài)繼電器模組的閉合和斷開,實(shí)現(xiàn)指定家用電器的打開/關(guān)閉;

2、當(dāng)前面板無操作而超時(shí)1秒時(shí),依次向下位機(jī)Arduino控制器發(fā)送溫度、煤氣濃度、熱釋電傳感器的讀取命令,Arduino控制器通過W5100模塊讀取上位機(jī)的命令,讀取所需的數(shù)據(jù)并通過W5100模塊上傳至LabVIEW上位機(jī)軟件顯示。


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


LabVIEW前面板分為儀表盤顯示、波形圖顯示和電器開關(guān)等部分,儀表盤部分用于顯示當(dāng)前的煤氣濃度,波形圖顯示部分用于顯示溫度的變化趨勢,電器開關(guān)部分用于控制各路電器的工作狀態(tài)。同時(shí),右下角的防盜指示燈顯示熱釋電傳感器的狀態(tài)。


遠(yuǎn)程家庭監(jiān)控系統(tǒng)的LabVIEW上位機(jī)前面板如下圖所示:


圖片


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


采用事件結(jié)構(gòu)+超時(shí)結(jié)構(gòu)來實(shí)現(xiàn)測量和控制兩部分,在測量中使用條件結(jié)構(gòu)+枚舉的狀態(tài)機(jī)來實(shí)現(xiàn)溫度、氣體濃度和熱釋電傳感器數(shù)據(jù)的讀取,將測量程序劃分為3個(gè)狀態(tài):溫度測量、氣體檢測和防盜指示。


為了更好地實(shí)現(xiàn)通信,制定如下的通信協(xié)議︰幀頭+操作碼。0x55AA為幀頭,操作碼0x80為熱釋電傳感器數(shù)據(jù)的采集,0x81為氣體濃度的采集,0x82為溫度采集,0x11為第一路繼電器閉合,0x10為第一路繼電器斷開,0x21為第二路繼電器閉合,0x20為第二路繼電器斷開,0x31為第三路繼電器閉合,0x30為第三路繼電器斷開,0x41為第四路繼電器閉合,0x40為第四路繼電器斷開。


LabVIEW上位機(jī)超時(shí)部分的程序框圖如下所示:


圖片


圖片


圖片


四個(gè)開關(guān)的值改變事件的程序框圖如下所示:


圖片


圖片


圖片


圖片


在將程序燒寫到Arduino Uno控制器之后,用網(wǎng)線將W5100網(wǎng)絡(luò)模塊與計(jì)算機(jī)連接在同一個(gè)路由器的不同的LAN接口,在LabVIEW程序中使用“高亮執(zhí)行代碼”,觀察TCP初始化能否成功。如不能,則重啟Arduino Uno控制器。


另外,在Arduino Uno控制器一端的路由器需要直接與公網(wǎng)相連接,而不是作為二級(jí)路由,同時(shí)需要設(shè)置路由器,使得Arduino Uno控制器的網(wǎng)絡(luò)IP地址能夠被遠(yuǎn)程的LabVIEW軟件所偵聽到。由于不同的路由器的設(shè)置方法不同,具體的路由器設(shè)置方法請上網(wǎng)搜索。


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



關(guān)鍵詞: LabVIEW Arduino

相關(guān)推薦

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

關(guān)閉