构建一个基于Arduino的自动宠物喂食器

描述

今天,我们正在构建一个基于Arduino的自动宠物喂食器,它可以及时自动为您的宠物提供食物。它有一个DS3231 RTC(实时时钟)模块,用于设置宠物应进食的时间和日期。因此,通过根据宠物的进食时间表设置时间,设备会自动掉落或装满食物碗。

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

所需材料

Arduino UNO

4*4矩阵键盘

16 * 2液晶显示器

按钮

伺服电机

电阻器

连接线

面包板

电路图

在这个基于Arduino的Cat喂食器中,为了获取时间和日期,我们使用了RTC(实时时钟)模块。我们使用 4*4 矩阵键盘在 16x2 LCD 的帮助下手动设置宠物的进食时间。伺服电机旋转容器并在用户设置的时间内放下食物。液晶屏用于显示日期和时间。完整的工作可以在最后给出的视频中找到。

喂食器

 

喂食器

3D打印宠物喂食器模型

我们使用3D打印机设计了这款Arduino宠物喂食器容器。用于打印此模型的材料是 PLA。它有四个部分,如下图所示:

喂食器

组装四个部件并连接伺服电机,如下图所示:

喂食器

DS3231 RTC 模块

DS3231是RTC(实时时钟)模块。它用于维护大多数电子项目的日期和时间。该模块有自己的纽扣电池电源,即使主电源被移除或MCU经过硬复位,它也能保持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它将始终跟踪它。在我们的电路中,我们使用DS3231根据宠物主人设置的时间喂宠物,就像闹钟一样。当时钟达到设定时间时,它操作伺服电机打开容器门,食物掉入宠物的食物碗中。

喂食器

注意:首次使用此模块时,您必须设置日期和时间。

在下面的代码中,我们定义了库,RTC模块的“#include ”,伺服电机的“#include ”,16 * 2 LCD的“#include ”和4 * 4矩阵键盘的“#include <键盘.h>”。

#include
#include
#include
#include
在下面的代码中,我们为 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],以及馈送。

int t1, t2, t3, t4, t5, t6;
boolean feed = true;
char key;
int r[6];
在下面的代码中,我们正在为启动设置所有组件。就像在这个代码“servo_test.attach(10);”伺服器附在 10千Arduino的销钉。定义 A0、A1 和 A2 作为输出引脚并初始化 LCD 和 RTC 模块。

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);
}
现在,循环如何工作是要理解的重要部分。每当按下按钮时,它都会变高表示 1,可以通过“按钮按下 = 数字读取(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

#include

#include

#include


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; }

}

}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分