今天,我們正在構(gòu)建一個(gè)基于Arduino的自動(dòng)寵物喂食器,它可以及時(shí)自動(dòng)為您的寵物提供食物。它有一個(gè)DS3231 RTC(實(shí)時(shí)時(shí)鐘)模塊,用于設(shè)置寵物應(yīng)進(jìn)食的時(shí)間和日期。因此,通過根據(jù)寵物的進(jìn)食時(shí)間表設(shè)置時(shí)間,設(shè)備會(huì)自動(dòng)掉落或裝滿食物碗。
在本電路中,我們使用16*2 LCD通過DS3231 RTC模塊和Arduino UNO顯示時(shí)間。此外,伺服電機(jī)用于旋轉(zhuǎn)容器以提供食物,4 * 4矩陣鍵盤用于手動(dòng)設(shè)置喂食寵物的時(shí)間。您可以根據(jù)要提供給寵物的食物數(shù)量設(shè)置旋轉(zhuǎn)角度和容器打開持續(xù)時(shí)間。食物的數(shù)量也可能取決于您的寵物,無論是狗、貓還是鳥。
所需材料
Arduino UNO
4*4矩陣鍵盤
16 * 2液晶顯示器
按鈕
伺服電機(jī)
連接線
面包板
電路圖
在這個(gè)基于Arduino的Cat喂食器中,為了獲取時(shí)間和日期,我們使用了RTC(實(shí)時(shí)時(shí)鐘)模塊。我們使用 4*4 矩陣鍵盤在 16x2 LCD 的幫助下手動(dòng)設(shè)置寵物的進(jìn)食時(shí)間。伺服電機(jī)旋轉(zhuǎn)容器并在用戶設(shè)置的時(shí)間內(nèi)放下食物。液晶屏用于顯示日期和時(shí)間。完整的工作可以在最后給出的視頻中找到。
3D打印寵物喂食器模型
我們使用3D打印機(jī)設(shè)計(jì)了這款A(yù)rduino寵物喂食器容器。用于打印此模型的材料是 PLA。它有四個(gè)部分,如下圖所示:
組裝四個(gè)部件并連接伺服電機(jī),如下圖所示:
DS3231 RTC 模塊
DS3231是RTC(實(shí)時(shí)時(shí)鐘)模塊。它用于維護(hù)大多數(shù)電子項(xiàng)目的日期和時(shí)間。該模塊有自己的紐扣電池電源,即使主電源被移除或MCU經(jīng)過硬復(fù)位,它也能保持日期和時(shí)間。因此,一旦我們在此模塊中設(shè)置了日期和時(shí)間,它將始終跟蹤它。在我們的電路中,我們使用DS3231根據(jù)寵物主人設(shè)置的時(shí)間喂寵物,就像鬧鐘一樣。當(dāng)時(shí)鐘達(dá)到設(shè)定時(shí)間時(shí),它操作伺服電機(jī)打開容器門,食物掉入寵物的食物碗中。
注意:首次使用此模塊時(shí),您必須設(shè)置日期和時(shí)間。
在下面的代碼中,我們定義了庫,RTC模塊的“#include ”,伺服電機(jī)的“#include ”,16 * 2 LCD的“#include ”和4 * 4矩陣鍵盤的“#include <鍵盤.h>”。
#include
#include
#include
#include
在下面的代碼中,我們?yōu)?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 };
在這里,我們將使用代碼中的以下命令創(chuàng)建鍵盤。
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
分配 A4 和 A5 Arduino 引腳以連接 DS3231 的 SCL 和 SDA 引腳。此外,將引腳分配給 LCD 并初始化伺服電機(jī)。
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、鍵和數(shù)組 r[6],以及饋送。
int t1, t2, t3, t4, t5, t6;
boolean feed = true;
char key;
int r[6];
在下面的代碼中,我們正在為啟動(dòng)設(shè)置所有組件。就像在這個(gè)代碼“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);
}
現(xiàn)在,循環(huán)如何工作是要理解的重要部分。每當(dāng)按下按鈕時(shí),它都會(huì)變高表示 1,可以通過“按鈕按下 = 數(shù)字讀取(A3)”來讀取。現(xiàn)在它進(jìn)入“if”語句并調(diào)用“setFeedingTime”函數(shù)。然后,它將實(shí)時(shí)時(shí)間和用戶輸入的時(shí)間進(jìn)行比較。如果條件為真,這意味著實(shí)時(shí)時(shí)間和輸入的時(shí)間相同,則伺服電機(jī)旋轉(zhuǎn)至 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() 函數(shù)代碼中,按下按鈕后,我們可以輸入寵物喂食時(shí)間,然后我們必須按“D”以節(jié)省該時(shí)間。當(dāng)保存的時(shí)間與實(shí)時(shí)匹配時(shí),伺服開始旋轉(zhuǎn)。
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; }
}
}
自動(dòng)寵物喂食器的工作原理
將代碼上傳到Arduino Uno后,時(shí)間和日期將顯示在16 * 2 LCD上。當(dāng)您按下按鈕時(shí),它會(huì)詢問寵物的喂食時(shí)間,您必須使用 4*4 矩陣鍵盤輸入時(shí)間。顯示屏將顯示輸入的時(shí)間,當(dāng)您按“D”時(shí),它會(huì)節(jié)省時(shí)間。當(dāng)實(shí)時(shí)時(shí)間和輸入時(shí)間匹配時(shí),它將伺服電機(jī)從其初始位置旋轉(zhuǎn) 55? 到 100?,并在延遲后再次返回到其初始位置。因此,伺服電機(jī)連接到食品容器門,因此當(dāng)它移動(dòng)時(shí),門將打開,一些食物落入碗或盤子中。延遲0.4秒后,伺服電機(jī)再次旋轉(zhuǎn)并關(guān)閉閘門。整個(gè)過程在幾秒鐘內(nèi)完成。這就是您的寵物在您輸入時(shí)自動(dòng)獲得食物的方式。
#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
+關(guān)注
關(guān)注
2文章
51瀏覽量
23834 -
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
186968 -
喂食器
+關(guān)注
關(guān)注
1文章
23瀏覽量
3063
發(fā)布評論請先 登錄
相關(guān)推薦
評論