資料介紹
描述
介紹
你的狗有沒有在清晨叫醒你吃東西?您是否因?yàn)樘Σ荒馨磿r(shí)回家而責(zé)怪自己沒能喂飽饑餓的寵物?購買允許您通過互聯(lián)網(wǎng)控制它的智能狗喂食器可能非常昂貴。那么,為什么不用一些廉價(jià)的電子元件來設(shè)計(jì)和構(gòu)建您自己的智能狗喂食器呢?在本文中,我們將構(gòu)建一個(gè)簡單的 IoT 狗(或其他友好生物)喂食器,成本不到 30 美元,并且可以通過 IoT 軟件遠(yuǎn)程控制。到本項(xiàng)目結(jié)束時(shí),您將學(xué)習(xí):
- 什么是 WeMos D1 Mini 開發(fā)板及其使用方法
- 如何使用 Blynk IoT 平臺管理您的硬件設(shè)備
- 如何使用 Arduino IDE 對 WeMos D1 Mini 開發(fā)板進(jìn)行編程
- 如何構(gòu)建物聯(lián)網(wǎng)喂狗器
背景知識
WeMos D1 迷你
WeMos D1 Mini 是一款功能強(qiáng)大的聯(lián)網(wǎng)開發(fā)板。這款小型開發(fā)板采用最流行且性價(jià)比最高的Wi-Fi 微芯片ESP8266 之一,使其成為任何初學(xué)者級別物聯(lián)網(wǎng)項(xiàng)目的完美選擇。
WeMos D1 Mini 的一大優(yōu)勢是用戶友好。它與 MicroPython、Arduino 和 nodemcu 完美兼容。此外,WeMos D1 Mini 與流行的Arduino IDE兼容,允許您開發(fā)程序并將程序上傳到微控制器。
WeMos D1 Mini 開發(fā)板有11 個(gè)數(shù)字 I/O 引腳,一個(gè) 5V 引腳和一個(gè) 3.3V 引腳。在十一個(gè)數(shù)字 I/O 引腳中,有一個(gè)RX 引腳和一個(gè)用于串行通信的 TX 引腳。WeMos D1 迷你板上的每個(gè)引腳都在 3.3V 電壓下運(yùn)行,任何高于 3.3V 的電壓都可能損壞開發(fā)板。如果你想將它與 5V 設(shè)備一起使用,你將需要一個(gè)邏輯電平轉(zhuǎn)換器。
WeMos D1 Mini 開發(fā)板可以通過 USB 進(jìn)行編程。不同版本的WeMos D1 Mini開發(fā)板USB接口不同。一些具有C 型 USB端口,而另一些具有微型 USB 端口。本教程中使用的 WeMos D1 Mini 板帶有一個(gè)微型 USB 端口。
PIR 運(yùn)動傳感器
被動紅外傳感器,也稱為熱釋電或IR 運(yùn)動傳感器,是一種小型廉價(jià)傳感器,通過測量其檢測范圍內(nèi)的物體發(fā)射或反射的紅外輻射 (IR)量來檢測運(yùn)動。檢測到的紅外輻射水平取決于物體的熱度。溫度越高的物體發(fā)出的紅外輻射越多。
資料來源:阿達(dá)果
PIR 運(yùn)動傳感器依靠熱釋電傳感器來檢測紅外輻射水平。熱釋電傳感器對熱能的變化高度敏感,并在加熱或冷卻時(shí)產(chǎn)生電能。
PIR 運(yùn)動傳感器分為兩個(gè)插槽。當(dāng)活體動物經(jīng)過運(yùn)動傳感器時(shí),一側(cè)會先于另一側(cè)檢測到移動物體。運(yùn)動傳感器兩側(cè)紅外輻射水平的差異會產(chǎn)生正的差分變化。當(dāng)運(yùn)動物體離開檢測區(qū)域時(shí),運(yùn)動傳感器兩側(cè)會出現(xiàn)負(fù)微分變化。
為什么不同的 PIR 運(yùn)動傳感器具有不同的檢測范圍?答案在于運(yùn)動傳感器的球面透鏡。PIR 運(yùn)動檢測器使用菲涅耳透鏡將大范圍的紅外線聚集到傳感器。在 PIR 運(yùn)動檢測器中,菲涅爾透鏡被分成許多小部分,每個(gè)部分包含許多同心圓以將光線聚焦在一個(gè)點(diǎn)上。菲涅爾透鏡的結(jié)構(gòu)使 PIR 運(yùn)動傳感器能夠檢測大面積的運(yùn)動。
腳步:
1. 構(gòu)建電路
讓我們先談?wù)勅绾问褂妹總€(gè)電子元件并為這個(gè)項(xiàng)目搭建電路。
1.1 用WeMos D1 Mini啟動電路
WeMos D1 Mini 有11 個(gè)數(shù)字 I/O 引腳、1 個(gè)模擬輸入引腳 (A0) 、1 個(gè) 3.3V 引腳、1 個(gè) 5V 引腳和一個(gè)接地引腳。3.3V 引腳將用于為 PIR 運(yùn)動傳感器供電,5V 引腳用于伺服電機(jī)。WeMos D1 Mini 開發(fā)板可以通過微型 USB 進(jìn)行編程和供電。您可以在此處熟悉 WeMos D1 Mini 。
資料來源:WEMOS 文檔
由于 WeMos D1 Mini 開發(fā)板只有一個(gè)接地引腳,我們需要使用面包板來創(chuàng)建更多。為此,通過將其中一個(gè)面包板電源軌連接到 WeMos D1 Mini 板的接地引腳,將其定義為接地。PIR 運(yùn)動傳感器、LED 和伺服電機(jī)的接地引腳可以連接到此電源導(dǎo)軌中的任何孔。
1.2 添加 PIR 運(yùn)動傳感器
PIR 運(yùn)動傳感器具有三個(gè)接頭引腳:接地(黑色)、信號輸出(黃色)和 VCC(紅色)。此 PIR 運(yùn)動傳感器的信號輸出引腳應(yīng)連接到 WeMos D1 迷你板上的數(shù)字 I/O 引腳之一。本教程中使用的 PIR 運(yùn)動傳感器需要 3.0V 的最小輸入電壓才能運(yùn)行。因此,PIR 運(yùn)動傳感器的 VCC 引腳應(yīng)連接到 3.3V 引腳。
資料來源:阿達(dá)果
注意:PIR 運(yùn)動傳感器可能對噪音高度敏感。WeMos D1 Mini 板的 Wi-Fi 信號可能會產(chǎn)生誤觸發(fā)。如果您遇到誤觸發(fā)問題,請盡量避免將您的 WeMos D1 Mini 放在靠近 PIR 運(yùn)動傳感器的位置。
1.3 添加伺服電機(jī)
小型伺服電機(jī)有三根線。黃色線是信號線,應(yīng)連接到WeMos D1 Mini 板上的PWM 引腳。紅線是電源線,應(yīng)連接到微控制器的5V 引腳。棕色線為地線,應(yīng)連接到WeMos D1 Mini開發(fā)板的地腳。
資料來源:Digikey/DFRobot
1.4 添加支持電路(LED 和電阻)
在這個(gè)項(xiàng)目中,紅色 LED 用于指示PIR 運(yùn)動傳感器的狀態(tài)。如果檢測到移動,LED 將打開,如果沒有移動,則關(guān)閉。紅色 LED 由 WeMos D1 Mini 開發(fā)板上的數(shù)字引腳供電。
計(jì)算所需電阻值
I/O 引腳的輸出電壓:3.3 V
最大直流輸出電流:12 mA(來源:https://diyi0t.com/esp8266-wemos-d1-mini-tutorial/)
LED 正向壓降:1.7 V - 2 V3.3V - 2V = 1.3V1.3V / (12mA) = 108.333 歐姆(最接近的標(biāo)準(zhǔn)電阻值 = 100 歐姆)
您最終應(yīng)該得到一個(gè)大致如下圖所示的電路:
2. 開始使用 Blynk 物聯(lián)網(wǎng)平臺
Blynk是一個(gè)非常流行的IoT 平臺,可幫助您從 IOS 或 Android 設(shè)備管理 IoT 應(yīng)用程序。該平臺允許您通過互聯(lián)網(wǎng)控制您的 Arduino、Raspberry PI 和其他微控制器。您將能夠根據(jù)他們的免費(fèi)計(jì)劃完成此項(xiàng)目。為了使用 Blynk,您需要在 Arduino IDE中下載Blynk 庫。
2.1 在 Arduino IDE 中安裝 Blynk 庫
1. 打開 Arduino 集成開發(fā)環(huán)境。轉(zhuǎn)到工具并選擇管理庫。2。在搜索欄中鍵入 Blynk.3。安裝最新版本的可用庫。
2. 在搜索欄中輸入 Blynk。
3. 安裝可用的最新版本庫。
2.2 將 ESP8266 開發(fā)板添加到 Arduino IDE
ESP8266 不是 Arduino 系列的一部分,因此我們需要安裝一個(gè)附加組件才能在 Arduino IDE 上對其進(jìn)行編程。要使用這個(gè)第三方硬件,我們需要安裝 ESP8266 社區(qū)提供的插件。
1. 轉(zhuǎn)到文件并選擇首選項(xiàng)。
2. 復(fù)制以下 URL 并將其粘貼到其他 Board Manager URL字段中:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
3. 接下來,轉(zhuǎn)到工具并選擇板:然后選擇板管理器。
4. 打開Boards Manager并在搜索欄中輸入 ESP8266。 5 . 安裝 esp8266。
5.安裝esp8266。
2.3 在 Blynk 上管理您的設(shè)備
下載所有必需的庫后,讓我們創(chuàng)建一個(gè) Blynk 項(xiàng)目來管理我們的 IoT 寵物喂食器。
1. 創(chuàng)建一個(gè) Blynk 帳戶并在網(wǎng)絡(luò)瀏覽器中打開 Blynk。
2. 轉(zhuǎn)到模板并單擊網(wǎng)頁右上角的+ 新模板按鈕。
3. 為您的設(shè)備命名并選擇您將使用的硬件。在這個(gè)項(xiàng)目中,我們將使用 ESP8266,連接類型應(yīng)該是Wi-Fi 。
4. 單擊完成按鈕創(chuàng)建一個(gè)新模板。
現(xiàn)在我們已經(jīng)創(chuàng)建了一個(gè) Blynk 項(xiàng)目,讓我們來談?wù)勅绾蝿?chuàng)建按鈕來使用虛擬引腳來控制我們的伺服電機(jī)。
Blynk Virtual Pins 旨在在硬件和 Blynk 云應(yīng)用程序之間交換數(shù)據(jù)。虛擬引腳允許您從應(yīng)用程序向微控制器發(fā)送命令或從微控制器接收數(shù)據(jù)。使用虛擬引腳,您可以控制各種設(shè)備,例如傳感器和伺服電機(jī)。
2.4 使用虛擬引腳控制伺服電機(jī)
1. 在模板部分打開您的硬件設(shè)備。
2. 轉(zhuǎn)到數(shù)據(jù)流并點(diǎn)擊右上角的編輯按鈕開始對您的項(xiàng)目進(jìn)行更改。
3. 數(shù)據(jù)流是用于在硬件設(shè)備和 Blynk 應(yīng)用程序之間交換數(shù)據(jù)的通道。要在硬件和 Blynk 應(yīng)用程序之間創(chuàng)建數(shù)據(jù)傳輸通道,請單擊“添加數(shù)據(jù)流”按鈕并創(chuàng)建一個(gè)新的虛擬 Pin。
4. 將 PIN 設(shè)置為V1并選擇Integer作為 DATA TYPE。
5. 設(shè)置按鈕的最小值和最大值。
6. 完成所有更改后,點(diǎn)擊保存,然后點(diǎn)擊網(wǎng)頁右上角的保存并應(yīng)用按鈕。
2.5 在 Blynk 上創(chuàng)建通知
1. 在編輯模式下,轉(zhuǎn)到事件并點(diǎn)擊+ 添加新事件。
2. 為您的事件命名,然后打開選項(xiàng)將事件發(fā)送到通知選項(xiàng)卡。
3. 轉(zhuǎn)到通知并啟用通知。
4. Blynk 提供三種傳遞通知的方式:電子郵件、推送通知和短信。在您想要的選項(xiàng)下添加設(shè)備所有者。
5. Blynk 允許您限制通知的數(shù)量。在“通知限制”部分,您可以限制在指定時(shí)間段內(nèi)可以發(fā)送的通知數(shù)量。例如,當(dāng)Limit Period設(shè)置為1小時(shí),Event Counter設(shè)置為1時(shí),即使該時(shí)間段內(nèi)多次觸發(fā)事件,用戶也只會在一小時(shí)內(nèi)收到一次通知。
6. 完成所有更改后,點(diǎn)擊保存并應(yīng)用。
2.6 下載 Blynk Mobile App 并設(shè)置項(xiàng)目
在 Web 瀏覽器上配置 Blynk 項(xiàng)目后,就可以在移動設(shè)備上設(shè)置項(xiàng)目,以便遠(yuǎn)程控制硬件。
1. 從蘋果或安卓商店下載 Blynk Mobile App。
2. 在 Blynk 應(yīng)用程序中,打開您的 IoT 項(xiàng)目并選擇設(shè)置(右上角的扳手)。
3. 單擊+按鈕打開 Widget Box。
4. 將最簡單的按鈕添加到您的項(xiàng)目中。這種類型的按鈕可以在兩種模式下運(yùn)行:按下和切換。在 Push 模式下工作時(shí),按下按鈕將切換到 ON 狀態(tài),松開按鈕將返回 OFF 狀態(tài)。開關(guān)模式允許您按下按鈕一次,然后它將保持打開或關(guān)閉狀態(tài),直到您再次按下按鈕以更改其狀態(tài)。
3. WeMos D1 迷你微控制器編程
您可以按照本教程進(jìn)行操作并編寫代碼,或者只需在此處下載項(xiàng)目代碼。
3.1 Blynk 庫和設(shè)置
在您的主固件的最頂部,在添加任何指令之前定義模板 ID和設(shè)備名稱。模板 ID 和設(shè)備名稱可以在Blynk 設(shè)備的信息頁面上找到。#include
在這個(gè)項(xiàng)目中,我們正在使用 Blynk 庫,因此我們需要在固件頂部包含指令 #include 。
然后,我們需要在固件中配置網(wǎng)絡(luò)連接。我們需要定義三個(gè)參數(shù)。第一個(gè)是您的Blynk 身份驗(yàn)證令牌,它可以在您的 Blynk 項(xiàng)目儀表板上找到。第二個(gè)是您的Wi-Fi SSID ,最后一個(gè)是您的Wi-Fi 密碼。定義三個(gè)參數(shù)后,將它們包含在函數(shù)中Blynk.begin(auth, ssid, pass)
。
最后,要完成 Blynk 庫設(shè)置,您需要為BLYNK_TEMPLATE_ID
和BLYNK_DEVICE_NAME
參數(shù)包含一個(gè)#define,這些參數(shù)也應(yīng)該在您的 Blynk 項(xiàng)目儀表板上找到。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
}
接下來,讓我們談?wù)勅绾瓮ㄟ^ Blynk 控制您的設(shè)備。
在上一步中,我們配置了一個(gè)虛擬 Pin 來打開和關(guān)閉事物。由于所有虛擬引腳值始終以字符串形式發(fā)送,因此我們需要將傳入數(shù)據(jù)解釋為整數(shù)、浮點(diǎn)數(shù)、雙精度數(shù)或字符串。例如,下面的命令意味著傳入的虛擬 Pin 數(shù)據(jù)將被解釋為整數(shù):
int pinValue = param.asInt();
要從您的設(shè)備向 Blynk 應(yīng)用程序發(fā)送數(shù)據(jù),請使用Blynk.virtualWrite(pin, value)
.
要接收從應(yīng)用程序發(fā)送的數(shù)據(jù),請使用函數(shù)BLYNK_WRITE(vPin)
。在我們的固件中,BLYNK_WRITE(V1)
意味著設(shè)備正在等待將某些內(nèi)容寫入 V1。換句話說,設(shè)備正在等待我們切換與 V1 關(guān)聯(lián)的按鈕的狀態(tài)。
您可以訪問官方Blynk 文檔以了解有關(guān)虛擬引腳的更多信息。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
// Create a button to control the servo motor
// This is a standalone function and can't be used inside of any loop or function.
// Go to Blynk documentation for more details:
//
BLYNK_WRITE(V1)
{
// Assign incoming value from pin V1 to the variable pinValue
int pinValue = param.asInt();
//Serial.print("V1 button value is: ");
//Serial.println(pinValue);
}
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
}
現(xiàn)在我們已經(jīng)創(chuàng)建了通過互聯(lián)網(wǎng)控制設(shè)備的按鈕,讓我們討論一下我們需要在固件中寫入什么來向您的手機(jī)或電子郵件發(fā)送通知。Blynk 使用 Events 來跟蹤您設(shè)備上發(fā)生的事件,并將通知發(fā)送到 Blynk 應(yīng)用程序或您的電子郵件。
要發(fā)送通知,請使用Blynk.logEvent(“event_code”, “message”)
; 功能。可以在活動頁面上找到。event_code
例如,該命令Blynk.logEvent("motion_detected", "Motion Detected!");
表示設(shè)備將發(fā)送通知“檢測到運(yùn)動!” 如果 PIR 運(yùn)動傳感器檢測到運(yùn)動。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include 8266.h>
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
// Create a button to control the servo motor
// This is a standalone function and can't be used inside of any loop or function.
// Go to Blynk documentation for more details.
BLYNK_WRITE(V1)
{
// Assign incoming value from pin V1 to the variable pinValue
int pinValue = param.asInt();
if (pinValue == 1)
{
// Send a notification to the user
Blynk.logEvent("food_dispensed", "Food Dispensed!");
}
//Serial.print("V1 button value is: ");
//Serial.println(pinValue);
}
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
}
3.2 添加代碼控制伺服電機(jī)
接下來,讓我們進(jìn)入項(xiàng)目中移動的部分;伺服電機(jī)!我們將使用 Arduino Servo 庫,因此讓我們通過#include
在代碼頂部添加一個(gè)并實(shí)例化 Servo 對象并將其連接到 WeMos D1 Mini 上的引腳 4 來設(shè)置該庫。
#include
// Servo Motor
Servo ServoMotor;
int ServoPin = D4;
現(xiàn)在,我們要告訴我們的伺服電機(jī)通過移動到特定位置然后在一段時(shí)間后移回關(guān)閉位置來打開狗食容器。我們可以通過添加兩個(gè)新變量來定義伺服電機(jī)的起始位置和最終位置來開始。
const int ServoInitialPosition = 0; // Starting position of servo motor
const int ServoFinalPosition = 135; // Final position of servo motor
然后我們可以在BLYNK_WRITE(V1)
函數(shù)中添加代碼來控制伺服電機(jī)。你現(xiàn)在應(yīng)該有這樣的東西了。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include 8266.h>
#include
// Servo Motor
Servo ServoMotor;
int ServoPin = D4;
const int ServoInitialPosition = 0; // Starting position of servo motor
const int ServoFinalPosition = 135; // Final position of servo motor
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
// Create a button to control the servo motor
// This is a standalone function and can't be used inside of any loop or function.
// Go to Blynk documentation for more details:
//
BLYNK_WRITE(V1)
{
// Assign incoming value from pin V1 to the variable pinValue
int pinValue = param.asInt();
if (pinValue == 1)
{
ServoMotor.attach(ServoPin); // Enable control signal of the servo motor
// Rotate the shaft to the final position
ServoMotor.write(ServoFinalPosition);
delay(1000);
// Rotate the shaft to the initial position
ServoMotor.write(ServoInitialPosition);
delay(1000);
ServoMotor.detach(); // Disable control signal
// Send a notification to the user
Blynk.logEvent("food_dispensed", "Food Dispensed!");
}
//Serial.print("V1 button value is: ");
//Serial.println(pinValue);
}
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
}
3.3 添加代碼以讀取 PIR 傳感器
接下來是為 PIR 傳感器編寫代碼,以便我們知道狗何時(shí)接近自動喂狗器。在我們的例子中,我們的 PIR 傳感器功能可以相當(dāng)簡單,因?yàn)槲覀冎恍枰拦肥欠裨谀抢铮ǘM(jìn)制輸出)。如果我們感覺到狗在那里,我們想將該消息發(fā)送回 Blynk 應(yīng)用程序,我們想打開電路中的 LED。
首先讓我們定義連接到 PIR 傳感器的引腳和void setup()
. 我還想添加另一個(gè)變量PIR_status
來跟蹤 PIR 傳感器的狀態(tài)。
// Define pins for the PIR Motion Sensor
int PIR_pin = D7;
int PIR_status = 0;
// LED for PIR motion sensor
int ledPin = D2;
要檢查 PIR 傳感器是否檢測到任何東西,我們可以使用該digitalRead()
功能,如果PIR_status
是HIGH
(意味著已檢測到狗),我們可以將該信息發(fā)送回 Blynk 應(yīng)用程序。
void PIR_sensor()
{
PIR_status = digitalRead(PIR_pin);
//Serial.println(PIR_status);
if (PIR_status == HIGH)
{
Serial.println("Motion Detected!");
Blynk.logEvent("motion_detected", "Motion Detected!");
// If motion is detected, turn on LED
digitalWrite(ledPin, HIGH);
}
else
{
Serial.println("Motion Stopped!");
}
}
總之,我們的代碼現(xiàn)在應(yīng)該看起來像這樣。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include 8266.h>
#include
// Servo Motor
Servo ServoMotor;
int ServoPin = D4;
const int ServoInitialPosition = 0; // Starting position of servo motor
const int ServoFinalPosition = 135; // Final position of servo motor
// Define pins for the PIR Motion Sensor
int PIR_pin = D7;
int PIR_status = 0;
// LED for PIR motion sensor
int ledPin = D2;
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
// Create a button to control the servo motor
// This is a standalone function and can't be used inside of any loop or function.
// Go to Blynk documentation for more details:
//
BLYNK_WRITE(V1)
{
// Assign incoming value from pin V1 to the variable pinValue
int pinValue = param.asInt();
if (pinValue == 1)
{
ServoMotor.attach(ServoPin); // Enable control signal of the servo motor
// Rotate the shaft to the final position
ServoMotor.write(ServoFinalPosition);
delay(1000);
// Rotate the shaft to the initial position
ServoMotor.write(ServoInitialPosition);
delay(1000);
ServoMotor.detach(); // Disable control signal
// Send a notification to the user
Blynk.logEvent("food_dispensed", "Food Dispensed!");
}
//Serial.print("V1 button value is: ");
//Serial.println(pinValue);
}
void PIR_sensor()
{
PIR_status = digitalRead(PIR_pin);
//Serial.println(PIR_status);
if (PIR_status == HIGH)
{
Serial.println("Motion Detected!");
Blynk.logEvent("motion_detected", "Motion Detected!");
// If motion is detected, turn on LED
digitalWrite(ledPin, HIGH);
}
else
{
Serial.println("Motion Stopped!");
}
}
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
}
截至目前,我們的代碼在技術(shù)上應(yīng)該可以工作;然而,我們現(xiàn)在所擁有的可能容易出現(xiàn)不穩(wěn)定的行為,因?yàn)槲覀儧]有考慮 PIR 傳感器可能遇到的任何噪聲,這可能導(dǎo)致錯(cuò)誤觸發(fā)或快速切換。
3.4 添加 SimpleTimer 庫以進(jìn)行簡化
除了我們的噪音問題,Blynk 每天只允許發(fā)送 100 條通知。因此,我們需要好好利用這些通知。這可以使用SimpleTimer庫來完成。
在我們的代碼中,我們需要將 PIR 運(yùn)動傳感器設(shè)置為每 3 秒檢測一次運(yùn)動,如果檢測到運(yùn)動,LED 將保持亮起 30 秒。如果連續(xù)檢測到移動,只會向 Blynk 應(yīng)用程序發(fā)送一個(gè)通知,這也有助于解決不穩(wěn)定的行為。
要下載 SimpleTimer 庫,只需按照下載和安裝庫的步驟操作即可。成功添加庫后,我們就可以#include
毫無問題地在代碼頂部添加指令。
#include
接下來,讓我們使用這個(gè)庫實(shí)例化一個(gè) SimpleTimer 對象,并在void setup()
.
SimpleTimer timer;
int counter = 0;
// Set a flag to make sure the program only sends one notification if motion is
// detected continuously
int flag = 1;
現(xiàn)在我們需要void setup()
通過包含代碼來設(shè)置計(jì)時(shí)器的間隔:
timer.setInterval(3000L,PIR_sensor); // Detects motion every 3 seconds
接下來,我們可以更新PIR_snesor()
函數(shù)內(nèi)的代碼,使一切順利運(yùn)行。
void PIR_sensor()
{
counter++;
Serial.println(counter);
// Turn off LED if no motion has been detected for 30 seconds
if (counter == 10)
{
digitalWrite(ledPin, LOW);
counter = 0;
flag = 1;
}
PIR_status = digitalRead(PIR_pin);
//Serial.println(PIR_status);
if (PIR_status == HIGH)
{
if (flag == 1)
{
Serial.println("Motion Detected!");
Blynk.logEvent("motion_detected", "Motion Detected!");
// If motion is detected, turn on LED
digitalWrite(ledPin, HIGH);
counter = 0;
flag = 0;
}
}
else
{
Serial.println("Motion Stopped!");
}
}
最后,我們現(xiàn)在應(yīng)該將 Blynk 和計(jì)時(shí)器對象設(shè)置為在void loop()
.
void loop()
{
Blynk.run();
timer.run();
}
最后,您現(xiàn)在應(yīng)該擁有如下所示的最終代碼。
#define BLYNK_TEMPLATE_ID "Replace with your template ID"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include 8266.h>
#include
// Servo Motor
Servo ServoMotor;
int ServoPin = D4;
const int ServoInitialPosition = 0; // Starting position of servo motor
const int ServoFinalPosition = 135; // Final position of servo motor
// Define pins for the PIR Motion Sensor
int PIR_pin = D7;
int PIR_status = 0;
// LED for PIR motion sensor
int ledPin = D2;
// ESP8266
char auth[] = "Your Blynk Auth Token"; // Blynk token
char ssid[] = "Replace with your WiFi SSID"; // Your WiFI SSID
char pass[] = "Replace with your WiFi password"; // Your Wifi password
// Create a button to control the servo motor
// This is a standalone function and can't be used inside of any loop or function.
// Go to Blynk documentation for more details:
//
BLYNK_WRITE(V1)
{
// Assign incoming value from pin V1 to the variable pinValue
int pinValue = param.asInt();
if (pinValue == 1)
{
ServoMotor.attach(ServoPin); // Enable control signal of the servo motor
// Rotate the shaft to the final position
ServoMotor.write(ServoFinalPosition);
delay(1000);
// Rotate the shaft to the initial position
ServoMotor.write(ServoInitialPosition);
delay(1000);
ServoMotor.detach(); // Disable control signal
// Send a notification to the user
Blynk.logEvent("food_dispensed", "Food Dispensed!");
}
//Serial.print("V1 button value is: ");
//Serial.println(pinValue);
}
void PIR_sensor()
{
counter++;
Serial.println(counter);
// Turn off LED if no motion has been detected for 30 seconds
if (counter == 10)
{
digitalWrite(ledPin, LOW);
counter = 0;
flag = 1;
}
PIR_status = digitalRead(PIR_pin);
//Serial.println(PIR_status);
if (PIR_status == HIGH)
{
if (flag == 1)
{
Serial.println("Motion Detected!");
Blynk.logEvent("motion_detected", "Motion Detected!");
// If motion is detected, turn on LED
digitalWrite(ledPin, HIGH);
counter = 0;
flag = 0;
}
}
else
{
Serial.println("Motion Stopped!");
}
}
void setup()
{
Serial.begin(9600);
Serial.println("Start!");
Serial.print("Connecting...");
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
timer.run();
}
4. 構(gòu)建容器
有許多方法可以構(gòu)建食品容器。最簡單的方法之一是使用塑料容器和硬紙板。本教程使用塑料管作為食品容器,因?yàn)槲覀兿雽W⒂陧?xiàng)目的電子部分,但您可以在此處找到有關(guān)如何制作漂亮容器的教程。
先在塑料食品容器的底部剪一個(gè)小孔,用一小塊硬紙板蓋住塑料食品容器上的孔。然后,將紙板蓋粘到伺服電機(jī)的軸上。伺服電機(jī)和塑料食品容器都應(yīng)該用膠帶粘在墻上以保持固定。
現(xiàn)在我們已經(jīng)完成了容器的構(gòu)建,我們需要確保伺服電機(jī)可以旋轉(zhuǎn)蓋子來分配食物。
在您的固件中,更改伺服電機(jī)的初始位置和您希望電機(jī)旋轉(zhuǎn)的角度。食物分配后,伺服電機(jī)應(yīng)返回初始位置。
該變量ServoInitialPosition
存儲伺服電機(jī)的初始位置。當(dāng)伺服電機(jī)在此位置時(shí),蓋子應(yīng)蓋住紙箱的孔,以防止食物從容器中漏出。另一個(gè)變量ServoFinalPosition
存儲您希望電機(jī)旋轉(zhuǎn)以分配食物的角度。
const int ServoInitialPosition = 0; //starting position
const int ServoFinalPosition = 135; //final position
5. 最終測試
現(xiàn)在我們自制的物聯(lián)網(wǎng)寵物喂食器可以進(jìn)行測試了。通過 USB 數(shù)據(jù)線連接 WeMos D1 迷你板的微型 USB 端口,為寵物喂食器供電。根據(jù)您的寵物喂食器的設(shè)計(jì)和您用來構(gòu)建寵物喂食器的組件,您可能需要對代碼進(jìn)行小幅修改。
結(jié)論
總的來說,我們已經(jīng)熟悉了使用 Arduino IDE 的 WeMos D1 Mini 和 Blynk IoT 平臺,并最終得到了一個(gè)很棒的 IoT Dog Feeder 來展示它!
如果您喜歡這個(gè)項(xiàng)目,請與其他人分享,以便我們繼續(xù)制作這些類型的項(xiàng)目!如果您對我們提供的更多內(nèi)容感興趣,可以訪問我們的學(xué)習(xí)中心以獲取更出色且易于訪問的電子教育。
- 燈光物聯(lián)網(wǎng)開源項(xiàng)目
- MuSa物聯(lián)網(wǎng)開源案例
- 新物聯(lián)網(wǎng)設(shè)備開源分享
- 物聯(lián)網(wǎng)濕度傳感器開源
- Lytograph物聯(lián)網(wǎng)顯示器開源
- 智能表物聯(lián)網(wǎng)開源
- 物聯(lián)網(wǎng)衣柜控制器開源分享
- 水位通知器家庭物聯(lián)網(wǎng)開源案例
- 物聯(lián)網(wǎng)遙控器控制車庫門開源
- 物聯(lián)網(wǎng)水族館喂魚器開源
- 物聯(lián)網(wǎng)電腦控制器開源分享
- 物聯(lián)網(wǎng)開源項(xiàng)目
- 基于zigbee、wifi物聯(lián)網(wǎng)廢水污染物在線監(jiān)測建設(shè)方案.pdf 0次下載
- 如何使用物聯(lián)網(wǎng)操作系統(tǒng)Zephyr實(shí)現(xiàn)“連續(xù)集成”開源軟件的詳細(xì)說明
- 10大物聯(lián)網(wǎng)開源軟件的介紹 7次下載
- PLC在物聯(lián)網(wǎng)中的應(yīng)用 842次閱讀
- 物聯(lián)網(wǎng)的體系架構(gòu) 989次閱讀
- 物聯(lián)網(wǎng)是什么和物聯(lián)網(wǎng)基本架構(gòu) 5697次閱讀
- 云計(jì)算、大數(shù)據(jù)與物聯(lián)網(wǎng)有什么聯(lián)系呢? 8353次閱讀
- dfrobot光子物聯(lián)網(wǎng)開發(fā)板簡介 2024次閱讀
- 源創(chuàng)通信 BPI-P2 Zero 四核開源物聯(lián)網(wǎng)開發(fā)板介紹 2560次閱讀
- 物聯(lián)網(wǎng)技術(shù)在工業(yè)自動化中的關(guān)鍵技術(shù)有哪些 4396次閱讀
- 盤點(diǎn)7個(gè)有效的物聯(lián)網(wǎng)應(yīng)用案例 1.1w次閱讀
- 物聯(lián)網(wǎng)十大經(jīng)典開源操作系統(tǒng) 1w次閱讀
- 工業(yè)物聯(lián)網(wǎng)與物聯(lián)網(wǎng) "工業(yè)4.0"的區(qū)別 1w次閱讀
- Kinetis“喂狗”的問題 3945次閱讀
- 傳感器和物聯(lián)網(wǎng)的介紹和“極端物聯(lián)網(wǎng)”的詳細(xì)資料概述 3805次閱讀
- 從物聯(lián)網(wǎng)角度去認(rèn)識MEMS傳感器 2171次閱讀
- 農(nóng)業(yè)物聯(lián)網(wǎng)應(yīng)用解決方案 3274次閱讀
- 農(nóng)業(yè)物聯(lián)網(wǎng)的意義_農(nóng)業(yè)物聯(lián)網(wǎng)的功能_農(nóng)業(yè)物聯(lián)網(wǎng)的應(yīng)用 9619次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多