使用Arduino的自动宠物喂食器

这篇文章介绍了如何使用Arduino构建一款自动宠物喂食器,配备DS3231RTC模块设置喂食时间,4*4矩阵键盘手动设置时间,伺服电机控制食物投放。教程详细讲解了所需材料、电路图、3D打印模型和代码实现。
摘要由CSDN通过智能技术生成

原文:https://circuitdigest.com/microcontroller-projects/automatic-pet-feeder-using-arduino

使用Arduino的自动宠物喂食器

ARDUINO的

经过**潘卡·哈特里(Pankaj Khatri)** 2018年04月03日56
在这里插入图片描述
今天,我们正在构建一个基于Arduino的自动宠物喂食器,它可以自动为您的宠物及时提供食物。它具有DS3231 RTC(实时时钟)模块,该模块用于设置宠物应被喂食的时间和日期。因此,通过根据宠物的进食时间设置时间,设备可以自动放下或装满食物碗。

在此电路中,我们使用带Arduino UNO的DS3231 RTC模块使用16 * 2 LCD来显示时间。另外,使用伺服电机旋转容器以提供食物,并使用4 * 4矩阵键盘手动设置喂食宠物的时间。您可以根据要提供给宠物的食物量来设置旋转角度和容器打开时间。食物的数量也可能取决于您的宠物,无论它是狗,猫还是鸟。

所需材料

  • Arduino UNO
  • 4 * 4矩阵键盘
  • 16 * 2液晶屏
  • 按钮
  • 伺服马达
  • 电阻器
  • 连接线
  • 面包板

电路图

在此基于Arduino的Cat Feeder中,为了获取时间和日期,我们使用了RTC(实时时钟)模块。我们使用4 * 4矩阵键盘通过16x2 LCD手动设置宠物的进餐时间。伺服电机旋转容器,并在用户设定的时间将食物放下。LCD用于显示日期和时间。可以在末尾的视频中找到完整的工作。
在这里插入图片描述
在这里插入图片描述

3D打印的宠物喂食器型号

我们使用3D打印机设计了Arduino Pet Feeder容器。您也可以通过从此处下载文件来打印相同的设计。用于打印此模型的材料是PLA。它分为四个部分,如下图所示:
在这里插入图片描述

组装四个零件,然后如下图所示连接伺服电动机:
在这里插入图片描述

如果您不熟悉3D打印,则这里是入门指南。您可以在此处下载该宠物喂食器STL文件

DS3231 RTC模块

DS3231是一个RTC(实时时钟)模块。它用于维护大多数电子项目的日期和时间。该模块具有自己的纽扣电池电源,即使断开主电源或MCU进行了硬复位,它也可以使用该电源来维持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它就会始终对其进行跟踪。在我们的电路中,我们正在使用DS3231根据宠物主人设置的时间(如警报)喂食宠物。当时钟达到设定的时间时,它将操作伺服电动机以打开容器门,并且食物会落入Pet的食物碗中。
在这里插入图片描述
**注意:**首次使用此模块时,必须设置日期和时间。您还可以使用 RTC IC DS1307与Arduino读取时间

代码和解释

最后给出了自动宠物喂食器的完整Arduino代码

Arduino具有用于使用伺服电机和LCD 16 * 2的默认库。但是要在Arduino上使用DS3231 RTC模块和4 * 4矩阵键盘,您必须下载并安装库。这两个库的下载链接如下:

在下面的代码,我们定义库,“#包括<DS3231.h>”用于RTC模块,“#包括<Servo.h>”为伺服电机,“#包括<LiquidCrystal.h>” 16 * 2液晶,以及*“ #include <Keypad.h>”*代表4 * 4矩阵键盘。

#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

在下面的代码中,我们为4 * 4矩阵键盘定义了键盘映射,并为键盘的行和列分配了Arduino引脚。

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = { 2, 3, 4, 5 };
byte colPins[COLS] = { 6, 7, 8, 9 };

在这里,我们通过使用以下代码中的命令来创建键盘。

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

分配A4和A5 Arduino引脚以与DS3231的SCL和SDA引脚连接。另外,将引脚分配给LCD并初始化伺服电机。

DS3231  rtc(A4, A5);
Servo servo_test;      //initialize a servo object for the connected servo 
LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)

在下面的代码中,我们声明t1到t6,键和数组r [6]以及feed。

int t1, t2, t3, t4, t5, t6;
boolean feed = true;
 char key;
 int r[6];

在下面的代码中,我们将开始设置所有组件。就像这段代码中的*“ servo_test.attach(10);”* 伺服连接到Arduino的第10针。将A0,A1和A2定义为输出引脚,并初始化LCD和RTC模块。

void setup()
 {
  Servo_test.attach(10); //将伺服的信号引脚连接到arduino的pin9
  rtc.begin();
  lcd.begin(16,2);
  Servo_test.write(55);
  Serial.begin(9600);
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
 }

现在,循环是如何工作的是要理解的重要部分。每当按下“ Pushbutton”(按钮)时,它就会变高,意味着“ 1 *”可以通过“ buttonPress = digitalRead(A3)”读取。现在,它进入“ if”语句,并调用“ setFeedingTime”*函数。然后,它将实时时间与用户输入的时间进行比较。如果条件为真,这意味着实时时间和输入的时间相同,则伺服电机旋转到100度角,并在经过0.4秒的延迟后返回到其初始位置。

void loop() {
lcd.setCursor(0,0);
int buttonPress;
buttonPress = digitalRead(A3);

if (buttonPress==1)
 setFeedingTime();
 lcd.print("Time:  ");
 String t = "";

 t = rtc.getTimeStr();
 t1 = t.charAt(0)-48;
 t2 = t.charAt(1)-48;
 t3 = t.charAt(3)-48;
 t4 = t.charAt(4)-48;
 t5 = t.charAt(6)-48;
 t6 = t.charAt(7)-48;

 lcd.print(rtc.getTimeStr());
 lcd.setCursor(0,1);
 lcd.print("Date: ");
 lcd.print(rtc.getDateStr());

 if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true)
 {
  servo_test.write(100);                   //command to rotate the servo to the specified angle
   delay(400);  
  servo_test.write(55);
  feed=false;
 }
 }      

在*void setFeedingTime()*函数代码中,按下按钮后,我们可以输入宠物的喂食时间,然后必须按“ D”键以保存该时间。当保存的时间与实时一致时,伺服开始旋转。

void setFeedingTime()
{
  feed = true;
   int i=0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Set feeding Time");
  lcd.clear();
  lcd.print("HH:MM");
  lcd.setCursor(0,1);
  while(1){
    key = kpd.getKey();
    char j;

  if(key!=NO_KEY){
    lcd.setCursor(j,1);
    lcd.print(key);
    r[i] = key-48;
    i++;
    j++;

    if (j==2)
    {
      lcd.print(":"); j++;
    }
    delay(500);
  }

  if (key == 'D')
  {key=0; break; }
  }
}

自动宠物喂食器的工作

在这里插入图片描述
将代码上传到Arduino Uno之后,时间和日期将显示在16 * 2 LCD上。当您按下按钮时,它会询问宠物的喂食时间,您必须使用4 * 4矩阵键盘输入时间。显示屏将显示输入的时间,当您按“ D”时,将节省时间。当实时时间和输入时间匹配时,它将使伺服电动机从其初始位置55⁰旋转到100°,并在延迟后再次返回其初始位置。因此,伺服马达连接到食物容器的门上,因此随着它的移动,门将打开,并且有一些食物掉入碗或盘中。延迟0.4秒后,伺服电机再次旋转并关闭闸门。整个过程将在几秒钟内完成。这就是您的宠物在您输入时自动获取食物的方式。

根据食物改变时间和程度

代码

#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap

char keys[ROWS][COLS] = {

  {'1','2','3','A'},

  {'4','5','6','B'},

  {'7','8','9','C'},

  {'*','0','#','D'}

};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.

byte rowPins[ROWS] = { 2, 3, 4, 5 };

// Connect keypad COL0, COL1 and COL2 to these Arduino pins.

byte colPins[COLS] = { 6, 7, 8, 9 };

//  Create the Keypad
  Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

DS3231  rtc(A4, A5);
Servo servo_test;      //initialize a servo object for the connected servo  
LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)

 //int angle = 0;    
// int potentio = A0;      // initialize the A0analog pin for potentiometer
 int t1, t2, t3, t4, t5, t6;

 
boolean feed = true; // condition for alarm

 char key;
 int r[6];
 
 void setup() 
 { 
  servo_test.attach(10);   // attach the signal pin of servo to pin9 of arduino
  rtc.begin();
  lcd.begin(16,2);
  servo_test.write(55); 
  Serial.begin(9600);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  
 } 
 
 void loop() 
 { 

lcd.setCursor(0,0);
int buttonPress;
buttonPress = digitalRead(A3);

if (buttonPress==1)
 setFeedingTime();
 

//Serial.println(buttonPress);

 lcd.print("Time:  ");
 String t = "";
 t = rtc.getTimeStr(); 
 t1 = t.charAt(0)-48;
 t2 = t.charAt(1)-48;
 t3 = t.charAt(3)-48;
 t4 = t.charAt(4)-48;
 t5 = t.charAt(6)-48;
 t6 = t.charAt(7)-48;
 
 lcd.print(rtc.getTimeStr());
 lcd.setCursor(0,1);
 lcd.print("Date: ");
 lcd.print(rtc.getDateStr());
 
 if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true)
 { 
  servo_test.write(100);                   //command to rotate the servo to the specified angle 
   delay(400);   
  servo_test.write(55); 
  feed=false;
 } 
 }       

void setFeedingTime()
{
  feed = true;
   int i=0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Set feeding Time");
  lcd.clear();
  lcd.print("HH:MM");
  lcd.setCursor(0,1);

  
  while(1){
    key = kpd.getKey();

    char j;
    
  if(key!=NO_KEY){
    
    lcd.setCursor(j,1);
    
    lcd.print(key);
    
    r[i] = key-48;
    i++;
    j++;

    if (j==2)
    {
      lcd.print(":"); j++;
    }
    delay(500);
  }

  if (key == 'D')
  {key=0; break; }
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值