使用Arduino的自动宠物喂食器
原文:https://circuitdigest.com/microcontroller-projects/automatic-pet-feeder-using-arduino
使用Arduino的自動寵物喂食器
ARDUINO的
經(jīng)過**潘卡·哈特里(Pankaj Khatri)** 2018年04月03日56
今天,我們正在構(gòu)建一個基于Arduino的自動寵物喂食器,它可以自動為您的寵物及時提供食物。它具有DS3231 RTC(實(shí)時時鐘)模塊,該模塊用于設(shè)置寵物應(yīng)被喂食的時間和日期。因此,通過根據(jù)寵物的進(jìn)食時間設(shè)置時間,設(shè)備可以自動放下或裝滿食物碗。
在此電路中,我們使用帶Arduino UNO的DS3231 RTC模塊使用16 * 2 LCD來顯示時間。另外,使用伺服電機(jī)旋轉(zhuǎn)容器以提供食物,并使用4 * 4矩陣鍵盤手動設(shè)置喂食寵物的時間。您可以根據(jù)要提供給寵物的食物量來設(shè)置旋轉(zhuǎn)角度和容器打開時間。食物的數(shù)量也可能取決于您的寵物,無論它是狗,貓還是鳥。
所需材料
- Arduino UNO
- 4 * 4矩陣鍵盤
- 16 * 2液晶屏
- 按鈕
- 伺服馬達(dá)
- 電阻器
- 連接線
- 面包板
電路圖
在此基于Arduino的Cat Feeder中,為了獲取時間和日期,我們使用了RTC(實(shí)時時鐘)模塊。我們使用4 * 4矩陣鍵盤通過16x2 LCD手動設(shè)置寵物的進(jìn)餐時間。伺服電機(jī)旋轉(zhuǎn)容器,并在用戶設(shè)定的時間將食物放下。LCD用于顯示日期和時間??梢栽谀┪驳囊曨l中找到完整的工作。
3D打印的寵物喂食器型號
我們使用3D打印機(jī)設(shè)計(jì)了Arduino Pet Feeder容器。您也可以通過從此處下載文件來打印相同的設(shè)計(jì)。用于打印此模型的材料是PLA。它分為四個部分,如下圖所示:
組裝四個零件,然后如下圖所示連接伺服電動機(jī):
如果您不熟悉3D打印,則這里是入門指南。您可以在此處下載該寵物喂食器的STL文件。
DS3231 RTC模塊
DS3231是一個RTC(實(shí)時時鐘)模塊。它用于維護(hù)大多數(shù)電子項(xiàng)目的日期和時間。該模塊具有自己的紐扣電池電源,即使斷開主電源或MCU進(jìn)行了硬復(fù)位,它也可以使用該電源來維持日期和時間。因此,一旦我們在此模塊中設(shè)置了日期和時間,它就會始終對其進(jìn)行跟蹤。在我們的電路中,我們正在使用DS3231根據(jù)寵物主人設(shè)置的時間(如警報(bào))喂食寵物。當(dāng)時鐘達(dá)到設(shè)定的時間時,它將操作伺服電動機(jī)以打開容器門,并且食物會落入Pet的食物碗中。
**注意:**首次使用此模塊時,必須設(shè)置日期和時間。您還可以使用 RTC IC DS1307與Arduino讀取時間。
代碼和解釋
最后給出了自動寵物喂食器的完整Arduino代碼。
Arduino具有用于使用伺服電機(jī)和LCD 16 * 2的默認(rèn)庫。但是要在Arduino上使用DS3231 RTC模塊和4 * 4矩陣鍵盤,您必須下載并安裝庫。這兩個庫的下載鏈接如下:
- DS3231 RTC(實(shí)時時鐘)模塊庫
- 4 * 4矩陣鍵盤庫
在下面的代碼,我們定義庫,“#包括<DS3231.h>”用于RTC模塊,“#包括<Servo.h>”為伺服電機(jī),“#包括<LiquidCrystal.h>” 16 * 2液晶,以及*“ #include <Keypad.h>”*代表4 * 4矩陣鍵盤。
#include <DS3231.h> #include <Servo.h> #include <LiquidCrystal.h> #include <Keypad.h>在下面的代碼中,我們?yōu)? * 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]以及feed。
int t1, t2, t3, t4, t5, t6; boolean feed = true;char key;int r[6];在下面的代碼中,我們將開始設(shè)置所有組件。就像這段代碼中的*“ servo_test.attach(10);”* 伺服連接到Arduino的第10針。將A0,A1和A2定義為輸出引腳,并初始化LCD和RTC模塊。
void setup(){Servo_test.attach(10); //將伺服的信號引腳連接到arduino的pin9rtc.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)按下“ Pushbutton”(按鈕)時,它就會變高,意味著“ 1 *”可以通過“ buttonPress = digitalRead(A3)”讀取。現(xiàn)在,它進(jìn)入“ if”語句,并調(diào)用“ setFeedingTime”*函數(shù)。然后,它將實(shí)時時間與用戶輸入的時間進(jìn)行比較。如果條件為真,這意味著實(shí)時時間和輸入的時間相同,則伺服電機(jī)旋轉(zhuǎn)到100度角,并在經(jīng)過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 angledelay(400); servo_test.write(55);feed=false;}}在*void setFeedingTime()*函數(shù)代碼中,按下按鈕后,我們可以輸入寵物的喂食時間,然后必須按“ D”鍵以保存該時間。當(dāng)保存的時間與實(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; }} }自動寵物喂食器的工作
將代碼上傳到Arduino Uno之后,時間和日期將顯示在16 * 2 LCD上。當(dāng)您按下按鈕時,它會詢問寵物的喂食時間,您必須使用4 * 4矩陣鍵盤輸入時間。顯示屏將顯示輸入的時間,當(dāng)您按“ D”時,將節(jié)省時間。當(dāng)實(shí)時時間和輸入時間匹配時,它將使伺服電動機(jī)從其初始位置55?旋轉(zhuǎn)到100°,并在延遲后再次返回其初始位置。因此,伺服馬達(dá)連接到食物容器的門上,因此隨著它的移動,門將打開,并且有一些食物掉入碗或盤中。延遲0.4秒后,伺服電機(jī)再次旋轉(zhuǎn)并關(guān)閉閘門。整個過程將在幾秒鐘內(nèi)完成。這就是您的寵物在您輸入時自動獲取食物的方式。
根據(jù)食物改變時間和程度
代碼
#include <DS3231.h> #include <Servo.h> #include <LiquidCrystal.h> #include <Keypad.h>const byte ROWS = 4; // Four rows const byte COLS = 4; // Three columns// Define the Keymapchar 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 KeypadKeypad 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 potentiometerint t1, t2, t3, t4, t5, t6;boolean feed = true; // condition for alarmchar key;int r[6];void setup() { servo_test.attach(10); // attach the signal pin of servo to pin9 of arduinortc.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; }} }總結(jié)
以上是生活随笔為你收集整理的使用Arduino的自动宠物喂食器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凯斯轴承数据故障诊断PHM轴承寿命预测深
- 下一篇: rapidjson坑