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

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

来源:萌宠菠菠乐园 时间:2024-09-27 21:39

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

第 1 部分 续 >

第4步:添加 RFID

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

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

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

SPI MFRC522 EEPROM

automatic pet feeder

图13:添加了RDIF的接线图

automatic pet feeder

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

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

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

automatic pet feeder

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

第5步:安装电机

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

以下是一些要点:

0 度:“锁具”完全关闭,没有食物投放; 180 度:“锁具”完全打开,食物全部投放; 在 0-180: 之间:你可以选择投放多少食物。

automatic pet feeder

图16:完整的项目接线图

第6步:制作机械部分

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

金属板(或木板)- 35×25 厘米 瓶子(或塑料容器) 打开/关闭食物分配器所需要用到的2块硬质材料 把瓶子固定在金属板上
用钻在金属板上钻4个洞,为碗留出空间(这个距离取决于你的碗/食物容器有多高。之后,你需要把瓶子倒过来,用两根线固定到金属板上。

automatic pet feeder

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

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

automatic pet feeder

图18:支架安放位置

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

automatic pet feeder

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

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

automatic pet feeder

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

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

automatic pet feeder

图21:完工后的宠物自动喂食器

automatic pet feeder

图22:最终成品

#include <Wire.h> #include <Time.h> #include <TimeLib.h> #include <DS1307RTC.h> #include <Servo.h> #include <EEPROM.h> #include <SPI.h> #include <MFRC522.h> #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; }

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

相关知识

用Arduino Uno制作一个智能的自动宠物喂食器(续)
如何用ARDUINO制作一个鸟蛋孵化器
宠物自动喂食器设计与制作
基于arduino和机智云平台的智能宠物屋设计
鸟喂食器推荐:鸟用自动喂食器哪个牌子好?
宠物自动喂食器设计方案
宠物自动喂食器哪个品牌值得买?推荐8款性价比高的智能投食器!
智能宠物喂食机第2部分—具有语音识别功能的喂食应用程序
宠物智能用品“消费热”席卷全球,自动和智能宠物喂食器趋势洞察
智能宠物喂食器设计方案

网址: 用Arduino Uno制作一个智能的自动宠物喂食器(续) https://www.mcbbbk.com/newsview269118.html

所属分类:萌宠日常
上一篇: 【DNF】30属强换25属强=?
下一篇: Android之android

推荐分享