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