這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。點擊這里閱讀本文的第1部分 >
在DIY智能家居安防系統(tǒng)第1部分中,我們將各種組件(例如PIR傳感器、溫度傳感器和壓力傳感器)組合在一起,以創(chuàng)建家庭安防系統(tǒng)/探測器。在第2部分中,將對前面所創(chuàng)建系統(tǒng)的離線程序進行測試,并連接到Internet,以便使用Cayenne API進行無線控制。使用myDevices Cayenne,只要您通過網(wǎng)站和/或智能手機中的Cayenne App連接到WiFi,您就能夠無線控制安防系統(tǒng)。
硬件
參考第1部分:
Arduino Mega 2560
Arduino WiFi Shield(Arduino WiFi擴展板)
用于Arduino的Grove Base Shield(Grove基礎(chǔ)擴展板)
3 只 LED (紅色、綠色和藍色)
Grove PIR 移動偵測傳感器
蜂鳴器
Arduino ROHM 傳感器擴展板
ROHM 溫度傳感器 (BD1020HFV)
ROHM 氣壓傳感器 (BM1383GLV)
Grove 通用4芯電線
亞克力: 195 x 195 x 3mm
電阻 (10 Kω and 100 KΩ)
面包板
無線遙控器,帶2個發(fā)射器和1個接收器
軟件
Arduino IDE
Seeed Studio (https://github.com/Seeed-Studio/PIR_Motion_Sensor, https://www.seeed.cc/project_detail.html?id=284)
Cayenne API (https://mydevices.com/cayenne/docs/#using-cayenne-library)
使用離線程序測試硬件
完成硬件安裝后,現(xiàn)在可以運行離線程序進行測試。這是“離線”模式,系統(tǒng)尚未連接到Internet。我們馬上就進行測試。離線程序?qū)?zhí)行下列功能:
遙控發(fā)射器(在示例中使用通道D)打開/關(guān)閉警報。如果遙控發(fā)射器打開,綠色 LED將亮起,蜂鳴器將發(fā)出一次嗶嗶聲。
PIR傳感器將檢測移動情況。如果檢測到移動,藍色 LED將亮起。
當警報聲響起并檢測到移動時,紅色 LED將亮起,蜂鳴器將熄滅。
同樣,當警報聲響起(即綠色 LED亮起)且熱量高于設(shè)定目標時,紅色 LED將亮起,蜂鳴器將熄滅。
注:
若想關(guān)閉警報聲,用戶只需再次按遙控發(fā)射器上的通道D。綠色 LED將熄滅,蜂鳴器將發(fā)出兩次嗶嗶聲。
若需查看溫度和氣壓的值,請將USB電線從Arduino連接到PC。然后,進入Arduino IDE并單擊工具 → 串行監(jiān)視器。
現(xiàn)在可以上傳程序。進行編譯以前,請確保已安裝所有必需的庫。
//**************** Home security Program - offline ****************************** #define PIR_MOTION_SENSOR 2 // Use pin 2 to receive the signal from the module #define LED1 4 // Blue Led for motion detected #define LED2 6 // Green Led for triggered alarm #define LED3 8 // Red Led if motion and trigger switch are on #define buzzer 5 // Buzzer #define remote 41 // Remote Control #include #include #include int alarm = 0; int trigger = 0; int remote_sw = 0; int online_sw = 0; int previousState = -1; int currentState = -1; int prev_remote_stat = 0; int curr_remote_stat = 0; int currentValue = 0; int prev_online_stat = 0; int curr_online_stat = 0; int tempout_pin = A2; BM1383GLV bm1383; BD1020 bd1020; unsigned long previousMillis = 0; void setup() { Serial.begin(9600); while (!Serial); bd1020.init(tempout_pin); byte rc; while (!Serial); Wire.begin(); rc = bm1383.init(); pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); pinMode(buzzer, OUTPUT); pinMode(remote, INPUT); pinMode(PIR_MOTION_SENSOR, INPUT); } // ********************* Start Loop ***************************************** void loop() { checkSensor(); remote_sw = digitalRead(remote); Serial.print("Remote Status : "); Serial.println(remote_sw); Serial.println(); //*********************** read barometric pressure ************************ byte rc; float press; rc = bm1383.get_val(&press); if (rc == 0) { Serial.write("BM1383GLV (PRESS) = "); Serial.print(press); Serial.println(" [hPa]"); Serial.println(); } //********************** read Temperature ******************************** float temp; bd1020.get_val(&temp); temp = temp - 5; // Temperature adjustment due to heat from circuit board Serial.print("BD1020HFV Temp="); Serial.print(temp); Serial.print(" [degrees Celsius], ADC="); Serial.println(bd1020.temp_adc); Serial.println(); // ********** Check if Remote switch or online/App switch is on ********** if(remote_sw == 1 | currentValue == 1) { digitalWrite(LED2,HIGH); alarm = 1; curr_remote_stat = 1; if(curr_remote_stat != prev_remote_stat) { triggerBuzzer(2,70,30); prev_remote_stat = curr_remote_stat; } } else { curr_remote_stat = 0; if(curr_remote_stat != prev_remote_stat) { triggerBuzzer(3,70,30); prev_remote_stat = curr_remote_stat; } digitalWrite(LED2,LOW); alarm = 0; } // ********************** If motion detected *********************** if(isPeopleDetected()) //if it detects the moving people? { digitalWrite(LED1, HIGH); // Turn on Blue Led trigger = 1; delay(10); } else { digitalWrite(LED1, LOW); trigger = 0; delay(2000); } // ***************If Alarm is triggerred ************************** if (alarm == 1 && trigger == 1 ) { digitalWrite(LED3,HIGH); delay(500); triggerBuzzer(6,100,100); Serial.println("Alarm triggered"); } else { alarm = 0; trigger = 0; digitalWrite(LED3,LOW); } // *********************** If temperature is triggerred ********** if (temp > 45.00) { digitalWrite(LED3,HIGH); delay(500); triggerBuzzer(10,100,10); Serial.println("Alarm triggered"); } delay(10); } // ************************** End Loop ***************************** // Function: Write to PIR sensor indicator in Web/App *************** void checkSensor() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= 250) { currentState = digitalRead(PIR_MOTION_SENSOR); if (currentState != previousState) { previousState = currentState; } previousMillis = currentMillis; } } //*************************************************************** // Function: Detect whether anyone moves in it's detecting range boolean isPeopleDetected() { int sensorValue = digitalRead(PIR_MOTION_SENSOR); if(sensorValue == HIGH) //if the sensor value is HIGH? { Serial.println("PIR detect motion"); return true; //yes,return true } else { Serial.println("no motion"); return false; //no,return false } } //*************************************************************** // Function : activate buzzer based on parameters received void triggerBuzzer(int iteration,int delay1,int delay2) { for (int i = 1; i < iteration; i++) { digitalWrite(buzzer, HIGH); delay(delay1); digitalWrite(buzzer, LOW); delay(delay2); } } //*****************************************************************
準備在線連接
創(chuàng)建一個myDevices帳戶!您可以通過以下鏈接注冊并創(chuàng)建一個新帳戶:https://mydevices.com/cayenne/signup/
如果您已經(jīng)擁有帳戶,請隨意使用自己的帳戶。
圖1. 注冊頁面 – https://mydevices.com/cayenne/signup/
然后選擇Arduino作為本項目的設(shè)備。
圖2. 選擇本項目所需的Arduino設(shè)備
閱讀文檔并通過以下網(wǎng)站安裝Cayenne庫:
https://mydevices.com/cayenne/docs/#using-cayenne-library
然后繼續(xù)下一步,在新網(wǎng)頁中連接到Arduino。選擇Arduino Mega和WiFi Shield。選定這兩項后,您將收到設(shè)備的“身份驗證口令”。務(wù)必復(fù)制此口令并將其保存于某處。在下一個程序中需要用到此口令。
char token[] = “zzzzzzz”;// Cayenne authentication token
圖3. 選擇Arduino Mega和WiFi Shield
圖4. 創(chuàng)建傳感器微件
創(chuàng)建微件
我們可以為PIR傳感器、觸發(fā)狀態(tài)和警報開/關(guān)狀態(tài)創(chuàng)建微件。
為此,必須單擊 “添加新…” ,然后單擊 “設(shè)備/微件”。然后轉(zhuǎn)到 “傳感器” 類別并單擊 “通用”。在“通用”下,有2個輸入選項:模擬輸入和數(shù)字輸入。選擇 “數(shù)字輸入”。進入“數(shù)字輸入”設(shè)置頁面后,將連接設(shè)置為“虛擬”和“V1”(在下方)。請勿忘記單擊步驟1 和 步驟2。
V2和V4微件也按相同步驟操作。請使用下表作為參考:
虛擬通道號 | 微件名稱 | 選擇微件 | 選擇圖標/顯示 | 連接至 |
V1 | PIR 傳感器 | 0/1 2 狀態(tài) | 顯示值 | PIR 傳感器 – 藍色 Led |
V2 | 觸發(fā)狀態(tài) | 0/1 2 狀態(tài) | 顯示值 | 觸發(fā)開關(guān) – 紅色 Led |
V4 | 警報狀態(tài)開/關(guān) | 0/1 2 狀態(tài) | 圖標指示燈 | 遠程開關(guān) |
代碼中使用的虛擬引腳分配如下:
#define VIRTUAL_PIN1 V1// PIR傳感器的虛擬引腳 – 藍色 Led
#define VIRTUAL_PIN2 V2// 觸發(fā)開關(guān)的虛擬引腳 – 紅色 Led
#define VIRTUAL_PIN4 V4// 遠程開關(guān)的狀態(tài)
當PIR傳感器檢測到發(fā)生移動時,V1將開啟(顏色變?yōu)榫G色);藍色LED也將亮起。
當觸發(fā)狀態(tài)開啟時,V2將開啟(顏色變?yōu)榫G色);當警報開啟且PIR傳感器檢測到發(fā)生移動時,紅色LED也將亮起。
通過遙控發(fā)射器或在線/應(yīng)用程序開啟警報狀態(tài)時,V4將開啟(顏色變?yōu)榫G色)
接下來為在線/應(yīng)用程序切換功能創(chuàng)建一個微件。
轉(zhuǎn)至 “添加新…” ,然后單擊 “設(shè)備/微件”。這次選擇 “執(zhí)行器” ,然后選擇 “通用”。選擇 “數(shù)字輸出” ,然后在“連接”下選擇“虛擬”。在“Pin”下,選擇“V3”。
圖5. 創(chuàng)建在線/應(yīng)用程序切換功能的微件
使用下表作為參考:
虛擬通道號 | 微件名稱 | 選擇微件 | 選擇圖標/顯示 | 連接到 |
V3 | 在線/應(yīng)用程序切換 | 按鈕 | 圖標鎖定 |
在線/應(yīng)用程序 切換 — 綠色LED |
單擊微件(在網(wǎng)站/應(yīng)用程序上)時,V3將開啟(顏色變?yōu)樽仙.擵3開啟時,綠色LED也會亮起。因此,該虛擬開關(guān)與遙控發(fā)射器功能相同。但是,通過此虛擬交換機激活時會有一段延時。在下一程序中以下代碼將會引用引腳V3。
#define VIRTUAL_PIN3 V3// 在線切換 – 綠色 led
然后需要創(chuàng)建溫度和壓力傳感器的微件。和前面一樣,點擊 “添加新…” 和 “設(shè)備/微件”。然后選擇 “傳感器” 和 “通用” ,然后選擇 “模擬輸入”。連接后,選擇“虛擬”和“V5”進行引腳選擇。
圖6. 創(chuàng)建溫度和壓力傳感器的微件
對V6執(zhí)行相同操作并使用下表作為參考:
虛擬通道號 | 微件名稱 | 選擇微件 | 選擇單位 | 連接到 |
V5 | 溫度(℃) | 測量精度 | 有效位數(shù) — 小數(shù)點后2位 | 溫度傳感器 |
V6 | 氣壓(hPa) | 測量精度 | 有效位數(shù) — 小數(shù)點后2位 | 大氣壓力傳感器 |
在下一程序中以下代碼將會引用引腳V5和V6。
#define VIRTUAL_PIN5 V5// 溫度傳感器
#define VIRTUAL_PIN6 V6// 氣壓傳感器
如果上述所有步驟都正確完成,您將看到如圖7所示的頁面。
圖7. 微件的顯示
最后一步是啟用電子郵件通知功能(觸發(fā)警報時)。為此,請單擊“觸發(fā)器狀態(tài)”微件上的設(shè)置符號,然后選擇“觸發(fā)器”。
圖8. 創(chuàng)建電子郵件觸發(fā)器
然后,您將進入以下頁面(圖9)。在“添加自定義收件人”中鍵入您的電子郵件地址,然后單擊“發(fā)送電子郵件”。
圖9. 設(shè)置電子郵件通知
myDevices設(shè)置到此結(jié)束!
測試在線程序
以上已經(jīng)完成了與家庭安防系統(tǒng)的在線連接設(shè)置。運行最終程序前可以先測試在線程序。
上傳以下程序。確保已安裝適用于Arduino的Cayenne庫。該程序用于執(zhí)行簡單的功能(即顯示溫度和氣壓值)。正確運行時,溫度和氣壓微件將改變顏色(綠色和橙色),相應(yīng)數(shù)值顯示于微件的底部。
//**************** Home security Program - online test*********************** * #define CAYENNE_DEBUG // Uncomment to show debug messages #define CAYENNE_PRINT Serial // Comment this out to disable prints and save space #define VIRTUAL_PIN5 V5 // Temperature sensor #define VIRTUAL_PIN6 V6 // Barometric Pressure Sensor #include // Cayenne wifi library #include #include #include char token[] = "zzzzzzz"; // Cayenne authentication token. char ssid[] = "xxxxxxxxx"; // Your Wifi network name char password[] = "yyyy"; // Your Wifi password int tempout_pin = A2; BM1383GLV bm1383; BD1020 bd1020; unsigned long previousMillis = 0; void setup() { Serial.begin(9600); while (!Serial); bd1020.init(tempout_pin); byte rc; while (!Serial); Wire.begin(); rc = bm1383.init(); Cayenne.begin(token, ssid, password); } // ********************* Start Loop ***************************************** void loop() { Cayenne.run(); //*********************** read barometric pressure ************************ byte rc; float press; rc = bm1383.get_val(&press); if (rc == 0) { Cayenne.virtualWrite(VIRTUAL_PIN6, press); // Write Barometric Pressure to Cayenne Serial.write("BM1383GLV (PRESS) = "); Serial.print(press); Serial.println(" [hPa]"); Serial.println(); } //********************** read Temperature ******************************** float temp; bd1020.get_val(&temp); temp = temp - 5; // Temperature adjustment due to heat from circuit board Cayenne.virtualWrite(VIRTUAL_PIN5, temp); // Write Temperature to Cayenne Serial.print("BD1020HFV Temp="); Serial.print(temp); Serial.print(" [degrees Celsius], ADC="); Serial.println(bd1020.temp_adc); Serial.println(); // ********** Check if Remote switch or online/App switch is on ********** delay(5000); } // ************************** End Loop *****************************
至此差不多完成了所有步驟!
最終方案
如果以上所有程序都能流暢運行,則可上傳最終程序,該程序中嵌入了離線程序以及與Cayenne API的連接功能。
//**************** Home security Program - Final ****************************** #define CAYENNE_DEBUG // Uncomment to show debug messages #define CAYENNE_PRINT Serial // Comment this out to disable prints and save space #define VIRTUAL_PIN1 V1 // Virtual Pin for PIR sensor - Blue Led #define VIRTUAL_PIN2 V2 // Virtual Pin for Trigger Switch - Red Led #define VIRTUAL_PIN3 V3 // Online Switch - Green led #define VIRTUAL_PIN4 V4 // Status of Remote Switch #define VIRTUAL_PIN5 V5 // Temperature sensor #define VIRTUAL_PIN6 V6 // Barometric Pressure Sensor #define PIR_MOTION_SENSOR 2 // Use pin 2 to receive the signal from the module #define LED1 4 // Blue Led for motion detected #define LED2 6 // Green Led for triggered alarm #define LED3 8 // Red Led if motion and triger switch are on #define buzzer 5 // Buzzer #define remote 41 // Remote Control #include // Cayenne wifi library #include #include #include char token[] = "zzzzzzz"; // Cayenne authentication token. char ssid[] = "xxxxxxxxx"; // Your Wifi network name char password[] = "yyyy"; // Your Wifi password int alarm = 0; int trigger = 0; int remote_sw = 0; int online_sw = 0; int previousState = -1; int currentState = -1; int prev_remote_stat = 0; int curr_remote_stat = 0; int currentValue = 0; int prev_online_stat = 0; int curr_online_stat = 0; int tempout_pin = A2; BM1383GLV bm1383; BD1020 bd1020; unsigned long previousMillis = 0; void setup() { Serial.begin(9600); while (!Serial); bd1020.init(tempout_pin); byte rc; while (!Serial); Wire.begin(); rc = bm1383.init(); Cayenne.begin(token, ssid, password); pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); pinMode(buzzer, OUTPUT); pinMode(remote, INPUT); pinMode(PIR_MOTION_SENSOR, INPUT); } // ************ Check if Online/App Switch is on ***************************** CAYENNE_IN(VIRTUAL_PIN3) {currentValue = getValue.asInt();} // ********************* Start Loop ***************************************** void loop() { Cayenne.run(); Serial.print("currentValue: "); Serial.println(currentValue); checkSensor(); remote_sw = digitalRead(remote); Serial.print("Remote Status : "); Serial.println(remote_sw); Serial.println(); //*********************** read barometric pressure ************************ byte rc; float press; rc = bm1383.get_val(&press); if (rc == 0) { Cayenne.virtualWrite(VIRTUAL_PIN6, press); Serial.write("BM1383GLV (PRESS) = "); Serial.print(press); Serial.println(" [hPa]"); Serial.println(); } //********************** read Temperature ******************************** float temp; bd1020.get_val(&temp); temp = temp - 5; // Temperature adjustment due to heat from circuit board Cayenne.virtualWrite(VIRTUAL_PIN5, temp); Serial.print("BD1020HFV Temp="); Serial.print(temp); Serial.print(" [degrees Celsius], ADC="); Serial.println(bd1020.temp_adc); Serial.println(); // ********** Check if Remote switch or online/App switch is on ********** if(remote_sw == 1 | currentValue == 1) { digitalWrite(LED2,HIGH); Cayenne.virtualWrite(VIRTUAL_PIN4, HIGH); alarm = 1; curr_remote_stat = 1; if(curr_remote_stat != prev_remote_stat) { triggerBuzzer(2,70,30); prev_remote_stat = curr_remote_stat; } } else { curr_remote_stat = 0; if(curr_remote_stat != prev_remote_stat) { triggerBuzzer(3,70,30); prev_remote_stat = curr_remote_stat; } digitalWrite(LED2,LOW); Cayenne.virtualWrite(VIRTUAL_PIN4, LOW); alarm = 0; } // ********************** If motion detected *********************** if(isPeopleDetected()) //if it detects the moving people? { digitalWrite(LED1, HIGH); // Turn on Blue Led trigger = 1; delay(10); } else { digitalWrite(LED1, LOW); trigger = 0; delay(2000); } // ***************If Alarm is triggerred ************************** if (alarm == 1 && trigger == 1 ) { digitalWrite(LED3,HIGH); Cayenne.virtualWrite(VIRTUAL_PIN2, HIGH); delay(500); triggerBuzzer(6,100,100); Serial.println("Alarm triggered"); } else { alarm = 0; trigger = 0; digitalWrite(LED3,LOW); Cayenne.virtualWrite(VIRTUAL_PIN2, LOW); } // *********************** If temperature is triggerred ********** if (temp > 45.00) { digitalWrite(LED3,HIGH); Cayenne.virtualWrite(VIRTUAL_PIN2, HIGH); delay(500); triggerBuzzer(10,100,10); Serial.println("Alarm triggered"); } delay(10); } // ************************** End Loop ***************************** // Function: Write to PIR sensor indicator in Web/App *************** void checkSensor() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= 250) { currentState = digitalRead(PIR_MOTION_SENSOR); if (currentState != previousState) { Cayenne.virtualWrite(VIRTUAL_PIN1, currentState); previousState = currentState; } previousMillis = currentMillis; } } //*************************************************************** // Function: Detect whether anyone moves in it's detecting range boolean isPeopleDetected() { int sensorValue = digitalRead(PIR_MOTION_SENSOR); if(sensorValue == HIGH) //if the sensor value is HIGH? { Serial.println("PIR detect motion"); return true; //yes,return true } else { Serial.println("no motion"); return false; //no,return false } } //*************************************************************** // Function : activate buzzer based on parameters received void triggerBuzzer(int iteration,int delay1,int delay2) { for (int i = 1; i < iteration; i++) { digitalWrite(buzzer, HIGH); delay(delay1); digitalWrite(buzzer, LOW); delay(delay2); } } // *****************************************************************
以下幾種方法可以測試程序是否正常運行。
檢查觸發(fā)警報時是否發(fā)送電子郵件。您應(yīng)收到如圖10所示的電子郵件。
圖10. 觸發(fā)警報時收到的電子郵件通知
檢查您是否可以看到溫度和氣壓圖。如需顯示圖形,請單擊窗口微件右上角的圖形符號。
圖11. 傳感器的圖形符號的顯示
然后還會顯示圖表:
圖12. 溫度曲線圖示例
下載智能手機應(yīng)用程序
如前所述,無論何時何地只要您能連接WiFi,您就可以24/7全天候?qū)Π卜老到y(tǒng)進行監(jiān)控。您可以在網(wǎng)站上或通過Cayenne手機應(yīng)用程序進行監(jiān)控。您可以在智能手機上直接下載Cayenne應(yīng)用程序。進入App Store(應(yīng)用商店,適用于iPhone)或Google Play商店(適用于Android)并搜索Cayenne然后就能下載。
圖13. Cayenne App
成功安裝應(yīng)用程序后,應(yīng)用程序圖標會顯示在主屏幕上。
單擊應(yīng)用程序圖標并登錄myDevices帳戶(電子郵件ID和密碼應(yīng)與上一次設(shè)置帳戶時相同)。登錄后,您將看到您創(chuàng)建的微件?,F(xiàn)在單擊在線/應(yīng)用程序切換微件就可以打開/關(guān)閉警報;警報開/關(guān)狀態(tài)顏色變?yōu)榫G色,如下圖所示:
圖14. Cayenne App微件
恭喜您!完整的系統(tǒng)已經(jīng)建立!每當觸發(fā)警報時,您將收到電子郵件通知。
這是一個包含多個模塊的有趣項目。將來還可以添加更多傳感器并增加其他功能和多個蜂鳴器,以使嗶嗶聲更大。我們還可以考慮通過更換一些組件來縮小系統(tǒng)規(guī)模。在此之前,盡情享受吧!
Purnomo Nuhalim
來自墨爾本的Purnomo是一名退休人員,也是電子發(fā)燒友。目前,他正使用Arduino和Raspberry Pi從事各種開放式硬件項目的研發(fā)。除了電子學(xué),他還對航空建模和天文學(xué)充滿熱情。
審核編輯黃宇
-
傳感器
+關(guān)注
關(guān)注
2551文章
51099瀏覽量
753568 -
安防系統(tǒng)
+關(guān)注
關(guān)注
2文章
249瀏覽量
33269
發(fā)布評論請先 登錄
相關(guān)推薦
評論