博客專欄

EEPW首頁 > 博客 > LabVIEW Arduino TCP/IP遠程智能家居系統(項目篇—5)

LabVIEW Arduino TCP/IP遠程智能家居系統(項目篇—5)

發布人:美男子玩編程 時間:2022-09-06 來源:工程師 發布文章

1


項目概述


智能家居是以家為平臺,兼備建筑化于一體的高效、舒適、安全、便利的家居環境。它是采用家庭控制總線、互聯網、通信、人工智能、單片機、傳感器等一系列高新技術將家居設備控制,安防管理生活信息及資訊管理,家居互聯網通信等與我們日常生活息息相關的常用生活元素全面并縝密地結合在一起,能夠高度地提升我們的日常生活質量、便利性、安全性、舒適性和豐富性,是實現真正意義上的數字化、網絡化、信息化和智能化家庭的一種全新的系統。它是依托于住宅這個平臺,能夠科學統籌管理家居生活的各個方面,讓家居生活“"智慧"起來。


這個管理過程的實現要依賴于計算機技術、網絡技術、通信技術和綜合布線技術等關鍵技術。其目的是為了給人們提供一個更加舒適、更加安全、更加便利的環境,從而真正地提高人們的生活品質,讓人們感受到現代化時尚便利式的生活。


智能家居系統是實現對家用電器、數據采集設備和安防設備進行智能化監控的系統,它包含入侵報警、煤氣檢測、數據采集以及家電控制等功能模塊。其中,具有安防功能的煤氣檢測、入侵報警模塊是為家庭提供安全方面的保障;數據采集模塊用于對溫度濕度等物理量的采集,把數據發送到控制模塊,通過控制模塊對空調、照明燈具和電動窗簾等設備進行控制,該模塊實現的目的是為用戶提供舒適、便捷、安全的家居環境。



2


項目架構


本篇博文主要介紹一個基于TCP/IP網絡的遠程智能家居系統,采用Arduino Uno控制器作為下位機,采用LabVIEW作為遠程監控軟件,兩者通過網絡實現通信。


圖片



3


傳感器選型


3.1、氣體傳感器


為了防止廚房內的煤氣發生泄露,引發煤氣中毒和火災等危險的發生,本系統在廚房中安裝氣體傳感器,以檢測是否有天然氣泄露。


氣體傳感器選用MQ-X系列氣體傳感器,此款傳感器采用MQ-X型氣敏元件,可以很靈敏地檢測到空氣中的煙霧以及甲烷氣體。結合蜂鳴器模塊與繼電器模塊,可以制作煙霧報警器、甲烷泄露報警器、自動煙霧排風機等產品,是使室內的空氣達到環保標準的理想傳感器。


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

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


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


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


圖片


3.2、溫度傳感器


DS18B20是美國DALLAS半導體公司的數字化單總線智能溫度傳感器,與傳統的熱敏電阻相比,它能夠直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。從DS18B20讀出信息或寫入信息僅需要一根線(單總線)讀寫,總線本身也可以向所掛接的設備供電,而無需額外電源。


拓展學習:LabVIEW控制Arduino采集多路DS18B20溫度數值(進階篇—3)


3.3、熱釋電紅外傳感器


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


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


熱釋電紅外傳感器具有不發任何類型的輻射、器件功耗很小、隱蔽性好、價格低廉等優點,其缺點如下:

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

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

3、環境溫度和人體溫度接近時,探測和靈敏度明顯下降,有時造成短時失靈。


圖片


3.4、繼電器


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


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


圖片



4


硬件環境


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


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


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


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


遠程智能家居系統部分硬件連接如下圖所示:


圖片



5


Arduino功能設計


在基于Arduino與LabVIEW的遠程家庭監控系統中,Arduino Uno控制器需要完成以下功能:

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

2、通過W5100網絡模塊接收并判斷命令、控制多路繼電器模組的斷開與閉合,以控制家用電器的關閉與工作。


遠程智能家居系統Arduino控制器程序代碼如下所示:

























































































































#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2     //DS18B20接至Arduino數字口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);    //測試串口數據是否正確并執行命令
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();               //延時一會,讓串口緩存準備好下一個字節,不延時可能會導致數據丟失              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功能設計


LabVIEW上位機部分需要完成以下功能:

1、當家用電器的開關觸發時,向下位機Arduino控制器發送指定家電的狀態切換命令,Arduino控制器通過W5100模塊讀取上位機的命令,進而控制固態繼電器模組的閉合和斷開,實現指定家用電器的打開/關閉;

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


6.1、前面板設計


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


遠程家庭監控系統的LabVIEW上位機前面板如下圖所示:


圖片


6.2、程序框圖設計


采用事件結構+超時結構來實現測量和控制兩部分,在測量中使用條件結構+枚舉的狀態機來實現溫度、氣體濃度和熱釋電傳感器數據的讀取,將測量程序劃分為3個狀態:溫度測量、氣體檢測和防盜指示。


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


LabVIEW上位機超時部分的程序框圖如下所示:


圖片


圖片


圖片


四個開關的值改變事件的程序框圖如下所示:


圖片


圖片


圖片


圖片


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


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


*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞: LabVIEW Arduino

相關推薦

技術專區

關閉
亚洲中文字幕一级无码