今天,我們正在構建一個基于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; }
}
}
-
DS3231
+關注
關注
2文章
51瀏覽量
23867 -
Arduino
+關注
關注
188文章
6477瀏覽量
187826 -
喂食器
+關注
關注
1文章
24瀏覽量
3155
發布評論請先 登錄
相關推薦
評論