電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>物聯(lián)網(wǎng)自動喂狗器開源分享

物聯(lián)網(wǎng)自動喂狗器開源分享

2023-02-06 | zip | 0.29 MB | 次下載 | 免費

資料介紹

描述

介紹

你的狗有沒有在清晨叫醒你吃東西?您是否因為太忙不能按時回家而責怪自己沒能喂飽饑餓的寵物?購買允許您通過互聯(lián)網(wǎng)控制它的智能狗喂食器可能非常昂貴。那么,為什么不用一些廉價的電子元件來設計和構建您自己的智能狗喂食器呢?在本文中,我們將構建一個簡單的 IoT 狗(或其他友好生物)喂食器,成本不到 30 美元,并且可以通過 IoT 軟件遠程控制。到本項目結束時,您將學習:

  • 什么是 WeMos D1 Mini 開發(fā)板及其使用方法
  • 如何使用 Blynk IoT 平臺管理您的硬件設備
  • 如何使用 Arduino IDE 對 WeMos D1 Mini 開發(fā)板進行編程
  • 如何構建物聯(lián)網(wǎng)喂狗器

背景知識

WeMos D1 迷你

WeMos D1 Mini 是一款功能強大的聯(lián)網(wǎng)開發(fā)板。這款小型開發(fā)板采用最流行性價比最高的Wi-Fi芯片ESP8266 之一,使其成為任何初學者級別物聯(lián)網(wǎng)項目的完美選擇。

pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
WeMos D1 迷你引出線
?

資料來源:WeMos 文檔

WeMos D1 Mini 的一大優(yōu)勢是用戶友好它與 MicroPython、Arduino 和 nodemcu 完美兼容。此外,WeMos D1 Mini 與流行的Arduino IDE兼容,允許您開發(fā)程序并將程序上傳到微控制器。

WeMos D1 Mini 開發(fā)板有11 個數(shù)字 I/O 引腳,一個 5V 引腳和一個 3.3V 引腳。在十一個數(shù)字 I/O 引腳中,有一個RX 引腳和一個用于串行通信的 TX 引腳。WeMos D1 迷你板上的每個引腳都在 3.3V 電壓下運行,任何高于 3.3V 的電壓都可能損壞開發(fā)板。如果你想將它與 5V 設備一起使用,你將需要一個邏輯電平轉換器。

WeMos D1 Mini 開發(fā)板可以通過 USB 進行編程。不同版本的WeMos D1 Mini開發(fā)板USB接口不同。一些具有C 型 USB端口,而另一些具有微型 USB 端口教程中使用的 WeMos D1 Mini 板帶有一個微型 USB 端口。

PIR 運動傳感器

被動紅外傳感器,也稱為熱釋電IR 運動傳感器,是一種小型廉價傳感器,通過測量檢測范圍內(nèi)的物體發(fā)射或反射的紅外輻射 (IR)量來檢測運動。檢測到的紅外輻射水平取決于物體的熱度。溫度越高的物體發(fā)出的紅外輻射越多。

pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
PIR 傳感器圖像
?

資料來源:阿達果

PIR 運動傳感器依靠熱釋電傳感器來檢測紅外輻射水平。熱釋電傳感器對熱能的變化高度敏感,并在加熱或冷卻時產(chǎn)生電能。

PIR 運動傳感器分為兩個插槽。當活體動物經(jīng)過運動傳感器時,一側會先于另一側檢測到移動物體。運動傳感器兩側紅外輻射水平的差異會產(chǎn)生正的差分變化。當運動物體離開檢測區(qū)域時,運動傳感器兩側會出現(xiàn)負微分變化。

為什么不同的 PIR 運動傳感器具有不同的檢測范圍?答案在于運動傳感器的球面透鏡。PIR 運動檢測器使用菲涅耳透鏡將大范圍的紅外線聚集到傳感器。在 PIR 運動檢測器中,菲涅爾透鏡被分成許多小部分,每個部分包含許多同心圓以將光線聚焦在一個點上。菲涅爾透鏡的結構使 PIR 運動傳感器能夠檢測大面積的運動。

腳步:

1. 構建電路

讓我們先談談如何使用每個電子元件并為這個項目搭建電路。

1.1 用WeMos D1 Mini啟動電路

WeMos D1 Mini 有11 個數(shù)字 I/O 引腳、1 個模擬輸入引腳 (A0) 、1 個 3.3V 引腳、1 個 5V 引腳和一個接地引腳。3.3V 引腳將用于為 PIR 運動傳感器供電,5V 引腳用于伺服電機WeMos D1 Mini 開發(fā)板可以通過微型 USB 進行編程和供電。您可以在此處熟悉 WeMos D1 Mini 。

pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
WeMos D1 迷你引出線
?

資料來源:WEMOS 文檔

由于 WeMos D1 Mini 開發(fā)板只有一個接地引腳,我們需要使用面包板來創(chuàng)建更多。為此,通過將其中一個面包板電源軌連接到 WeMos D1 Mini 板的接地引腳,將其定義為接地。PIR 運動傳感器、LED 和伺服電機的接地引腳可以連接到此電源導軌中的任何孔。

1.2 添加 PIR 運動傳感器

PIR 運動傳感器具有三個接頭引腳:接地(黑色)、信號輸出(黃色)和 VCC(紅色)此 PIR 運動傳感器的信號輸出引腳應連接到 WeMos D1 迷你板上的數(shù)字 I/O 引腳之一。本教程中使用的 PIR 運動傳感器需要 3.0V 的最小輸入電壓才能運行。因此,PIR 運動傳感器的 VCC 引腳應連接到 3.3V 引腳。

pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
PIR 傳感器引出線
?

資料來源:阿達果

注意:PIR 運動傳感器可能對噪音高度敏感。WeMos D1 Mini 板的 Wi-Fi 信號可能會產(chǎn)生誤觸發(fā)。如果您遇到誤觸發(fā)問題,請盡量避免將您的 WeMos D1 Mini 放在靠近 PIR 運動傳感器的位置。

1.3 添加伺服電機

小型伺服電機有三根線。黃色線是信號線,應連接到WeMos D1 Mini 板上的PWM 引腳。紅線是電源線,應連接到微控制器的5V 引腳。棕色線為地線,應連接到WeMos D1 Mini開發(fā)板的地腳。

pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
伺服電機圖像和引出線
?

資料來源:Digikey/DFRobot

1.4 添加支持電路(LED 和電阻

在這個項目中,紅色 LED 用于指示PIR 運動傳感器的狀態(tài)如果檢測到移動,LED 將打開,如果沒有移動,則關閉。紅色 LED 由 WeMos D1 Mini 開發(fā)板上的數(shù)字引腳供電。

計算所需電阻值

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 歐姆(最接近的標準電阻值 = 100 歐姆)

您最終應該得到一個大致如下圖所示的電路:

DogFeeder_bb.png?auto=compress%2Cformat&w=740&h=555&fit=max
最終電路圖(Fritzing)
?
pasted_image_0.png?auto=compress%2Cformat&w=740&h=555&fit=max
最終電路原理圖 (KiCAD)
?

2. 開始使用 Blynk 物聯(lián)網(wǎng)平臺

Blynk是一個非常流行的IoT 平臺,可幫助您從 IOSAndroid 設備管理 IoT 應用程序。該平臺允許您通過互聯(lián)網(wǎng)控制您的 Arduino、Raspberry PI 和其他微控制器。您將能夠根據(jù)他們的免費計劃完成此項目。為了使用 Blynk,您需要在 Arduino IDE中下載Blynk 庫。

2.1 在 Arduino IDE 中安裝 Blynk 庫

1. 打開 Arduino 集成開發(fā)環(huán)境。轉到工具并選擇管理庫。2。在搜索欄中鍵入 Blynk.3。安裝最新版本的可用庫。

2. 在搜索欄中輸入 Blynk。

3. 安裝可用的最新版本庫。

Untitled.png?auto=compress%2Cformat&w=740&h=555&fit=max
安裝 Blynk 庫
?

2.2 將 ESP8266 開發(fā)板添加到 Arduino IDE

ESP8266 不是 Arduino 系列的一部分,因此我們需要安裝一個附加組件才能在 Arduino IDE 上對其進行編程。要使用這個第三方硬件,我們需要安裝 ESP8266 社區(qū)提供的插件。

1. 轉到文件并選擇首選項。

2. 復制以下 URL 并將其粘貼到其他 Board Manager URL字段中:

https://arduino.esp8266.com/stable/package_esp8266com_index.json

3. 接下來,轉到工具并選擇板:然后選擇板管理器。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
將 ESP8266 添加到 Arduino IDE
?

4. 打開Boards Manager在搜索欄中輸入 ESP8266。 5 . 安裝 esp8266。

5.安裝esp8266。

Untitled.png?auto=compress%2Cformat&w=740&h=555&fit=max
為 Arduino IDE 安裝 ESP8266
?

2.3 在 Blynk 上管理您的設備

下載所有必需的庫后,讓我們創(chuàng)建一個 Blynk 項目來管理我們的 IoT 寵物喂食器。

1. 創(chuàng)建一個 Blynk 帳戶并在網(wǎng)絡瀏覽器中打開 Blynk。

2. 轉到模板并單擊網(wǎng)頁右上角的+ 新模板按鈕。

3. 為您的設備命名并選擇您將使用的硬件。在這個項目中,我們將使用 ESP8266,連接類型應該是Wi-Fi 。

4. 單擊完成按鈕創(chuàng)建一個新模板。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
創(chuàng)建一個新的 Blynk 項目
?

現(xiàn)在我們已經(jīng)創(chuàng)建了一個 Blynk 項目,讓我們來談談如何創(chuàng)建按鈕來使用虛擬引腳來控制我們的伺服電機。

Blynk Virtual Pins 旨在在硬件和 Blynk 云應用程序之間交換數(shù)據(jù)。虛擬引腳允許您從應用程序向微控制器發(fā)送命令或從微控制器接收數(shù)據(jù)。使用虛擬引腳,您可以控制各種設備,例如傳感器和伺服電機。

2.4 使用虛擬引腳控制伺服電機

1. 在模板部分打開您的硬件設備。

2. 轉到數(shù)據(jù)流并點擊右上角的編輯按鈕開始對您的項目進行更改。

3. 數(shù)據(jù)流是用于在硬件設備和 Blynk 應用程序之間交換數(shù)據(jù)的通道。要在硬件和 Blynk 應用程序之間創(chuàng)建數(shù)據(jù)傳輸通道,請單擊“添加數(shù)據(jù)流”按鈕并創(chuàng)建一個新的虛擬 Pin。

4. 將 PIN 設置為V1并選擇Integer作為 DATA TYPE。

5. 設置按鈕的最小值最大值。

6. 完成所有更改后,點擊保存,然后點擊網(wǎng)頁右上角的保存并應用按鈕。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
在 Blynk 中添加虛擬引腳數(shù)據(jù)流
?

2.5 在 Blynk 上創(chuàng)建通知

1. 在編輯模式下,轉到事件并點擊+ 添加新事件。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
?

2. 為您的事件命名,然后打開選項將事件發(fā)送到通知選項卡。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
?

3. 轉到通知并啟用通知

4. Blynk 提供三種傳遞通知的方式:電子郵件、推送通知和短信。在您想要的選項下添加設備所有者。

5. Blynk 允許您限制通知的數(shù)量。在“通知限制”部分,您可以限制在指定時間段內(nèi)可以發(fā)送的通知數(shù)量。例如,當Limit Period設置為1小時,Event Counter設置為1時,即使該時間段內(nèi)多次觸發(fā)事件,用戶也只會在一小時內(nèi)收到一次通知。

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
Blynk 中的事件通知設置
?

6. 完成所有更改后,點擊保存并應用

2.6 下載 Blynk Mobile App 并設置項目

在 Web 瀏覽器上配置 Blynk 項目后,就可以在移動設備上設置項目,以便遠程控制硬件。

1. 從蘋果或安卓商店下載 Blynk Mobile App。

2. 在 Blynk 應用程序中,打開您的 IoT 項目并選擇設置(右上角的扳手)。

Untitled.png?auto=compress%2Cformat&w=740&h=555&fit=max
Blynk 應用程序視圖
?

3. 單擊+按鈕打開 Widget Box。

Untitled.png?auto=compress%2Cformat&w=740&h=555&fit=max
添加 Blynk 應用程序小部件
?

4. 將最簡單的按鈕添加到您的項目中。這種類型的按鈕可以在兩種模式下運行:按下和切換。在 Push 模式下工作時,按下按鈕將切換到 ON 狀態(tài),松開按鈕將返回 OFF 狀態(tài)。開關模式允許您按下按鈕一次,然后它將保持打開或關閉狀態(tài),直到您再次按下按鈕以更改其狀態(tài)。

Untitled.png?auto=compress%2Cformat&w=740&h=555&fit=max
創(chuàng)建一個 Blynk 應用程序按鈕
?

3. WeMos D1 迷你微控制器編程

您可以按照本教程進行操作并編寫代碼,或者只需在此處下載項目代碼。

3.1 Blynk 庫和設置

在您的主固件的最頂部,在添加任何指令之前定義模板 ID設備名稱。模板 ID 和設備名稱可以在Blynk 設備的信息頁面上找到。#include

Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
Blynk 信息頁面
?

在這個項目中,我們正在使用 Blynk 庫,因此我們需要在固件頂部包含指令 #include 。

然后,我們需要在固件中配置網(wǎng)絡連接。我們需要定義三個參數(shù)。第一個是您的Blynk 身份驗證令牌,它可以在您的 Blynk 項目儀表板上找到。第二個是您的Wi-Fi SSID ,最后一個是您的Wi-Fi 密碼。定義三個參數(shù)后,將它們包含在函數(shù)中Blynk.begin(auth, ssid, pass)

最后,要完成 Blynk 庫設置,您需要為BLYNK_TEMPLATE_IDBLYNK_DEVICE_NAME參數(shù)包含一個#define,這些參數(shù)也應該在您的 Blynk 項目儀表板上找到。

#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()
{
}

接下來,讓我們談談如何通過 Blynk 控制您的設備。

在上一步中,我們配置了一個虛擬 Pin 來打開和關閉事物。由于所有虛擬引腳值始終以字符串形式發(fā)送,因此我們需要將傳入數(shù)據(jù)解釋為整數(shù)、浮點數(shù)、雙精度數(shù)或字符串。例如,下面的命令意味著傳入的虛擬 Pin 數(shù)據(jù)將被解釋為整數(shù):

int pinValue = param.asInt();

要從您的設備向 Blynk 應用程序發(fā)送數(shù)據(jù),請使用Blynk.virtualWrite(pin, value).

要接收從應用程序發(fā)送的數(shù)據(jù),請使用函數(shù)BLYNK_WRITE(vPin)。在我們的固件中,BLYNK_WRITE(V1)意味著設備正在等待將某些內(nèi)容寫入 V1。換句話說,設備正在等待我們切換與 V1 關聯(lián)的按鈕的狀態(tài)。

您可以訪問官方Blynk 文檔以了解有關虛擬引腳的更多信息。

#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)控制設備的按鈕,讓我們討論一下我們需要在固件中寫入什么來向您的手機或電子郵件發(fā)送通知。Blynk 使用 Events 來跟蹤您設備上發(fā)生的事件,并將通知發(fā)送到 Blynk 應用程序或您的電子郵件。

要發(fā)送通知,請使用Blynk.logEvent(“event_code”, “message”); 功能。可以在活動頁面上找到。event_code

例如,該命令Blynk.logEvent("motion_detected", "Motion Detected!");表示設備將發(fā)送通知“檢測到運動!” 如果 PIR 運動傳感器檢測到運動。

#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 添加代碼控制伺服電機

接下來,讓我們進入項目中移動的部分;伺服電機!我們將使用 Arduino Servo 庫,因此讓我們通過#include 在代碼頂部添加一個并實例化 Servo 對象并將其連接到 WeMos D1 Mini 上的引腳 4 來設置該庫。

#include 
// Servo Motor
Servo ServoMotor;
int ServoPin = D4;

現(xiàn)在,我們要告訴我們的伺服電機通過移動到特定位置然后在一段時間后移回關閉位置來打開狗食容器。我們可以通過添加兩個新變量來定義伺服電機的起始位置和最終位置來開始。

const int ServoInitialPosition = 0; // Starting position of servo motor
const int ServoFinalPosition = 135; // Final position of servo motor

然后我們可以在BLYNK_WRITE(V1)函數(shù)中添加代碼來控制伺服電機。你現(xiàn)在應該有這樣的東西了。

#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 傳感器編寫代碼,以便我們知道狗何時接近自動喂狗器。在我們的例子中,我們的 PIR 傳感器功能可以相當簡單,因為我們只需要知道狗是否在那里(二進制輸出)。如果我們感覺到狗在那里,我們想將該消息發(fā)送回 Blynk 應用程序,我們想打開電路中的 LED。

首先讓我們定義連接到 PIR 傳感器的引腳和void setup(). 我還想添加另一個變量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_statusHIGH(意味著已檢測到狗),我們可以將該信息發(fā)送回 Blynk 應用程序。

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)在應該看起來像這樣。

#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()
{
}

截至目前,我們的代碼在技術上應該可以工作;然而,我們現(xiàn)在所擁有的可能容易出現(xiàn)不穩(wěn)定的行為,因為我們沒有考慮 PIR 傳感器可能遇到的任何噪聲,這可能導致錯誤觸發(fā)或快速切換。

3.4 添加 SimpleTimer 庫以進行簡化

除了我們的噪音問題,Blynk 每天只允許發(fā)送 100 條通知。因此,我們需要好好利用這些通知。這可以使用SimpleTimer庫來完成。

在我們的代碼中,我們需要將 PIR 運動傳感器設置為每 3 秒檢測一次運動,如果檢測到運動,LED 將保持亮起 30 秒。如果連續(xù)檢測到移動,只會向 Blynk 應用程序發(fā)送一個通知,這也有助于解決不穩(wěn)定的行為。

要下載 SimpleTimer 庫,只需按照下載安裝庫的步驟操作即可。成功添加庫后,我們就可以#include 毫無問題地在代碼頂部添加指令。

#include 

接下來,讓我們使用這個庫實例化一個 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()通過包含代碼來設置計時器的間隔:

timer.setInterval(3000L,PIR_sensor); // Detects motion every 3 seconds

接下來,我們可以更新PIR_snesor()函數(shù)內(nèi)的代碼,使一切順利運行。

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)在應該將 Blynk 和計時器對象設置為在void loop().

void loop() 
{    
    Blynk.run();    
    timer.run();
}

最后,您現(xiàn)在應該擁有如下所示的最終代碼。

#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. 構建容器

有許多方法可以構建食品容器。最簡單的方法之一是使用塑料容器和硬紙板。本教程使用塑料管作為食品容器,因為我們想專注于項目的電子部分,但您可以在此處找到有關如何制作漂亮容器的教程。

先在塑料食品容器的底部剪一個小孔,用一小塊硬紙板蓋住塑料食品容器上的孔。然后,將紙板蓋粘到伺服電機的軸上。伺服電機和塑料食品容器都應該用膠帶粘在墻上以保持固定。

現(xiàn)在我們已經(jīng)完成了容器的構建,我們需要確保伺服電機可以旋轉蓋子來分配食物。

在您的固件中,更改伺服電機的初始位置和您希望電機旋轉的角度。食物分配后,伺服電機應返回初始位置。

該變量ServoInitialPosition存儲伺服電機的初始位置。當伺服電機在此位置時,蓋子應蓋住紙箱的孔,以防止食物從容器中漏出。另一個變量ServoFinalPosition存儲您希望電機旋轉以分配食物的角度。

const int ServoInitialPosition = 0; //starting position
const int ServoFinalPosition = 135; //final position
Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
最終結果
?

5. 最終測試

現(xiàn)在我們自制的物聯(lián)網(wǎng)寵物喂食器可以進行測試了。通過 USB 數(shù)據(jù)線連接 WeMos D1 迷你板的微型 USB 端口,為寵物喂食器供電。根據(jù)您的寵物喂食器的設計和您用來構建寵物喂食器的組件,您可能需要對代碼進行小幅修改。

結論

總的來說,我們已經(jīng)熟悉了使用 Arduino IDE 的 WeMos D1 Mini 和 Blynk IoT 平臺,并最終得到了一個很棒的 IoT Dog Feeder 來展示它!

如果您喜歡這個項目,請與其他人分享,以便我們繼續(xù)制作這些類型的項目!如果您對我們提供的更多內(nèi)容感興趣,可以訪問我們的學習中心以獲取更出色且易于訪問的電子教育。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費