风筝
发表于: 2018-4-13 09:39:16 | 显示全部楼层

Automatic-Pet -Feeder-using-Arduino.jpg

今天,我们将要制作一个基于Arduino开发板的自动宠物喂食机,它可以及时的自动为你的宠物提供食物。该项目采用一个DS3231的RTC(实时时钟)模块,用于设置宠物需要喂食的时间和日期。因此,根据您宠物进食的时刻表,设备会自动放下或填充食物。


在本项目中,我们使用一个1602的LCD模块显示时间,通过使用连接到Arduino UNO的DS3231 RTC模块获得。此外,它还使用一个伺服电机旋转容器以提供食物,同时还提供一个4 * 4的矩阵键盘,用来手动设置喂食宠物的时间。您可以根据您想要喂给宠物的食物量来设置旋转角度和容器开启时间。食物量也可能由于你的宠物是小狗、小猫还是鸟儿而略有不同。


所需的材料

●    Arduino UNO开发板

●    4 * 4的矩阵键盘

●    LCD显示模块1602

●    一个按钮

●    伺服电机

●    电阻

●    连接导线

●    面包板


电路原理图

在这款基于Arduino的宠物喂食机的项目中,为了获取时间和日期,我们使用了RTC(实时时钟)模块。我们使用4 * 4矩阵键盘以及LCD模块1602手动设置宠物的喂食时间。伺服电机旋转容器并按照用户设定的时间放下食物。 LCD用于显示日期和时间。

Automatic-Pet-Feeder-circuit-diagram-using-Arduino.png


Automatic-Pet-Feeder-using-Arduino-circuit-hardware.jpg


使用3D打印的宠物喂食机模型

我们使用3D打印机设计了这款Arduino宠物喂食机的容器。您也可以通过从这里下载文件来打印相同的设计。用于打印此模型的材料是PLA。它包含四个部分,如下图所示:

3D-printed-Pet -Feeder-model-Parts.jpg

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

3D-printed-Pet -Feeder-model.jpg


DS3231 RTC模块简介

DS3231是一个RTC(实时时钟)模块。在大多数电子项目中,它用于保持日期和时间。该模块自带了纽扣电池,即使主电源被移除或MCU硬件复位,也可使用该纽扣电池来保持日期和时间。所以一旦我们在这个模块中设置了日期和时间,它会一直保持下去。在我们的电路中,我们使用DS3231根据宠物主人设置的时间来喂宠物,就像闹铃一样。当时钟达到设定的时间时,它操作伺服电机打开容器门,食物落入宠物食物碗中。

DS3231-RTC-Module.jpg

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


代码和说明

自动宠物喂食机的完整的Arduino代码在本章的末尾给出。

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

●    DS3231 RTC(实时时钟)模块库

●    4 * 4矩阵键盘库


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

  1. #include <DS3231.h>
  2. #include <Servo.h>
  3. #include <LiquidCrystal.h>
  4. #include <Keypad.h>
复制代码

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

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

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

  1. Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
复制代码

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

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

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

  1. int t1, t2, t3, t4, t5, t6;
  2. boolean feed = true;
  3. char key;
  4. int r[6];
复制代码

在下面的代码中,我们设置了所有组件用于初始化操作。比如,在代码“servo_test.attach(10);”中,将伺服电机连接到Arduino的第10个引脚。将A0、A1和A2定义为输出引脚,然后初始化LCD和RTC模块。

  1. void setup()
  2. {
  3.   servo_test.attach(10);   // attach the signal pin of servo to pin9 of arduino
  4.   rtc.begin();
  5.   lcd.begin(16,2);
  6.   servo_test.write(55);
  7.   Serial.begin(9600);
  8.   pinMode(A0, OUTPUT);
  9.   pinMode(A1, OUTPUT);
  10.   pinMode(A2, OUTPUT);
  11. }
复制代码

现在,理解的重要部分是loop函数是如何工作的。无论何时按下按钮,它都会变为搞定平,也就是1,可以通过“buttonPress = digitalRead(A3)”的方式来读取。现在它进入'if'语句并调用'setFeedingTime'函数。然后比较实时时间和用户输入的时间。如果条件为真,即实时时间和输入时间相同,则伺服电机旋转至100度,并在0.4秒延迟后返回其初始位置。

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

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

  9. t = rtc.getTimeStr();
  10. t1 = t.charAt(0)-48;
  11. t2 = t.charAt(1)-48;
  12. t3 = t.charAt(3)-48;
  13. t4 = t.charAt(4)-48;
  14. t5 = t.charAt(6)-48;
  15. t6 = t.charAt(7)-48;

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

  20. if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true)
  21. {
  22.   servo_test.write(100);                   //command to rotate the servo to the specified angle
  23.    delay(400);  
  24.   servo_test.write(55);
  25.   feed=false;
  26. }
  27. }      
复制代码

void setFeedingTime()函数代码中,按下按钮后,我们可以输入宠物的喂食时间,然后我们必须按'D'来保存时间。当保存的时间与实时时间匹配时,伺服开始旋转。

  1. void setFeedingTime()
  2. {
  3.   feed = true;
  4.    int i=0;

  5.   lcd.clear();
  6.   lcd.setCursor(0,0);
  7.   lcd.print("Set feeding Time");
  8.   lcd.clear();
  9.   lcd.print("HH:MM");
  10.   lcd.setCursor(0,1);
  11.   while(1){
  12.     key = kpd.getKey();
  13.     char j;

  14.   if(key!=NO_KEY){
  15.     lcd.setCursor(j,1);
  16.     lcd.print(key);
  17.     r[i] = key-48;
  18.     i++;
  19.     j++;

  20.     if (j==2)
  21.     {
  22.       lcd.print(":"); j++;
  23.     }
  24.     delay(500);
  25.   }

  26.   if (key == 'D')
  27.   {key=0; break; }
  28.   }
  29. }
复制代码

自动宠物喂食器的工作过程

Automatic-Pet-Feeder-using-Arduino-in-action.jpg

将代码上传到Arduino Uno开发板后,LCD模块将会显示相应的时间和日期。当您按下按钮时,它会询问宠物的喂食时间,您必须使用4 * 4矩阵键盘输入时间。显示屏将显示输入的时间,按'D'键可以保存该时间。当实时时间和输入时间一致时,伺服电机从初始位置55⁰旋转到100⁰,并在延迟后再次返回到初始位置。由于伺服马达连接到了食品容器门,因此当它移动时,门打开并且一些食物落入碗或盘中。延时0.4秒后,伺服电机再次旋转,并关闭闸门。整个过程在几秒钟内完成。这就是您的宠物如何在您输入的时间点自动获取食物的方式。


您根据食物量来改变时间和旋转角度。如果您在制作类似项目时遇到问题,欢迎在此贴下进行回复。


代码

本文使用的完整代码如下: main.rar (1.21 KB, 下载次数: 472)

跳转到指定楼层
13018423232
发表于: 2018-10-20 16:03:57 | 显示全部楼层

亲,我想问下电阻是多大的饿呢
回复

使用道具 举报

风筝
发表于: 2018-10-24 22:24:40 | 显示全部楼层

13018423232 发表于 2018-10-20 16:03
亲,我想问下电阻是多大的饿呢

连接按键的电阻阻值是1K
回复

使用道具 举报

TonyWu
发表于: 2018-11-13 16:55:58 | 显示全部楼层

亲!我也想问一下,怎么才能让LCD显示真实的时间而不是Unix time?
回复

使用道具 举报

ldy
发表于: 2018-12-9 10:41:51 | 显示全部楼层

您好!请问一下您是如何供电的。?
回复

使用道具 举报

Yuki-xie
发表于: 2018-12-14 19:30:41 | 显示全部楼层

伺服电机可以换成别的吗
回复

使用道具 举报

ldy
发表于: 2018-12-25 20:54:53 | 显示全部楼层

你好,请问为何在按键时lcd不显示?
回复

使用道具 举报

风筝
发表于: 2018-12-25 22:26:45 | 显示全部楼层

ldy 发表于 2018-12-25 20:54
你好,请问为何在按键时lcd不显示?

可以先检查以下Arduino开发板有没有检测到按键按下
回复

使用道具 举报

Fate丶GG丿
发表于: 2019-6-2 19:34:25 | 显示全部楼层

楼主,可以加一下好友吗,我在程序上遇到点问题。
回复

使用道具 举报

随便下来看
发表于: 2019-6-19 09:52:18 | 显示全部楼层

作者 想问问伺服电机是什么牌子的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-26 06:49 , Processed in 0.046790 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表