2015年11月25日 星期三

土砲自製 ---- 我的溫度記錄站



這次實做的作品是「我的溫度記錄站」,使用的硬體是樹莓派、Arduio與DHT22溫度感測器。記錄站的功能是偵測溫度、顯示溫度與記錄溫度,同時樹莓派內也運行一個小網站,可以用來查詢溫度的記錄。在本文寫成時間,可以從這裡(163.30.47.6)連到樹莓派,查詢溫度記錄(不保証長久運行)。



在今年暑假中,複習兼學習一些動態網頁的技術。偶爾也在思考,動態網頁與實體互動能做出什麼?另外,之前買的樹莓派都還沒好好利用,一直覺得有點可惜。這些因素加起來,就產生了製作一個溫度記錄站的想法。

一開始有點小看這個點子,想說一兩個星期就可以做出,沒想到做了將近一個半月的時間才完成。

下圖是完成後的樣子(呃…很土砲吧)



使用到的硬體如下圖說明, 除了樹莓派2、Arduino、DHT溫度感測器以外,還有使用一個84x48的單色液晶(PCD8544),與兩個按鈕。



因為使用到樹莓派,所以也會提到使用的軟體。這次的實作有將近8成的時間都在程式的編寫上。樹莓派可以使用到廣大linux與open source的資源。所以這次的作品有的程式部分佔很大,有讀取arduino的程式、控制液晶的程式、使用按鈕開關的程式、有Web伺服器、動態網頁、還有記錄溫度資料庫的記錄與查詢,而且要把這些都整合起來實現記錄站的功能,算是一個不小的挑戰。雖然過程很辛苦,一直在寫code,一直換不同的context,主程式一直修修改改,真的很辛苦,不過換來的是滿滿的充實感。

整個作品的軟硬體架構概念圖如下:




在中間製做時,因為時間不多,常常要把作品白天帶到學校,晚上帶回家,所以就想找個架子方便實作。之前看到我家小孩的槌子玩具,覺得很適合,而且還有洞洞,到時方便穿線與理線,實在是Maker理想中的框體啊(…不要理我)

下圖是使用的木架與積木:


放上麵包板與Arduino


 簡單的用泡棉膠固定


做出溫度記錄站的初步樣子


首先是關鍵的測量溫度感測器,之前有買個DHT11的溫溼度感測器,不過因為比較便宜且溫度的精確度只能到整數位,覺得不理想,所以就找了DHT22,溫度方面可以測到小數一位。(作品以溫度為主,故不做溼度記錄),下圖是DHT22



再來是DHT22感測器的連接,有找到DHT22以樹莓派直接讀取溫度的作法,不過因為想要結合原有Arduino的資源,也想練一練Serial通訊的程式,所以就決定將DHT22接在Arduino上。

這邊也有個小插曲,原本使用的是Arduino Nano(買來一直沒用過),但是在過程中,會偶會找不到USB serial,必需重插USB。尤其是每次樹莓派開機後都會遇到,由於主程式是要開機自動執行,為了這個卡了一陣子,後來發現換成Arduino UNO後,USB serial的連線就很穩定了。


Arduino會每2秒就送出包含感應值的字串,準備送出資料給樹莓派。網路上查資料時,有說DHT22是很慢的感應器,每2秒讀取已是極限,在後來的實作測試也發現,DHT22的溫度升或降都很慢(用吹風機吹過的結論),不過空氣溫度的感測多是長期的,所以還OK,需要靈敏溫度變化的,就要另找適合的感測器了。
下圖是Arduino經由serial連接埠送出的資料


接著是使用一個小螢幕的單色液晶顯示溫度。其實記錄站可以不做這個部份,但是如果都只是用網路,而當場看不到溫度資料,實在很沒有Maker的Feeling,所以還是決定要來實作這個部份。

選用的單色液晶是PCD8544,早期Nokia的手機曾經使用過,大小是84x48點。
下圖是買來時找到的例子,在液晶上顯示系統資訊。不過必需以C語言來寫,且因為我偷懶,買的是免焊直接使用的模組,後來發液晶現腳位被固定,只能使用軟體SPI,無法使用樹莓派的硬體SPI,一開始還好,但是主程式寫到後來,常會有液晶畫面更新來不及或錯位的情形,而且這個液晶模組可以直接插在樹莓派上,但是也佔用了許多未用針腳位置(實際上不需那麼多)。所以有時得與失真的很難說,尤其是網路購買零件,有些情形要買了才知道。

                                      

一開始在研究這個液晶時,也有練習用bitmap的圖(單色黑白圖),把圖案畫在液晶。
下面兩個照片是記錄站主程式開機時的Logo:




原有的PCD8544程式庫,因為是外國網友寫的,所以文字方面只能使用ASCII的字元,無法顯示中文。另一個問題是我的主程式預計要用Python來寫,而這個程式庫是C語言的。

別人沒有義務要幫你解決問題,有找到現成的程式很感謝,沒有的話,就要想辦法靠自己動手來解決。尤其是中文支援。

為了解決這兩個問題,花了時間研究如何把C語言經過包裝(Wrap),變成可以讓Python使用的模組。而中文的顯示,則是想找到以前的點陣字型(…遙想當年的倚天中文系統),後來找到比較適合的是Unifont的字體,有完整的unicode點陣字型,中間又產生了一個問題,就是字型無法太大,無法直接放在程式裡,所以又花了時間找了Kyotocabinet這個DBM來存取字型。

這部分也花了不少時間,終於成功在單色液晶,成功的顯示出中文(也可以日文韓文),由於中文字型比起英文來大得多,在小小的液晶上,中文只能顯示出一行5個字,最多3行,但是成功的喜悅一直持續了好幾天。這下我的溫度記錄站液晶就可以有中文了。下圖是顯示Unifont字型的畫面。


作品做到一半時,覺得要有一個實體的記錄動作開始的方法,所以又加上按鈕開關( 這個不是一般的按鈕,可是我今年參加噗浪客時抽到的哦!)

因為主程式在樹莓派,所以考慮過後,還是把按鈕接在樹莓派的GPIO上,然後透過WiringPi的程式庫來讀取按鈕資訊。

本來開關只有一個,後來想說要有選擇(Select)與確定(Set)的功能,所以最後的版本就變成了兩個。
(左邊的功能是選擇鈕,右邊的功能是設定鈕)


在經過不斷寫code、測試、加新功能的迴圈。最後完成的液晶選單畫面
分為多種模式。模式可由選擇鈕做切換。

下圖是主要的溫度模式,在溫度模式上可以看到目前的溫度,而且按下設定鈕後,就可以進行溫度記錄的功能

這是記錄溫度的下一個動作,先選擇記錄的地點(地點資訊來自sqlite3資料庫,可由網頁上更改)


再來是網路模式,我的樹莓派有兩個網路介面,一個Wifi,一個是實體網路,
因為在實作的過程中,在學校與家裡的網路環境不同,再加上實際運作時,也
需要網路資訊,所以就做了這個顯示模式



再來是目前時間模式,記錄站做到後來,發現時間的因素很重要,而因為樹莓派沒有電池,所以無法記憶時間,而且我的GPIO針腳已沒有位置,也無法再裝RTC時鐘模組了
(這是自己偷懶的藉口),

那時間要怎麼辦?為什麼之前使用時,時間都沒有問題。原來當樹莓派連接網際網路時,就會自動進行網路校時,所以之前都沒有感覺,直到有一次,把兩個網卡都設為內部網路時,才發現記錄的時間不對了。也因為這個原因,溫度記錄站的環境就必需要連接上網路,才能有正確的時間。

為了確認系統時間,所以才會做了這個時間模式。


再來是開機時間模式,這個模式是顯示樹莓派的開機時間,預計溫度的記錄都是長期的,所以有了這個,可以知道樹莓派已運行了多久。


最後是系統模式,可以將樹莓派重新啟動或關機,這樣就可以不需網路只靠按鈕,把記錄站做重啟或關機動作。

再來是溫度資料的記錄與查詢,樹莓派裡運行了一個Linux OS,所以可以在裡面加一個小網站,來做資料查詢。

我選用的Web伺服器是nginx,動態網頁的框架是用Django (Python based)。
下面是首頁的選單,有三個功能。




第一個功能是記錄清單,可以查到不同批次的記錄,每一批次都會記錄開始與結束時間、週期,與記錄筆數



每一批次的記錄,還可以再看詳細的溫度資料,動態網頁會將資料送出,經由Chart.js這個javascript的程式庫來畫出。
由於太多資料會變得很擠,所以也做了分頁的功能。


首頁的第二個功能是記錄站資料。
會有這個功能,是因為後來測試時,發現當記錄站不在視線範圍時,就看不到液晶上的即時溫度,而且也不知主程式是否還在運行,所以實做這個功能,可以從遠端看到記錄站的重要資訊。像是目前溫度、目前時間、開機時間、主程式狀態、目前是否正在記錄中。

另外,如果是正在記錄中,也可以看到最新的溫度圖表(這個最新頁面會每10秒自動刷新)


除了記錄溫度以外,後來也加上記錄地點,與記錄週期,這些文字資料都無法透過按鈕開關來輸入,所以就做了一個網站管理的功能,這個功能可以對資料庫的資料作修改或刪除的動作,這樣就可以新增不同的記錄地點與週期。

在實作上網站管理是使用Django本身的admin管理介面,這個功能由於權限太大,所以有帳號密碼做為保護。


下圖是改變記錄地點的畫面


經過了這麼多的努力,終於可以來實測看看,第一個實測的地點是學校的機房。

機房內有兩台冷氣在輪流吹,以保持溫度不過高。




找個空位放我的溫度記錄站。



另一個角度拍照。


機房的溫度記錄了兩天,都是約19~22度之間



經過測試,室內的溫度都比較穩定,難怪人要住在房子裡(…不要罵我)

那來做個室外的溫度記錄看看吧。

由於室外環境會較不方便,且通常要讓感測器放到本體以外的地方,所以先把DHT22做一些延長



有了延長的DHT22,這樣配置起來就比較有彈性了

選定的地點是學校第三棟的一樓走廊,因為走廊上方剛好有個機櫃,所以網路與電力就不成問題。

下圖是將記錄站放進機櫃的照片,照片上的人是辦公室裡,坐我對面的同事,感謝他的協助,常常給我作品的建議,也常常聽我的進度報告。(可千萬別害怕坐我對面啊)

機櫃的內部,加上記錄站就變得很擁擠

記錄站在機櫃裡,但是感測器可不行,不然就跟室內溫度情況相似了(歹命的DHT22,要在外面吹風),把延長後的感測器,固定在機櫃外面。


下圖是機櫃關起來的樣子(記錄站在裡面要乖乖的啊)


這一張是從走廊上拍的(當旁邊有同事經過時,都要特別解釋這不是攝影機)

下圖是撰文時,所測得的室外溫度變化,從下午13:55到晚上21:05,溫度由23.8,一路降到20度的頁面。


結語:

這個作品在實作之前及實作過程中,都不斷的在反思與詢問別人,這個作品的意義是什麼,會有趣嗎?

溫度的值看起來沒什麼,變化趨勢大概也都可以預期,不過我們大多的氣象資訊都是來自媒體或網路,當我想要真正知道當下環境的溫度與變化時,這個作品就有了價值。

另外,雖然做的時間很長很累,但是無論如何還是要把過程做個記錄,因為這個作品也有自造、自我學習、自我實現的價值在裡面。即使成品看起來不酷,但是由於經歷了每一個過程,解決一個又一個的問題,讓我又再次感受到當一個Maker的美好過程!(回憶總會經過美化的)


3 則留言: