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

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

圖2 DHT11傳感器測(cè)試結(jié)果
2.1SD卡寫(xiě)入流程設(shè)計(jì)
圖3為SD卡寫(xiě)入流程設(shè)計(jì)的過(guò)程。對(duì)于SD卡存儲(chǔ)數(shù)據(jù),首先對(duì)單片機(jī)進(jìn)行初始化,主要是初始化單片機(jī)的SPI串口,然后初始化SD卡,下來(lái)就會(huì)將文件打開(kāi),再接下來(lái)就是對(duì)文件的打開(kāi)是否正確進(jìn)行判斷,如果文件的打開(kāi)是正確的,那么接下來(lái)就開(kāi)始寫(xiě)文件,完成后就會(huì)把文件關(guān)閉;如果打開(kāi)不正確,就會(huì)重新打開(kāi)。

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

圖4 串口測(cè)試結(jié)果

圖5 SD卡的內(nèi)容
3.1主控流程設(shè)計(jì)
圖6是數(shù)據(jù)采集存儲(chǔ)的流程設(shè)計(jì)。具體體操作為:首先對(duì)系統(tǒng)進(jìn)行初始化,實(shí)現(xiàn)I/O和SPI串口的初始化,然后單片機(jī)給DHT11發(fā)送開(kāi)始信號(hào),并判斷DHT11是否響應(yīng),若響應(yīng),則開(kāi)始數(shù)據(jù)的采集,再打開(kāi)文件將采集的數(shù)據(jù)寫(xiě)入文件,寫(xiě)完之后關(guān)閉該文件結(jié)束;若未響應(yīng),則返回。

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

圖7 采集存儲(chǔ)測(cè)試結(jié)果
由于采集的數(shù)據(jù)存儲(chǔ)在SD卡,所以通過(guò)計(jì)算機(jī)打開(kāi)SD卡,可以看到數(shù)據(jù)的文件是M.TXT文件,其大小是10.7 KB (11,052字節(jié))。打開(kāi)M.TXT文件,見(jiàn)下圖7,圖中H是濕度,某一時(shí)刻的濕度值是49.0%;T代表溫度,27.0是某一時(shí)刻的溫度值。
以上所述就是溫濕度采集存儲(chǔ)系統(tǒng)設(shè)計(jì)的系統(tǒng)軟件研究的整個(gè)過(guò)程。那么利用這個(gè)設(shè)計(jì),我們給定設(shè)計(jì)環(huán)境后,可以在圖7的溫濕度數(shù)據(jù)提取,利用作圖軟件可以作出溫濕度的變化曲線(xiàn)。
[1] 王剛.溫室溫濕度控制系統(tǒng)設(shè)計(jì)[J].中國(guó)新技術(shù)新產(chǎn)品.2011(09).
[2] 陳呂洲.Arduino程序設(shè)計(jì)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,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