【物联网毕设】基于arduino与树莓派的智能鱼缸【一】
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 零、智能魚缸框架與項目整體思路
- 一、Arduino與傳感器部分
- 1.溫度傳感器部分
- 2.水位傳感器部分
- 3.溶解氧傳感器部分
- 4.全部代碼
- 總結
前言
第一次寫文章,不知道該說什么好。對于我這種大學四年潛心劃水,現在只會寫簡單的C的小白來說。要完完整整的做一個物聯網小項目簡直是太難了。找遍了全網,也沒有找到一家和我項目類似的。在一天天磨進度,查資料的日子里,我真心希望遇到這么一篇文章。能直接帶我一步步做完整個畢設哈哈哈哈。所以我決定把我的畢設全部都記錄下來,細到每一小步。很多代碼都是copy來的,我也不懂為什么,但是它就是能用。所以如果你想學專業的知識和原理,這一系列文章幫不了你什么。但如果你的畢設和我很像或者一樣,我的這一系列能省出你很多查資料的時間。零、智能魚缸框架與項目整體思路
先來看看我畢設的整體框架吧:
整體思路就是:
用Arduino開發板(我用的是太極創客的arduino UNO克隆板,因為意大利的板有點貴QAQ)讀取溫度傳感器、水位傳感器、溶解氧傳感器的值,然后分別控制四個繼電器工作。當溫度低于25℃,繼電器1控制加熱棒開啟,當溫度高于25℃,加熱棒關閉;把水位傳感器放在魚缸合適的高度,當水位低于水位傳感器上的1cm刻度時(水位傳感器上有刻度,后面講到這部分會放圖),繼電器2控制注水水泵開啟,往魚缸里注水,當水位處在傳感器1cm~3cm時,繼電器2和3都處于關閉狀態,當水位在3cm以上時,繼電器3控制抽水水泵開啟,給魚缸抽水;溶解氧傳感器部分有點問題,就是它太貴了!某寶小小一個要3k+,咱也不知道為什么這么貴,經過和導師商量,最后實物用電位器來模擬溶解氧傳感器輸出的值,根據資料,一般魚類在溶解氧5mg/L以上的水中能正常生存,那就設定當溶解氧濃度低于5時,繼電器4控制充氧泵開啟。Arduino部分結束。
最難的就是樹莓派部分了,我的樹莓派是3B。大致思路就是Arduino把傳感器數據發送給樹莓派,(這里涉及到Arduino和樹莓派之間通訊的問題,我用的是USB通訊,后面細講。)然后樹莓派接收到數據后,通過web服務器將數據寫入MySQL數據庫(這里涉及到四個問題:樹莓派上安裝Django并用Django搭建web服務器;在樹莓派上安裝MySQL數據庫;web服務器與MySQL數據庫進行連接;樹莓派通過服務器接口post給服務器值,服務器通過另一個接口get到樹莓派的最新值)。最后小程序也是通過get請求,通過服務器讀取到數據庫的值,顯示在小程序的界面上。(這里涉及到微信小程序的開發,后面細講)目前的整體思路就是這樣。
后續如果有時間的話,會給小程序增加按鈕,實現手動開關增氧泵、加熱棒、水泵;會給樹莓派加一個攝像頭,抓取魚缸圖片或視頻放到小程序界面上。
那接下來就一部分一部分的細說吧!
一、Arduino與傳感器部分
1.溫度傳感器部分
首先去官網下載Arduino IDE后續敲代碼要用
溫度傳感器我用了DS18B20防水的那款,提醒一下如果在某寶上買,最好連它配套的模塊也一起買了,否則的話后續接線要接一個上拉電阻。模塊的引腳就三個VCC、GND和DAT,挺方便。
如果你想了解更多,推薦鏈接:點我
接線圖:
我用的Arduino UNO的開發板是克隆板,和意大利原板外貌不太一樣,但功能是一樣的。注意意大利板只有一個5V的接口,我的克隆板有兩個5V接口。
實物圖:
實物圖拍照還是挺亂的,主要還是看上面的接線圖連吧。
這里的實物圖沒接加熱棒,經過實踐之后,發現存在Arduino和樹莓派供電不足,帶不動加熱棒、充氧泵和兩個水泵的問題。于是給arduino又加了一個電源供電。接線圖都有體現。
總體來說就是:
樹莓派單獨給一個電源供電。
Arduino UNO和樹莓派用USB連接,但是僅僅由樹莓派給Arduino供電是遠遠不夠的,Arduino要再接一個獨立電源給它供電。
溫度傳感器、溶解氧傳感器(用電位器代替)、水位傳感器、四個繼電器由Arduino的5V引腳供電。
兩個水泵、充氧泵和加熱棒由Arduino的另外一個5V引腳供電。
這些接線圖里都有體現,照著接線圖連就沒什么問題。
Arduino IDE上代碼如下:
結果:
第一個小任務就完成啦!
但是我們只是接了繼電器,繼電器要控制加熱棒工作。這里建議買USB接口的加熱棒,后面的水泵、充氧泵也統統買USB接口的。拿到之后把USB接口出拿小刀割開,發現只有兩根線,一根VCC,一根GND,構造非常簡單,如圖:
圖片有點大湊合著看吧哈哈懶得調了。
那么我們怎么把這兩根線和繼電器接起來從而使繼電器控制加熱棒工作呢?
上圖解釋!
自己手畫了湊合著看吧奧~繼電器相當于一個開關的作用,有一個公共端COM,一個常開端NO,一個常閉端NC,我的繼電器使高電平觸發,當我連接Arduino的那端發出一個高電平信號時,常閉端的銜鐵打到常開端,我的電路就通了,加熱棒就開始工作了。后面的水泵和充氧泵也是一個道理。你可以用杜邦線處理一下,讓我們的接線更好看。
我是這么接的:
黑色那部分是加熱棒。加熱棒正極是粉色的線,負極是白色的線。把這兩根線和杜邦線接在一起(把杜邦線一頭割斷,露出類似于漆包線的部分,把杜邦線漆包線部分和加熱棒漆包線部分纏在一起,可以先拿小刀刮一刮漆包線部分的漆,防止兩部分線接觸不良。)然后拿焊錫把它倆焊住。最后拿熱熔膠把接口封裝。如下圖所示:
下面充氧泵和水泵也是這么接。它倆就只上圖不解釋了。
2.水位傳感器部分
水位傳感器接線的時候要注意,因為不能長期在潮濕的環境下工作,探針通電后,腐蝕速度將顯著提高,所以而應僅在獲取讀數時才為其供電。一種簡單的方法是將VCC引腳連接到Arduino的數字引腳,然后根據需要將其設置為HIGH或LOW。因此,我們將VCC引腳連接到Arduino的數字引腳#7。
如果你想更詳細的了解水位傳感器,推薦鏈接:點我
接線圖:
實物圖:
拍實物圖只是為了留作紀念,具體接線以接線圖為準。這里沒有拔溫度傳感器的線因為最后要把三塊子代碼合起來再跑一遍。
Arduino代碼如下:
運行結果:
需要強調的是,我的水位傳感器價格低廉,所以不是很靈敏,延遲數值在50左右,在實際做實物的時候,在代碼中設定的數值要根據誤差進行調整,我的已經調整過了。
第二個小任務也完成啦~
接水泵的實物圖:
手機拍的有點朦朧。不過不影響。
3.溶解氧傳感器部分
上面已經提到過了,溶解氧傳感器太貴了,所以我用電位器模擬溶解氧輸出的值。
接線圖:
實物圖:
上代碼:
運行結果:
連接充氧泵實物圖:
4.全部代碼
#include <OneWire.h> #include <DallasTemperature.h> #define tempPin 2// 溫度傳感器數據輸出腳接開發板數字引腳2 #define waterpower 7 //水位傳感器VCC引腳 #define waterpin A0 //水位傳感器輸出引腳 #define oxygenpin A1//溶解氧傳感器輸出引腳 OneWire oneWire(tempPin); DallasTemperature sensors(&oneWire);int relaypin1=3;//溫度傳感器繼電器1引腳為3 float temperature; int relaypin2=4;//水位傳感器繼電器2引腳為4 int relaypin3=5;//水位傳感器繼電器3引腳為5 int val=0; int waterlevel; int relaypin4=9;//溶解氧傳感器繼電器引腳為9 void setup(void) {pinMode(relaypin1,OUTPUT);//設置繼電器1為輸出模式pinMode(tempPin,OUTPUT);//溫度傳感器輸出模式Serial.begin(9600);//連接到電腦串口監視器sensors.begin();pinMode(relaypin2,OUTPUT);//繼電器輸出模式pinMode(relaypin3,OUTPUT);//繼電器輸出模式pinMode(waterpower,OUTPUT);//將水位傳感器VCC引腳設置成輸出模式digitalWrite(waterpower,LOW);//先將水位傳感器VCC引腳關閉pinMode(relaypin4,OUTPUT);//溶解氧繼電器4輸出模式 } int readwatersensor() {digitalWrite(waterpower,HIGH);//將水位傳感器VCC電源打開給傳感器供電delay(10);val=analogRead(waterpin);//讀取水位傳感器A0引腳的值digitalWrite(waterpower,LOW);//將水位傳感器電源關閉return val;//返回val值 } void loop(void) { sensors.requestTemperatures(); // 發送命令獲取溫度Serial.print("Temperature for the device 1 (index 0) is: ");Serial.println(sensors.getTempCByIndex(0)); temperature=sensors.getTempCByIndex(0);delay(500); if(temperature<25)//如果溫度小于25度{digitalWrite(relaypin1, HIGH); //繼電器1開,加熱棒開Serial.println("加熱棒開");}else{digitalWrite(relaypin1,LOW); //繼電器1關,加熱棒關Serial.println("加熱棒關"); }delay(500);//水位int level=readwatersensor();//讓level=valwaterlevel=readwatersensor();//讓waterlevel=valSerial.print("water level: ");//打印水位值Serial.println(level);//打印水位值delay(1000);//延遲1秒if(waterlevel<550)//如果水位在傳感器1CM之下{digitalWrite(relaypin2, HIGH);//繼電器2開,放水水泵開Serial.println("繼電器2開,放水!");delay(2000);//延遲2秒}else{if(waterlevel>640){digitalWrite(relaypin3, HIGH);//繼電器3開,抽水水泵開Serial.println("繼電器3開,抽水!");delay(2000);//延遲2秒}else{digitalWrite(relaypin2, LOW);//繼電器2關digitalWrite(relaypin3, LOW);//繼電器3關Serial.println("繼電器2,3關!");delay(2000);//延遲2秒}}//溶解氧int analog=analogRead(A1);//讀取模擬輸入值int oxygenlevel=map(analog,0,1023,0,10);//將模擬輸入0~1023等比映射到0mg/L~10mg/LSerial.print("oxygen level: ");//打印水位值Serial.println(oxygenlevel);//打印水位值analogWrite(9,oxygenlevel);if(oxygenlevel<5){digitalWrite(relaypin4, HIGH);//繼電器4開,充氧泵開Serial.println("繼電器4開,充氧!");delay(500);}else{digitalWrite(relaypin4, LOW);//繼電器4關,充氧泵開Serial.println("繼電器4關,充氧泵關!");delay(500);} }整體運行結果:
總結
到此為止,Arduino部分就完美結束了!接下來就是重頭戲樹莓派部分,我去歇一會兒,下一篇文章再寫吧。
總結
以上是生活随笔為你收集整理的【物联网毕设】基于arduino与树莓派的智能鱼缸【一】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac 常用快捷键(Alfred+wor
- 下一篇: 根据当前地理位置经纬度计算1000米以内