伍敏君
(中山火炬職業(yè)技術(shù)學院光電信息學院 廣東省中山市 528400)
經(jīng)濟發(fā)展使人們生活水平不斷提高,生活用水與工業(yè)用水量大幅度增加;另一方面,要動態(tài)監(jiān)測湖泊、水庫、河流等水位以研究生態(tài)環(huán)境變化、防御自然災害,因此,水位監(jiān)測與控制至關(guān)重要[1-3]。電子技術(shù)的迅速發(fā)展,使智能化監(jiān)控已成為發(fā)展趨勢。移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)技術(shù)、傳感器技術(shù)的發(fā)展,為實時監(jiān)測提供了必要條件[4-5]。本文以水位為監(jiān)測對象,設計一款水位實時監(jiān)測報警系統(tǒng),通過傳感器采集數(shù)據(jù)并顯示于液晶顯示器中,本系統(tǒng)可應用于日常生活中的水位監(jiān)測場合。
本系統(tǒng)以ArduinoUNO 控制器為核心,結(jié)合傳感器技術(shù),實現(xiàn)水位實時監(jiān)測與報警。本系統(tǒng)由控制器模塊、水位檢測模塊、顯示模塊、報警模塊等四部分組成。
本系統(tǒng)采用的控制器為ArduinoUNO,如圖1所示,其主控芯片為ATmega328P,核心處理器是AVR 單片機。ArduinoUNO 是開源的硬件,資源豐富,有14 個數(shù)字I/O 口,6 個PWM 輸出端口,6 個模擬輸入端口,1 個16MHz 晶振,1 個復位按鍵,1 個USB 接口以及1 個直流電源插孔等[6]。ArduinoUNO 的工作電壓為5V,既可用USB 供電,也可用外部供電。其價格低,穩(wěn)定性好,設有一個自恢復保險絲,當短路或電流過大時,自動斷開供電,起保護ArduinoUNO 板和計算機USB 端口的作用。
本系統(tǒng)的水位檢測模塊采用深圳科易互動科技有限公司研發(fā)的一款水位傳感器,如圖2所示。此傳感器采用半月形凹陷防滑處理設計,表面有一系列平行導線用于測量水滴水量的大小。模塊體積小巧,輕便簡單,低功耗,靈敏性好,工作電壓為5V,工作電流低于20mA。該水位傳感器可直接與控制器相連接,有三個引腳,其中,“-”為GND 端口,“+”為VCC 端口,“S”為數(shù)據(jù)輸出端口。
圖1:ArduinoUNO 控制器
圖2:水位傳感器
圖3:LCD1602 液晶顯示器
本系統(tǒng)的顯示模塊采用液晶顯示器LCD1602 芯片,如圖3所示。該芯片能顯示2 行信息,每行可顯示16 個字符、數(shù)字或字母,各字符尺寸為2.95×4.35mm。LCD1602 的工作電壓為5.0V,工作電流為2.0mA,驅(qū)動簡單,共有16 個引腳。其中,引腳1 為電源地,引腳2 為電源正極,引腳3 為液晶顯示偏壓信號,引腳4 為數(shù)據(jù)/命令選擇端,引腳5 為讀/寫選擇端,引腳6 為使能信號,引腳7 ~14為數(shù)據(jù)口,引腳15 為背光源正極,引腳16 為背光源負極。
本系統(tǒng)的報警模塊采用由LED 指示燈和有源蜂鳴器組成的電路。為了使LED、有源蜂鳴器工作在額定電壓和額定電流范圍內(nèi),兩者各串聯(lián)220Ω 電阻。當水位低于預設的報警值時,報警模塊不工作;否則,觸發(fā)報警模塊工作,驅(qū)動LED 點亮、蜂鳴器發(fā)響。
本系統(tǒng)的連接圖如圖4所示,LCD1602 芯片的16 個引腳,采用八位連接法與ArduinoUNO 控制器連接,即第7 ~14 引腳的數(shù)據(jù)位D0 ~D7 分別連接到ArduinoUNO 控制器的八個數(shù)字I/O 口9、8、7、6、5、4、3、2。為了便于調(diào)節(jié)液晶顯示器的對比度,第3 引腳接入10kΩ 可調(diào)電阻。
LED 和有源蜂鳴器的正極并聯(lián)后,接至ArduinoUNO 控制器的數(shù)字I/O 口13。LED 和有源蜂鳴器的負極分別串聯(lián)220Ω 電阻,再接至控制器的GND 端口。
水位傳感器的正極接至ArduinoUNO 控制器的VCC 端口,其負極接至控制器的GND 端口,S 端口接控制器的模擬輸入端口A0。
本系統(tǒng)所有模塊功能的程序均在Arduino IDE 平臺中設計與完成。在Arduino IDE 平臺上,Arduino 語言把AVR 單片機相關(guān)的參數(shù)設置封裝成函數(shù),減少了硬件底層的開發(fā)。
啟動Arduino IDE 后,新建工程,系統(tǒng)已自動在工程中添加如下內(nèi)容:
圖4:系統(tǒng)連接圖
圖5:軟件設計流程圖
圖6:水位傳感器置于空氣中
圖7:水位傳感器浸入水中
Arduino 程序中沒有C 語言要求的main()函數(shù),只需完成setup()和loop()兩個函數(shù)的編寫。其中,setup()只執(zhí)行一次,完成程序的一些初始化設置;loop()一直反復執(zhí)行,相當于while(1)的循環(huán)語句,是實現(xiàn)程序功能的主體代碼。
本系統(tǒng)軟件部分的設計包括變量的定義與初始化、數(shù)據(jù)采集、數(shù)據(jù)分析、顯示器設置等。軟件設計流程圖如圖5所示。
當Arduino UNO 控制器上電后,啟動本系統(tǒng)。首先完成系統(tǒng)初始化,執(zhí)行頭文件命令,由于系統(tǒng)采用液晶顯示器,需要包含頭文件“LiquidCrystal.h”。接著完成變量的定義與初始化等。
在setup()函數(shù)里,將LED、蜂鳴器引腳配置為OUTPUT 端口,串口波特率初始化為9600,LCD1602 初始化為16 列2 行,傳感器采集第一次數(shù)據(jù)等。
在loop()函數(shù)里,定時采集傳感器數(shù)據(jù),通過analogRead 函數(shù)讀取傳感數(shù)據(jù),并作數(shù)據(jù)分析,水位數(shù)據(jù)顯示在LCD1602 中。LCD1602 第一行顯示當前的日期,設置格式為“年-月-日”;第二行顯示“water:”字符串,其后顯示傳感數(shù)據(jù)。當傳感數(shù)據(jù)大于預設的報警值300 時,啟動LED 燈點亮、蜂鳴器報警。系統(tǒng)每隔3s 自動采集并更新數(shù)據(jù)于LCD1602 中。
為了測試系統(tǒng)的功能、穩(wěn)定性以及可行性,將系統(tǒng)分別置于空氣和水中,通過實驗采集數(shù)據(jù),記錄相應數(shù)值。如圖6所示,當水位傳感器置于空氣中,此時未浸入水中,水位傳感器采集到的數(shù)據(jù)為9,通過自定義函數(shù)完成數(shù)據(jù)轉(zhuǎn)換,LCD1602 中顯示為“009”。
如圖7所示,當水位傳感器浸入水中,將其采集到的數(shù)據(jù)顯示于LCD1602 中,本次采集數(shù)據(jù)為“611”,大于預設的報警值300,則觸發(fā)報警模塊,此時Arduino UNO 驅(qū)動LED 點亮,蜂鳴器發(fā)響,實現(xiàn)水位過高的報警機制。
本文設計并制作一款基于Arduino的水位監(jiān)測報警系統(tǒng),本系統(tǒng)電路設計簡明,實現(xiàn)實時監(jiān)測,定時更新并顯示水位的傳感數(shù)據(jù)。通過實驗表明,系統(tǒng)采集、數(shù)據(jù)處理、數(shù)據(jù)顯示等各功能可靠,報警響應迅速,滿足水位實時監(jiān)測的需求。