0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Arduino Uno制作一個智能的自動寵物喂食器(續(xù))

北上北京 ? 來源:DevicePlus ? 作者:DevicePlus ? 2023-02-24 14:40 ? 次閱讀

這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。

第 1 部分 續(xù) >

第4步:添加 RFID

RFID是該系統(tǒng)的核心。當(dāng)你的寵物靠近喂食器時,RFID將讀取標(biāo)簽上的值,并決定是否提供更多的食物。RFID系統(tǒng)采用SPI通信,將標(biāo)簽的值存儲在EEPROM存儲器中。在這種情況下,如果發(fā)生系統(tǒng)故障(例如斷電等引發(fā)的問題),信息將被保存到存儲器中。

有關(guān)Arduino SPI通信的更多信息,請參閱 Arduino 通信協(xié)議教程。

就RFID而言,必須添加以下庫:

SPI

MFRC522

EEPROM

poYBAGPzFtKAX7zyAAMsDigOifo508.jpg

圖13:添加了RDIF的接線圖

pYYBAGPzFtSAJ55uAASGpcTWC-Q771.jpg

圖14:RFID與其他組件連接的示意圖

我們有兩個RFID標(biāo)簽。紅的會裝在寵物身上。作為測試組,藍(lán)的會裝在外人身上(不是你寵物的其他東西)。該系統(tǒng)有兩個功能:

白天:上午8時至晚上8時,喂食器每4小時投放3次食物。當(dāng)食物被投放出來以后,蜂鳴器會發(fā)出聲音作為信號,它會叫你的寵物過來進(jìn)食。當(dāng)有聲音時,寵物就會知道該吃飯了,它會靠近自己的碗(食物容器)。當(dāng)標(biāo)簽靠近RFID閱讀器時,食物就會被投放出來

晚上:不會發(fā)出聲音,但如果寵物在早上0點(diǎn)以后接近RFID,則將被喂食一次。

pYYBAGPzFtaAUHcOAABoU3OOHW0007.jpg

圖15:在串口監(jiān)視器上所顯示的分配標(biāo)簽

第5步:安裝電機(jī)

我們將使用伺服電機(jī)SG90。伺服角度的大小是(0-180度)。我們的鎖具系統(tǒng)將類似于一個角度控制的鎖具(當(dāng)“鎖具”打開/解鎖時,可控制投喂多少食物)。

以下是一些要點(diǎn):

0 度:“鎖具”完全關(guān)閉,沒有食物投放;

180 度:“鎖具”完全打開,食物全部投放;

在 0-180: 之間:你可以選擇投放多少食物。

pYYBAGPzFteANWVBAAODEFCK6p8610.jpg

圖16:完整的項目接線圖

第6步:制作機(jī)械部分

在我們討論電機(jī)的編程之前,我們需要制作喂食器的支架?,F(xiàn)在就需要研究一下喂食器的機(jī)械部分。我們需要以下材料:

金屬板(或木板)- 35×25 厘米

瓶子(或塑料容器)

打開/關(guān)閉食物分配器所需要用到的2塊硬質(zhì)材料

把瓶子固定在金屬板上
用鉆在金屬板上鉆4個洞,為碗留出空間(這個距離取決于你的碗/食物容器有多高。之后,你需要把瓶子倒過來,用兩根線固定到金屬板上。

pYYBAGPzFtqABgu-AARgLOw7J6M868.jpg

圖17:用兩根線把瓶子(食物分配器)連到金屬板上

“鎖具”系統(tǒng)不能懸在半空中,所以我們要用一塊堅硬的材料來固定它。這為食物分配器提供了一個很好的開口。我們需要用鉆頭或膠帶將其固定在金屬板上,這樣它就不會塌下來,以防你把太多食物放在分配器里。如下圖所示,為了防止鎖具的錯位,需要彎曲金屬部分的外緣。

pYYBAGPzFtyAOtDmAAMpGZ0lM5o337.jpg

圖18:支架安放位置

放置伺服電機(jī)
我們需要把電機(jī)接到金屬板上。我在金屬板上鉆了個洞,以便牢牢地固定伺服電機(jī)。接下來,我們需要將伺服電機(jī)連接到機(jī)械系統(tǒng)上,通過滑動鎖蓋來打開和關(guān)閉鎖具。這是通過線纜將蓋板的中間(靠近外緣)連接到電機(jī)上的(圖17)。只要確保蓋板順利地打開和關(guān)閉,你可以用任何材料來制作這個裝置。

poYBAGPzFt6ALZwlAAJLVYlGnOY459.jpg

圖19:在合適的地方鉆一個用來連接電機(jī)的孔

到這里,你差不多就要完工了。接下來,你只需要把喂食器固定到你想要的地方。請確保這個地方足夠安全,你的寵物無法輕易地拆除喂食器即可。

poYBAGPzFuCAJnvBAAN5ReizDiI246.jpg

圖20:在支架附近接好電機(jī)

為了保證精度,請不要弄彎連接食物分配器蓋板和電機(jī)的線纜,否則電機(jī)的馬力會因此削弱。

pYYBAGPzFuWAEigQAAKU_ZRt7iw515.jpg

圖21:完工后的寵物自動喂食器

poYBAGPzFuaAZx0nAAIYmeq76kE778.jpg

圖22:最終成品

#include 
#include 
#include 
#include 
#include 
#include      
#include         
#include 

#define SS_PIN 10
#define RST_PIN 9

Servo myservo;

boolean match = false;        
boolean programMode = false;  
boolean replaceMaster = false;

int lightSensor = 0;
int distanceSensor=1;
int pos = 0; 
int successRead; 

byte storedCard[4];  
byte readCard[4];   
byte masterCard[4];

MFRC522 mfrc522(SS_PIN, RST_PIN); 

void setup() {
 Serial.begin(9600);
 setSyncProvider(RTC.get); 
 
 myservo.attach(9);
 
 Serial.begin(9600); 
 SPI.begin();          
 mfrc522.PCD_Init();   
 if (EEPROM.read(1) != 143) {
   do {
     successRead = getID();           
   }
   while (!successRead);                  

   for ( int j = 0; j < 4; j++ ) {       
     EEPROM.write( 2 + j, readCard[j] ); 
   }
   EEPROM.write(1, 143);                 
   
 }
for ( int i = 0; i < 4; i++ ) {         
   masterCard[i] = EEPROM.read(2 + i);   
   Serial.print(masterCard[i], HEX);
 }
 
}



void loop() {
 
 int valueFromLightSensor = analogRead(lightSensor);

 int valueFromDistanceSensor = analogRead(distanceSensor);
 int distance= 4800/(valueFromDistanceSensor - 20);
 Serial.println(distance);

do {
   successRead = getID();  
  
 }
 while (!successRead);  
 if (programMode) {
   if ( isMaster(readCard) ) { 
      programMode = false;
     return;
   }
   else {
     if ( findID(readCard) ) { 
       
     }
     
   }
 }
 else {
   if ( isMaster(readCard)) {    
     programMode = true;
          int count = EEPROM.read(0);   
    
    
   }
   else {
     if ( findID(readCard) ) { 
      
               if ((hour()>=8) && (hour()<=12 )){
                 if (distance>=20){
                     for(pos = 130; pos>=1; pos-=1)     
                       {
                        myservo.write(pos);              
                        delay (20);
                       }
                     for(pos = 50; pos < 180; pos += 1)  
                       {                                  
                         myservo.write(pos);              
                         delay(20);                       
                     } 
                     
                 }
               delay(10000);  
               }
               
               
      if ((hour()>=12) && (hour()<=16 )){
                 if (distance>=20){
                     
                     for(pos = 130; pos>=1; pos-=1)    
                       {
                        myservo.write(pos);             
                        delay (20);
                       }
                     for(pos = 50; pos < 180; pos += 1) 
                       {                                 
                         myservo.write(pos);             
                         delay(20);                      
                     }
                   
                     
                 }
               delay(10000);  
         }
         

if ((hour()>=0) && (hour()<=8 )){
                 if (distance>=20){
                     
                     for(pos = 130; pos>=1; pos-=1)    
                       {
                        myservo.write(pos);             
                        delay (20);
                       }
                     for(pos = 50; pos < 180; pos += 1) 
                       {                                 
                         myservo.write(pos);             
                         delay(20);                      
                     }
                   
                     
                 }
               delay(20000);  
         }
         

         
        if ((hour()>=16) && (hour()<=20 )){
                 if (distance>=20){
                     Serial.println(distance);
                     for(pos = 130; pos>=1; pos-=1)    
                       {
                        myservo.write(pos);             
                        delay (20);
                       }
                     for(pos = 50; pos < 180; pos += 1) 
                       {                                                           

myservo.write(pos);                                       

delay(20);                                          

  } 
                     
                 }
               delay(10000);  
         }
               
               
               
               
     }
         }
 }

}


int getID() {

 if ( ! mfrc522.PICC_IsNewCardPresent()) {
   return 0;
 }
 if ( ! mfrc522.PICC_ReadCardSerial()) {  
   return 0;
 }
 Serial.println(F("Scanned PICC's UID:"));
 for (int i = 0; i < 4; i++) {  //
   readCard[i] = mfrc522.uid.uidByte[i];
   Serial.print(readCard[i], HEX);
 }
 Serial.println("");
 mfrc522.PICC_HaltA();
 return 1;
}

void readID( int number ) {
 int start = (number * 4 ) + 2;   
 for ( int i = 0; i < 4; i++ ) {    
   storedCard[i] = EEPROM.read(start + i);  
 }
}

boolean checkTwo ( byte a[], byte b[] ) {
 if ( a[0] != NULL )      
   match = true;      
 for ( int k = 0; k < 4; k++ ) {  
   if ( a[k] != b[k] )    
     match = false;
 }
 if ( match ) {     
   return true;     
 }
 else  {
   return false;      
 }
}

int findIDSLOT( byte find[] ) {
 int count = EEPROM.read(0);      
 for ( int i = 1; i <= count; i++ ) {   
   readID(i);               
   if ( checkTwo( find, storedCard ) ) {  
     return i;        
     break;         
   }
 }
}


boolean findID( byte find[] ) {
 int count = EEPROM.read(0);     

 for ( int i = 1; i <= count; i++ ) {  
   readID(i);            

 if ( checkTwo( find, storedCard ) ) {  

     return true;
     break; 
   }
   else {   
   }
 }
 return false;
}

boolean isMaster( byte test[] ) {
 if ( checkTwo( test, masterCard ) )
   return true;
 else
   return false;
}

這就是本項目的第一部分。這個設(shè)備凝聚了我對電子設(shè)備以及軟件編程的熱情,也讓我免于在一天之內(nèi)喂好幾次寵物。它完美地在一個簡易項目和一個實(shí)用的家庭發(fā)明之間作出了平衡。在接下來的部分,我們將探究更先進(jìn)的用戶界面,那時你就可以遠(yuǎn)程控制喂食器了。

pYYBAGPzDmSAfn_UAAAF-_P5AGo881.jpg

Tiberia Todeila

Tiberia目前是布加勒斯特理工大學(xué)電氣工程學(xué)院的大四學(xué)生。她非常熱衷于智能家居設(shè)備的設(shè)計和開發(fā),旨在讓我們的日常生活更加輕松。

審核編輯黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RFID
    +關(guān)注

    關(guān)注

    386

    文章

    6006

    瀏覽量

    236617
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6453

    瀏覽量

    185927
  • 喂食器
    +關(guān)注

    關(guān)注

    1

    文章

    23

    瀏覽量

    2939
收藏 人收藏

    評論

    相關(guān)推薦

    構(gòu)建基于Arduino自動寵物喂食器

    今天,我們正在構(gòu)建基于Arduino自動寵物喂食器,它可以及時
    的頭像 發(fā)表于 11-17 17:28 ?2627次閱讀
    構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個</b>基于<b class='flag-5'>Arduino</b>的<b class='flag-5'>自動</b><b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    怎么實(shí)現(xiàn)寵物自動喂食器的設(shè)計?

    怎么實(shí)現(xiàn)寵物自動喂食器的設(shè)計?
    發(fā)表于 06-15 07:01

    怎樣去設(shè)計基于stm32的智能寵物喂食器

    著怎么給它固定時間喂食還能遠(yuǎn)程遙控,和實(shí)習(xí)公司老板聊了下,他支持我在業(yè)余時間預(yù)研智能寵物喂食器
    發(fā)表于 08-11 08:35

    如何設(shè)計寵物喂食器?

    如何設(shè)計寵物喂食器
    發(fā)表于 02-09 07:49

    自制寵物喂食器

    :(劃掉虛假的)你參加了聚會/你工作了/你的孩子不讓你睡覺。這只是遠(yuǎn)程饋線派上用場的例子。與您家中的智能系統(tǒng)集成的
    發(fā)表于 07-22 07:43

    自動喂食器的設(shè)計原理圖

    自己設(shè)計的自動喂食器的設(shè)計,家庭寵物的需要。
    發(fā)表于 12-30 15:55 ?35次下載

    基于涂鴉智能寵物喂食器

    基于涂鴉智能寵物喂食器
    發(fā)表于 12-04 18:36 ?27次下載
    基于涂鴉<b class='flag-5'>智能</b>的<b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    制作易于使用的自動寵物喂食器

    這是易于使用的自動寵物喂食器,帶有些 3D 打印部件、可調(diào)節(jié)的
    的頭像 發(fā)表于 06-28 17:18 ?5137次閱讀
    <b class='flag-5'>制作</b><b class='flag-5'>一</b><b class='flag-5'>個</b>易于使用的<b class='flag-5'>自動</b><b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    基于物聯(lián)網(wǎng)的寵物喂食器

    我們正在構(gòu)建簡單、高效且經(jīng)濟(jì)的基于物聯(lián)網(wǎng)的寵物喂食器。使用這款自動寵物
    的頭像 發(fā)表于 07-25 17:29 ?3161次閱讀
    基于物聯(lián)網(wǎng)的<b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    設(shè)計寵物NFC定時喂食器

    我設(shè)計并制造了這款自動喂食器,以幫助我的糖尿病貓控制他的喂食并防止我的另只貓吃他的食物。該喂食器可能對需要監(jiān)控
    的頭像 發(fā)表于 08-06 16:15 ?2386次閱讀
    設(shè)計<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>寵物</b>NFC定時<b class='flag-5'>喂食器</b>

    Arduino遙控寵物喂食器

    電子發(fā)燒友網(wǎng)站提供《Arduino遙控寵物喂食器.zip》資料免費(fèi)下載
    發(fā)表于 10-24 10:28 ?4次下載
    <b class='flag-5'>Arduino</b>遙控<b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    智能自動魚/寵物喂食器開源分享

    電子發(fā)燒友網(wǎng)站提供《智能自動魚/寵物喂食器開源分享.zip》資料免費(fèi)下載
    發(fā)表于 10-24 09:23 ?9次下載
    <b class='flag-5'>智能</b><b class='flag-5'>自動</b>魚/<b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>開源分享

    自動寵物喂食器開源硬件

    電子發(fā)燒友網(wǎng)站提供《自動寵物喂食器開源硬件.zip》資料免費(fèi)下載
    發(fā)表于 12-23 17:06 ?3次下載
    <b class='flag-5'>自動</b><b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>開源硬件

    Arduino Uno制作智能自動寵物喂食器

    你曾懶得喂你家寵物嗎?我們愛我們的寵物,但有時我們也希望能讓喂寵物這件事變得自動點(diǎn)。今天我們將使用A
    的頭像 發(fā)表于 02-24 15:12 ?4007次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>Arduino</b> <b class='flag-5'>Uno</b><b class='flag-5'>制作</b><b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>智能</b>的<b class='flag-5'>自動</b><b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>

    基于WTR096-28SS芯片方案的寵物喂食器實(shí)現(xiàn)智能喂食功能

    、簡介 本方案寵物喂食器采用了WTR096-28SS芯片方案來實(shí)現(xiàn)智能化的喂食功能。該方案結(jié)合了先進(jìn)的技術(shù)和設(shè)計理念,提供了便捷、
    的頭像 發(fā)表于 03-19 13:57 ?394次閱讀
    基于WTR096-28SS芯片方案的<b class='flag-5'>寵物</b><b class='flag-5'>喂食器</b>實(shí)現(xiàn)<b class='flag-5'>智能</b>化<b class='flag-5'>喂食</b>功能