日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【物联网毕设】基于arduino与树莓派的智能鱼缸【一】

發(fā)布時(shí)間:2024/1/1 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【物联网毕设】基于arduino与树莓派的智能鱼缸【一】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 零、智能魚缸框架與項(xiàng)目整體思路
  • 一、Arduino與傳感器部分
    • 1.溫度傳感器部分
    • 2.水位傳感器部分
    • 3.溶解氧傳感器部分
    • 4.全部代碼
  • 總結(jié)


前言

第一次寫文章,不知道該說什么好。對(duì)于我這種大學(xué)四年潛心劃水,現(xiàn)在只會(huì)寫簡(jiǎn)單的C的小白來說。要完完整整的做一個(gè)物聯(lián)網(wǎng)小項(xiàng)目簡(jiǎn)直是太難了。找遍了全網(wǎng),也沒有找到一家和我項(xiàng)目類似的。在一天天磨進(jìn)度,查資料的日子里,我真心希望遇到這么一篇文章。能直接帶我一步步做完整個(gè)畢設(shè)哈哈哈哈。所以我決定把我的畢設(shè)全部都記錄下來,細(xì)到每一小步。很多代碼都是copy來的,我也不懂為什么,但是它就是能用。所以如果你想學(xué)專業(yè)的知識(shí)和原理,這一系列文章幫不了你什么。但如果你的畢設(shè)和我很像或者一樣,我的這一系列能省出你很多查資料的時(shí)間。

零、智能魚缸框架與項(xiàng)目整體思路

先來看看我畢設(shè)的整體框架吧:

整體思路就是:
用Arduino開發(fā)板(我用的是太極創(chuàng)客的arduino UNO克隆板,因?yàn)橐獯罄陌逵悬c(diǎn)貴QAQ)讀取溫度傳感器、水位傳感器、溶解氧傳感器的值,然后分別控制四個(gè)繼電器工作。當(dāng)溫度低于25℃,繼電器1控制加熱棒開啟,當(dāng)溫度高于25℃,加熱棒關(guān)閉;把水位傳感器放在魚缸合適的高度,當(dāng)水位低于水位傳感器上的1cm刻度時(shí)(水位傳感器上有刻度,后面講到這部分會(huì)放圖),繼電器2控制注水水泵開啟,往魚缸里注水,當(dāng)水位處在傳感器1cm~3cm時(shí),繼電器2和3都處于關(guān)閉狀態(tài),當(dāng)水位在3cm以上時(shí),繼電器3控制抽水水泵開啟,給魚缸抽水;溶解氧傳感器部分有點(diǎn)問題,就是它太貴了!某寶小小一個(gè)要3k+,咱也不知道為什么這么貴,經(jīng)過和導(dǎo)師商量,最后實(shí)物用電位器來模擬溶解氧傳感器輸出的值,根據(jù)資料,一般魚類在溶解氧5mg/L以上的水中能正常生存,那就設(shè)定當(dāng)溶解氧濃度低于5時(shí),繼電器4控制充氧泵開啟。Arduino部分結(jié)束。
最難的就是樹莓派部分了,我的樹莓派是3B。大致思路就是Arduino把傳感器數(shù)據(jù)發(fā)送給樹莓派,(這里涉及到Arduino和樹莓派之間通訊的問題,我用的是USB通訊,后面細(xì)講。)然后樹莓派接收到數(shù)據(jù)后,通過web服務(wù)器將數(shù)據(jù)寫入MySQL數(shù)據(jù)庫(kù)(這里涉及到四個(gè)問題:樹莓派上安裝Django并用Django搭建web服務(wù)器;在樹莓派上安裝MySQL數(shù)據(jù)庫(kù);web服務(wù)器與MySQL數(shù)據(jù)庫(kù)進(jìn)行連接;樹莓派通過服務(wù)器接口post給服務(wù)器值,服務(wù)器通過另一個(gè)接口get到樹莓派的最新值)。最后小程序也是通過get請(qǐng)求,通過服務(wù)器讀取到數(shù)據(jù)庫(kù)的值,顯示在小程序的界面上。(這里涉及到微信小程序的開發(fā),后面細(xì)講)目前的整體思路就是這樣。
后續(xù)如果有時(shí)間的話,會(huì)給小程序增加按鈕,實(shí)現(xiàn)手動(dòng)開關(guān)增氧泵、加熱棒、水泵;會(huì)給樹莓派加一個(gè)攝像頭,抓取魚缸圖片或視頻放到小程序界面上。

那接下來就一部分一部分的細(xì)說吧!

一、Arduino與傳感器部分

1.溫度傳感器部分

首先去官網(wǎng)下載Arduino IDE后續(xù)敲代碼要用
溫度傳感器我用了DS18B20防水的那款,提醒一下如果在某寶上買,最好連它配套的模塊也一起買了,否則的話后續(xù)接線要接一個(gè)上拉電阻。模塊的引腳就三個(gè)VCC、GND和DAT,挺方便。

如果你想了解更多,推薦鏈接:點(diǎn)我

接線圖:

我用的Arduino UNO的開發(fā)板是克隆板,和意大利原板外貌不太一樣,但功能是一樣的。注意意大利板只有一個(gè)5V的接口,我的克隆板有兩個(gè)5V接口。

實(shí)物圖:

實(shí)物圖拍照還是挺亂的,主要還是看上面的接線圖連吧。
這里的實(shí)物圖沒接加熱棒,經(jīng)過實(shí)踐之后,發(fā)現(xiàn)存在Arduino和樹莓派供電不足,帶不動(dòng)加熱棒、充氧泵和兩個(gè)水泵的問題。于是給arduino又加了一個(gè)電源供電。接線圖都有體現(xiàn)。
總體來說就是:
樹莓派單獨(dú)給一個(gè)電源供電。
Arduino UNO和樹莓派用USB連接,但是僅僅由樹莓派給Arduino供電是遠(yuǎn)遠(yuǎn)不夠的,Arduino要再接一個(gè)獨(dú)立電源給它供電。
溫度傳感器、溶解氧傳感器(用電位器代替)、水位傳感器、四個(gè)繼電器由Arduino的5V引腳供電。
兩個(gè)水泵、充氧泵和加熱棒由Arduino的另外一個(gè)5V引腳供電。

這些接線圖里都有體現(xiàn),照著接線圖連就沒什么問題。
Arduino IDE上代碼如下:

#include <OneWire.h> #include <DallasTemperature.h>// 數(shù)據(jù)輸出腳接開發(fā)板數(shù)字引腳2 #define tempPin 2OneWire oneWire(tempPin); DallasTemperature sensors(&oneWire);int relaypin1=3;//繼電器1引腳為3 float temperature; void setup(void) {pinMode(relaypin1,OUTPUT);//繼電器1輸出模式pinMode(tempPin,OUTPUT);//溫度傳感器輸出模式Serial.begin(9600);//連接到電腦串口監(jiān)視器sensors.begin(); } void loop(void) { sensors.requestTemperatures(); // 發(fā)送命令獲取溫度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關(guān),加熱棒關(guān)Serial.println("加熱棒關(guān)"); }delay(500); }

結(jié)果:

第一個(gè)小任務(wù)就完成啦!
但是我們只是接了繼電器,繼電器要控制加熱棒工作。這里建議買USB接口的加熱棒,后面的水泵、充氧泵也統(tǒng)統(tǒng)買USB接口的。拿到之后把USB接口出拿小刀割開,發(fā)現(xiàn)只有兩根線,一根VCC,一根GND,構(gòu)造非常簡(jiǎn)單,如圖:

圖片有點(diǎn)大湊合著看吧哈哈懶得調(diào)了。
那么我們?cè)趺窗堰@兩根線和繼電器接起來從而使繼電器控制加熱棒工作呢?
上圖解釋!

自己手畫了湊合著看吧奧~繼電器相當(dāng)于一個(gè)開關(guān)的作用,有一個(gè)公共端COM,一個(gè)常開端NO,一個(gè)常閉端NC,我的繼電器使高電平觸發(fā),當(dāng)我連接Arduino的那端發(fā)出一個(gè)高電平信號(hào)時(shí),常閉端的銜鐵打到常開端,我的電路就通了,加熱棒就開始工作了。后面的水泵和充氧泵也是一個(gè)道理。你可以用杜邦線處理一下,讓我們的接線更好看。

我是這么接的:

黑色那部分是加熱棒。加熱棒正極是粉色的線,負(fù)極是白色的線。把這兩根線和杜邦線接在一起(把杜邦線一頭割斷,露出類似于漆包線的部分,把杜邦線漆包線部分和加熱棒漆包線部分纏在一起,可以先拿小刀刮一刮漆包線部分的漆,防止兩部分線接觸不良。)然后拿焊錫把它倆焊住。最后拿熱熔膠把接口封裝。如下圖所示:

下面充氧泵和水泵也是這么接。它倆就只上圖不解釋了。

2.水位傳感器部分

水位傳感器接線的時(shí)候要注意,因?yàn)椴荒荛L(zhǎng)期在潮濕的環(huán)境下工作,探針通電后,腐蝕速度將顯著提高,所以而應(yīng)僅在獲取讀數(shù)時(shí)才為其供電。一種簡(jiǎn)單的方法是將VCC引腳連接到Arduino的數(shù)字引腳,然后根據(jù)需要將其設(shè)置為HIGH或LOW。因此,我們將VCC引腳連接到Arduino的數(shù)字引腳#7。
如果你想更詳細(xì)的了解水位傳感器,推薦鏈接:點(diǎn)我

接線圖:

實(shí)物圖:

拍實(shí)物圖只是為了留作紀(jì)念,具體接線以接線圖為準(zhǔn)。這里沒有拔溫度傳感器的線因?yàn)樽詈笠讶龎K子代碼合起來再跑一遍。
Arduino代碼如下:

//水位傳感器引腳 #define waterpower 7 //水位傳感器VCC引腳 #define waterpin A0 //水位傳感器輸出引腳 int relaypin2=4;//水位傳感器繼電器引腳為4 int relaypin3=5;//水位傳感器繼電器引腳為5 int val=0; int waterlevel; void setup() {pinMode(relaypin2,OUTPUT);//繼電器輸出模式pinMode(relaypin3,OUTPUT);//繼電器輸出模式pinMode(waterpower,OUTPUT);//將水位傳感器VCC引腳設(shè)置成輸出模式digitalWrite(waterpower,LOW);//先將水位傳感器VCC引腳關(guān)閉Serial.begin(9600);//串口開啟 } void loop() {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開,放水!");}else{if(waterlevel>640){digitalWrite(relaypin3, HIGH);//繼電器3開,抽水水泵開Serial.println("繼電器3開,抽水!");}else{digitalWrite(relaypin2, LOW);//繼電器2關(guān)digitalWrite(relaypin3, LOW);//繼電器3關(guān)Serial.println("繼電器2,3關(guān)!");}}} int readwatersensor() {digitalWrite(waterpower,HIGH);//將水位傳感器VCC電源打開給傳感器供電delay(10);val=analogRead(waterpin);//讀取水位傳感器A0引腳的值digitalWrite(waterpower,LOW);//將水位傳感器電源關(guān)閉return val;//返回val值 }

運(yùn)行結(jié)果:

需要強(qiáng)調(diào)的是,我的水位傳感器價(jià)格低廉,所以不是很靈敏,延遲數(shù)值在50左右,在實(shí)際做實(shí)物的時(shí)候,在代碼中設(shè)定的數(shù)值要根據(jù)誤差進(jìn)行調(diào)整,我的已經(jīng)調(diào)整過了。
第二個(gè)小任務(wù)也完成啦~
接水泵的實(shí)物圖:

手機(jī)拍的有點(diǎn)朦朧。不過不影響。

3.溶解氧傳感器部分

上面已經(jīng)提到過了,溶解氧傳感器太貴了,所以我用電位器模擬溶解氧輸出的值。
接線圖:

實(shí)物圖:

上代碼:

#define oxygenpin A1 int relaypin4=9;//溶解氧傳感器繼電器引腳為9 void setup() {Serial.begin(9600);pinMode(relaypin4,OUTPUT);//溶解氧繼電器4輸出模式 } void loop() {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關(guān),充氧泵開Serial.println("繼電器4關(guān),充氧泵關(guān)!");delay(500);}}

運(yùn)行結(jié)果:

連接充氧泵實(shí)物圖:

4.全部代碼

#include <OneWire.h> #include <DallasTemperature.h> #define tempPin 2// 溫度傳感器數(shù)據(jù)輸出腳接開發(fā)板數(shù)字引腳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);//設(shè)置繼電器1為輸出模式pinMode(tempPin,OUTPUT);//溫度傳感器輸出模式Serial.begin(9600);//連接到電腦串口監(jiān)視器sensors.begin();pinMode(relaypin2,OUTPUT);//繼電器輸出模式pinMode(relaypin3,OUTPUT);//繼電器輸出模式pinMode(waterpower,OUTPUT);//將水位傳感器VCC引腳設(shè)置成輸出模式digitalWrite(waterpower,LOW);//先將水位傳感器VCC引腳關(guān)閉pinMode(relaypin4,OUTPUT);//溶解氧繼電器4輸出模式 } int readwatersensor() {digitalWrite(waterpower,HIGH);//將水位傳感器VCC電源打開給傳感器供電delay(10);val=analogRead(waterpin);//讀取水位傳感器A0引腳的值digitalWrite(waterpower,LOW);//將水位傳感器電源關(guān)閉return val;//返回val值 } void loop(void) { sensors.requestTemperatures(); // 發(fā)送命令獲取溫度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關(guān),加熱棒關(guān)Serial.println("加熱棒關(guān)"); }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關(guān)digitalWrite(relaypin3, LOW);//繼電器3關(guān)Serial.println("繼電器2,3關(guān)!");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關(guān),充氧泵開Serial.println("繼電器4關(guān),充氧泵關(guān)!");delay(500);} }

整體運(yùn)行結(jié)果:

總結(jié)

到此為止,Arduino部分就完美結(jié)束了!接下來就是重頭戲樹莓派部分,我去歇一會(huì)兒,下一篇文章再寫吧。

總結(jié)

以上是生活随笔為你收集整理的【物联网毕设】基于arduino与树莓派的智能鱼缸【一】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。