今天,我们正在构建基于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根据宠物主人设置的时间(如警报)喂食宠物。当时钟达到设定的时间时,它将操作伺服电动机以打开容器门,并且食物会落入宠物的食物碗中。
注意:首次使用此模块时,必须设置日期和时间。您也可以使用RTC IC DS1307与Arduino读取时间。
代码和解释
最后给出了自动宠物喂食器的完整Arduino代码。
Arduino具有用于使用伺服电机和LCD 16 * 2的默认库。但是,要在Arduino上使用DS3231 RTC模块和4 * 4矩阵键盘,您必须下载并安装库。这两个库的下载链接如下:
- DS3231 RTC(实时时钟)模块库
- 4 * 4矩阵键盘库
在下面的代码中,我们定义了库, “#include
#包括
在下面的代码中,我们将为4 * 4矩阵键盘定义键盘映射,并为键盘的行和列分配Arduino引脚。
字符键= {{'1','2','3','A'},{'4','5','6','B'},{'7','8',' 9','C'},{'*','0','#','D'}}; 字节rowPins = {2,3,4,5}; 字节colPins = {6,7,8,9};
在这里,我们通过使用以下代码中的命令来创建键盘。
键盘kpd =键盘(makeKeymap(keys),rowPins,colPins,ROWS,COLS);
分配A4和A5 Arduino引脚以与DS3231的SCL和SDA引脚连接。另外,将引脚分配给LCD并初始化伺服电机。
DS3231 rtc(A4,A5); 伺服伺服测试; //为连接的伺服LiquidCrystal lcd(A0,A1,A2,11,12,13)初始化伺服对象 //创建一个LC对象。参数:(rs,启用,d4,d5,d6,d7)
在下面的代码中,我们声明t1到t6,键和数组r以及feed。
整数t1,t2,t3,t4,t5,t6; 布尔值feed = true; 字符键 诠释
在下面的代码中,我们将开始设置所有组件。就像这段代码中的 “ servo_test.attach(10);” 伺服连接到Arduino的第10针。将A0,A1和A2定义为输出引脚,并初始化LCD和RTC模块。
void setup(){Servo_test.attach(10); //将伺服的信号引脚连接到arduino rtc.begin()的pin9上;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 button按; buttonPress = digitalRead(A3);如果(buttonPress == 1)setFeedingTime(); lcd.print(“ Time:”);字符串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());如果(t1 == r && t2 == r && t3 == r && t4 == r && t5 <1 && t6 <3 && feed == true){伺服测试。写入(100); //命令将伺服旋转到指定的角度延迟(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(“设置进纸时间”); lcd.clear(); lcd.print(“ HH:MM”); lcd.setCursor(0,1); while(1){key = kpd.getKey(); 字符j; if(key!= NO_KEY){lcd.setCursor(j,1); lcd.print(key); r =键48; i ++; j ++; 如果(j == 2){lcd.print(“:”); j ++; } delay(500); } if(key =='D'){key = 0; 打破; }}}
自动宠物喂食器的工作
将代码上传到Arduino Uno之后,时间和日期将显示在16 * 2 LCD上。当您按下按钮时,它会询问宠物的喂食时间,您必须使用4 * 4矩阵键盘输入时间。显示屏将显示输入的时间,按“ D”键可以节省时间。当实时时间和输入时间匹配时,它将使伺服电动机从其初始位置55⁰旋转到100°,并在延迟后再次返回其初始位置。因此,伺服电机连接到食物容器的门上,因此随着它的移动,门将打开,并且有一些食物掉入碗或盘中。延迟0.4秒后,伺服电机再次旋转并关闭闸门。整个过程将在几秒钟内完成。这就是您的宠物在您输入时自动获取食物的方式。
根据食物改变时间和程度