智慧家居系統設計與實現
一、設計目的
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”則燈滅的程式。
上圖展示了嵌入式開發板與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
對此感興趣的可以將兩個功能合在一起,學習愉快!