1. 程式人生 > >智慧家居系統設計與實現

智慧家居系統設計與實現

一、設計目的

1、根據酷痞Coolpy資料庫,相當於一個雲平臺和Web服務,理解網頁控制電源開關的方法和過程,掌握HTML5頁面訪問與控制的具體協議和通訊命令。學會在Coolpy中建立數值型感測器和開關型感測器,並熟悉使用。

2、通過Arduino接收RT5350F開發板得到的Coolpy資料庫中的開關感測器的開關狀態來控制Arduino上的LED燈的亮滅。

3、通過Arduino獲取光強的強度數值,將數值通過RT5350F開發板傳給Coolpy資料庫中的數值型感測器。

4、通過酷痞資料庫的開關感測器的開關控制燈亮滅,並且燈亮時,採集光強並上傳資料給酷痞資料庫,當燈滅時,不採集光強資料。

5、掌握網路通訊和無線通訊原理,理解系統實現的具體方案,以及系統控制資料的流向,從而實現智慧家居系統實現的目的。

 二、設計內容

1、設定IPv4的地址為192.168.1.88,子網掩碼為255.255.255.0,點選確定。這樣可以確保與嵌入式開發板在同一網段,從而實現網路共享、檔案共享。

2、開啟瀏覽器,在位址列中敲入192.168.1.1,這是嵌入式開發板的ip地址,可自己設定。在裡面找到WIFI選項,連入WIFI訊號,這裡的WIFI訊號所使用的是自己的熱點。

3、接下來開啟我們的串列埠終端軟體,SecureCRT,開啟串列埠終端之後可以對嵌入式開發板進行操作了。主要是操作/mnt目錄下的指令碼檔案。

三、開關控制LED燈

首先給Arduino中燒寫入通過上位機給串列埠傳送“1”則小燈亮;通過上位機給串列埠傳送“0”則燈滅的程式。

接下來就要實現能實時獲取到酷痞中的開關感測器的狀態“0”或者“1”,之後就將酷痞、嵌入式開發板、Arduino開發板三者聯絡在一起。


上圖展示了嵌入式開發板與Arduino開發板通訊的三腳,從左往右看,分別是GND、TX、RX。分別與Arduino的GND、0腳、1腳相連。



//Arduino程式:

int led=13;   //設定13管腳為led

byte ch;

voidsetup() {

  Serial.begin(9600);//設定波特率為9600

  pinMode(led,OUTPUT);//設定13號管腳為輸出

}

voidloop()

{

  if(Serial.available()>0)//判斷串列埠接收到了資料

 {

   ch=Serial.read();//讀取串列埠的資料

   Serial.flush();//清除串列埠快取

  if(ch=='1')//如果收到‘1’

  {   

    Serial.println("1");//輸出1並回車

    digitalWrite(led, HIGH);}//燈亮

 else if(ch=='0')//如果收到‘0’

 {

  Serial.println("0");//輸出0並回車

  digitalWrite(13, LOW);}//燈滅

 }

}

#指令碼程式

while :;

#大迴圈

do

curl -G--data "{}" -H "User-Agent: Fiddler" -H "Content-Type:application/json" -H "U-ApiKey:8aaefde1-9e67-4a2d-a99e-44f644e937a2" -H "Host:172.20.10.11:1337" --http1.1 172.20.10.11:1337/v1.0/hub/5/node/5/datapoint|cut -b 10 >/mnt/1.txt

#採集酷痞開關感測器的開關值並存入1.txt中

stty -F/dev/ttyS0 raw speed 9600 min 0 time 5

#二者波特率相等,可以進行通訊

echo"$(cat /mnt/1.txt)"  >  /dev/ttyS0

#將收到的開關資料值傳給串列埠,使得燈亮或者燈滅

sleep 1

done

四、採集光強資料

先在Arduino中燒入採集光強的資訊並列印給串列埠。特別注意的是,在程式中應該要重新整理串列埠資料,即清空原本快取在串列埠中的資料。否則在第一條curl列印的資料中會出現錯誤。

在指令碼程式中,主要是要讀取到串列埠傳送過來的資料。這裡會有一個常見的錯誤。不能直接讀取串列埠的資料,而需要將串列埠的資料值存入一個文字中(有SD卡會方便很多),然後在從文字中讀取資料傳入酷痞中。



光敏電阻的一腳接入A0模擬介面,另一腳接入5V,再加入一個330歐的電阻,一腳接A0,一腳接GND,從而可以達到採集光強的效果。

//arduino採集光強程式

intsensorPin = A0;//設定A0口為sernsorPin

intsensorValue = 0; //設定光強初始值為0

voidsetup()

{

  Serial.begin(9600);//設定波特率為9600

  }

  void loop()

  {

    Serial.flush();//清理串列埠快取資料

    sensorValue = analogRead(sensorPin);//將A0口資料傳給變數

    Serial.println(sensorValue); //輸出光強值

delay(100);

    }

#指令碼檔案

while :;

do

stty -F/dev/ttyS0 raw speed 9600 min 0 time 2

#設定波特率為9600

cat/dev/ttyS0 > /mnt/3.txt

#抓取串列埠資料存入3.txt中

c=$(echo`sed -n '1p' /mnt/3.txt`)

#將3.txt檔案中的第一行資料抓取出來

echo $a

curl -d"{\"value\":$c}" -H "User-Agent: Fiddler" -H"Content-Type: application/json" -H "U-ApiKey:8aaefde1-9e67-4a2d-a99e-44f644e937a2" -H "Host:172.20.10.11:1337" --http1.1172.20.10.11:1337/v1.0/hub/8/node/9/datapoints

#上傳光強資料值

sleep 1

done




對此感興趣的可以將兩個功能合在一起,學習愉快!