如果您在自己的地方養(yǎng)了一只寵物,并且在您不在的時(shí)候沒(méi)有人在正確的時(shí)間喂他/她。因此,我們正在構(gòu)建一個(gè)簡(jiǎn)單、高效且經(jīng)濟(jì)的基于物聯(lián)網(wǎng)的寵物喂食器。使用這款自動(dòng)寵物喂食器,您可以在世界任何地方使用Blynk 移動(dòng)應(yīng)用程序或 Web 儀表板喂養(yǎng)您的寵物。您只需按一個(gè)按鈕或設(shè)置一個(gè)時(shí)間,其余的任務(wù)將由這臺(tái)機(jī)器完成。在這個(gè)項(xiàng)目中,我們使用NodeMCU ESP8266作為主控制器,使用伺服電機(jī)來(lái)操作寵物喂食器和 NTP 服務(wù)器來(lái)獲取當(dāng)前時(shí)間。
構(gòu)建寵物喂食器所需的組件
NodeMCU ESP8266
伺服電機(jī)
自動(dòng)寵物喂食器電路圖
自動(dòng)寵物喂食器的完整示意圖如下:
連接非常簡(jiǎn)單,因?yàn)槲覀冎皇菍⑺欧姍C(jī)與 NodeMCU 連接起來(lái)。Servo 的 Vcc(紅線)和 GND(棕線)引腳連接到 NodeMCU 的 3.3V 和 GND,而 Servo 的信號(hào)引腳(黃線)連接到 NodeMCU 的 D3 引腳。
為寵物喂食器配置 Blynk
Blynk 是一套完整的軟件,用于對(duì)任何規(guī)模的連接設(shè)備進(jìn)行原型設(shè)計(jì)、部署和遠(yuǎn)程管理,從小型物聯(lián)網(wǎng)項(xiàng)目到數(shù)百萬(wàn)商業(yè)可用的連接項(xiàng)目。它可用于將硬件連接到云并構(gòu)建無(wú)代碼 iOS、Android 和 Web 應(yīng)用程序,以分析來(lái)自設(shè)備的實(shí)時(shí)和歷史數(shù)據(jù),從全球任何地方遠(yuǎn)程控制它們,接收重要通知等等。 在這個(gè)項(xiàng)目中,我們將使用 Blynk 移動(dòng)應(yīng)用程序來(lái)控制連接到寵物喂食器設(shè)置的伺服電機(jī)。
首先,我們必須為Blynk Cloud平臺(tái)創(chuàng)建一個(gè)新帳戶,或者如果您已有舊帳戶,您可以使用舊帳戶。登錄到您的帳戶后,您必須創(chuàng)建一個(gè)模板,您可以在其中添加多個(gè)設(shè)備。為此,請(qǐng)單擊右上角的“+ 新模板”按鈕。
將彈出一個(gè)窗口,您必須在其中輸入模板名稱(chēng)、硬件類(lèi)型和連接類(lèi)型。模板名稱(chēng)可以是與您的項(xiàng)目相關(guān)的任何名稱(chēng),硬件類(lèi)型是您正在使用的微控制器板,連接類(lèi)型是 Wi-Fi。
現(xiàn)在在模板中,我們可以添加多個(gè)信息,如設(shè)備信息、元數(shù)據(jù)、DataStream、事件等。在接下來(lái)的步驟中,我們將一一填寫(xiě)這些詳細(xì)信息。因此,第一個(gè)選項(xiàng)卡是設(shè)備信息,將其保留為默認(rèn)值。
然后第二個(gè)選項(xiàng)卡是元數(shù)據(jù)。元數(shù)據(jù)是我們提供給項(xiàng)目的附加信息,例如設(shè)備名稱(chēng)、設(shè)備所有者等。這不是強(qiáng)制性的,您可以根據(jù)需要添加填寫(xiě)這些內(nèi)容。
下一個(gè)選項(xiàng)卡是“DataStream”。數(shù)據(jù)流是一種結(jié)構(gòu)化數(shù)據(jù)的方法,這些數(shù)據(jù)定期流入和流出設(shè)備。在這里,我們將創(chuàng)建兩個(gè)數(shù)據(jù)流,一個(gè)用于控制伺服,另一個(gè)用于從 blynk 應(yīng)用程序獲取計(jì)時(shí)器數(shù)據(jù)。要?jiǎng)?chuàng)建 DataStream,請(qǐng)單擊“+New Datastream”按鈕,然后選擇Virtual Pin。
將彈出一個(gè)窗口,您必須在其中輸入數(shù)據(jù)流名稱(chēng)、虛擬引腳和數(shù)據(jù)類(lèi)型。在此之后單擊“創(chuàng)建”按鈕并按照相同的過(guò)程創(chuàng)建數(shù)據(jù)流以獲取計(jì)時(shí)器值。
完成此操作后,保留“事件”選項(xiàng)卡并移至“Web 儀表板”選項(xiàng)卡。在 blynk 2.0 中,我們有兩種類(lèi)型的儀表板,即 Web 儀表板和移動(dòng)儀表板。兩個(gè)儀表板都可以單獨(dú)配置和使用。Web Dashboard 的小部件數(shù)量有限。您可以添加一個(gè)開(kāi)關(guān)進(jìn)行測(cè)試。
完成此操作后,下一個(gè)選項(xiàng)卡是移動(dòng)儀表板。移動(dòng)儀表板只能在移動(dòng)設(shè)備上配置。所以在移動(dòng)到移動(dòng)端之前,首先將所有更改保存在云端。為此,請(qǐng)單擊右上角的保存按鈕。
現(xiàn)在我們剩下編碼部分和移動(dòng)儀表板。首先,我們將使用編碼部分。
為寵物喂食器編程 NodeMCU
該項(xiàng)目的完整代碼在文檔末尾給出。在這里,我們將解釋一些重要的代碼行。因此,像往常一樣通過(guò)包含所有必需的庫(kù)文件來(lái)啟動(dòng)代碼。BlynkEdgent.h是 Blynk 2.0 平臺(tái)的新庫(kù)。“NTPClient.h”用于從 NTP 服務(wù)器獲取時(shí)間和日期數(shù)據(jù)。“WiFiUdp.h”庫(kù)用于處理UDP協(xié)議,如打開(kāi)UDP端口,發(fā)送和接收UDP數(shù)據(jù)包等。而“Servo.h”用于控制伺服電機(jī)。
#include “BlynkEdgent.h” #include#include #include #include <伺服.h>
然后在接下來(lái)的行中輸入 Blynk 模板 ID 和 Blynk 設(shè)備 ID。這些 ID 可以從 Blynk 云平臺(tái)上的“設(shè)備信息”頁(yè)面復(fù)制。
#define BLYNK_TEMPLATE_ID "TMPLrKGv1gYp" #define BLYNK_DEVICE_NAME "寵物喂食器"
然后在下一行為 NTP 客戶端創(chuàng)建一個(gè)實(shí)例。在這個(gè)實(shí)例中,我們必須指定我們希望使用的 NTP 服務(wù)器的地址。
NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", utcOffsetInSeconds);
BLYNK_WRITE()函數(shù)用于檢查 V0 和 V1 虛擬引腳的傳入數(shù)據(jù)。虛擬引腳 V0 用于接收開(kāi)關(guān)狀態(tài),而 V1 引腳用于從 Blynk 應(yīng)用程序獲取定時(shí)器數(shù)據(jù)。
BLYNK_WRITE(V0) { int 數(shù)據(jù) = param.asInt(); 如果(數(shù)據(jù) == 1){ 伺服_1.write(45);// 伺服將移動(dòng)到 45 度角。 延遲(1000); 伺服_1.write(90);//伺服將移動(dòng)到90度角。 } } BLYNK_WRITE(V1){ time_blynk = param.asInt(); }
在設(shè)置部分,我們首先以 115200 的波特率初始化串行通信,并啟動(dòng) Blynk 和時(shí)間客戶端通信。
無(wú)效設(shè)置() { 序列號(hào).開(kāi)始(115200); 延遲(100); BlynkEdgent.begin(); 伺服_1.attach(0); timeClient.begin(); }
現(xiàn)在在循環(huán)函數(shù)中,我們首先從 NTP 客戶端-服務(wù)器獲取時(shí)間數(shù)據(jù),然后將這些數(shù)據(jù)存儲(chǔ)在 HH 和 MM 變量中。我們從 NTP 客戶端獲取的時(shí)間數(shù)據(jù)是 24 小時(shí)格式,所以首先我們將其更改為 12 小時(shí)格式,然后我們以秒為單位轉(zhuǎn)換小時(shí)和分鐘數(shù)據(jù),以將其與我們從 Blynk 接收的計(jì)時(shí)器數(shù)據(jù)進(jìn)行比較應(yīng)用程序。如果當(dāng)前時(shí)間和從 Blynk 應(yīng)用程序接收到的時(shí)間相同,則寵物喂食器將在特定時(shí)間段內(nèi)打開(kāi)和關(guān)閉。
無(wú)效循環(huán)(){ timeClient.update(); HH = timeClient.getHours(); 國(guó)際小時(shí)= HH; 如果(小時(shí) == 0)小時(shí) = 12; 如果(小時(shí) > 12)小時(shí) = 小時(shí) - 12; MM = timeClient.getMinutes(); final_time = 3600*小時(shí)+ 60*MM; 如果(time_blynk == final_time){ } BlynkEdgent.run(); }
現(xiàn)在選擇“ NodeMCU ”的板類(lèi)型和連接NodeMCU的端口并上傳代碼。現(xiàn)在完成此操作后,我們就剩下了 Blynk 移動(dòng)應(yīng)用程序,并將 Wi-Fi 憑據(jù)添加到 NodeMCU。
配置 Blynk 移動(dòng)應(yīng)用程序
第一步是從 Play 商店下載 Blynk 應(yīng)用程序,然后創(chuàng)建一個(gè)新帳戶。如果您有一個(gè)現(xiàn)有帳戶,您也可以使用現(xiàn)有帳戶登錄。現(xiàn)在您必須啟用開(kāi)發(fā)者模式。開(kāi)發(fā)人員是一個(gè)特殊用戶,他可以訪問(wèn)配置平臺(tái)以供最終用戶使用所需的所有功能。要啟用開(kāi)發(fā)者模式,請(qǐng)單擊左上角的“個(gè)人資料”圖標(biāo),然后啟用開(kāi)發(fā)者模式。
之后,您需要單擊添加新設(shè)備按鈕并將 NodeMCU 板靠近手機(jī)并單擊就緒按鈕。
它會(huì)自動(dòng)找到NodeMCU板創(chuàng)建的熱點(diǎn)。連接到該熱點(diǎn),然后您可以輕松輸入路由器的 Wi-Fi 憑據(jù)。之后單擊繼續(xù),它將 Wi-Fi 憑據(jù)發(fā)送到 NodeMCU 板,我們完成了將 Wi-Fi 憑據(jù)添加到板。
創(chuàng)建 Blynk 移動(dòng)儀表板
現(xiàn)在我們完成了配置 Blynk 移動(dòng)儀表板的最后一步。為此,請(qǐng)轉(zhuǎn)到您剛剛創(chuàng)建的設(shè)備,然后單擊菜單圖標(biāo),您將看到所有可用的小部件。
在這里,我們將添加兩個(gè)小部件,即 Button 和 Timer 小部件。按鈕小部件用于手動(dòng)控制伺服,而計(jì)時(shí)器小部件用于設(shè)置特定操作的時(shí)間。
現(xiàn)在點(diǎn)擊按鈕小部件進(jìn)行配置。在這里,您必須選擇我們?cè)?Blynk 云上創(chuàng)建的數(shù)據(jù)流。之后點(diǎn)擊計(jì)時(shí)器小部件并選擇數(shù)據(jù)流。您還可以更改其他設(shè)置,如小部件名稱(chēng)、顏色等。
現(xiàn)在我們已經(jīng)成功配置了 Blynk Mobile 儀表板,下一步是構(gòu)建 Pet Feeder 設(shè)置。
構(gòu)建寵物喂食器設(shè)置
為了制造一個(gè)自動(dòng)貓喂食器,我們從亞馬遜訂購(gòu)了一個(gè)寵物喂食器盒,并對(duì)其進(jìn)行了修改以適應(yīng)伺服系統(tǒng)和其他電子設(shè)備。直流電機(jī)放置在盒子內(nèi),并附有一個(gè) 3D 打印齒輪。NodeMCU 板放置在盒子的底部,這個(gè)完整的設(shè)置使用 12V 適配器供電。
測(cè)試自動(dòng)寵物喂食器
現(xiàn)在我們已經(jīng)準(zhǔn)備好了一切,讓我們繼續(xù)測(cè)試這個(gè)寵物喂食器設(shè)置。為此,我在寵物喂食器的盒子里裝滿了貓糧,為了進(jìn)行測(cè)試,我使用安裝在我手機(jī)上的 Blynk 應(yīng)用程序作為遙控器來(lái)檢查我們的寵物喂食器是否正在分配食物。我一打開(kāi)設(shè)置,寵物喂食器就開(kāi)始以可控的速度分配貓糧。
除了開(kāi)關(guān),我們還可以使用 Blynk 應(yīng)用程序的計(jì)時(shí)器小部件設(shè)置喂貓的時(shí)間。完整的測(cè)試過(guò)程顯示在頁(yè)面底部的視頻中。希望你理解這篇文章并學(xué)到新的東西。如果您有任何疑問(wèn),請(qǐng)將它們放在下面的評(píng)論部分。
代碼
// 在此處填寫(xiě)來(lái)自您的 Blynk 模板的信息
#define BLYNK_TEMPLATE_ID "TMPLrKGv1gYp" #define BLYNK_DEVICE_NAME "寵物喂食器" #define BLYNK_FIRMWARE_VERSION "0.1.0" #define BLYNK_PRINT 序列號(hào) //#define BLYNK_DEBUG #define APP_DEBUG // 取消注釋您的板,或在 Settings.h 中配置自定義板 //#define USE_SPARKFUN_BLYNK_BOARD //#define USE_NODE_MCU_BOARD //#define USE_WITTY_CLOUD_BOARD //#define USE_WEMOS_D1_MINI #include “BlynkEdgent.h” #include#include #include //#include // 包括伺服庫(kù)。 常量長(zhǎng) utcOffsetInSeconds = 19800; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", utcOffsetInSeconds); int HH,MM,final_time; int time_blynk,數(shù)據(jù); //伺服servo_1; #定義電機(jī)D0 BLYNK_WRITE(V0) { 數(shù)據(jù) = param.asInt(); } BLYNK_WRITE(V1) { time_blynk = param.asInt(); Serial.print(time_blynk); //Serial.print("有時(shí)間"); } 無(wú)效設(shè)置() { 序列號(hào).開(kāi)始(115200); 延遲(100); BlynkEdgent.begin(); pinMode(電機(jī),輸出); 數(shù)字寫(xiě)入(電機(jī),低); //servo_1.attach(0); timeClient.begin(); } 無(wú)效循環(huán)(){ timeClient.update(); HH = timeClient.getHours(); //Serial.print(timeClient.getHours()); 國(guó)際小時(shí)= HH; 如果(小時(shí) == 0)小時(shí) = 12;// 午夜 如果(小時(shí) > 12)小時(shí) = 小時(shí) - 12; //Serial.print(小時(shí)); //Serial.print(":"); MM = timeClient.getMinutes(); // Serial.println(timeClient.getMinutes()); final_time = 3600*小時(shí)+ 60*MM; // Serial.println(final_time); 如果(time_blynk == final_time){ 數(shù)字寫(xiě)入(電機(jī),低); 延遲(3000); 數(shù)字寫(xiě)入(電機(jī),高); } 如果(數(shù)據(jù) == 1){ 數(shù)字寫(xiě)入(電機(jī),高); 延遲(5000); 數(shù)字寫(xiě)入(電機(jī),低); Serial.print("開(kāi)幕"); } 延遲(6000); BlynkEdgent.run(); }
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2913文章
44929瀏覽量
377065 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45332 -
喂食器
+關(guān)注
關(guān)注
1文章
24瀏覽量
3155
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論