游曠吉吉,董自鵬,顧苗苗
(蘇州市職業(yè)大學(xué) 計(jì)算機(jī)工程學(xué)院,江蘇 蘇州 215104)
水是生命的源泉,隨著經(jīng)濟(jì)社會(huì)的快速發(fā)展和社會(huì)文明的進(jìn)步,人類對(duì)水資源的重視程度越來越高。傳統(tǒng)的人工抽樣檢測(cè)水質(zhì)既費(fèi)時(shí)又費(fèi)力,實(shí)現(xiàn)對(duì)水質(zhì)的實(shí)時(shí)監(jiān)測(cè),無論是對(duì)保護(hù)水資源還是促進(jìn)水產(chǎn)養(yǎng)殖都具有十分重要的意義[1]。
基于嵌入式的產(chǎn)品開發(fā),市場(chǎng)廣泛、功能擴(kuò)展性好[2]。本文基于STM32設(shè)計(jì)的水質(zhì)監(jiān)測(cè)系統(tǒng),可實(shí)現(xiàn)對(duì)被監(jiān)測(cè)水域的水溫和濁度自動(dòng)實(shí)時(shí)監(jiān)測(cè)并預(yù)警。
本系統(tǒng)以正點(diǎn)原子戰(zhàn)艦STM32F1 V3開發(fā)板作為控制器[3],總體設(shè)計(jì)采用STM32F103ZET6作為主控芯片[4],選用DS18B20溫度模塊和TSW-30濁度模塊作為傳感器[5],通過引腳設(shè)定和必要的外部電路連接,分別測(cè)量監(jiān)測(cè)水域的水溫和濁度,經(jīng)過信號(hào)處理和A/D轉(zhuǎn)換,將測(cè)量得到的數(shù)值顯示在TFTLCD液晶屏上,當(dāng)測(cè)量值超過設(shè)定的閾值時(shí),蜂鳴器報(bào)警,提醒現(xiàn)場(chǎng)工作人員,如圖1所示。
圖1 總體設(shè)計(jì)
本系統(tǒng)以STM32F103ZET6作為主控芯片,該芯片是意法半導(dǎo)體公司生產(chǎn)的一款32位Cortex-M3內(nèi)核的處理器[6],具有64 kB SRAM,512 kB FLASH、最高72 MHz的工作頻率,共有112個(gè)通用IO口,是一款低功耗、高性能的芯片。該芯片已在工程上被廣泛使用,很適合本系統(tǒng)的嵌入式開發(fā)。
DS18B20是由DALLAS半導(dǎo)體公司推出的一款“一線總線”接口的溫度傳感器,具有體積小、抗干擾性強(qiáng)、與微處理器接口簡(jiǎn)單的優(yōu)點(diǎn),測(cè)量溫度范圍-55~125 ℃,精度為±0.5 ℃,可在3.3~5.0 V的電壓范圍工作。使用時(shí)將DS18B20的平面部分朝內(nèi)、曲面部分朝外,按照電源線、DQ線、接地線的次序從左到右插入開發(fā)板U6的1、2和3腳,測(cè)量結(jié)果即會(huì)以9~12位數(shù)字量方式串行傳送,不需要再外接外圍元件。
濁度傳感器通過測(cè)量水中懸浮固體總量(TSS)的變化來測(cè)量水中懸浮顆粒物的光透過率和散射率,利用光來檢測(cè)懸浮顆粒物。傳感器默認(rèn)采用模擬信號(hào)的輸出模式,濁度越高輸出值越低,根據(jù)參考資料,輸出的電壓值和濁度關(guān)系,如圖2所示。在使用時(shí)電源線接開發(fā)板的5 V引腳,接地線接開發(fā)板的GND引腳,OUT接開發(fā)板的PA1引腳即可讀取到內(nèi)部ADC值,通過單片機(jī)的A/D轉(zhuǎn)換即可得到電壓值,進(jìn)而得到當(dāng)前水的濁度。
圖2 電壓與濁度關(guān)系
軟件部分使用C語言庫函數(shù)編寫,用MDK5軟件進(jìn)行編譯,用FlyMcu軟件將編譯好的.hex文件下載到STM32中,查看運(yùn)行效果。主要的函數(shù)模塊有DS18B20溫度模塊、濁度模塊和主函數(shù)模塊,程序控制流程,如圖3所示。
圖3 程序控制流程
DS18B20的典型溫度讀取過程為:復(fù)位→發(fā)SKIP ROM命令(0XCC)→發(fā)開始轉(zhuǎn)換命令(0X44)→延時(shí)→復(fù)位→發(fā)送SKIP ROM命令(0XCC)→發(fā)讀存儲(chǔ)器命令(0XBE)→連續(xù)讀出兩個(gè)字節(jié)數(shù)據(jù)(即溫度)→結(jié)束。轉(zhuǎn)化后得到的12位數(shù)據(jù)存儲(chǔ)在DS18B20的兩個(gè)8比特的RAM中,如圖4所示。二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于0,這5位為0,只要將測(cè)到的數(shù)值乘以0.062 5即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)得的數(shù)值需要取反加1再乘以0.062 5即可得到實(shí)際溫度。
圖4 DS18B20數(shù)據(jù)位表示
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //溫度為負(fù)
}else temp=1; //溫度為正
tem=TH; //獲得高八位
tem<<=8;
tem+=TL; //獲得低八位
tem=(float)tem*0.625; //轉(zhuǎn)換
if(temp)return tem; //返回溫度值
else return -tem;
代碼實(shí)現(xiàn)如上所示,先判定溫度的正負(fù),如果為負(fù),則將高低位的值都取反,反之則數(shù)據(jù)位保持不變動(dòng),再將測(cè)量得到的數(shù)值乘以0.625,將實(shí)際溫度擴(kuò)大10倍,輸出時(shí)再分別除以10取整以及取余作為整數(shù)部分和小數(shù)部分,小數(shù)點(diǎn)前后的數(shù)據(jù)分開輸出,并精確到0.1 ℃。
在獲取ADC的值時(shí),因?yàn)槭莻€(gè)實(shí)時(shí)變化的量,可能誤差較大,因此采用一定時(shí)間內(nèi)多次測(cè)量取平均值的方法,獲得adcx的值,提高精確度。代碼實(shí)現(xiàn)如下所示。
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t { temp_val= temp_val +Get_Adc(ch); delay_ms(5); } return temp_val/times; } adcx=Get_Adc_Average(ADC_Channel_1,10);//采樣10次 因?yàn)镾TM32的ADC是12位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器,其值為0~4 095,定義一臨時(shí)變量temp,用于儲(chǔ)存測(cè)量得到的adcx值轉(zhuǎn)換為0~4.5 V的電壓值。當(dāng)temp小于2.64時(shí),直接輸出NTU的值3 000(表示水極度渾濁);當(dāng)temp大于4.2時(shí),直接輸出NTU的值0(表示水比較清澈);當(dāng)temp介于2.64~4.20之間時(shí),根據(jù)公式-1 120.4*temp*temp+5 742.3*temp-4 352.9,求得NTU的值。代碼實(shí)現(xiàn)如下所示。 temp=(float)adcx*(4.5/4096); if(temp<2.64) NTU=3000; else if(temp>4.2) NTU=0; else NTU=-1120.4*temp*temp+5742.3*temp-4352.9; 主函數(shù)主要包括定義一定的變量,完成延時(shí)函數(shù)初始化、設(shè)置中斷優(yōu)先級(jí)、串口初始化、LED端口初始化、蜂鳴器初始化、LCD顯示屏初始化、STM32內(nèi)部ADC初始化、DS18B20初始化和中文字庫初始化等。 if(t%10==0) //每100ms讀取一次 { temperature=DS18B20_Get_Temp(); if(temperature<0) { LCD_ShowChar(30+40,210,'-',16,0); //顯示負(fù)號(hào) temperature=-temperature; //將負(fù)數(shù)轉(zhuǎn)為正數(shù) }else LCD_ShowChar(30+40,210,' ',16,0); //原負(fù)號(hào)的位置不顯示 LCD_ShowNum(30+40+8,210,temperature/10,2,16); //顯示整數(shù)部分 LCD_ShowNum(30+40+32,210,temperature%10,1,16); //顯示小數(shù)部分 } delay_ms(10); t++; if(t==20) { t=0; } 通過t的計(jì)數(shù)和延時(shí),每100 ms獲取一次DS18B20測(cè)得的temperature并進(jìn)行判定,如果小于0,就顯示“-”號(hào)并將值取反,否則就顯示空白,然后將temperature分別除以10取整以及取余作為整數(shù)部分和小數(shù)部分輸出在屏幕上。 系統(tǒng)通電后,將傳感器放入水中,即可在TFTLCD液晶屏上正常顯示采集到的數(shù)據(jù)。分別選取一定程度的渾濁水和清澈水,模擬測(cè)試圖,如圖5和6所示:渾濁水測(cè)試結(jié)果NTU的值為2 407,水溫為20.1 ℃;清澈水測(cè)試結(jié)果NTU的值為0,水溫為20.5 ℃。系統(tǒng)設(shè)定:當(dāng)水溫值低于10 ℃或高于30 ℃、濁度值高于2 800時(shí),蜂鳴器報(bào)警。 圖5 渾濁水測(cè)試 圖6 清澈水測(cè)試 本系統(tǒng)在設(shè)計(jì)和實(shí)現(xiàn)的過程中僅加入了單一的溫度和濁度傳感器,具有投入小、適用范圍廣的優(yōu)勢(shì)。但當(dāng)被監(jiān)測(cè)的水域面積足夠大時(shí),可能無法客觀地反映整體水域的水質(zhì)情況,并且不同深度的水質(zhì)情況也會(huì)存在差異,可利用STM32良好的功能擴(kuò)展性,通過多布局傳感器節(jié)點(diǎn)、統(tǒng)一收集數(shù)據(jù)管理分析的方式,更為全面地反映整體水域的水質(zhì)情況。后期還可添加溶氧、酸堿度、電導(dǎo)率、氨氮、亞硝酸鹽pH等傳感器,多參數(shù)更為科學(xué)地、綜合地評(píng)價(jià)水質(zhì)情況;還可添加LoRa無線傳輸模塊和GPRS通信模塊,通過無線傳輸?shù)姆绞綄?shù)據(jù)傳送至遠(yuǎn)端計(jì)算機(jī)保存,實(shí)現(xiàn)遠(yuǎn)程實(shí)時(shí)監(jiān)測(cè)。3.3 主函數(shù)模塊
4 系統(tǒng)測(cè)試
5 結(jié)語