这篇文章来源于DevicePlus.com英语网站的翻译稿。
你曾懒得喂你家宠物吗?我们爱我们的宠物,但有时我们也希望能让喂宠物这件事变得自动化一点。今天我们将使用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
图1:集电极电流vs照度/©Sparkfun
图2:TEMT6000光敏传感器与Arduino Uno的接线图
图3:TEMT6000和Arduino Uno之间的接线图
由于该传感器连接在模拟引脚上,而模数转换器的分辨率是10位的,所以其最大值为1023。例如,当传感器接收到来自我手机闪光灯的最亮照射时,从传感器读出的值大约是1023。
图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)除以传感器的输出电压之后的数值。因此增加一个恒定的距离偏移量并修改缩放因子可以改善这条线的拟合。
图5:距离传感器的特性 / ©Pololu.com
摘自 Phidgets.com
基于夏普的“典型值”,将传感器值转换为距离的公式(公式仅适用于传感器值在80 – 500之间)为:
距离 (cm) = 4800/(传感器值 – 20)
这种传感器可以找到离物体的距离,这些物体呈现出非常窄的边缘,比如角度非常尖锐的墙壁。
注: 该传感器的输出因单元而异,并取决于目标的特性(反射率、尺寸、运动方向、目标对准)。
图6:夏普GP2Y0A21YK与Uno之间的接线图
图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的晶体振荡器展开工作。其原理与手表类似。一个基于晶体振动的机械共振的电子振荡器能产生精确的频率。此频率用来追踪源自计算机的日期和时间。
这是一个实用模块,即使在系统关闭时,上面所配备的电池也能保证系统工作的连续性。
图8:RTC模块接线图
图9:RTC、夏普距离传感器、TEMT6000、Uno之间的接线图
为了获得最佳的使用效果,需要为模块添加两个库。
这两个库可以在我的网址 https://github.com/todeilatiberia/AutomaticFeeder上找到:
DS1307RTC
时间
连接线(这个库已经包含在Arduino IDE中,因此添加起来很容易)
我们将运行一个测试代码来检测模块。当我们将程序上传到Arduino board时,串口监视器会显示当前的日期和时间。这两个库有一个用于查找日期和时间的示例代码,称为 “SetTime”。
找出设置时间:
点击 Arduino IDE → 文件 → 示例 → DS1307RTC → 设置时间
图10:在Arduino IDE上查找设置时间
在图11中,您将看到模块在显示当前日期和时间时正常工作。
图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); }
图12:所显示的小时
继续阅读 >
Tiberia Todeila
Tiberia目前是布加勒斯特理工大学电气工程学院的大四学生。她非常热衷于智能家居设备的设计和开发,旨在让我们的日常生活更加轻松。
审核编辑黄宇
-
传感器
+关注
关注
2545文章
50384浏览量
750657 -
测量
+关注
关注
10文章
4720浏览量
111020 -
Arduino
+关注
关注
187文章
6455浏览量
186444
发布评论请先 登录
相关推荐
评论