今天,我們將要制作一個基于Arduino開發板的自動寵物喂食機,它可以及時的自動為你的寵物提供食物。該項目采用一個DS3231的RTC(實時時鐘)模塊,用于設置寵物需要喂食的時間和日期。因此,根據您寵物進食的時刻表,設備會自動放下或填充食物。
在本項目中,我們使用一個1602的LCD模塊顯示時間,通過使用連接到Arduino UNO的DS3231 RTC模塊獲得。此外,它還使用一個伺服電機旋轉容器以提供食物,同時還提供一個4 * 4的矩陣鍵盤,用來手動設置喂食寵物的時間。您可以根據您想要喂給寵物的食物量來設置旋轉角度和容器開啟時間。食物量也可能由于你的寵物是小狗、小貓還是鳥兒而略有不同。 
所需的材料 ● Arduino UNO開發板 ● 4 * 4的矩陣鍵盤 ● LCD顯示模塊1602 ● 一個按鈕 ● 伺服電機 ● 電阻 ● 連接導線 ● 面包板 電路原理圖 在這款基于Arduino的寵物喂食機的項目中,為了獲取時間和日期,我們使用了RTC(實時時鐘)模塊。我們使用4 * 4矩陣鍵盤以及LCD模塊1602手動設置寵物的喂食時間。伺服電機旋轉容器并按照用戶設定的時間放下食物。 LCD用于顯示日期和時間。 
使用3D打印的寵物喂食機模型 我們使用3D打印機設計了這款Arduino寵物喂食機的容器。您也可以通過從這里下載文件來打印相同的設計。用于打印此模型的材料是PLA。它包含四個部分,如下圖所示: 
按照下圖所示組裝四個部件并連接伺服電機: 
DS3231 RTC模塊簡介 DS3231是一個RTC(實時時鐘)模塊。在大多數電子項目中,它用于保持日期和時間。該模塊自帶了紐扣電池,即使主電源被移除或MCU硬件復位,也可使用該紐扣電池來保持日期和時間。所以一旦我們在這個模塊中設置了日期和時間,它會一直保持下去。在我們的電路中,我們使用DS3231根據寵物主人設置的時間來喂寵物,就像鬧鈴一樣。當時鐘達到設定的時間時,它操作伺服電機打開容器門,食物落入寵物食物碗中。 
注意:首次使用此模塊時,您必須設置日期和時間。
代碼和說明 自動寵物喂食機的完整的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矩陣鍵盤。 - #include <DS3231.h>
- #include <Servo.h>
- #include <LiquidCrystal.h>
- #include <Keypad.h>
[color=rgb(51, 102, 153) !important]復制代碼
在下面的代碼中,我們定義了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 };
[color=rgb(51, 102, 153) !important]復制代碼
在這里,我們通過在代碼中使用下面的命令來創建鍵盤。 - Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
[color=rgb(51, 102, 153) !important]復制代碼
我們分配Arduino開發板的A4和A5連接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)
[color=rgb(51, 102, 153) !important]復制代碼
在下面的代碼中,我們聲明了t1到t6、key和數組r[6]以及feed。 - int t1, t2, t3, t4, t5, t6;
- boolean feed = true;
- char key;
- int r[6];
[color=rgb(51, 102, 153) !important]復制代碼
在下面的代碼中,我們設置了所有組件用于初始化操作。比如,在代碼“servo_test.attach(10);”中,將伺服電機連接到Arduino的第10個引腳。將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);
- }
[color=rgb(51, 102, 153) !important]復制代碼
現在,理解的重要部分是loop函數是如何工作的。無論何時按下按鈕,它都會變為搞定平,也就是1,可以通過“buttonPress = digitalRead(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;
- }
- }
[color=rgb(51, 102, 153) !important]復制代碼
在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 = key-48;
- i++;
- j++;
- if (j==2)
- {
- lcd.print(":"); j++;
- }
- delay(500);
- }
- if (key == 'D')
- {key=0; break; }
- }
- }
[color=rgb(51, 102, 153) !important]復制代碼
自動寵物喂食器的工作過程 
將代碼上傳到Arduino Uno開發板后,LCD模塊將會顯示相應的時間和日期。當您按下按鈕時,它會詢問寵物的喂食時間,您必須使用4 * 4矩陣鍵盤輸入時間。顯示屏將顯示輸入的時間,按'D'鍵可以保存該時間。當實時時間和輸入時間一致時,伺服電機從初始位置55⁰旋轉到100⁰,并在延遲后再次返回到初始位置。由于伺服馬達連接到了食品容器門,因此當它移動時,門打開并且一些食物落入碗或盤中。延時0.4秒后,伺服電機再次旋轉,并關閉閘門。整個過程在幾秒鐘內完成。這就是您的寵物如何在您輸入的時間點自動獲取食物的方式。
您根據食物量來改變時間和旋轉角度。如果您在制作類似項目時遇到問題,歡迎在此貼下進行回復
|