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

电子说

1.3w人已加入

描述

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

Arduino

你曾懒得喂你家宠物吗?我们爱我们的宠物,但有时我们也希望能让喂宠物这件事变得自动化一点。今天我们将使用Arduino Uno做一个智能自动宠物喂食器!该项目的主要组件包括一个用来追踪时间、管理喂养计划的RTC模块,一个用来监控食物水平的距离传感器,一个用来区分白天黑夜的光敏传感器,一个用来识别宠物的RFID。好了!让我们开始吧!

硬件

Arduino Uno

TEMT6000 光敏传感器

GP2Y0A21YK 夏普距离传感器

RFID MFRC522

蜂鸣器

SG90 电机

RTC DS1307

软件

Arduino IDE

https://github.com/todeilatiberia/AutomaticFeeder

工具

瓶子(或任何食物容器)

金属板 35×25 厘米

第1步:连接光敏传感器

我们使用SparkFun光敏传感器TEMT6000来检测白天和黑夜。之所以需要区分这两者,主要原因是因为我们要确定何时需要投放食物,两次食物投放之间需要间隔多久。TEMT6000光敏传感器有3个引脚:SIG,GND,VCC。将这个传感器接到Arduino板上的步骤非常简单:VCC连接到5V引脚;GND到板上的GND引脚,然后SIG需要接到模拟输入上。我选择了A0引脚。输出引脚SIG的作用就好像一个晶体管,因此在传感器附近的光越亮,引脚输出的电压就越高。

下图显示了TEMT6000感知到的电流和照度之间的关系。照度是总光通量(即光源发出的可见光,以lm为单位)除以面积(m²)的量度。一般来说,1照度(Ix) = 1 / m²。TEMT6000可以识别典型的人类可见光光谱,波长在390-700纳米之间。

TEMT6000技术规格书: https://www.sparkfun.com/datasheets/Sensors/Imaging/TEMT6000.pdf

Arduino

图1:集电极电流vs照度/©Sparkfun

Arduino

图2:TEMT6000光敏传感器与Arduino Uno的接线图

Arduino

图3:TEMT6000和Arduino Uno之间的接线图

由于该传感器连接在模拟引脚上,而模数转换器的分辨率是10位的,所以其最大值为1023。例如,当传感器接收到来自我手机闪光灯的最亮照射时,从传感器读出的值大约是1023。

Arduino

图4:Arduino显示传感器最大值的串口监视器

光敏传感器的代码:

 

int lightSensor = 0;

void setup() {

 Serial.begin(9600);

}



void loop() {

 int valueFromLightSensor = analogRead(lightSensor);

 Serial.println(valueFromLightSensor);



 delay(1000);

}

 

第2步:添加距离传感器

为了测量距离,我选择了一个模拟传感器(Sharp GP2Y0A21YK),因为与其他距离传感器相比,它的效果最好。其工作原理如下:首先发出一个信号,当它发现路上有障碍物时,它也会发回一个信号(一个电压值,该电压值随障碍物的远近而变化),这个电压会转换成距离。

GP2Y0A21YK将被安置在食物容器上方,在开启自动喂食功能前,需要先测量瓶子里的剩余空间(即食物的多少)。有了这个距离传感器,系统将检测食物容器(或瓶子)是满的还是空的。具体工作方式如下:

距离较小: 自动系统只会增加一小部分食物;

中等距离: 您的宠物将获得一半食物;

距离较大: 自动系统将投喂全部食物。

这里的距离表示从安装距离传感器的位置到食品容器底部的距离。由于传感器的量程为10-80 cm,所以传感器需要在食品容器顶部以上10cm处才能读取正确的距离值。

如何确定传感器的最佳拟合线:

摘自 Pololu.com

传感器的输出电压与测量距离的倒数之间的关系在传感器的可用范围内近似线性。您可以使用此图将传感器输出电压转换为一个近似的距离,方法是创建一条最佳拟合线,将输出电压(V)的倒数与距离(cm)联系起来。线性化方程的最简形式可以表述为到反射物体的距离约等于一个常数尺度因子(~ 27v *cm)除以传感器的输出电压之后的数值。因此增加一个恒定的距离偏移量并修改缩放因子可以改善这条线的拟合。

Arduino

图5:距离传感器的特性 / ©Pololu.com

摘自 Phidgets.com

基于夏普的“典型值”,将传感器值转换为距离的公式(公式仅适用于传感器值在80 – 500之间)为:

距离 (cm) = 4800/(传感器值 – 20)

这种传感器可以找到离物体的距离,这些物体呈现出非常窄的边缘,比如角度非常尖锐的墙壁。

注: 该传感器的输出因单元而异,并取决于目标的特性(反射率、尺寸、运动方向、目标对准)。

Arduino

图6:夏普GP2Y0A21YK与Uno之间的接线图

Arduino

图7:夏普距离传感器、TEMT6000、Uno之间的接线图

代码:

 

int lightSensor = 0;

int distanceSensor=1;



void setup() {

 Serial.begin(9600);

}



void loop() {

 int valueFromLightSensor = analogRead(lightSensor);

 Serial.print("Light Value= ");

 Serial.print(valueFromLightSensor);

 Serial.println("");

 Serial.print("Distance Value= ");

 int valueFromDistanceSensor = analogRead(distanceSensor);

 int distance= 4800/(valueFromDistanceSensor - 20);

 Serial.print(distance);



 delay(1000);

}

 

第3步: 确定时间

RTC DS1307模型将被用来确定时间。一个实时的时钟系统承担了确定时间的功能。该电路基于一个频率为32.768 kHz的晶体振荡器展开工作。其原理与手表类似。一个基于晶体振动的机械共振的电子振荡器能产生精确的频率。此频率用来追踪源自计算机的日期和时间。

这是一个实用模块,即使在系统关闭时,上面所配备的电池也能保证系统工作的连续性。

Arduino

图8:RTC模块接线图

Arduino

图9:RTC、夏普距离传感器、TEMT6000、Uno之间的接线图

为了获得最佳的使用效果,需要为模块添加两个库。

这两个库可以在我的网址 https://github.com/todeilatiberia/AutomaticFeeder上找到:

DS1307RTC

时间

连接线(这个库已经包含在Arduino IDE中,因此添加起来很容易)

我们将运行一个测试代码来检测模块。当我们将程序上传到Arduino board时,串口监视器会显示当前的日期和时间。这两个库有一个用于查找日期和时间的示例代码,称为 “SetTime”。

找出设置时间:

点击 Arduino IDE → 文件 → 示例 → DS1307RTC → 设置时间

Arduino

图10:在Arduino IDE上查找设置时间

在图11中,您将看到模块在显示当前日期和时间时正常工作。

Arduino

图11: 正确显示当前的日期和时间

在这里,我们将只测量小时的运行情况。为此,我们需要从RTC模块中提取确切的时间。这将通过名为“setSyncProvider(RTC.get)”的RTC简单函数来完成。在实现此功能后,您将能够同时看到串口监视器上的小时数以及距离传感器和光敏传感器上的数值。

代码:

 

#include 

#include 

#include 



int lightSensor = 0;

int distanceSensor=1;



void setup() {

 Serial.begin(9600);

 setSyncProvider(RTC.get);

}





void loop() {

 int valueFromLightSensor = analogRead(lightSensor);

 Serial.print("Light Value= ");

 Serial.print(valueFromLightSensor);

 Serial.println("");

 Serial.print("Distance Value= ");

 int valueFromDistanceSensor = analogRead(distanceSensor);

 int distance= 4800/(valueFromDistanceSensor - 20);

 Serial.println(distance);

 

 Serial.print("Hour= ");

 Serial.println(hour());

 delay(1000);

 

}

 

Arduino

图12:所显示的小时

继续阅读 >

Arduino

Tiberia Todeila

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

审核编辑 黄宇

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分