楊力,孟令亞
(鹽城三新供電服務(wù)有限公司,江蘇鹽城,224600)
時代不斷發(fā)展,人們對環(huán)境質(zhì)量的要求越來越高,對便攜式環(huán)境監(jiān)測設(shè)備的需求變大,傳統(tǒng)的溫濕度計僅可以顯示溫度濕度時間等。嵌入式技術(shù)不斷發(fā)展,家居也越來越智能化。本文設(shè)計了一款基于Arduino的智能化的溫濕度監(jiān)測系統(tǒng),可以實時顯示溫濕度信息在LCD液晶屏上,還可以通過無線通信模塊將信息發(fā)送給手機APP,方便人們遠(yuǎn)程查看溫濕度信息。整個系統(tǒng)具有功耗低、精度高、可靠性強等優(yōu)點,極大地便利了人們的生活。
總體設(shè)計方案包括:微處理器、顯示模塊、溫濕度傳感器和無線通信模塊[1]。
系統(tǒng)框圖如圖1所示。
圖1 系統(tǒng)框圖
1.2.1 微處理器方案選擇
采用Arduino微處理器作為MCU。Arduino微處理器價格便宜、性能強大、拓展性好、抗干擾能力強,采用C語言開發(fā)。IDE配置簡單,無需配置復(fù)雜的驅(qū)動程序、寄存器與庫函數(shù)。
1.2.2 顯示模塊方案選擇
LCD1602是一款字符型液晶顯示屏,可顯示字母數(shù)字符號。LCD1602液晶工作溫度為0℃~+55℃,工作電壓為-4.5~+5.5V,能夠同時顯示16字符2行的字母或數(shù)字。成本低廉,編程容易,符合本設(shè)計的需求。
1.2.3 傳感器模塊方案選擇
采用DHT11溫濕度傳感器作為溫濕度采集模塊。DHT11溫濕度傳感器工作電壓為3.3~5V,采用4針單排直插的封裝工藝,精度在±2℃,量程范圍是0℃~50℃。編程簡單,成本較低,適合本設(shè)計使用。
1.2.4 無線通信模塊方案選擇
采用ESP8266為核心的開發(fā)板WiFiduino進(jìn)行數(shù)據(jù)傳輸。WiFi具有信號強度高、傳輸距離遠(yuǎn)、功耗低、安全性極高、性價比高等特點。集成了ESP8266模塊的WiFiduino開發(fā)板為物聯(lián)網(wǎng)提供了簡單便捷的實現(xiàn)方式,手機端下載WiFiduino官網(wǎng)提供的BLINKER APP。BLINKER是一個物聯(lián)網(wǎng)接入項目,IOS、安卓、鴻蒙都支持,本地、遠(yuǎn)程都支持,藍(lán)牙、WiFi都支持。WiFiduino開發(fā)板可以實現(xiàn)與DHT11相連接采集溫濕度信息,并且發(fā)送給手機端的BLINKER,符合本文的環(huán)境監(jiān)測系統(tǒng)的使用場景。
硬件電路部分包括Arduino微處理器、WiFiduino模塊、DHT11溫濕度傳感器和LCD1602液晶顯示模塊的電路設(shè)計及連接[2]。
電路連接示意圖如圖2和圖3所示。
圖2 Arduino連接示意圖
圖3 WiFiduino連接示意圖
LCD1602原理圖如圖4所示。液晶顯示屏與Arduino的AD12、AD11、AD10、AD9、AD8、AD7這六個I/O引腳連接,其中AD12、AD11號引腳是控制線,也就是說傳輸“我要寫”之類的握手信號。AD10、AD9、AD8、AD7是數(shù)據(jù)傳輸口。LCD的VSS接GND,VDD接5V,AO號接用于調(diào)節(jié)背光的電阻,RS接Arduino 12號引腳,RW號接GND,E引腳接Arduino 11號引腳,D0,D1,D2,D3不接,D4接Arduino 10號引腳,D5接Arduino 9號引腳,D6接Arduino 8號引腳,D7接Arduino7號引腳,A接5V,K接GND。
圖4 LCD1602原理圖
DHT11溫濕度傳感器封裝后實物示意圖和引腳功能說明如圖5所示。
圖5 DHT11實物示意圖
電路連接示意圖如圖6所示。
圖6 DHT11電路連接示意圖
3號引腳懸空不接線,接線時只要將1號引腳接到5V的VDD上,4號引腳接到Arduino GND上,2號引腳引腳接Arduino的AD4引腳,接WiFiduino的WD1引腳。
DATA引腳需要接出一個5kΩ的上拉電阻。因為單片機在復(fù)位以后,I/O引腳處于浮空狀態(tài),跳變輸出高低電平信號,無法正常工作,因此需要一個4.7kΩ左右的電阻將電位鉗制在高電平,又不影響電平信號的正常輸出,用以保證數(shù)據(jù)的正確傳輸。
通過調(diào)用DHT11的庫函數(shù),實現(xiàn)DHT11的溫濕度采集和發(fā)送給Arduino主控制器功能。給Arduino編寫主函數(shù),實現(xiàn)從DHT11接收溫濕度數(shù)據(jù),讓數(shù)據(jù)發(fā)送給LCD1602液晶屏顯示的功能。對WiFiduino模塊進(jìn)行編程,接收DHT11溫濕度傳感器的數(shù)據(jù),同時發(fā)送給手機APP[3]。
3.2.1 主函數(shù)流程圖
主函數(shù)流程圖如圖7所示。
圖7 主函數(shù)流程圖
3.2.2 核心代碼及分析
程序分析:首先引入liquidcrystal和dht的庫函數(shù),定義連接Arduino開發(fā)板上的引腳編號為12、11、10、9、8、7。引入DHT11和BLINKER庫函數(shù),定義DHT11的DATA數(shù)據(jù)線連接WiFiduino的引腳編號設(shè)置波特率為115200,如果波特率設(shè)置錯誤,會導(dǎo)致COM6端口監(jiān)視器出現(xiàn)humi和temp顯示的亂碼錯誤,在串口通過print語句輸出濕度數(shù)據(jù)和溫度數(shù)據(jù)。
程序分析:在lcd第一行顯示"Humidity(%)",第二行顯示"Temperature(C)"這里的lcd.setCursor的功能是將光標(biāo)移動到指定位置。BLINKER_LOG語句為開啟調(diào)試輸出(Debug) 后可以使用BLINKER_LOG()打印輸出調(diào)試信息,這里是為了顯示出濕度信息h,和溫度信息t。在Blinker.print這條語句中,如果基于MQTT協(xié)議傳輸時,中間的dealy必須大于1000ms否則會發(fā)生只顯示第一條語句的錯誤,然后系統(tǒng)delay 5000ms,也就是每5s向APP發(fā)送一次溫度濕度信息。
3.3.1 DHT11函數(shù)流程圖
DHT11函數(shù)流程圖如圖8所示。
圖8 DHT11函數(shù)流程圖
3.3.2 DHT11模塊核心代碼及分析
程序分析:設(shè)置數(shù)據(jù)緩沖區(qū),定義5個八位的數(shù)組40位數(shù)據(jù),用來存儲數(shù)據(jù)采集的結(jié)果。cnt給每一個數(shù)據(jù)的每一位輸入值時計數(shù)用。idx給5個數(shù)組計數(shù)用。清空數(shù)據(jù)緩沖區(qū),首先把5個八位的數(shù)組全部填0,也就是初始值為0。將引腳定義為輸出,由Arduino給DHT11寫數(shù)據(jù)。啟動DHT11先發(fā)送18ms的低電平,再發(fā)送20~40μs的高電平[4],收到這樣的電平信號,引腳定義為輸入引腳,傳感器開始采集數(shù)據(jù)。接收數(shù)據(jù)先要讀取80μs的低電平信號,要設(shè)置一個超時程序,若超過了等待時長,返回一個異常信息。在80μs的低電平信號之后是80μs的高電平信號,也要設(shè)置一個超時程序。設(shè)置for循環(huán)來讀取40位的數(shù)據(jù)。對于每一位數(shù)據(jù),都是由一個低電平和一個高電平組成,區(qū)分這該位數(shù)據(jù)是1還是0取決于高電平的時常,如果高電平的時常為70μs則表示1,如果高電平的時常為26~28μs則表示0,因此讀取每一位數(shù)據(jù)時,都是先等待至50μs的低電平信號結(jié)束,再判斷高電平信號的時常,根據(jù)這個時常來判斷該位數(shù)據(jù)是1還是0。40位數(shù)據(jù)第1個8位是濕度的整數(shù)部分,第3個8位是溫度的整數(shù)部分,以上兩句代碼將數(shù)據(jù)分別放在這兩個變量中,再校驗數(shù)據(jù)是否正確[5]。
如圖9所示,LiquidCrystal庫函數(shù)程序先進(jìn)行初始化,再定義給用戶使用的高級指令,用戶使用的指令由子函數(shù)COMMOND構(gòu)成,COMMOND函數(shù)由data push子函數(shù)構(gòu)成,最后定義data push底層函數(shù)功能。即可實現(xiàn)用戶定義指令功能。
圖9 LiquidCrystal函數(shù)流程圖
WiFiduino中定義的高級控制命令如表1所示。
表1
DHT11置于面包板上與Arduino連接,WiFiduino接相同電位的三根線相連接,DHT11采集周圍環(huán)境的溫度濕度數(shù)據(jù)。Arduino和WiFiduino可以同時接收到DHT11采集到的溫度和濕度信息,Arduino與LCD1602顯示屏相連接,用于顯示采集到的溫度濕度信息。WiFiduino 是集成了ESP8266 WiFi模塊的高度集成的開發(fā)板,可以將采集到的溫度濕度信息通過WiFi或者M(jìn)QTT協(xié)議來向手機發(fā)送溫濕度信息,同時在手機端下載BLINKER APP,可以看到溫濕度信息,PC端可以通過Arduino或者WiFiduino的串口在PC上顯示溫濕度信息。
測試結(jié)果如圖10、圖11、圖12所示。圖10中LCD 1602可以顯示當(dāng)前環(huán)境的溫濕度,圖11為BLINKER APP上顯示的由WiFiduino發(fā)送的溫濕度信息,圖12為系統(tǒng)整體照片。
圖10 溫濕度液晶顯示
圖11 APP端截圖
圖12 系統(tǒng)整體圖片
在本設(shè)計實驗過程中也遇到了一些問題,比如WiFiduino和BLINKER比較新穎,IDE存在BUG,在使用Arduino IDE過程中,編譯WiFi_BUTTON函數(shù)時出現(xiàn)了報錯,通過聯(lián)系編譯器開發(fā)者得以解決。在燒寫程序到WiFiduino時會占用引腳,導(dǎo)致下載失敗,重新插拔即可下載完成。在連接LCD1602時最好連接一個10kΩ大小的電阻,可以幫助LCD1602調(diào)節(jié)到合適的對比度,在實驗中一開始沒有接,導(dǎo)致背光太亮無法觀察溫濕度。經(jīng)過測試,本設(shè)計電路與軟件皆可以正常運行,實現(xiàn)全部預(yù)設(shè)的功能,且運行穩(wěn)定、數(shù)據(jù)精確,后續(xù)可以將面包板改進(jìn)為PCB,將各個模塊焊接,有利于批量生產(chǎn)使用。