吳云沛,胡永金,張西平
(湖北汽車工業學院,湖北十堰,442002)
Wu Yunpei,Hu Yongjin,Zhang Xiping
(Hubei University Of Automotive Technology,Shiyan Hubei,442002)
溫濕度采集存儲系統設計的系統軟件研究
吳云沛,胡永金,張西平
(湖北汽車工業學院,湖北十堰,442002)
本文介紹了溫濕度傳感器的檢測流程、存儲軟件的SD卡寫入流程和主控軟件的設計、程序開發和測試結果。
溫濕度傳感器; 單片機
Wu Yunpei,Hu Yongjin,Zhang Xiping
(Hubei University Of Automotive Technology,Shiyan Hubei,442002)
1.1關于溫濕度傳感器檢測流程的設計
DHT11數字溫濕度傳感器采集一次數據的流程如圖1所示。其具體操作為:首先,對單片機進行初始化,實現I/O管腳的配置,然后單片機給DHT11發送開始信號,接下來看DHT11是否有信號響應,如果沒有的話,單片機就會再次發送開始信號;如果獲得響應信號,則單片機實現數據采集,將采集的40位數據發送給單片機,校驗和,如果不正確,則丟棄;如果正確的話,會把數據進行轉化,也就是把二進制轉成十進制,完成。

圖1 傳感器單次數據采集流程示意圖
1.2關于溫濕度傳感器的測試程序開發
此程序的開發來源于傳感器采集數據流程圖。首先定義DHT11的管腳,根據接口電路設計的連接方式,定義A0號引腳為信號的輸入腳,對應傳感器的輸出信號引腳,以字節的方式讀取數據。接下來就是對單片機進行初始化。要實現這個過程部分編譯為:
DDRC |= _BV(DHT11_PIN);//初始化單片機
PORTC |= _BV(DHT11_PIN);
單片機初始化后,首先單片機將A0口變為低電平,確保DHT11能檢測到起始信號,至少等待18ms,等到其開始信號完成后,還需要等待40us,然后就是對DHT11有沒有響應做判斷,如果沒有響應,就會返回;如果有響應,此時低電平狀態延時等待80us,然后會把DHT11的低電平改為高電平,延時等待80us。部分編譯如下:
byte read_dht11_dat()//以字節讀取數據
PORTC &= ~_BV(DHT11_PIN);
delay(18);//將單片機的A0口拉為低電平至少18ms
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);//單片機將開始信號發送給DHT11
if(dht11_in){//判斷DHT11是否響應
return;
}
delayMicroseconds(80);//延時等待80us
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
return;
}
delayMicroseconds(80);//延時等待80us
DHT11開始傳送數據,單片機接收到DHT11發送的40位數據,然后校驗和,判斷校驗和是否正確。部分編譯如下:
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_ dat[1]+dht11_dat[2]+dht11_dat[3]; //校驗和
if(dht11_dat[4]!= dht11_check_sum)
{;
}
根據以上部分編譯,然后具體編譯,在setup()函數中完成單片機的初始化,在loop()函數中完成溫濕度數據的采集,再加入delay()函數,每間隔一定時間重復一次loop()中的程序。為了便于測試,則運用Arduino IDE中的軟件串口,這樣就可以實時的通過軟件串口來顯示溫濕度傳感器的數據。在setup()中,配置軟件串口的速率為19200bps,具體為:Serial.begin(19200)。
1.3關于溫濕度傳感器測試結果的表述
將編譯好的程序代碼通過USB下載至Arduino UNO開發板上,然后打開串口監視器,結果如果是如圖2所示的。Read是串口輸出準備,Current humdity=56.0%是當時的濕度數據,temperature=27℃是當時的溫度數據,這種結果表明傳感器已經響應,數據的采集正在進行中。進一步說明,DHT11數字溫濕度傳感器可以正常采集數據,如果還沒有連接到傳感器或讀取數據錯誤,則可能會看到其他錯誤的提示。

圖2 DHT11傳感器測試結果
2.1SD卡寫入流程設計
圖3為SD卡寫入流程設計的過程。對于SD卡存儲數據,首先對單片機進行初始化,主要是初始化單片機的SPI串口,然后初始化SD卡,下來就會將文件打開,再接下來就是對文件的打開是否正確進行判斷,如果文件的打開是正確的,那么接下來就開始寫文件,完成后就會把文件關閉;如果打開不正確,就會重新打開。

圖3 SD卡一次寫入的流程示意圖
2.2SD卡測試程序開發
由圖3可知,我們先要建一個文件夾,然后給其命名。然后定義SD卡的CS引腳,根據SD卡接口電路的設計,將SD卡的CS連接到單片機的10號引腳,初始化單片機的SPI串口,初始化SD卡,然后打開文件,實例如下編譯:
pinMode(10, OUTPUT);//設置10引腳為輸出模式
myFile = SD.open("test.txt", FILE_WRITE);//打開文件
把文件打開以后,同時判斷有沒有正常打開,如果是正常打開的,就會開始寫文件,完畢后關閉文件,終止。部分程序編譯如下:
myFile.close();//關閉文件
文件關閉之后再打開已經寫入內容的文件,然后再編寫程序:
m y F i l e = S D.o p e n("t e s t.t x t");//重新打開文件
這個程序的setup()函數主要是完成對SD卡的初始化與打開文件,然后對文件是不是正常的作出判斷,并讀取第二次打開文件中的內容,完成后將文件關閉。在loop()中沒有這個操作,那是由于這個程序只運行一次 。為了便于測試,則運用Arduino IDE中的軟件串口,這樣就可以實時的通過軟件串口來顯示SD卡中寫的內容。在setup()中,配置軟件串口的速率為9600bps,具體為:Serial.begin(9600)。
2.3SD卡讀寫測試結果
將編譯好的程序代碼通過USB下載至Arduino UNO開發板上,然后打開串口監視器,結果若是如圖4所示,testing 1,2,3.,是寫入SD卡的內容。然后通過計算機打開SD卡,可以看到文件名為TEST.TXT,如圖5所示,寫入的信息為testing 1,2,3,說明SD卡寫入的數據正確,進一步說明SD卡可寫。

圖4 串口測試結果

圖5 SD卡的內容
3.1主控流程設計
圖6是數據采集存儲的流程設計。具體體操作為:首先對系統進行初始化,實現I/O和SPI串口的初始化,然后單片機給DHT11發送開始信號,并判斷DHT11是否響應,若響應,則開始數據的采集,再打開文件將采集的數據寫入文件,寫完之后關閉該文件結束;若未響應,則返回。

圖6 一次數據采集存儲流程示意圖
3.2主控程序設計
對于主控程序的設計,主要是溫濕度傳感器進行數據的正確采集,然后打開文件,將采集的數據正確寫入SD卡,以實現數據存儲的功能。具體步驟如下表述,第一步,先將系統初始化,這里的初始化主要指A0口和單片機的SPI的初始化,我們分別定義A0號引腳為信號的輸入,單片機10、11、12、13號引腳,把10號引腳設置成輸出模式,11號引腳設置成數據輸出模式,12號引腳設置成數據輸入模式,13號引腳設置成時鐘輸出模式。具體編譯如下:
int chipSelect = 10;//定義管腳
int dataOut =11;
int dataIn = 12;
int clockPin = 13;
pinMode(chipSelect,OUTPUT);//初始化單片機的SPI引腳和I/O引腳
pinMode(dataIn,INPUT);
pinMode(dataOut,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(A0,OUTPUT);
以字節的方式讀取數據,部分編譯如下:
byte read_dht11_dat()
{
byte i = 0;//定義變量
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN)));//當開始發送數據時,等待50秒
delayMicroseconds(30);//延時等待30微妙
if(PINC & _BV(DHT11_PIN))//判斷第一個位數據是否發送完
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN)));//當第一個位數據發送完后,返回進行下一個
}
return result;
}
然后在void setup()函數中,對單片機進行初始化。在void loop()函數中進行數據的采集,其程序與5.1.2節中的部分程序一樣,數據采集之后,然后打開文件,將采集的數據寫入SD卡,由于單片機內部有A/D轉換功能,因此寫入的程序是十進制數據,寫完之后關閉文件,每間隔一定時間重復一次loop()中的內容。
部分編譯如下:
byte dht11_dat[5];//用于緩存DHT11溫濕度數據
byte dht11_in;
byte i;
3.3采集存儲測試結果

圖7 采集存儲測試結果
由于采集的數據存儲在SD卡,所以通過計算機打開SD卡,可以看到數據的文件是M.TXT文件,其大小是10.7 KB (11,052字節)。打開M.TXT文件,見下圖7,圖中H是濕度,某一時刻的濕度值是49.0%;T代表溫度,27.0是某一時刻的溫度值。
以上所述就是溫濕度采集存儲系統設計的系統軟件研究的整個過程。那么利用這個設計,我們給定設計環境后,可以在圖7的溫濕度數據提取,利用作圖軟件可以作出溫濕度的變化曲線。
[1] 王剛.溫室溫濕度控制系統設計[J].中國新技術新產品.2011(09).
[2] 陳呂洲.Arduino程序設計基礎[M].北京:北京航空航天大學出版社,2014.1.
Research on the system software of temperature and humidity acquisition and storage system
This paper introduces the testing process of temperature and humidity sensor,the SD card writing process of storage software and the design,program development and test results of the main control software.
temperature and humidity sensor;MCU