《基于單片機的水質檢測儀的設計》15000字(論文)_第1頁
《基于單片機的水質檢測儀的設計》15000字(論文)_第2頁
《基于單片機的水質檢測儀的設計》15000字(論文)_第3頁
《基于單片機的水質檢測儀的設計》15000字(論文)_第4頁
《基于單片機的水質檢測儀的設計》15000字(論文)_第5頁
已閱讀5頁,還剩57頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

-PAGEIV-基于單片機的水質檢測儀的設計摘要隨著經濟的快速增長,水污染變得愈發嚴重,其主要來源來自于生活廢水、工業廢水、醫院廢水以及農業地表徑流。水資源的保護成為了我們重要的任務之一。水質檢測是水資源保護的第一個環節,也是較為重要的環節,良好的水質檢測儀能夠及時地檢測出水質變化以及污染情況。本課題在了解和掌握了水質檢測的原理,結合了硬件電路和軟件代碼,通過各類傳感器對水源進行采集處理產生模擬和數字信號,再以單片機進行接收并轉換成水質檢測的各個參數。本文所設計的基于單片機的水質檢測儀對比于傳統的水質檢測儀,具有成本低、適用范圍廣、多參數等特點。它是基于ArduinoMega2560開發板和ESP8266開發板進行開發,可以檢測pH值、水溫、濁度、溶解性總固體四個參數,通過OLED顯示屏能夠實時顯示數據的變化,通過無線網絡與Blinker物聯網平臺的實現網絡連接進行數據傳輸,實現手機APP實時查看數據,通過Python編程和USB串口通信將所有參數數據整合生成Excel表格,具有一定的實用價值。關鍵詞:水質檢測,Arduino,Python,物聯網目錄引言 11緒論 21.1國內飲用水水質標準指標 21.2國內外水質檢測儀差距 31.3本文研究主要內容 32水質檢測儀方案設計 52.1設計要求 52.2總體設計框圖 53硬件電路部分設計 73.1數據采集模塊 73.1.1DS18B20溫度探頭 73.1.2渾濁度傳感器 83.1.3模擬TDS傳感器 93.1.4pH值采集傳感器 103.2數據處理模塊 123.2.1ArduinoMega2560開發板 123.2.2ESP8266開發板 123.3警示模塊 133.3.1LED警告燈 133.3.2蜂鳴器 143.4數據顯示模塊 153.4.1OLED顯示模塊 153.4.2手機APP顯示 163.5總體電路 163.6PCB設計 173.7外框設計 183.8元件清單 183.9電路實物圖 194軟件編程部分設計 204.1總體流程框圖 204.2器件程序調試 214.2.1溫度傳感器 214.2.2濁度傳感器 224.2.3pH傳感器 254.2.4TDS傳感器 274.2.5OLED顯示屏 284.3ESP8266程序調試 314.4Python程序調試 345系統調試 375.1市場上的水質檢測儀 375.2樣品檢測 375.2.1家中水質檢測 375.2.2樣品1檢測 385.2.3樣品2檢測 405.3總結 415.4調試中遇到的問題 41結論 43參考文獻 44附錄AArduinoMega2560程序 45附錄BESP8266程序 54附錄CPython程序 57·1··PAGE21·PAGE1引言水是一切生命的源泉,是我們日常生活和世界發展最重要、最不能夠或缺的物質資源中的一個。人體內的水分含量占體重的四分之三左右,它在人體內的生理反應以及新陳代謝等各個方面起著較為重要的作用。隨著現代社會的不斷變遷和科技的不斷進步,為了實現利益的增長使得水污染變得越來越嚴重,威脅到了人們日常生活用水以及飲用水的安全。水質檢測作為我們邁向保護環境的第一步,有助于我們作出科學的決策,有效預防和治理水污染,保證日常生活用水的質量和飲水安全等其他方面具有非常重要的現實意義[1]。因此,對于檢測水質是否符合飲用水和日常用水的標準這一課題是保證國家安全建設和人民生活健康的重要課題。目前國內傳統的水質檢測儀大部分是單參數水質檢測儀,需要攜帶其他儀器設備[2],而且單單一項內容的檢測往往不能夠說明水質的具體情況,參考意義不大,若要測量多個參數就需要購買并攜帶多個儀器設備,開銷大,便捷性較差。為此,本文設計了一款多參數、低成本、結構簡單、適用范圍性比較廣的水質檢測儀,適用于家庭生活用水的實時檢測,確保飲用水的安全。

1緒論1.1國內飲用水水質標準指標對于水資源保護的首要環節,水質檢測的標準是分辨水質好壞的重要條件。在國家頒布的《生活飲用水衛生標準》(GB5749-2006)[3]中查詢到有關于渾濁度、pH值和溶解性總固體三項指標的參數,并列成表格如表1.1所示。表1.1生活飲用水水質指標(部分參數)項目標準限值色色度不得超過15度,并且不得呈現其他異色臭和味不能有異味、異臭的現象渾濁度(NTU)≤1(水源與凈水技術條件限制時為≤3)pH值6.5~8.5溶解性總固體(ppm)<1000渾濁度是水質檢測中檢測水的清亮程度。水的渾濁往往由細微的懸浮顆粒如泥土、膠體顆粒、浮游生物以及其他微生物等所造成的。渾濁度超標則代表了水中的固體懸浮顆粒超標。若是懸浮顆粒中含有大量的重金屬,那么會導致慢性的重金屬中毒;若懸浮顆粒中含有大量的有毒的成分,那么會導致慢性中毒或者急性中毒;若是其中含有大量的泥沙則會對于人類的消化系統有影響。所以渾濁度的檢測是衡量水質良好程度的重要指標之一。pH值是水質檢測中檢測水的酸堿度。pH值為7代表水溶液呈中性,pH<7代表水溶液呈酸性,pH>7代表水溶液呈堿性。國內對于酸堿度的標準是pH值位于6.5至8.5之間,易于保持人體的酸堿平衡。同時還能夠防止腐蝕輸送水的金屬管道,減少水中的鈣鎂離子的沉淀而產生水垢。溶解性總固體(TDS)水質檢測中檢測水中全部溶質的總量,是日常生活中較簡易的檢測方式。它可以給出明確具體的數據,直觀的展示飲用水是否在安全健康的范圍之內。

表1.20~1000ppm的水質分布TDS值(單位:ppm)品質0~50純度高50~100純度較高100~300純度一般300~600容易結水垢600~1000口感較差如表1.2所示,可以看出0ppm~100ppm屬于較為優秀的水質范圍,100ppm~600ppm屬于較為一般的水質范圍,600ppm~1000ppm屬于口感較差,水里可溶解性固體較多,不太適宜。因此,在這里以0ppm~600ppm為本設計的TDS值可接受范圍。1.2國內外水質檢測儀差距相對于美國、德國、日本等發達國家來說,中國起步較晚。因此在水處理技術領域,我國也處于相對較低的水平。隨著國家經濟方面的發展速度愈發變快,對環保要求越來越高,國內行業對于水處理設備的需求與日俱增,國內的有關企業仍然面臨著巨大的困難去挑戰。由于專業人才短缺、關鍵電子元器件的穩定性和供應不足、設計流程和理念落后和較少采用有效的質量控制方法[4],導致了國內的水處理技術較為落后。在工業水處理監控、污水處理、環境監測等領域是國內水質檢測儀的主要市場,改革開放的短短幾十年里,對于我國的在線水質檢測儀自動控制技術、軟件技術、電子技術、精密制造產業技術等基礎技術,都是近幾十年來慢慢發展起來的。這兩方面的原因造成了中國水質檢測儀以及檢測技術發展的差距。水質檢測儀同國內外差距的另外一點就是創新。與發達國家相比,他們對于水質檢測所應用的新分析原理、新材料和算法都是十分完善的。而中國目前使用的還是較為傳統的電化學和比色法[5],作為水質檢測儀的主要檢測方法,不能完全滿足目前水處理工業過程控制的要求。1.3本文研究主要內容本設計擬采用單片機設計一款水質檢測儀,該檢測儀的功能主要從以下幾個方面考慮:多參數:目前市場上大多數的水質檢測儀是單參數檢測,比如小米和格力品牌的TDS水質檢測筆等。而且一項檢測內容并不能完全說明水質的好壞,需要多參數綜合考慮。智能性:手機在我們日常生活中算是必不可少的。該設計可以通過聯網進行手機互聯,利用手機實時觀察數據變化。同時還能通過一根USB數據線通過Python編程進行以一段時間間隔輸出數據并生成EXCEL表格,便于后續的觀察以及分析。便捷性:將所有模塊焊接在一塊PCB板上,相較于單參數水質檢測儀而言,方便攜帶。

2水質檢測儀方案設計2.1設計要求搭建水質檢測儀的實物,可以測量溫度、TDS值、渾濁度和pH值,測量精度控制在±10%以內。可實現OLED屏幕實時顯示溫度、TDS值、渾濁度和pH值,當超過各項標準指標(pH值范圍為6.5~8.5、TDS值范圍為0ppm~600ppm、濁度范圍0NTU~1NTU)時會點亮對應的LED燈,蜂鳴器工作。手機APP上能夠實現清晰地實時顯示各項指標數值。通過Python編程可以實現單片機與電腦串口通信收集數據生成Excel數據表格。2.2總體設計框圖本次設計的水質檢測儀的硬件電路部分包括數據采集模塊、數據顯示模塊、數據處理模塊和警示模塊。在這里采用的器件主要有ArduinoMega2560R3開發板、ESP8266V3開發板、DS18B20數字溫度探頭、渾濁度傳感器、TDS傳感器、pH值傳感器、OLED(0.96寸)顯示屏、蜂鳴器、三個LED燈。總體的設計流程框圖如圖2.1所示。圖2.1水質檢測儀設計框圖其中,數據處理模塊是整個設計的核心模塊,主要包括ArduinoMega2560R3開發板和ESP8266V3開發板。ArduinoMega2560R3開發板主要用于信號的接收和處理。ESP8266V3開發板主要用于聯網發送數據至Blinker平臺。數據采集模塊主要包括四個傳感器,分別為濁度傳感器、TDS傳感器、pH傳感器以及DS18B20數字溫度探頭。其中溫度測量的目的是為了實現溫度補償,讓濁度傳感器和TDS傳感器的數值更加精準。數據顯示模塊包括兩部分,一個是檢測儀上的實時顯示,考慮到要顯示的內容比較多,故本設計選用OLED0.96英寸顯示屏,放棄了LCD1602的想法。另一個是手機APP顯示。警示顯示模塊包括LED警示燈和蜂鳴器。三個LED燈用于分別顯示當pH值、TDS值和濁度超過標準指標時會點亮。整個工作過程描述如下:首先通過渾濁度傳感器、模擬TDS傳感器、pH值采集傳感器以及DS18B20數字溫度探頭將感受到的信息轉化為電信號,再由單片機模塊進行AD轉換數據處理從而得到相應的參數數值,判斷是否超出標準指標。若超出則會點亮相應的LED警告燈,同時觸發一次蜂鳴器。通過串口通信進行數據傳輸,再由Wi-Fi模塊進行與Blinker物聯網平臺的互聯,進行數據存儲,再通過Blinker軟件進行實時的數據展示。通過USB串口通信與電腦PC互聯,經過Python編程進行一段時間的Excel數據表格的生成。

3硬件電路部分設計根據上述的設計框圖,可知硬件電路主要包括數據采集模塊、數據顯示模塊、數據處理模塊和警示模塊四個部分,下面就各個部分進行詳細的說明。3.1數據采集模塊3.1.1DS18B20溫度探頭DS18B20溫度探頭采用的是常用的數字溫度傳感器型號DS18B20,輸出為數字信號,具有體積很小,硬件開銷很低,適用范圍很廣,抗干擾能力很強,測量范圍較廣(-55℃~+125℃),精度高(±0.5℃)的特點。因此在水質檢測儀中使用較為合適。圖3.1DS18B20溫度傳感器圖3.2DS18B20溫度傳感器與ArduinoMega2560的接線如圖3.1所示,DS18B20溫度傳感器總共有三個引腳,從左到右依次是GND引腳、DQ引腳和VDD引腳。如圖3.2所示,DS18B20數字溫度探頭的VCC引腳接ArduinoMega2560的5V接口為DS18B20數字溫度傳感器提供5V的工作電壓。注意的是在D引腳處連接ArduinoMega2560的D2接口時需要外接4.7KΩ上拉電阻。由于DS18B20是單線通信,它的接收和發送都是同一個引腳(D)進行的。輸出0時通過三極管下拉為低電平,而輸出1時,則為高阻,需要外接上拉電阻將其拉為高電平[6]。這里將上拉電阻的高電平與VCC相接。使用DS18B20數字溫度探頭進行溫度的測量目的是為了給渾濁度傳感器、pH值采集傳感器和模擬TDS傳感器進行溫度補償,從而使得數據更加精確。3.1.2渾濁度傳感器渾濁度傳感器采用的是TSW-30濁度傳感器,它是通過溶液樣品中的透光率和散射率進行綜合判斷濁度情況[7],接收端把發射端穿透過溶液的光強度轉換為電流大小,通過電阻將經過該電阻的電流轉換成電壓信號,具有實用性強,適用范圍廣,測量范圍為0NTU~1000NTU,誤差為±30。圖3.3TSW-30濁度傳感器圖3.4TSW-30濁度傳感器原理圖圖3.5TSW-30濁度傳感器與ArduinoMega2560的接線如圖3.4所示,TSW-30濁度傳感器通過EL-23G紅外發射二極管和ST-23G紅外接受二極管,把透過液體的光強度轉換成其對應的電流大小,再通過電阻轉換成電壓,輸出濁度信號。如圖3.5所示,VCC引腳接ArduinoMega2560的5V接口為TSW-30濁度傳感器提供5V工作電壓,A引腳接ArduinoMega2560的模擬輸入A0口。ArduinoMega2560通過讀取模擬輸入A0口的模擬信號轉換成電壓數值。3.1.3模擬TDS傳感器模擬TDS傳感器有3.3V~5.5V的寬電壓供電,0V~2.3V的模擬信號輸出,兼容5V、3.3V兩種控制系統,測量范圍為0ppm~1000ppm,誤差為±10%。通過在這兩個電極之間施加電壓,將帶正電的離子向負電荷的電極移動,再將帶負電荷的離子將向正電荷的電極移動,從而形成了電流[8]。測量所使用的激勵源采用交流信號,這樣做可以有效防止探頭極化[9],加了輸出信號的穩定性,具有價格低廉,簡單易用的特點,適用于水質檢測儀。圖3.6模擬TDS傳感器圖3.7模擬TDS傳感器與ArduinoMega2560的接線如圖3.6所示,模擬TDS傳感器由TDS探頭和轉接板組成。如圖3.7所示,VCC引腳接ArduinoMega2560的5V接口為模擬TDS傳感器提供5V工作電壓,其A引腳接ArduinoMega2560的模擬輸入A1口。ArduinoMega2560通過讀取模擬輸入A1口的模擬信號轉換成電壓。3.1.4pH值采集傳感器pH值檢測傳感器的電極采用的是塑料式不可填充式復合電極,是由玻璃電極和參比電極組合在一起的,在玻璃膜與被檢測溶液中的氫離子進行離子交換時,通過測量兩個電極之間的電位差[10],檢測到該樣品溶液中所含有的氫離子濃度,從而得到被測液體的pH數值。它具備了連線簡單、方便實用等特點,同時在水質檢測儀中是不可缺少的檢測項目。圖3.8pH值采集傳感器圖3.9pH值采集傳感器原理圖圖3.10pH值采集傳感器與ArduinoMega2560的接線如圖3.9所示,三端可調分流基準電壓源TL431的輸出電壓用兩個電阻就能夠任意地設置從2.5V至36V該范圍內的任意一個電壓值。將負極與參考端連接起來,得2.5V作為輸入基準源供TLC4502進行轉換。根據運算放大器的工作原理以及電壓跟隨電路,通過調節RP1電位器給參比電極賦予合適的電壓值,則可以保證信號電極電壓恒為正值,運放單電源供電即可滿足要求[11]。經過運算放大器可使其達到模數轉換所需電壓范圍,即可送入Mega2560進行數據處理。如圖3.10所示,VCC引腳接ArduinoMega2560的5V接口為pH值采集傳感器提供5V工作電壓,Po引腳接ArduinoMega2560的A2口。ArduinoMega2560通過讀取A2口的模擬信號轉換成電壓值。3.2數據處理模塊3.2.1ArduinoMega2560開發板本次設計采用ArduinoMega2560開發板作為對于各個傳感器的電信號的接收和發送以及數據處理的核心部分,具體參數如表3.1所示。圖3.11ArduinoMega2560開發板表3.1ArduinoMega2560開發板參數主控芯片ATMega2560工作電壓5V輸入電壓7V~12V數字I/0口54(含15路PWM輸出)模擬輸入口16閃存(FlashMemory)256KB靜態存儲器(SRAM)8KBEEPROM4KB時鐘16MHzArduinoMega2560開發板是采用USB接口的核心電路板,被廣泛應用于3D打印機、智能機器人、智能家居等等。由表3.1中可以看出,它具有I/O口數量多、閃存空間大、編程簡單、資源庫豐富等特點。同時電路板搭載了DC接口,可以進行外部供電。它還搭載了USB接口,可以通過USB在電腦上的虛擬COM端口,以此來進行虛擬串行(CDC)通信。3.2.2ESP8266開發板本次設計運用到了物聯網通信,采用ESP8266開發板作為媒介通過無線通信將ArduinoMega2560開發板通過串口通信傳輸的數據向Blinker物聯網平臺進行發送。具體參數如表3.2所示。圖3.12ESP8266開發板表3.2ESP8266開發板參數主控芯片CH9102X工作電壓3.3VWIFI模塊ESP-12F網絡協議無線802.11b/g/n閃存空間512KBRAM20KB用戶可用存儲空間150KB最高傳輸速率450KbpsESP8266開發板采用的是CH9102X主控芯片,具有高穩定性、支持高波特率等特點,使用與Arduino相同的編程軟件。Wi-Fi模塊采用的是ESP-12F模塊,運用2.4GHz無線技術,覆蓋范圍廣、穿透性強的特點能夠更好的進行無線通信。同時它還能夠支持三種無線網絡協議:802.11b/g/n,使得它具有很好的適用性。3.3警示模塊3.3.1LED警告燈LED燈就是最常見的發光二極管,具有節能、環保、價格便宜、響應快等特點。其作用就是當特定的參數超出其標準指標時就會點亮以示警告,當沒有超出時,保持熄滅狀態。圖3.13LED警告燈與ArduinoMega2560的接線如圖3.13所示,三個LED燈分別接在ArduinoMega2560的D8、D9、D10三個數字IO口上,分別代表渾濁度警告、TDS警告和pH值警告。并且在每個LED燈前接1KΩ的電阻,起到限流的作用,以防LED燈燒壞。當單片機處理得出的數據超出表1.1的有關指標時,其對應的數字I/O口輸出高電平,從而點亮LED燈。3.3.2蜂鳴器蜂鳴器模塊使用的是低電平觸發的有源蜂鳴器,其特點是:程序控制方便,接通電源就可以工作。其作用是:參數超出標準指標時發出聲響以示警告。圖3.14有源蜂鳴器圖3.15有源蜂鳴器與ArduinoMega2560的接線如圖3.14所示,有源蜂鳴器模塊有三個引腳分別是GND、I/O和VCC。接線圖如圖3.15所示,I/O引腳接ArduinoMega2560開發板的D3數字I/O口,當單片機處理得出的數據超出表1.1的有關指標時,D3口輸出低電平從而讓蜂鳴器工作。在VCC引腳接入ArduinoMega2560開發板的5V口中間接一個自鎖開關。在檢測的時候能夠讓蜂鳴器工作;在監測的時候讓蜂鳴器停止工作。3.4數據顯示模塊3.4.1OLED顯示模塊本設計的顯示模塊采用的是以SSD1306為驅動芯片的OLED顯示屏幕,尺寸為0.96寸,分辨率為128×64,能夠支持多種平臺,具有對比度高、視角廣、反應速度快等特點。相較于LCD1602,它能夠顯示更多的參數內容,作為水質檢測儀的數據實時顯示十分合適。圖3.16OLED顯示屏(0.96寸)圖3.17OLED顯示屏與ArduinoMega2560開發板的接線如圖3.16所示,OLED顯示屏總共有四個引腳,從左到右分別是GND引腳、VCC引腳、SCL引腳和SDA引腳。如圖3.17所示,VCC引腳接ArduinoMega2560的3.3V接口,來為OLED顯示屏提供3.3V的工作電壓,由于OLED顯示屏采用的是I2C協議,SCL引腳和SDA引腳分別接入ArduinoMega2560的時鐘管腳SCL和數據管腳SDA,從而驅動OLED顯示屏。3.4.2手機APP顯示本設計采用的手機APP是Blinker物聯網平臺下的點燈·blinker,通過ESP8266無線通信發送并存儲數據至Blinker物聯網平臺[12]。圖3.18Blinker手機APP手機APP界面如圖3.18所示,該界面上方四宮格顯示的是溫度、pH值、TDS值和渾濁度的數值,下方是一定時間段的對應數據曲線,這樣可以良好的觀測出該樣品的溫度、pH值、TDS值和渾濁度在該時間段的變化,做到實時監測。3.5總體電路將上述傳感器、開發板、顯示模塊和警示模塊結合在一起構成了總體電路,如圖3.19所示。圖3.19水質檢測儀總體電路3.6PCB設計由于該設計涉及到的傳感器、開發板以及接線過多,傳統的洞洞板焊接電路可能布線過于緊湊,所以采用了自行設計PCB板進行電路的焊接。運用AltiumDesigner14軟件進行各模塊的原理圖庫設計[13]、各種模塊的PCBLibrary設計以及各模塊的所組成的電路總原理圖設計,通過立創平臺進行PCB板的制作。并且對于原來傳感器的引腳接口進行了一定的更換改造。PCB板的原圖如圖3.20所示。各個模塊的焊盤距離的把控以及空間的分布都經過了一定的測量后進行修正。圖3.20水質檢測儀PCB板設計圖3.7外框設計為了能夠更好的展示實物作品,通過SolidWork2016軟件進行3D畫圖制作外框部件。如圖3.21所示,首先通過游標卡尺進行電路板的四個圓孔和ArduinoMega2560開發板的USB接口和DC接口定位,得到位置參數,在SolidWork軟件上進行繪制。最后生成STL文件通過軟件進行3D打印機的切片并打印。同時還設計了一塊亞克力蓋板,用于固定模塊和遮擋灰塵的作用。圖3.21水質檢測儀外框設計圖3.8元件清單將所需要的元件進行表格匯總,具體如表3.3所示。表3.3元件清單名稱型號開發板ArduinoMega2560和ESP8266渾濁度傳感器TSW-30模擬TDS傳感器TDS探頭(XH2.54-2P接口)pH值采集傳感器E-201-C型PH復合電極數字溫度傳感器DS18B20LED燈紅色(1個)綠色(2個)電阻4.7KΩ(1個)、1KΩ(3個)OLED顯示屏0.96寸(SSD1306)有源蜂鳴器低電平觸發自鎖開關6個引腳3.9電路實物圖將上述所有的元器件、PCB板和外框部件進行搭建組合,最終完成水質檢測儀的硬件部分,具體如圖3.22所示。圖3.22水質檢測儀實物圖4軟件編程部分設計4.1總體流程框圖此次ArduinoMega2560開發板和ESP8266開發板的編程用到了ArduinoIDE軟件,采用了C語言。在進行Arduino編程前進行了程序流程框圖的設計和構思,首先進行兩個開發板的初始化,然后運行四個傳感器獲取數據,并且判斷是否符合標準,然后在OLED屏上顯示數據。將獲取數據通過串口通信發送給ESP8266進行數據上傳。具體如圖4.1所示。圖4.1水質檢測儀的程序流程圖具體代碼詳見附錄A和附錄B4.2器件程序調試4.2.1溫度傳感器DS18B20溫度探頭采用的是1-Wire通信協議,對于該復雜協議需要大量代碼解析,因此采用Arduino的庫文件:DallasTemperature庫和OneWire庫進行編程,從而讀出溫度數據。圖4.2溫度傳感器程序定義如圖4.2所示,將OneWire庫文件和DallasTemperature庫文件嵌入源文件中,定義其數據輸出的引腳接開發板的數字引腳2。隨后創建一個oneWire類的新實例通過數字引腳2與OneWire設備通信,再將該實例引用傳遞給DallasTemperature庫中。圖4.3溫度傳感器程序初始化如圖4.3所示,打開串口通信,設置波特率為115200字節每秒。然后啟動DallasTemperature庫文件,完成溫度傳感器程序的初始化。圖4.4溫度傳感器程序循環部分如圖4.4所示,設置循環函數,通過發送命令獲取溫度傳感器的溫度信息,并在串口監視器上輸出溫度,每隔1秒發送一次數據。串口監視器的結果如圖4.5所示。圖4.5串口監視器的溫度數據4.2.2濁度傳感器TSW-30濁度傳感器模塊輸出電壓與渾濁度關系如圖4.6所示。圖4.6濁度傳感器輸出電壓與濁度關系曲線輸出電壓與濁度值滿足下列關系式:TU=?865.68×U+K(4.1)其中,TU為當前濁度值,U為當前溫度條件下濁度傳感器的輸出電壓值,K為截距值,通過下列關系式得到。K=865.68×U25℃(其中U25℃是指標準電壓值,即在0NTU的標準液在25TSW-30濁度傳感器所輸出的電壓值大小還受當時環境的溫度影響,在測量的時候需要進行溫度補償從而提高測量的精確性,溫度的大小通過DS18B20溫度探頭得到。輸出電壓與溫度曲線關系如圖所示。圖4.7濁度傳感器輸出電壓與溫度曲線輸出電壓與溫度滿足下列關系式:?U=?0.0192×(T?25)(4.3)其中,?U為由溫度的變化而引起的電壓差,T為當前測量的溫度值大小。通過這些公式從而進行對于濁度傳感器與ArduinoMega2560的調試編程。圖4.8濁度傳感器程序定義如圖4.8所示,對于上述公式所用的參數進行定義,TU為當前測量所得到的濁度值;TU_value為溫度校正后的濁度值;TU_calibration為標準電壓值(25℃);temp_data為當前溫度值,在這里默認為25℃進行調試;K為截距。這些變量都為浮點型變量。圖4.9濁度傳感器程序初始化如圖4.9所示,打開串口通信,設置波特率為115200字節每秒。圖4.10濁度傳感器程序循環部分如圖4.10所示,設置循環函數,讀取A0模擬輸入口,并將這些模擬讀數轉化為電壓,再將所得到的電壓代入公式中得到最后的濁度值。由于該濁度傳感器的測量范圍在0NTU~1000NTU,因此在后面設置了區間范圍,超出1000的數值始終顯示1000。在串口監視器上輸出濁度,每隔1秒發送一次數據。串口監視器的結果如圖4.11所示。圖4.11串口監視器的濁度數據4.2.3pH傳感器圖4.12pH傳感器程序定義如圖4.12所示,進行宏定義,定義數據輸出引腳接開發板的模擬輸入口A2,默認偏差補償為0,定義avgValue為無符號長整形變量,用于存儲傳感器反饋的平均值。圖4.13pH傳感器程序初始化如圖4.13所示,打開串口通信,設置波特率為115200字節每秒。圖4.14pH傳感器程序循環部分如圖4.14所示,定義一個數組包含10個元素,其中每個元素都是pH傳感器所獲取的采樣值。再將這些采樣值按從大到小進行排列,去除最大值和最小值取中心6個樣本的總和,再計算平均值,使得得到的數據誤差不會過大。再將模擬值轉換為毫伏值,通過下列公式:pH=?5.8887×Voltage+21.677(4.4)其中Voltage就是6個樣本的均值所轉換的電壓值,pH就是所求的pH值。將最終求得的數據以每隔1秒輸出的形式在串口監視器上顯示,如圖4.15。圖4.15串口監視器的pH值數據4.2.4TDS傳感器模擬TDS傳感器的編程需要用到GravityTDS和EEPROM兩個Arduino庫文件。將數據存儲到EEPROM里,通過GravityTDS庫進行數據的調用以及計算。圖4.16TDS傳感器程序定義如圖4.16所示,引用兩個庫文件,宏定義TDS傳感器的數據輸出接開發板的模擬輸入口A1,隨后創建一個gravityTds類。定義temperature賦值為25.0,tdsValue賦值為0.0,兩個變量都為浮點型變量。圖4.17TDS傳感器程序初始化如圖4.17所示,打開串口通信,設置波特率為115200字節每秒。同時設定引腳為A1,ADC的參考電壓設定為5.0V,設定采樣進度為10位,即1024級。最后對于GravityTds庫文件進行初始化運行。圖4.18TDS傳感器程序循環部分如圖4.18所示,將各項所需要的參數進行設定,這里默認環境溫度為25℃。隨后通過GravityTds庫文件的抽樣計算得到TDS值,并以每隔1秒輸出的形式顯示在串口監視器上,如圖4.19所示。圖4.19串口監視器的TDS值數據4.2.5OLED顯示屏OLED顯示屏的編程需要用到Adafruit_GFX、Adafruit_SSD1306和Wire三個Arduino庫文件。前面是一種圖形庫,中間是SSD1306驅動芯片庫,最后是I2C通信庫。圖4.20OLED程序定義如圖4.20所示,引用三種庫文件。設置SSD1306顯示所需要的參數,128×64是屏幕分辨率,采用I2C通信,復位引腳為4號引腳。圖4.21軟件生成字模圖4.22存儲點陣變量如圖4.21所示,以溫度兩個字舉例,采用PCtoLCD2002軟件將所需要的漢字生成點陣字模,設置字寬為14,字高也為14。如圖4.22所示,設置靜態常量并將生成字模的代碼存入其中。圖4.23OLED顯示代碼如圖4.23所示,設置字體大小并在開頭設置清屏和OLED點亮語句,可以通過后續的循環部分刷新顯示的數據。后四行代碼是確定了上述靜態常量所儲存的對應字模的位置、大小,對于數據變量則設置好顯示位置直接輸出對應數字。由于調試默認溫度為22.94℃。其余的參數設置為濁度:1000NTU、pH值:8.33、TDS值:0PPM。圖4.24OLED初始化如圖4.24所示,0x3C為I2C協議通訊地址,使用該地址進行初始化。display2()是開機顯示內容。最后在OLED程序循環部分中不斷執行display1(),實現數據的更新。具體顯示的效果圖如圖4.25所示。圖4.25OLED開機顯示以及數據顯示4.3ESP8266程序調試圖4.26ESP8266程序定義如圖4.26所示,通過ESP8266與Blinker物聯網平臺進行無線通信,采用了Blinker庫文件,通過設置Wi-Fi網絡名、Wi-Fi密碼和設備密鑰,進行設備與Blinker物聯網平臺的連接,從而將數據都上傳到Blinker物聯網平臺。圖4.27Blinker手機APP的組件建立如圖4.27所示,創建四個數字組件,對應手機APP上的組件鍵名,用于發送數據到手機APP,顯示溫度、TDS值、pH值和渾濁度四項數字數據。圖4.28Blinker云存儲數據如圖4.28所示,儲存信息到Blinker物聯網平臺,通過存儲鍵名進行讀取一段時間的數值變化,生成對應的圖表。Rev_float()是浮點型變量,是接受ArduinoMega2560通過串口通信發送的按照溫度、pH值、TDS值、渾濁度這一順序的浮點數聯合體,在輸出對應值時也要與其順序對應,否則會出現顯示錯誤。圖4.29ESP8266初始化如圖4.29所示,打開串口通信,設置和ArduinoMega2560同樣的波特率進行接收數據,后面都是對于Blinker庫文件的初始化以及注冊回調函數,用于數據的云存儲和實時讀取。圖4.30ESP8266循環部分如圖4.30所示,通過設置循環函數,頻繁調用并設置延時,以此來保持設備間連接及處理收到的數據。在延時過程中依舊能保持設備之間的網絡連接及數據接收處理。

4.4Python程序調試Python編程將開發板獲取的數據通過USB串口通信上傳至PC端,再將這些數據整理行成EXCEL表格。其中總共運用了以下五個庫:serial庫:設置參數并打開串口,與開發板進行串口通信;struct庫:用于字節流轉換為浮點型數據;time庫:用于延時時間;datatime庫:實時提供時間和日期pandas庫:用于數據分析,整理生成EXCEL表格;Python編程流程框圖如圖4.31所示。圖4.31Python流程框圖首先導入所需要的五個函數庫,隨后根據設備管理器中的COM端口以及所需要的波特率進行初始設置。設置記錄次數為10次,每2分鐘記錄一次。將接收到的字符串進行解包轉成浮點數,并將這些數據生成列表。記錄滿10次后通過DataFrame生成表格型的數據結構,輸出EXCEL表格,然后停止運行。具體代碼詳見附錄C。圖4.32Python打開串口如圖4.32,通過設置波特率和端口(與開發板的端口一致),打開串口通信,如果打開成功就會顯示“實時水質檢測數據開啟!”的字樣,否則將不會顯示內容。圖4.33Python字節流轉換如圖4.33,獲取通過串口通信按順序讀取一組4個字節的字符串,總共4組,再將這些字符串轉換成16進制數,通過解包16進制數,以小端字節順序排列。由于解包返回值為元組,后續需要轉換成浮點數形式,從而獲取對應的數值。圖4.34Python獲取當前時間圖4.35Python生成列表圖4.36Python生成EXCEL表格將之前獲得的數據以及如圖4.34獲取的當前時間,匯成一個列表并且作為一個最后的EXCEL數據列表的元素,具體如圖4.35所示。通過循環和延時,得到一個時間段的數據,最后輸出的大列表就是作為EXCEL表格的數據內容。如圖4.36所示,display定義為一個空列表,這個列表由標題和數據列表添加組成,再計算除時間外的參數計算平均值。最后通過DataFrame將display列表生成EXCEL表格,具體如表4.1所示。表4.1水質監測數據表格5系統調試將上述的硬件電路和軟件編程完成后,開始進行該設計的實物測試,為了能夠更好地展示本次設計,購買市場上所能買到的水質檢測儀進行測量數據的比對。本次進行了三種樣品的測試:家中自來水質、樣品溶液1和樣品溶液2。5.1市場上的水質檢測儀圖5.1市場上的水質檢測儀實物本次所對比的市場上的水質檢測儀是這款PH-07B型號的多參數水質檢測儀,它能夠測量pH值、TDS值和溫度三個參數,自帶自動溫度補償和自動校準功能,價格較為適中。其技術參數如表5.1所示。表5.1市場上的水質檢測儀技術參數指標量程及精度溫度0.1℃~60℃(±0.5℃)TDS值0ppm~10000ppm(±2%)pH值0.01~14.0(±0.1)5.2樣品檢測5.2.1家中水質檢測將搭建好的水質檢測儀實物進行測試,首先對于家中自來水樣品進行一段時間的測量,取平均值獲得較為精準的數值,與所購買的測量儀器作比較計算誤差。圖5.2市場上的測量儀器測量家中水質數據表5.2家中自來水水質監測數據首先將市場上的測量儀器對該水質進行檢測,由于能買到的產品最多只能測量溫度、pH值和TDS值,在此對于渾濁度的誤差測量不做要求。通過圖5.2所示,可以看到市場上的測量儀器對于該樣品測出來的三項數據:溫度為16℃、pH值為7.51、TDS值為148ppm。由表5.2所示,將監測時間的間隔設置為2分鐘,進行了10次的采樣數據,最后算下來平均數據:溫度為16.48℃、pH值為7.62、TDS值為151.08ppm、渾濁度為0NTU。然后進行與市場上的測量儀器所測的數據進行誤差比對,可以得到溫度誤差在3.00%、pH值誤差在1.46%、TDS值誤差在2.08%。符合各項傳感器的誤差范圍內,同時精確度能夠保證在±10%以內,滿足了設計要求。同時家中自來水的水質也符合了國家水質要求,滿足于日常使用的水質。5.2.2樣品1檢測該樣品是自來水與pH值為9.18的溶質進行調合,且產生了沉淀物。圖5.3水質檢測儀檢測樣品1圖5.4市場上的測量儀器測量樣品1數據表5.3樣品1水質監測數據圖5.3是水質檢測儀檢測溶液樣品1的實物圖,其中對于TDS傳感器的兩個電極和pH值傳感器的玻璃球泡不能與杯壁觸碰。由于倒入的pH值為9.18的溶質過量,并且有晶體沉淀,會導致pH值會大于9.18,TDS值會偏高。所以能夠看到右邊兩個LED燈點亮,說明了TDS值和pH值超過了標準指標,進行了警報。如圖5.4所示,根據市面上所購買的檢測儀所測得的數據,溫度由于兩次不同則取平均值24.7℃、TDS值為943ppm、pH值為9.32。表5.3是本次設計的水質檢測儀所測得的數據,得到溫度24.7℃、TDS值為964ppm、pH值為9.62。通過與市面上所購買的檢測儀測得的數據對比計算誤差,同樣滿足于本次設計的目標要求。5.2.3樣品2檢測該樣品是自來水與少量pH值為4.01的溶質進行調合,且無沉淀物產生,其中參雜了一些泥土。圖5.5水質檢測儀檢測樣品2圖5.6市場上的測量儀器測量樣品2數據表5.4樣品2水質檢測數據圖5.5是水質檢測儀檢測溶液樣品2的實物圖,其中對于TDS傳感器的兩個電極和pH值傳感器的玻璃球泡不能與杯壁觸碰。由于pH值為4.01的溶質加入量少,沒有晶體沉淀,同時混入了些許泥土,透光率降低,因此pH值測試會大于4.01,濁度測試會大于0~1這個區間,TDS值會偏高。隨后可以看到三個LED燈點亮,說明了濁度、TDS值和pH值全部超過了標準指標,進行了警報。如圖5.6所示,根據市面上所購買的檢測儀所測得的數據,溫度由于兩次不同則取平均值19.15℃、TDS值為968ppm、pH值為4.42。表5.4是本次設計的水質檢測儀所測得的數據,得到溫度20.02℃、TDS值為932ppm、pH值為4.34。通過與市面上所購買的檢測儀測得的數據對比計算誤差,同樣滿足于本次設計的目標要求。5.3總結通過三次樣品的測試中,手機APP能夠實時顯示參數數值,Python能夠成功生成EXCEL表格,LED燈和蜂鳴器的警報功能也能成功運行。通過三次調試的生成的數據表格可以看出,本次設計的水質檢測儀與市場上現在銷售的水質檢測儀測量數值誤差相差不大,說明該設計也具有一定的市場價值,并且都符合之前設定的多參數、智能性、便捷性的設計理念。5.4調試中遇到的問題在硬件方面,在PCB板進行各類元器件的焊接時,發現溫度傳感器所測得的數值一直不正常,經過電路圖的觀察后發現,使用了接地符號而沒有連接到開發板的GND引腳,導致這個引腳始終懸空,沒有處于接地狀態,導致運行不正常;在更換pH值傳感器模塊的6根引腳時焊接損壞了焊盤,導致沒有接連成功。在軟件方面,對于兩塊開發板的編程調試環節沒有出錯,但是在整合的過程中發現存在一定的沖突,調節了延時后有所緩解。在最后的樣品測試中,數據有一定的誤差產生,其中可能的原因就是對于傳感器探頭做完測試后進行清洗,使得探頭存在一定的損傷或者污染,會導致下一次的測試產生偏差。其中在進行測試中對于渾濁度傳感器的探頭外殼內部進過溶液,導致內部污染,由于利用的是光的透射性,存在一定的偏差,需要清洗后曬干一段時間,才能繼續使用。上述問題都在解決后進行了測試,發現能夠實現預期的效果,從而完成了本次實驗。

結論本次課題完成了基于單片機的水質檢測儀的設計,所需元器件為:ArduinoMega2560R3開發板、ESP8266V3開發板、渾濁度傳感器、模擬TDS傳感器、pH值采集傳感器、DS18B20數字溫度探頭、OLED(0.96寸)顯示屏、蜂鳴器、三個LED燈和自鎖開關。運用AltiumDesigner14軟件進行了水質檢測儀的PCB設計,通過企業進行PCB打樣。使用ArduinoIDE軟件對兩塊開發板的代碼進行了編寫。在完成了代碼的編寫后,為更好更快速的檢驗代碼的正確與否,通過串口監視器進行數據的顯示和實物的測試,并進行精確度的調試。在完成實物制作后,進行了實物調試。實物調試中出現的錯誤有:在PCB設計圖中用了GND符號導致需要飛線接在開發板的引腳、在焊接引腳的時候將傳感器模塊損壞、對于串口發送浮點數據以及接受浮點數據的編程問題、ArduinoMega2560與ESP8266開發板第一次開啟導致APP數據顯示不正常以及沒有對所有傳感器進行保養導致誤差變大等。運用了水質檢測儀,進行了多種樣品的測試以及對于市場上的水質檢測儀進行比對,完成了本次實驗的調試。本次設計可以實現:同時檢測一種樣品的溫度、pH值、渾濁度和TDS值;當一項數值超過標準指標時會點亮對應的LED燈并且蜂鳴器工作,相反則關閉;運用自鎖開關在監測的時候關閉蜂鳴器,檢測的時候打開蜂鳴器;OLED顯示屏顯示數據;手機APP上實時顯示數據;與PC串口通信通過Python編程進行數據整合生成EXCEL表格進行分析。本次實驗與預期目標現象相符合,但還存在不足之處,對該系統來說還可以優化很多,比如可以運用電源模塊分別給兩塊開發板進行供電,保證其工作電壓;代碼可以進行一部分的簡化;對于傳感器探頭要保養保證數值的精確性等等。同時擁有更多的功能,例如加入攝像頭模塊,可以遠程進行樣品的監視等。

參考文獻[1]段利軍,馬建濤.生活飲用水水質檢測的重要性分析[J].質量安全與檢驗檢測,2020,30(05):148-149.[2]廖堅燦,潘長林,秦海軍等.基于Arduino的多參數水質檢測儀[J].廣西物理,2018,39(01):26-29.[3]俞國柱,楊孫楷.旅游景區飲用水水質快速檢測的探討[J].旅行醫學科學,2009,15(02):24-26.[4]李源.水質環境檢測中質量控制的幾種方法[J].資源節約與環保,2021(10):54-56.[5]李海波.基于電化學與光學比色原理的水環境重金屬自動檢測儀器設計[D].浙江:浙江大學,2015.[6]潘珍珍,紀志堅,鄭旭.水溫自動控制系統設計[J].工業控制計算機,2017,30(07):158-159.[7]姜德志,姬光榮,陳艷麗.TS濁度傳感器在洗衣機中的應用[J].國外電子元器件,2007(08):68-69.[8]許仕海,李姮,陳千祥,等.基于Arduino的家用在線智能水質監測儀設計[J].科技視界,2019(22):14-15.[9]JanFarmanullah,MinAllahNasro,Dü?teg?rDilek.IoTBasedSmartWaterQualityMonitoring:RecentTechniques,TrendsandChallengesforDomesticApplications[J].Water,2021,13(13).[10]蘇宏鋒.一種小型污水水情測控裝置設計與實現[J].數字技術與應用,2019,37(01):161-163.[11]董華.基于MSP430單片機的pH計的研制[D].吉林大學.[12]胡文睿,談潘攀.基于物聯網的智慧浴室系統的設計[J].電腦知識與技術,2021,17(26):127-130.[13]高敬鵬,武超群,王臣業等.AltiumDesigner原理圖與PCB設計教程[M].北京:機械工業出版社,2013.

附錄AArduinoMega2560程序#include<OneWire.h>#include<DallasTemperature.h>#include<EEPROM.h>#include<GravityTDS.h>#include<Adafruit_GFX.h>#include<Adafruit_SSD1306.h>#include<Wire.h>//數據輸出腳接開發板數字引腳2#defineONE_WIRE_BUS2#defineTUSensorPinA0#defineTdsSensorPinA1#definepHSensorPin2#defineOffset21.677#defineOLED_RESET4GravityTDS;Adafruit_SSD1306display(128,64,&Wire,OLED_RESET);OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(&oneWire);floatTU=0.0;floatTU_value=0.0;floatTU_calibration=0.0;floatT;//當前溫度floatK=3291.30;//截距floattdsValue=0.0;unsignedlongintavgValue;floatphValue=0.0;staticconstunsignedcharPROGMEMstr1[]={0x07,0xE0,0x44,0x20,0x24,0x20,0x07,0xE0,0x84,0x20,0x44,0x20,0x07,0xE0,0x20,0x00,0x2F,0xF0,0x4A,0x50,0x4A,0x50,0x8A,0x50,0x8A,0x50,0x1F,0xF8};/*"溫",0*/staticconstunsignedcharPROGMEMstr2[]={0x02,0x00,0x01,0x00,0x3F,0xF8,0x24,0x20,0x3F,0xF8,0x24,0x20,0x27,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x20,0x22,0x40,0x41,0x80,0x46,0x60,0x98,0x18};/*"度",1*/staticconstunsignedcharPROGMEMstr3[]={0x00,0x80,0x40,0x80,0x20,0x80,0x17,0xF0,0x04,0x90,0x84,0x90,0x44,0x90,0x14,0x90,0x17,0xF0,0x20,0x80,0x20,0x90,0x40,0x88,0x4F,0xF8,0x00,0x08};/*"濁",2*/staticconstunsignedcharPROGMEMstr4[]={0x10,0x80,0x10,0x80,0x2F,0xF8,0x20,0x80,0x67,0xF0,0xA4,0x10,0x27,0xF0,0x24,0x10,0x27,0xF0,0x24,0x10,0x27,0xF0,0x24,0x10,0x24,0x10,0x2F,0xF8};/*"值",6*/staticconstunsignedcharPROGMEMstr5[]={0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x44,0x78,0x40,0xE0};/*"p",4*/staticconstunsignedcharPROGMEMstr6[]={0x00,0x00,0x00,0xEE,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0xEE,0x00,0x00};/*"H",5*/staticconstunsignedcharPROGMEMstr7[]={0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00};/*"T",7*/staticconstunsignedcharPROGMEMstr8[]={0x00,0x00,0x00,0xF0,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0xF0,0x00,0x00};/*"D",8*/staticconstunsignedcharPROGMEMstr9[]={0x00,0x00,0x00,0x3C,0x44,0x40,0x20,0x18,0x04,0x04,0x44,0x78,0x00,0x00};/*"S",9*/staticconstunsignedcharPROGMEMstr10[]={0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00};/*":",10*/staticconstunsignedcharPROGMEMstr11[]={0x40,0x00,0xA7,0x40,0x48,0xC0,0x10,0x40,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x20,0x08,0x40,0x07,0x80,0x00,0x00,0x00,0x00};/*"℃",11*/staticconstunsignedcharPROGMEMstr12[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x08,0x01,0x08,0x7D,0x90,0x05,0xA0,0x09,0x40,0x09,0x40,0x11,0x20,0x11,0x10,0x21,0x08,0x41,0x06,0x81,0x00,0x05,0x00,0x02,0x00};/*"水",0*/staticconstunsignedcharPROGMEMstr13[]={0x00,0x7C,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xFE,0x20,0x40,0x20,0x40,0x27,0xFC,0x24,0x04,0x24,0x44,0x24,0x44,0x24,0x44,0x24,0xB4,0x41,0x08,0x46,0x04,0x98,0x02};/*"質",1*/staticconstunsignedcharPROGMEMstr14[]={0x10,0x40,0x10,0x40,0x10,0xA0,0x10,0xA0,0xFD,0x10,0x12,0x08,0x35,0xF6,0x38,0x00,0x54,0x88,0x50,0x48,0x92,0x48,0x11,0x50,0x11,0x10,0x10,0x20,0x17,0xFE,0x10,0x00};/*"檢",2*/staticconstunsignedcharPROGMEMstr15[]={0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08};/*"測",3*/staticconstunsignedcharPROGMEMstr16[]={0x08,0x80,0x08,0x48,0x0A,0x48,0x12,0x08,0x12,0x08,0x31,0x10,0x31,0x10,0x51,0x10,0x90,0xA0,0x10,0xA0,0x10,0x40,0x10,0x40,0x10,0xA0,0x11,0x10,0x12,0x08,0x14,0x06};/*"儀",4*///定義聯合體unionData{floatFloat;byteByte[4];//單精度浮點數float長度為32位,也就是4Byte}a;//構建發送浮點數字的節數組voidSend_float(floatdata){a.Float=data;Serial.write(a.Byte[0]);//打印一個數組的字節Serial.write(a.Byte[1]);//一個數組代表一個類型的數據,并且一一對應Serial.write(a.Byte[2]);Serial.write(a.Byte[3]);}voidSend_float(floatFLOAT);voidTemperatureRead(){sensors.requestTemperatures();//發送命令獲取溫度T=sensors.getTempCByIndex(0);}voidpHread(){intbuf[10];//bufferforreadanalogfor(inti=0;i<10;i++)//Get10samplevaluefromthesensorforsmooththevalue{buf[i]=analogRead(pHSensorPin);delay(10);}for(inti=0;i<9;i++)//sorttheanalogfromsmalltolarge{for(intj=i+1;j<10;j++){if(buf[i]>buf[j]){inttemp=buf[i];buf[i]=buf[j];buf[j]=temp;}}}avgValue=0;for(inti=1;i<9;i++)//taketheaveragevalueof6centersampleavgValue+=buf[i];phValue=(float)avgValue*5.0/1024/8;//converttheanalogintomillivoltphValue=-5.8887*phValue+Offset;//convertthemillivoltintopHvalueif(phValue>8.50&&phValue<6.5)digitalWrite(10,HIGH);elsedigitalWrite(10,LOW);}voidTURead(){TemperatureRead();intValue=analogRead(TUSensorPin);//讀取模擬輸入口A0floatTU=Value*(5.0/1024.0);//將模擬讀數(0-1023)轉換為電壓(0-5V)TU_calibration=-0.0192*(T-25.0)+TU;//溫度校正公式TU_value=-865.68*TU_calibration+K;//標準曲線公式//0~1000的測量范圍if(TU_value<=0)TU_value=0.0;if(TU_value>=1000)TU_value=1000.0;if(TU_value>1)digitalWrite(8,HIGH);elsedigitalWrite(8,LOW);}voidTDSRead(){TemperatureRead();gravityTds.setTemperature(T);//設置溫度并執行溫度補償gravityTds.update();//抽樣計算tdsValue=gravityTds.getTdsValue();//thengetthevalueif(tdsValue<=0)tdsValue=0.0;if(tdsValue>=1000)tdsValue=1000.0;if(tdsValue>600)digitalWrite(9,HIGH);elsedigitalWrite(9,LOW);}voiddisplay1(){display.clearDisplay();//清屏display.setTextColor(WHITE);display.drawBitmap(20,22,str12,16,16,1);//水display.drawBitmap(37,22,str13,16,16,1);//質display.drawBitmap(54,22,str14,16,16,1);//檢display.drawBitmap(71,22,str15,16,16,1);//測display.drawBitmap(88,22,str16,16,16,1);//儀display.display();//開顯示}voiddisplay2(){display.clearDisplay();//清屏display.setTextColor(WHITE);display.setTextSize(1);//設置字體大小display.setCursor(40,5);//設置顯示位置display.print(T);//輸出字符display.setTextColor(WHITE);display.setTextSize(1);//設置字體大小display.setCursor(40,20);//設置顯示位置display.print(TU_value);//輸出字符display.println("NTU");//輸出字符display.setTextColor(WHITE);display.setTextSize(1);//設置字體大小display.setCursor(44,35);//設置顯示位置display.println(phValue);//輸出字符display.setTextColor(WHITE);display.setTextSize(1);//設置字體大小display.setCursor(47,50);//設置顯示位置display.print(tdsValue);//輸出字符display.println("PPM");//輸出字符display.drawBitmap(0,0,str1,14,14,1);//溫display.drawBitmap(14,0,str2,14,14,1);//度display.drawBitmap(28,0,str10,7,14,1);//:display.drawBitmap(72,3,str11,12,12,1);//℃display.drawBitmap(0,15,str3,14,14,1);//濁display.drawBitmap(14,15,str2,14,14,1);//度display.drawBitmap(28,15,str10,7,14,1);//:display.drawBitmap(0,30,str5,7,14,1);//pdisplay.drawBitmap(7,30,str6,7,14,1);//Hdisplay.drawBitmap(15,30,str4,14,14,1);//值display.drawBitmap(30,30,str10,7,14,1);//:display.drawBitmap(0,45,str7,7,14,1);//Tdisplay.drawBitmap(7,45,str8,7,14,1);//Ddisplay.drawBitmap(14,45,str9,7,14,1);//Sdisplay.drawBitmap(21,45,str4,14,14,1);//值display.drawBitmap(36,45,str10,7,14,1);//:display.display();//開顯示}voidbuzzer(){if((phValue>8.50&&phValue<6.5)||(TU_value>1)||(tdsValue>600)){digitalWrite(3,LOW);delay(200);digitalWrite(3,HIGH);}}voidsetup(){Serial.begin(115200);display.begin(SSD1306_SWITCHCAPVCC,0x3C);display1();pinMode(10,OUTPUT);//pH警告燈pinMode(9,OUTPUT);//TDS警告燈pinMode(8,OUTPUT);//渾濁度警告燈pinMode(3,OUTPUT);//蜂鳴器digitalWrite(3,HIGH);gravityTds.setPin(TdsSensorPin);gravityTds.setAref(5.0);//referencevoltageonADC,default5.0VonArduinoUNOgravityTds.setAdcRange(1024);//1024for10bitADC;4096for12bitADCgravityTds.begin();//initializationsensors.begin();}voidloop(){TemperatureRead();TDSRead();TURead();pHread();display2();Send_float(T);Send_float(phValue);Send_float(tdsValue);Send_float(TU_value);buzzer();delay(100);}

附錄BESP8266程序#defineBLINKER_WIFI#include<Blinker.h>charauth[]="6eeead2ffb35";//輸入DeviceSecretKeycharssid[]="Chinanet-2.4G-A5A0";//輸入WiFi網絡名charpswd[]="qwertyuiop";//輸入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論