液晶模塊" title="液晶模塊">液晶模塊制作溫濕度計(jì)" title="溫濕度計(jì)">溫濕度計(jì)Digital Thermometer" height="375" src="http://files.chinaaet.com/images/20111026/6194c4c9-4595-4678-8376-36637a404e98.jpg" width="521" />
圖1
在上次介紹的日歷鐘的基礎(chǔ)上擴(kuò)展一下:讓它具備檢測(cè)大氣溫度和濕度的功能,,一天24小時(shí)不間斷運(yùn)行并定時(shí)檢測(cè),,于是,,日歷鐘就搖身一變成為一個(gè)小小溫濕度計(jì)啦。雖然氣象要素很多,,不過我們最常用的就是氣溫和濕度,。一個(gè)是冷熱程度,一個(gè)是環(huán)境空氣中含水蒸氣的多少,。一般家用溫度計(jì)很常見,,濕度計(jì)就比較少,以前有一種干濕球溫度計(jì),,但是用起來比較麻煩,,準(zhǔn)確度也不高。現(xiàn)在應(yīng)用電子技術(shù)我們就可以做一個(gè)可以同時(shí)顯示溫度,、濕度,、時(shí)間的小儀器" title="儀器">儀器,放在家里以便隨時(shí)監(jiān)測(cè)我們的小環(huán)境,。它的特點(diǎn)如下:
1.在單片機(jī)ATMega8L-8PU(以下簡(jiǎn)稱M8)和日歷鐘電路DS1302的基礎(chǔ)上,,使用一個(gè)在工廠經(jīng)過精密校準(zhǔn)的數(shù)字式溫度、濕度傳感器AM2301作為探頭,;
2.當(dāng)24小時(shí)連續(xù)工作時(shí),,縱然工作電流僅為幾毫安,也不宜使用紐扣電池供電,。這次選用可充電的3.6V聚合物鋰電池,,使它的放置地點(diǎn)可以不受電源限制,可以在室內(nèi),,也可以在不受陽光直射和雨水接觸的室外,;
3.具有文字和圖形界面,可以顯示溫度和濕度數(shù)值,,以及12小時(shí)內(nèi)的濕度變化記錄曲線,,為什么是濕度曲線呢?因?yàn)闅鉁氐淖兓?guī)律一般比較穩(wěn)定,,濕度就不一樣了,,我們可以從濕度變化趨勢(shì)估計(jì)一下未來的晴雨可能,這比看燕子飛高飛低要靠譜些吧,??jī)蓚€(gè)界面用按鍵切換,;
4.具備鋰電池線性充電電路,通過USB接口從外部取得5V電源,,一邊供給充電,一邊維持電路繼續(xù)工作,;
全部元器件安裝在一塊70mm×90mm的小萬用板上,,正面,、背面外形見圖1、圖2,。正面左邊那個(gè)黑色小烏龜殼就是溫濕度探頭,。
圖2 電路板背面元器件分布和連線
電路原理
電路見圖3。圖形點(diǎn)陣液晶,、單片機(jī)M8,、時(shí)鐘電路DS1302和上次小小日歷鐘基本相同,不再重復(fù),。有兩點(diǎn)稍稍不同:
1.液晶的控制雖然還是通過M8的PD口,,但具體接線有所改變,不再占用兩根串口線PD0和PD1,,目的是為今后可能和外部通信預(yù)留接口,。這好辦,編程時(shí)重新定義即可,;
2.因?yàn)槌S秒娫词菐ПWo(hù)板的3.6V充電鋰電池(圖3中GB2),,它放完電會(huì)自動(dòng)切斷,為了使DS1302繼續(xù)工作,,必須另外使用一片3V紐扣鋰電池CR1225(圖3中GB1)作為時(shí)鐘芯片的后備電池,。也可用法拉電容,但較貴,。
圖3 電路原理圖
圖4 AM2301的讀寫時(shí)序脈沖示意圖
TRH是數(shù)字式溫濕度傳感器 AM2301,。它內(nèi)部有經(jīng)過校準(zhǔn)的電容式濕度傳感器和負(fù)溫度系數(shù)熱敏電阻(NTC),以及8位單片機(jī),??蓽y(cè)量溫度范圍是-40~+80℃,精度最大±1℃,,濕度范圍是0%~100%,,常溫時(shí)精度±3%,分辨率都是0.1,。溫度信號(hào),、濕度信號(hào)最后都轉(zhuǎn)換為一個(gè)40位的二進(jìn)數(shù)串行輸出。其中的高16位是濕度,,中16位是溫度,,低8位是校驗(yàn)和,當(dāng)高16位加中16位等于低8位時(shí),,說明測(cè)量結(jié)果正確,,可以采信。它使用單線總線結(jié)構(gòu),接線很簡(jiǎn)單,,一共就3根線:圖3中的R表示紅線,,接電源(3.3~5.5VΩ),Y表示黃線,,是信號(hào)線,,按照要求需要外接5kΩ上拉電阻R2,接M8的PC5引腳,。B表示黑線,,接地。
輕觸按鈕S1~S5還是作校時(shí)用,,沒有變化,。
為了給400mAh的鋰電池充電,通過USB插頭把外部的5V電壓加到智能線性充電模塊TP4054,。另外一個(gè)2×2微型自鎖開關(guān)S6可以選擇電池供電,,或者電池充電。充電時(shí)5V外部電壓經(jīng)穩(wěn)壓器WY1降低為3.3V為VCC供電,。
用上蓄電池了,,液晶背光也可以“奢侈點(diǎn)”,偶爾用它一下,。為此,,增加了限流電阻R3和輕觸按鈕S5。
硬件組裝
這個(gè)溫濕度計(jì)電路簡(jiǎn)單,,所需元件不多,。除了溫濕度傳感器和充電模塊比較特殊以外,其他都是普通元件,。幾個(gè)電阻和退耦電容都是用的貼片元件,,尺寸是 0805,和洞洞板可以很好地配合,。當(dāng)然也可用普通的引線電阻,、電容。集成電路使用雙列直插插座反裝,,這樣就有效利用了正面液晶屏占用的面積,。具體做法和小小日歷鐘一樣。
溫濕度傳感器和充電模塊我都是從淘寶網(wǎng)上買的,,搜一下“DHT21”和“TP4054”就可以找到大把,,價(jià)格不高。溫濕度探頭的敏感元件都是裝在通風(fēng)透氣的烏龜殼內(nèi),,膠死了打不開,,也就不要試圖暴力拆解了,,以免污染了敏感元件影響性能。
反面焊裝IC插座的辦法是先把引腳向外折平(這樣子它更像小蜈蚣了),,然后把引腳尖端稍向下彎,,在洞洞板反面定位后,用尖頭鑷子把引腳尖端逐一捅進(jìn)焊盤洞洞里,,外接引線也插入相應(yīng)洞洞里,一并焊接,。
要注意兩個(gè)鋰電池最后安裝,,安裝前必須先檢查已經(jīng)裝好其他元器件和接線的電路板,確認(rèn)VCC和地端沒有短路故障,。在焊接前電池先不開封,,避免不小心正負(fù)極短路,以至于“出師未捷身先死”,。帶引腳的紐扣電池焊好即固定了,,充電電池則用較厚的雙面膠粘接在電路板反面固定。完工后四角一定要裝上墊柱,,避免電路板直接與平面接觸,。
其他就沒有什么訣竅了,也就不再搞看圖識(shí)物,。7cm×9cm的洞洞板安裝全部元件很寬松,,實(shí)際上要想使這個(gè)小玩意工作起來,還要靠“軟功夫”,。下面一一分解,。
編程之一:AM2301的讀寫時(shí)序
前面說過,溫濕度探子輸出的是40位的二進(jìn)數(shù),。在探頭進(jìn)行測(cè)量并輸出數(shù)據(jù)前,,主控單片機(jī)M8和探頭有個(gè)握手過程,步驟是:
M8的PC5空閑時(shí)一直為高,,數(shù)據(jù)線處于釋放狀態(tài),。要啟動(dòng)測(cè)量,M8就在PC5輸出低,,使數(shù)據(jù)線拉低1ms以上(程序中用的10ms),,把PC5轉(zhuǎn)為輸入狀態(tài),外部上拉電阻R2立即使數(shù)據(jù)線升高,。在40μs以內(nèi)探頭發(fā)出響應(yīng):把數(shù)據(jù)線拉低80μs,。M8讀到這個(gè)低電平,知道探頭回話了,,接著探頭也釋放數(shù)據(jù)線80μs,,M8就明白隨后就是數(shù)據(jù)了。數(shù)據(jù)總是以50μs低電平先導(dǎo),隨后并不是以電平高低表示1,、0,,而是以高電平脈沖寬度表示1、0:70μs表示 1,,26~28μs表示0,。為了識(shí)別1和0,M8可在讀先導(dǎo)低電平完成后,,延時(shí)35μs再次讀數(shù)據(jù)線,,如果為高,就是1,,如果為低,,就是0。探頭連續(xù)送出 40個(gè)低-高脈沖后,,再次拉低數(shù)據(jù)線50μs,,結(jié)束數(shù)據(jù)送出。脈沖示意圖如圖4,。
實(shí)際使用時(shí)還要注意,,測(cè)量應(yīng)進(jìn)行兩次:第一次測(cè)量后,過2s再測(cè)一次,,這次M8讀出的數(shù)據(jù)是兩秒前的測(cè)試數(shù)據(jù),。如果連續(xù)測(cè)量,間隔2s最好,,無論如何不得小于1s,。實(shí)際上氣溫和濕度一般也不會(huì)變化那么快。現(xiàn)在做的是每分鐘測(cè)兩次:在0s和2s各測(cè)一次,,2s讀出0s的數(shù)據(jù),,0s讀的是上一分鐘的數(shù)據(jù),就丟棄了,。
編程之二:AM2301的數(shù)據(jù)格式
如果數(shù)據(jù)正確(通過檢查和校驗(yàn)),,就需要把高16位濕度數(shù)據(jù)換算成十進(jìn)位的3位數(shù):000到999。在個(gè)位和十位間加上小數(shù)點(diǎn),,就是濕度的百分值,。例如 M8讀出的高16位是0B0000001100001101=512+256+8+4+1=781。濕度就是78.1%,。溫度類似,,但是如果溫度最高位為 1,意味著零下溫度,。
編程之三:怎樣畫出記錄曲線
要畫出一段時(shí)間的記錄曲線,,也就是在液晶上面按照這也就是在液晶上面按照這段時(shí)間順序記錄的數(shù)值畫出對(duì)應(yīng)的點(diǎn),。
在這塊圖形液晶畫點(diǎn)的基本方法前次已經(jīng)介紹過,就是先設(shè)置列坐標(biāo)x和頁坐標(biāo)y,,再寫數(shù)據(jù),,用LCDSetxy(unsigned x,unsigned y)和LCDWriData(unsigned data)兩個(gè)函數(shù)就可以在x列y頁點(diǎn)亮任意8個(gè)點(diǎn),。但是如果直接用頁坐標(biāo)來畫出通常用垂直坐標(biāo)(行坐標(biāo))表示的點(diǎn)則非常不便,。
圖5 12小時(shí)內(nèi)的溫度變化記錄曲線
要按照列坐標(biāo)x和行坐標(biāo)h(h從0到63共計(jì)64行)來畫一個(gè)點(diǎn),而這正是畫記錄曲線的基礎(chǔ),,我們可以變換一下,,先用h/8算出h所在的頁,例如h為45,,那么它就在45/8即5頁。而余數(shù)h%8就是h在該頁的第幾位(現(xiàn)在是第5位),,讓一個(gè)數(shù)unsigned char tmp=0x01;那把它左移5位得到的數(shù)值0x20就是用列坐標(biāo)和頁坐標(biāo)畫點(diǎn)時(shí)需要給液晶輸入的數(shù)值,。這些數(shù)值對(duì)于每次僅僅1個(gè)點(diǎn),從低位到高位只能對(duì)應(yīng)于0x01,、0x02,、0x04、0x08,、0x10,、0x20、0x40,、0x80這8個(gè)數(shù)中的一個(gè),。這樣我們可以捏造一個(gè)函數(shù) LCDPutDot(unsigned char x,unsigned h),;來在x列,,h行畫出一個(gè)點(diǎn)了,具體代碼見后文,。形式上用行列坐標(biāo)參數(shù),,實(shí)質(zhì)上還是頁列坐標(biāo)參數(shù),但卻方便多了?,F(xiàn)在再回到怎樣畫濕度記錄曲線,。由于液晶像素的限制,水平只能取128點(diǎn)以下,。那么如果每6分鐘記錄一次,,12小時(shí)就記錄120次,把這120次的濕度數(shù)值和液晶的垂直方向點(diǎn)位置(與行坐標(biāo)成比例)對(duì)應(yīng)起來畫一系列點(diǎn),,不就是記錄曲線嗎,?當(dāng)然垂直方向只有64點(diǎn),,那么我們就取51點(diǎn),0到50表示0到100,。還要提醒的是,,液晶的垂直方向,0點(diǎn)在最上面,,這和通常的習(xí)慣相反,。那也沒關(guān)系,就把(100-h)/2作為垂直坐標(biāo)就對(duì)了,,為簡(jiǎn)單計(jì),,可略去小數(shù)。
至此幾個(gè)編程的關(guān)鍵都說完了,。按此在程序中加入了新增的函數(shù):
unsigned char DHT21_ReadByte(void);//讀探頭串行數(shù)據(jù)
void DHT21_RHT(void);//發(fā)起檢測(cè),,讀數(shù)
void Show_RHT(void);//顯示檢測(cè)值
void LcdPutDot(unsignedcharx,unsignedcharh);//畫點(diǎn)
函數(shù)具體內(nèi)容見附件程序,。
為了描繪12小時(shí)的記錄曲線,,還要設(shè)立一個(gè)120單元的濕度記錄數(shù)組unsigned charRH_record[120],好在M8的數(shù)據(jù)區(qū)有512字節(jié),,還很富裕,。
每6分鐘往里面順序填入一個(gè)記錄,記滿后又從0單元開始,。
整個(gè)程序流程和日歷鐘基本相同,,但有改變:
啟動(dòng)→M8初始化→LCD初始化→檢查1302是否已經(jīng)運(yùn)行中,如否則要初始化并啟動(dòng)它→讀取1302數(shù)據(jù)→打開顯示界面(標(biāo)題,、正文和最下面的顯示行)→檢測(cè)溫濕度→延時(shí)2秒→給記錄數(shù)組賦以初值→再次檢測(cè)溫濕度→顯示溫濕度→進(jìn)入程序循環(huán),。
程序循環(huán)是設(shè)置一個(gè)用于軟件計(jì)數(shù)的靜態(tài)變量:const unsigned int delta=0;在主循環(huán)while(1){}中當(dāng)delta未達(dá)到設(shè)定值例如3800前它每次遞增,達(dá)到設(shè)定值后再查鍵→健處理→如果秒數(shù)值改變就刷新日歷鐘的顯示,。
有所改變的是如果計(jì)時(shí)達(dá)到1分鐘,,就開始一次檢測(cè)溫濕度→2秒后再檢測(cè)并更新溫濕度顯示→如果是6的整數(shù)倍分鐘,則還要在濕度記錄數(shù)組中填入新的濕度記錄,。
在S4的按鍵功能觸發(fā)時(shí)就按照濕度記錄數(shù)組的數(shù)值逐一繪點(diǎn),,形成曲線。其中還包括水平和垂直標(biāo)尺的繪制和當(dāng)前記錄位置指針的繪制,。
調(diào)試
調(diào)試過程和小小日歷鐘類似,,就不重復(fù)了。只要元件正常,,接線正確,,加電后把程序注入M8立刻就可以運(yùn)行。繪制曲線則要等到1小時(shí)以后才畫出一小段,。經(jīng)過 12小時(shí)曲線完成,,你就可以知道過去12小時(shí)的濕度變化趨勢(shì)了,。按照我這里來看(番禺郊區(qū)),濕度波動(dòng)還是蠻大的,,晴熱時(shí)可以低到40%,,一下暴雨會(huì)升高到80%以上。
如果發(fā)現(xiàn)溫度,、濕度顯示都為0,,那么檢查探頭接線是否有斷開。如果突然不顯示了,,那么恭喜你,!鋰電池保護(hù)板發(fā)揮了作用,沒電了,!趕快切換S6充電吧,!在這個(gè)基礎(chǔ)上還能進(jìn)一步改進(jìn):找出24小時(shí)內(nèi)的最高溫濕度和最低溫濕度;設(shè)定報(bào)警點(diǎn),,實(shí)現(xiàn)超限報(bào)警以及把信號(hào)發(fā)送出去等,,就靠你啦!
使用
把它充好電,,按一下S6,切到電池供電位置就可以了,,把它放在桌上,、掛在墻上都可以,只要不陽光直射,,陰涼通風(fēng)就可以,。充一次電大約需要90分鐘,充好后可以用三天以上,。