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

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

automatic pet feeder

 

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

硬件

  • Arduino Uno
  • TEMT6000 光敏传感器
  • GP2Y0A21YK 夏普距离传感器
  • RFID MFRC522
  • 蜂鸣器
  • SG90 电机
  • RTC DS1307

 

软件

 

工具

  • 瓶子(或任何食物容器)
  • 金属板 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

automatic pet feeder

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

 

 

automatic pet feeder

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

 

automatic pet feeder

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

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

automatic pet feeder

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

  1. 距离较小: 自动系统只会增加一小部分食物;
  2. 中等距离: 您的宠物将获得一半食物;
  3. 距离较大: 自动系统将投喂全部食物。

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

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

摘自 Pololu.com

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

 

 

automatic pet feeder

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

 

摘自 Phidgets.com

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

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

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

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

 

 

automatic pet feeder

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

 

automatic pet feeder

图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的晶体振荡器展开工作。其原理与手表类似。一个基于晶体振动的机械共振的电子振荡器能产生精确的频率。此频率用来追踪源自计算机的日期和时间。

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

 

automatic pet feeder

图8:RTC模块接线图

 

 

automatic pet feeder

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

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

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

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

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

找出设置时间:

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

automatic pet feeder

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

 

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

automatic pet feeder

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

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

 

代码:

#include <Time.h>

#include <Wire.h>

#include <DS1307RTC.h>



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

 

}

 

 

Figure 12: Hour displayed

图12:所显示的小时

 

继续阅读 >

DevicePlus 编辑团队
Tiberia Todeila

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

Related post

  1. create an Arduino program

    Arduino基础:Arduino的前期准备

  2. PIR1

    如何构建动态感应灯

  3. 创建您的第一个草图以及了解有关编程语言的更多信息

  4. diy camera gimbal

    利用Arduino实现DIY伺服相机云台

  5. 用ROHM传感器套件制作Arduino LED圣诞树

  6. arduino robot

    Arduino RF 探索者机器人 —第2部分—组装所有组件

  7. 如何用调光器控制灯光

  8. arduino library

    适用于罗姆传感器评估套件的轻量级 Arduino库

  9. 制作Arduino LED节日彩灯

TECH INFO

  • 重点必看
  • 技术分享
  • Arduino入门指南

基础知识

  • SiC功率元器件
  • Si功率元器件
  • 热设计
  • 仿真
  • 开关噪声-EMC
  • AC/DC
  • DC/DC
  • 电机
  • 传递函数

工程技巧


PICK UP!

  1. 模块配置
  2. ROHM开发出业界先进的第4代低导通电阻SiC MOSFET:支持xEV/EV主机逆变器和电池提高电压
  3. “第三代 行驶中无线供电轮毂电机”开发成功:超小型SiC模块 助力实现无需担心充电的EV
  4. 以纳米级输出电容实现稳定控制的Nano Cap™技术:无需输出电容器的线性稳压器
  5. arduino explorer rover
  6. 作为车载用二次电源而开发的同步整流降压型DC/DC转换器 : 车载设备中二次电源的优点
  7. 刘铭
PAGE TOP