0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Arduino Uno制作一个智能的自动宠物喂食器(续)

北上北京 来源:DevicePlus 作者:DevicePlus 2023-02-24 14:40 次阅读

这篇文章来源于DevicePlus.com英语网站的翻译稿。

第 1 部分 续 >

第4步:添加 RFID

RFID是该系统的核心。当你的宠物靠近喂食器时,RFID将读取标签上的值,并决定是否提供更多的食物。RFID系统采用SPI通信,将标签的值存储在EEPROM存储器中。在这种情况下,如果发生系统故障(例如断电等引发的问题),信息将被保存到存储器中。

有关Arduino SPI通信的更多信息,请参阅 Arduino 通信协议教程

就RFID而言,必须添加以下库:

SPI

MFRC522

EEPROM

poYBAGPzFtKAX7zyAAMsDigOifo508.jpg

图13:添加了RDIF的接线图

pYYBAGPzFtSAJ55uAASGpcTWC-Q771.jpg

图14:RFID与其他组件连接的示意图

我们有两个RFID标签。红的会装在宠物身上。作为测试组,蓝的会装在外人身上(不是你宠物的其他东西)。该系统有两个功能:

白天:上午8时至晚上8时,喂食器每4小时投放3次食物。当食物被投放出来以后,蜂鸣器会发出声音作为信号,它会叫你的宠物过来进食。当有声音时,宠物就会知道该吃饭了,它会靠近自己的碗(食物容器)。当标签靠近RFID阅读器时,食物就会被投放出来

晚上:不会发出声音,但如果宠物在早上0点以后接近RFID,则将被喂食一次。

pYYBAGPzFtaAUHcOAABoU3OOHW0007.jpg

图15:在串口监视器上所显示的分配标签

第5步:安装电机

我们将使用伺服电机SG90。伺服角度的大小是(0-180度)。我们的锁具系统将类似于一个角度控制的锁具(当“锁具”打开/解锁时,可控制投喂多少食物)。

以下是一些要点:

0 度:“锁具”完全关闭,没有食物投放;

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

在 0-180: 之间:你可以选择投放多少食物。

pYYBAGPzFteANWVBAAODEFCK6p8610.jpg

图16:完整的项目接线图

第6步:制作机械部分

在我们讨论电机的编程之前,我们需要制作喂食器的支架。现在就需要研究一下喂食器的机械部分。我们需要以下材料:

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

瓶子(或塑料容器)

打开/关闭食物分配器所需要用到的2块硬质材料

把瓶子固定在金属板上
用钻在金属板上钻4个洞,为碗留出空间(这个距离取决于你的碗/食物容器有多高。之后,你需要把瓶子倒过来,用两根线固定到金属板上。

pYYBAGPzFtqABgu-AARgLOw7J6M868.jpg

图17:用两根线把瓶子(食物分配器)连到金属板上

“锁具”系统不能悬在半空中,所以我们要用一块坚硬的材料来固定它。这为食物分配器提供了一个很好的开口。我们需要用钻头或胶带将其固定在金属板上,这样它就不会塌下来,以防你把太多食物放在分配器里。如下图所示,为了防止锁具的错位,需要弯曲金属部分的外缘。

pYYBAGPzFtyAOtDmAAMpGZ0lM5o337.jpg

图18:支架安放位置

放置伺服电机
我们需要把电机接到金属板上。我在金属板上钻了个洞,以便牢牢地固定伺服电机。接下来,我们需要将伺服电机连接到机械系统上,通过滑动锁盖来打开和关闭锁具。这是通过线缆将盖板的中间(靠近外缘)连接到电机上的(图17)。只要确保盖板顺利地打开和关闭,你可以用任何材料来制作这个装置。

poYBAGPzFt6ALZwlAAJLVYlGnOY459.jpg

图19:在合适的地方钻一个用来连接电机的孔

到这里,你差不多就要完工了。接下来,你只需要把喂食器固定到你想要的地方。请确保这个地方足够安全,你的宠物无法轻易地拆除喂食器即可。

poYBAGPzFuCAJnvBAAN5ReizDiI246.jpg

图20:在支架附近接好电机

为了保证精度,请不要弄弯连接食物分配器盖板和电机的线缆,否则电机的马力会因此削弱。

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;
}

这就是本项目的第一部分。这个设备凝聚了我对电子设备以及软件编程的热情,也让我免于在一天之内喂好几次宠物。它完美地在一个简易项目和一个实用的家庭发明之间作出了平衡。在接下来的部分,我们将探究更先进的用户界面,那时你就可以远程控制喂食器了。

pYYBAGPzDmSAfn_UAAAF-_P5AGo881.jpg

Tiberia Todeila

Tiberia目前是布加勒斯特理工大学电气工程学院的大四学生。她非常热衷于智能家居设备的设计和开发,旨在让我们的日常生活更加轻松。

审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RFID
    +关注

    关注

    387

    文章

    6107

    浏览量

    237392
  • Arduino
    +关注

    关注

    187

    文章

    6464

    浏览量

    186651
  • 喂食器
    +关注

    关注

    1

    文章

    23

    浏览量

    3054
收藏 人收藏

    评论

    相关推荐

    构建基于Arduino自动宠物喂食器

    今天,我们正在构建基于Arduino自动宠物喂食器,它可以及时
    的头像 发表于 11-17 17:28 2903次阅读
    构建<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>

    怎么实现宠物自动喂食器的设计?

    怎么实现宠物自动喂食器的设计?
    发表于 06-15 07:01

    怎样去设计基于stm32的智能宠物喂食器

    着怎么给它固定时间喂食还能远程遥控,和实习公司老板聊了下,他支持我在业余时间预研智能宠物喂食器
    发表于 08-11 08:35

    如何设计宠物喂食器

    如何设计宠物喂食器
    发表于 02-09 07:49

    自制宠物喂食器

    :(划掉虚假的)你参加了聚会/你工作了/你的孩子不让你睡觉。这只是远程馈线派上用场的例子。与您家中的智能系统集成的
    发表于 07-22 07:43

    自动喂食器的设计原理图

    自己设计的自动喂食器的设计,家庭宠物的需要。
    发表于 12-30 15:55 35次下载

    基于涂鸦智能宠物喂食器

    基于涂鸦智能宠物喂食器
    发表于 12-04 18:36 27次下载
    基于涂鸦<b class='flag-5'>智能</b>的<b class='flag-5'>宠物</b><b class='flag-5'>喂食器</b>

    制作易于使用的自动宠物喂食器

    这是易于使用的自动宠物喂食器,带有些 3D 打印部件、可调节的
    的头像 发表于 06-28 17:18 5365次阅读
    <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>

    基于物联网的宠物喂食器

    我们正在构建简单、高效且经济的基于物联网的宠物喂食器。使用这款自动宠物
    的头像 发表于 07-25 17:29 3314次阅读
    基于物联网的<b class='flag-5'>宠物</b><b class='flag-5'>喂食器</b>

    设计宠物NFC定时喂食器

    我设计并制造了这款自动喂食器,以帮助我的糖尿病猫控制他的喂食并防止我的另只猫吃他的食物。该喂食器可能对需要监控
    的头像 发表于 08-06 16:15 2498次阅读
    设计<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>宠物</b>NFC定时<b class='flag-5'>喂食器</b>

    Arduino遥控宠物喂食器

    电子发烧友网站提供《Arduino遥控宠物喂食器.zip》资料免费下载
    发表于 10-24 10:28 4次下载
    <b class='flag-5'>Arduino</b>遥控<b class='flag-5'>宠物</b><b class='flag-5'>喂食器</b>

    智能自动鱼/宠物喂食器开源分享

    电子发烧友网站提供《智能自动鱼/宠物喂食器开源分享.zip》资料免费下载
    发表于 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>开源分享

    Arduino Uno制作智能自动宠物喂食器

    你曾懒得喂你家宠物吗?我们爱我们的宠物,但有时我们也希望能让喂宠物这件事变得自动点。今天我们将使用A
    的头像 发表于 02-24 15:12 4331次阅读
    <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芯片方案的宠物喂食器实现智能喂食功能

    、简介 本方案宠物喂食器采用了WTR096-28SS芯片方案来实现智能化的喂食功能。该方案结合了先进的技术和设计理念,提供了便捷、
    的头像 发表于 03-19 13:57 502次阅读
    基于WTR096-28SS芯片方案的<b class='flag-5'>宠物</b><b class='flag-5'>喂食器</b>实现<b class='flag-5'>智能</b>化<b class='flag-5'>喂食</b>功能

    宠物自动喂食器主控芯片DSH3186

    宠物在现代人的生活中占有极大的比重,甚至愿意将宠物当做孩子精细地养活。也正因为如此,由宠物而衍生出来的产业链涉及方方面面,不但解决了宠物主人的烦恼,也给
    的头像 发表于 11-01 16:26 198次阅读