楊力,孟令亞
(鹽城三新供電服務有限公司,江蘇鹽城,224600)
時代不斷發展,人們對環境質量的要求越來越高,對便攜式環境監測設備的需求變大,傳統的溫濕度計僅可以顯示溫度濕度時間等。嵌入式技術不斷發展,家居也越來越智能化。本文設計了一款基于Arduino的智能化的溫濕度監測系統,可以實時顯示溫濕度信息在LCD液晶屏上,還可以通過無線通信模塊將信息發送給手機APP,方便人們遠程查看溫濕度信息。整個系統具有功耗低、精度高、可靠性強等優點,極大地便利了人們的生活。
總體設計方案包括:微處理器、顯示模塊、溫濕度傳感器和無線通信模塊[1]。
系統框圖如圖1所示。

圖1 系統框圖
1.2.1 微處理器方案選擇
采用Arduino微處理器作為MCU。Arduino微處理器價格便宜、性能強大、拓展性好、抗干擾能力強,采用C語言開發。IDE配置簡單,無需配置復雜的驅動程序、寄存器與庫函數。
1.2.2 顯示模塊方案選擇
LCD1602是一款字符型液晶顯示屏,可顯示字母數字符號。LCD1602液晶工作溫度為0℃~+55℃,工作電壓為-4.5~+5.5V,能夠同時顯示16字符2行的字母或數字。成本低廉,編程容易,符合本設計的需求。
1.2.3 傳感器模塊方案選擇
采用DHT11溫濕度傳感器作為溫濕度采集模塊。DHT11溫濕度傳感器工作電壓為3.3~5V,采用4針單排直插的封裝工藝,精度在±2℃,量程范圍是0℃~50℃。編程簡單,成本較低,適合本設計使用。
1.2.4 無線通信模塊方案選擇
采用ESP8266為核心的開發板WiFiduino進行數據傳輸。WiFi具有信號強度高、傳輸距離遠、功耗低、安全性極高、性價比高等特點。集成了ESP8266模塊的WiFiduino開發板為物聯網提供了簡單便捷的實現方式,手機端下載WiFiduino官網提供的BLINKER APP。BLINKER是一個物聯網接入項目,IOS、安卓、鴻蒙都支持,本地、遠程都支持,藍牙、WiFi都支持。WiFiduino開發板可以實現與DHT11相連接采集溫濕度信息,并且發送給手機端的BLINKER,符合本文的環境監測系統的使用場景。
硬件電路部分包括Arduino微處理器、WiFiduino模塊、DHT11溫濕度傳感器和LCD1602液晶顯示模塊的電路設計及連接[2]。
電路連接示意圖如圖2和圖3所示。

圖2 Arduino連接示意圖

圖3 WiFiduino連接示意圖
LCD1602原理圖如圖4所示。液晶顯示屏與Arduino的AD12、AD11、AD10、AD9、AD8、AD7這六個I/O引腳連接,其中AD12、AD11號引腳是控制線,也就是說傳輸“我要寫”之類的握手信號。AD10、AD9、AD8、AD7是數據傳輸口。LCD的VSS接GND,VDD接5V,AO號接用于調節背光的電阻,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Ω的上拉電阻。因為單片機在復位以后,I/O引腳處于浮空狀態,跳變輸出高低電平信號,無法正常工作,因此需要一個4.7kΩ左右的電阻將電位鉗制在高電平,又不影響電平信號的正常輸出,用以保證數據的正確傳輸。
通過調用DHT11的庫函數,實現DHT11的溫濕度采集和發送給Arduino主控制器功能。給Arduino編寫主函數,實現從DHT11接收溫濕度數據,讓數據發送給LCD1602液晶屏顯示的功能。對WiFiduino模塊進行編程,接收DHT11溫濕度傳感器的數據,同時發送給手機APP[3]。
3.2.1 主函數流程圖
主函數流程圖如圖7所示。

圖7 主函數流程圖
3.2.2 核心代碼及分析

程序分析:首先引入liquidcrystal和dht的庫函數,定義連接Arduino開發板上的引腳編號為12、11、10、9、8、7。引入DHT11和BLINKER庫函數,定義DHT11的DATA數據線連接WiFiduino的引腳編號設置波特率為115200,如果波特率設置錯誤,會導致COM6端口監視器出現humi和temp顯示的亂碼錯誤,在串口通過print語句輸出濕度數據和溫度數據。

程序分析:在lcd第一行顯示"Humidity(%)",第二行顯示"Temperature(C)"這里的lcd.setCursor的功能是將光標移動到指定位置。BLINKER_LOG語句為開啟調試輸出(Debug) 后可以使用BLINKER_LOG()打印輸出調試信息,這里是為了顯示出濕度信息h,和溫度信息t。在Blinker.print這條語句中,如果基于MQTT協議傳輸時,中間的dealy必須大于1000ms否則會發生只顯示第一條語句的錯誤,然后系統delay 5000ms,也就是每5s向APP發送一次溫度濕度信息。
3.3.1 DHT11函數流程圖
DHT11函數流程圖如圖8所示。

圖8 DHT11函數流程圖
3.3.2 DHT11模塊核心代碼及分析


程序分析:設置數據緩沖區,定義5個八位的數組40位數據,用來存儲數據采集的結果。cnt給每一個數據的每一位輸入值時計數用。idx給5個數組計數用。清空數據緩沖區,首先把5個八位的數組全部填0,也就是初始值為0。將引腳定義為輸出,由Arduino給DHT11寫數據。啟動DHT11先發送18ms的低電平,再發送20~40μs的高電平[4],收到這樣的電平信號,引腳定義為輸入引腳,傳感器開始采集數據。接收數據先要讀取80μs的低電平信號,要設置一個超時程序,若超過了等待時長,返回一個異常信息。在80μs的低電平信號之后是80μs的高電平信號,也要設置一個超時程序。設置for循環來讀取40位的數據。對于每一位數據,都是由一個低電平和一個高電平組成,區分這該位數據是1還是0取決于高電平的時常,如果高電平的時常為70μs則表示1,如果高電平的時常為26~28μs則表示0,因此讀取每一位數據時,都是先等待至50μs的低電平信號結束,再判斷高電平信號的時常,根據這個時常來判斷該位數據是1還是0。40位數據第1個8位是濕度的整數部分,第3個8位是溫度的整數部分,以上兩句代碼將數據分別放在這兩個變量中,再校驗數據是否正確[5]。
如圖9所示,LiquidCrystal庫函數程序先進行初始化,再定義給用戶使用的高級指令,用戶使用的指令由子函數COMMOND構成,COMMOND函數由data push子函數構成,最后定義data push底層函數功能。即可實現用戶定義指令功能。

圖9 LiquidCrystal函數流程圖
WiFiduino中定義的高級控制命令如表1所示。

表1
DHT11置于面包板上與Arduino連接,WiFiduino接相同電位的三根線相連接,DHT11采集周圍環境的溫度濕度數據。Arduino和WiFiduino可以同時接收到DHT11采集到的溫度和濕度信息,Arduino與LCD1602顯示屏相連接,用于顯示采集到的溫度濕度信息。WiFiduino 是集成了ESP8266 WiFi模塊的高度集成的開發板,可以將采集到的溫度濕度信息通過WiFi或者MQTT協議來向手機發送溫濕度信息,同時在手機端下載BLINKER APP,可以看到溫濕度信息,PC端可以通過Arduino或者WiFiduino的串口在PC上顯示溫濕度信息。
測試結果如圖10、圖11、圖12所示。圖10中LCD 1602可以顯示當前環境的溫濕度,圖11為BLINKER APP上顯示的由WiFiduino發送的溫濕度信息,圖12為系統整體照片。

圖10 溫濕度液晶顯示

圖11 APP端截圖

圖12 系統整體圖片
在本設計實驗過程中也遇到了一些問題,比如WiFiduino和BLINKER比較新穎,IDE存在BUG,在使用Arduino IDE過程中,編譯WiFi_BUTTON函數時出現了報錯,通過聯系編譯器開發者得以解決。在燒寫程序到WiFiduino時會占用引腳,導致下載失敗,重新插拔即可下載完成。在連接LCD1602時最好連接一個10kΩ大小的電阻,可以幫助LCD1602調節到合適的對比度,在實驗中一開始沒有接,導致背光太亮無法觀察溫濕度。經過測試,本設計電路與軟件皆可以正常運行,實現全部預設的功能,且運行穩定、數據精確,后續可以將面包板改進為PCB,將各個模塊焊接,有利于批量生產使用。