今天,我們正在構(gòu)建一個(gè)基于Arduino的自動(dòng)寵物喂食器,它可以及時(shí)自動(dòng)為您的寵物提供食物。它有一個(gè)DS3231 RTC(實(shí)時(shí)時(shí)鐘)模塊,用于設(shè)置寵物應(yīng)進(jìn)食的時(shí)間和日期。因此,通過(guò)根據(jù)寵物的進(jìn)食時(shí)間表設(shè)置時(shí)間,設(shè)備會(huì)自動(dòng)掉落或裝滿食物碗。
在本電路中,我們使用16*2 LCD通過(guò)DS3231 RTC模塊和Arduino UNO顯示時(shí)間。此外,伺服電機(jī)用于旋轉(zhuǎn)容器以提供食物,4 * 4矩陣鍵盤(pán)用于手動(dòng)設(shè)置喂食寵物的時(shí)間。您可以根據(jù)要提供給寵物的食物數(shù)量設(shè)置旋轉(zhuǎn)角度和容器打開(kāi)持續(xù)時(shí)間。食物的數(shù)量也可能取決于您的寵物,無(wú)論是狗、貓還是鳥(niǎo)。
所需材料
Arduino UNO
4*4矩陣鍵盤(pán)
16 * 2液晶顯示器
按鈕
伺服電機(jī)
連接線
面包板
電路圖
在這個(gè)基于Arduino的Cat喂食器中,為了獲取時(shí)間和日期,我們使用了RTC(實(shí)時(shí)時(shí)鐘)模塊。我們使用 4*4 矩陣鍵盤(pán)在 16x2 LCD 的幫助下手動(dòng)設(shè)置寵物的進(jìn)食時(shí)間。伺服電機(jī)旋轉(zhuǎn)容器并在用戶(hù)設(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)過(guò)硬復(fù)位,它也能保持日期和時(shí)間。因此,一旦我們?cè)诖四K中設(shè)置了日期和時(shí)間,它將始終跟蹤它。在我們的電路中,我們使用DS3231根據(jù)寵物主人設(shè)置的時(shí)間喂寵物,就像鬧鐘一樣。當(dāng)時(shí)鐘達(dá)到設(shè)定時(shí)間時(shí),它操作伺服電機(jī)打開(kāi)容器門(mén),食物掉入寵物的食物碗中。
	
注意:首次使用此模塊時(shí),您必須設(shè)置日期和時(shí)間。
	在下面的代碼中,我們定義了庫(kù),RTC模塊的“#include ”,伺服電機(jī)的“#include ”,16 * 2 LCD的“#include ”和4 * 4矩陣鍵盤(pán)的“#include <鍵盤(pán).h>”。
	#include
	#include
	#include
	#include
	在下面的代碼中,我們?yōu)?4*4 矩陣鍵盤(pán)定義鍵盤(pán)映射,并為鍵盤(pán)的行和列分配 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)建鍵盤(pán)。
	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的銷(xiāo)釘。定義 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,可以通過(guò)“按鈕按下 = 數(shù)字讀取(A3)”來(lái)讀取?,F(xiàn)在它進(jìn)入“if”語(yǔ)句并調(diào)用“setFeedingTime”函數(shù)。然后,它將實(shí)時(shí)時(shí)間和用戶(hù)輸入的時(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í),伺服開(kāi)始旋轉(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ì)詢(xún)問(wèn)寵物的喂食時(shí)間,您必須使用 4*4 矩陣鍵盤(pán)輸入時(shí)間。顯示屏將顯示輸入的時(shí)間,當(dāng)您按“D”時(shí),它會(huì)節(jié)省時(shí)間。當(dāng)實(shí)時(shí)時(shí)間和輸入時(shí)間匹配時(shí),它將伺服電機(jī)從其初始位置旋轉(zhuǎn) 55? 到 100?,并在延遲后再次返回到其初始位置。因此,伺服電機(jī)連接到食品容器門(mén),因此當(dāng)它移動(dòng)時(shí),門(mén)將打開(kāi),一些食物落入碗或盤(pán)子中。延遲0.4秒后,伺服電機(jī)再次旋轉(zhuǎn)并關(guān)閉閘門(mén)。整個(gè)過(guò)程在幾秒鐘內(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瀏覽量
24270 - 
                                Arduino
                                +關(guān)注
關(guān)注
190文章
6512瀏覽量
195445 - 
                                喂食器
                                +關(guān)注
關(guān)注
1文章
30瀏覽量
3876 
發(fā)布評(píng)論請(qǐng)先 登錄
基于單片機(jī)的寵物定時(shí)自動(dòng)喂食器設(shè)計(jì)(原理圖&程序)
怎么實(shí)現(xiàn)寵物自動(dòng)喂食器的設(shè)計(jì)?
基于ESP8266設(shè)計(jì)的寵物喂食器
自制一個(gè)寵物喂食器
自動(dòng)喂食器的設(shè)計(jì)原理圖
基于物聯(lián)網(wǎng)的寵物喂食器
    
設(shè)計(jì)一個(gè)寵物NFC定時(shí)喂食器
    
智能自動(dòng)魚(yú)/寵物喂食器開(kāi)源分享
    
自動(dòng)寵物喂食器開(kāi)源硬件
    
用Arduino Uno制作一個(gè)智能的自動(dòng)寵物喂食器
    
          
        
        
構(gòu)建一個(gè)基于Arduino的自動(dòng)寵物喂食器
                
 
    
           
            
            
                
            
評(píng)論