這篇文章來源于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為單位)除以面積(m2)的量度。一般來說,1照度(Ix) = 1 / m2。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目前是布加勒斯特理工大學電氣工程學院的大四學生。她非常熱衷于智能家居設備的設計和開發,旨在讓我們的日常生活更加輕松。
審核編輯黃宇
-
傳感器
+關注
關注
2550文章
51046瀏覽量
753142 -
測量
+關注
關注
10文章
4854瀏覽量
111250 -
Arduino
+關注
關注
188文章
6469瀏覽量
186969
發布評論請先 登錄
相關推薦
評論