精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐ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 | 次下載 | 免費(fèi)

資料介紹

描述

介紹

你的狗有沒有在清晨叫醒你吃東西?您是否因?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)目的完美選擇。

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 個(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ā)出的紅外輻射越多。

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

資料來源:阿達(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

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

資料來源: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 引腳。

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

資料來源:阿達(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ā)板的地腳

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

資料來源: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è)大致如下圖所示的電路:

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是一個(gè)非常流行的IoT 平臺,可幫助您從 IOSAndroid 設(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. 安裝可用的最新版本庫。

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

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)到工具并選擇板:然后選擇板管理器

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 上管理您的設(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è)新模板。

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

現(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)用按鈕。

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

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

1. 在編輯模式下,轉(zhuǎn)到事件并點(diǎn)擊+ 添加新事件

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

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

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

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)收到一次通知。

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

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è)置(右上角的扳手)。

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

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

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

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

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

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

您可以按照本教程進(jìn)行操作并編寫代碼,或者只需在此處下載項(xiàng)目代碼。

3.1 Blynk 庫和設(shè)置

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

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

在這個(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_IDBLYNK_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_statusHIGH(意味著已檢測到狗),我們可以將該信息發(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
Untitled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
最終結(jié)果
?

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í)中心以獲取更出色且易于訪問的電子教育。


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

評論

查看更多

下載排行

本周

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

本月

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

總榜

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