小程序
传感搜
传感圈

基于物联网的宠物喂食器

2022-07-25
关注

如果您在自己的地方养了一只宠物,并且在您不在的时候没有人在正确的时间喂他/她。因此,我们正在构建一个简单、高效且经济的基于物联网的宠物喂食器。使用这款自动宠物喂食器,您可以在世界任何地方使用Blynk 移动应用程序或 Web 仪表板喂养您的宠物。您只需按一个按钮或设置一个时间,其余的任务将由这台机器完成。在这个项目中,我们使用NodeMCU ESP8266作为主控制器,使用伺服电机来操作宠物喂食器和 NTP 服务器来获取当前时间。

构建宠物喂食器所需的组件

NodeMCU ESP8266

伺服电机

自动宠物喂食器电路

自动宠物喂食器的完整示意图如下:

连接非常简单,因为我们只是将伺服电机与 NodeMCU 连接起来。Servo 的 Vcc(红线)和 GND(棕线)引脚连接到 NodeMCU 的 3.3V 和 GND,而 Servo 的信号引脚(黄线)连接到 NodeMCU 的 D3 引脚。

为宠物喂食器配置 Blynk

Blynk 是一套完整的软件,用于对任何规模的连接设备进行原型设计、部署和远程管理,从小型物联网项目到数百万商业可用的连接项目。它可用于将硬件连接到云并构建无代码 iOSAndroid 和 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();
}

您觉得本篇内容如何
评分

评论

您需要登录才可以回复|注册

提交评论

提取码
复制提取码
点击跳转至百度网盘