基于物联网的宠物喂食器
如果您在自己的地方养了一只宠物,并且在您不在的时候没有人在正确的时间喂他/她。因此,我们正在构建一个简单、高效且经济的基于物联网的宠物喂食器。使用这款自动宠物喂食器,您可以在世界任何地方使用Blynk 移动应用程序或 Web 仪表板喂养您的宠物。您只需按一个按钮或设置一个时间,其余的任务将由这台机器完成。在这个项目中,我们使用NodeMCU ESP8266作为主控制器,使用伺服电机来操作宠物喂食器和 NTP 服务器来获取当前时间。
构建宠物喂食器所需的组件
NodeMCU ESP8266
伺服电机
自动宠物喂食器电路图
自动宠物喂食器的完整示意图如下:
连接非常简单,因为我们只是将伺服电机与 NodeMCU 连接起来。Servo 的 Vcc(红线)和 GND(棕线)引脚连接到 NodeMCU 的 3.3V 和 GND,而 Servo 的信号引脚(黄线)连接到 NodeMCU 的 D3 引脚。
为宠物喂食器配置 Blynk
Blynk 是一套完整的软件,用于对任何规模的连接设备进行原型设计、部署和远程管理,从小型物联网项目到数百万商业可用的连接项目。它可用于将硬件连接到云并构建无代码 iOS、Android 和 Web 应用程序,以分析来自设备的实时和历史数据,从全球任何地方远程控制它们,接收重要通知等等。 在这个项目中,我们将使用 Blynk 移动应用程序来控制连接到宠物喂食器设置的伺服电机。
首先,我们必须为Blynk Cloud平台创建一个新帐户,或者如果您已有旧帐户,您可以使用旧帐户。登录到您的帐户后,您必须创建一个模板,您可以在其中添加多个设备。为此,请单击右上角的“+ 新模板”按钮。
将弹出一个窗口,您必须在其中输入模板名称、硬件类型和连接类型。模板名称可以是与您的项目相关的任何名称,硬件类型是您正在使用的微控制器板,连接类型是 Wi-Fi。
现在在模板中,我们可以添加多个信息,如设备信息、元数据、DataStream、事件等。在接下来的步骤中,我们将一一填写这些详细信息。因此,第一个选项卡是设备信息,将其保留为默认值。
然后第二个选项卡是元数据。元数据是我们提供给项目的附加信息,例如设备名称、设备所有者等。这不是强制性的,您可以根据需要添加填写这些内容。
下一个选项卡是“DataStream”。数据流是一种结构化数据的方法,这些数据定期流入和流出设备。在这里,我们将创建两个数据流,一个用于控制伺服,另一个用于从 blynk 应用程序获取计时器数据。要创建 DataStream,请单击“+New Datastream”按钮,然后选择Virtual Pin。
将弹出一个窗口,您必须在其中输入数据流名称、虚拟引脚和数据类型。在此之后单击“创建”按钮并按照相同的过程创建数据流以获取计时器值。
完成此操作后,保留“事件”选项卡并移至“Web 仪表板”选项卡。在 blynk 2.0 中,我们有两种类型的仪表板,即 Web 仪表板和移动仪表板。两个仪表板都可以单独配置和使用。Web Dashboard 的小部件数量有限。您可以添加一个开关进行测试。
完成此操作后,下一个选项卡是移动仪表板。移动仪表板只能在移动设备上配置。所以在移动到移动端之前,首先将所有更改保存在云端。为此,请单击右上角的保存按钮。
现在我们剩下编码部分和移动仪表板。首先,我们将使用编码部分。
为宠物喂食器编程 NodeMCU
该项目的完整代码在文档末尾给出。在这里,我们将解释一些重要的代码行。因此,像往常一样通过包含所有必需的库文件来启动代码。BlynkEdgent.h是 Blynk 2.0 平台的新库。“NTPClient.h”用于从 NTP 服务器获取时间和日期数据。“WiFiUdp.h”库用于处理UDP协议,如打开UDP端口,发送和接收UDP数据包等。而“Servo.h”用于控制伺服电机。
#include “BlynkEdgent.h” #include#include #include #include <伺服.h>
然后在接下来的行中输入 Blynk 模板 ID 和 Blynk 设备 ID。这些 ID 可以从 Blynk 云平台上的“设备信息”页面复制。
#define BLYNK_TEMPLATE_ID "TMPLrKGv1gYp" #define BLYNK_DEVICE_NAME "宠物喂食器"
然后在下一行为 NTP 客户端创建一个实例。在这个实例中,我们必须指定我们希望使用的 NTP 服务器的地址。
NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", utcOffsetInSeconds);
BLYNK_WRITE()函数用于检查 V0 和 V1 虚拟引脚的传入数据。虚拟引脚 V0 用于接收开关状态,而 V1 引脚用于从 Blynk 应用程序获取定时器数据。
BLYNK_WRITE(V0) { int 数据 = param.asInt(); 如果(数据 == 1){ 伺服_1.write(45);// 伺服将移动到 45 度角。 延迟(1000); 伺服_1.write(90);//伺服将移动到90度角。 } } BLYNK_WRITE(V1){ time_blynk = param.asInt(); }
在设置部分,我们首先以 115200 的波特率初始化串行通信,并启动 Blynk 和时间客户端通信。
无效设置() { 序列号.开始(115200); 延迟(100); BlynkEdgent.begin(); 伺服_1.attach(0); timeClient.begin(); }
现在在循环函数中,我们首先从 NTP 客户端-服务器获取时间数据,然后将这些数据存储在 HH 和 MM 变量中。我们从 NTP 客户端获取的时间数据是 24 小时格式,所以首先我们将其更改为 12 小时格式,然后我们以秒为单位转换小时和分钟数据,以将其与我们从 Blynk 接收的计时器数据进行比较应用程序。如果当前时间和从 Blynk 应用程序接收到的时间相同,则宠物喂食器将在特定时间段内打开和关闭。
无效循环(){ timeClient.update(); HH = timeClient.getHours(); 国际小时= HH; 如果(小时 == 0)小时 = 12; 如果(小时 > 12)小时 = 小时 - 12; MM = timeClient.getMinutes(); final_time = 3600*小时+ 60*MM; 如果(time_blynk == final_time){ } BlynkEdgent.run(); }
现在选择“ NodeMCU ”的板类型和连接NodeMCU的端口并上传代码。现在完成此操作后,我们就剩下了 Blynk 移动应用程序,并将 Wi-Fi 凭据添加到 NodeMCU。
配置 Blynk 移动应用程序
第一步是从 Play 商店下载 Blynk 应用程序,然后创建一个新帐户。如果您有一个现有帐户,您也可以使用现有帐户登录。现在您必须启用开发者模式。开发人员是一个特殊用户,他可以访问配置平台以供最终用户使用所需的所有功能。要启用开发者模式,请单击左上角的“个人资料”图标,然后启用开发者模式。
之后,您需要单击添加新设备按钮并将 NodeMCU 板靠近手机并单击就绪按钮。
它会自动找到NodeMCU板创建的热点。连接到该热点,然后您可以轻松输入路由器的 Wi-Fi 凭据。之后单击继续,它将 Wi-Fi 凭据发送到 NodeMCU 板,我们完成了将 Wi-Fi 凭据添加到板。
创建 Blynk 移动仪表板
现在我们完成了配置 Blynk 移动仪表板的最后一步。为此,请转到您刚刚创建的设备,然后单击菜单图标,您将看到所有可用的小部件。
在这里,我们将添加两个小部件,即 Button 和 Timer 小部件。按钮小部件用于手动控制伺服,而计时器小部件用于设置特定操作的时间。
现在点击按钮小部件进行配置。在这里,您必须选择我们在 Blynk 云上创建的数据流。之后点击计时器小部件并选择数据流。您还可以更改其他设置,如小部件名称、颜色等。
现在我们已经成功配置了 Blynk Mobile 仪表板,下一步是构建 Pet Feeder 设置。
构建宠物喂食器设置
为了制造一个自动猫喂食器,我们从亚马逊订购了一个宠物喂食器盒,并对其进行了修改以适应伺服系统和其他电子设备。直流电机放置在盒子内,并附有一个 3D 打印齿轮。NodeMCU 板放置在盒子的底部,这个完整的设置使用 12V 适配器供电。
测试自动宠物喂食器
现在我们已经准备好了一切,让我们继续测试这个宠物喂食器设置。为此,我在宠物喂食器的盒子里装满了猫粮,为了进行测试,我使用安装在我手机上的 Blynk 应用程序作为遥控器来检查我们的宠物喂食器是否正在分配食物。我一打开设置,宠物喂食器就开始以可控的速度分配猫粮。
除了开关,我们还可以使用 Blynk 应用程序的计时器小部件设置喂猫的时间。完整的测试过程显示在页面底部的视频中。希望你理解这篇文章并学到新的东西。如果您有任何疑问,请将它们放在下面的评论部分。
代码
// 在此处填写来自您的 Blynk 模板的信息
#define BLYNK_TEMPLATE_ID "TMPLrKGv1gYp" #define BLYNK_DEVICE_NAME "宠物喂食器" #define BLYNK_FIRMWARE_VERSION "0.1.0" #define BLYNK_PRINT 序列号 //#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 // 包括伺服库。 常量长 utcOffsetInSeconds = 19800; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", utcOffsetInSeconds); int HH,MM,final_time; int time_blynk,数据; //伺服servo_1; #定义电机D0 BLYNK_WRITE(V0) { 数据 = param.asInt(); } BLYNK_WRITE(V1) { time_blynk = param.asInt(); Serial.print(time_blynk); //Serial.print("有时间"); } 无效设置() { 序列号.开始(115200); 延迟(100); BlynkEdgent.begin(); pinMode(电机,输出); 数字写入(电机,低); //servo_1.attach(0); timeClient.begin(); } 无效循环(){ timeClient.update(); HH = timeClient.getHours(); //Serial.print(timeClient.getHours()); 国际小时= HH; 如果(小时 == 0)小时 = 12;// 午夜 如果(小时 > 12)小时 = 小时 - 12; //Serial.print(小时); //Serial.print(":"); MM = timeClient.getMinutes(); // Serial.println(timeClient.getMinutes()); final_time = 3600*小时+ 60*MM; // Serial.println(final_time); 如果(time_blynk == final_time){ 数字写入(电机,低); 延迟(3000); 数字写入(电机,高); } 如果(数据 == 1){ 数字写入(电机,高); 延迟(5000); 数字写入(电机,低); Serial.print("开幕"); } 延迟(6000); BlynkEdgent.run(); }