[Arduino World] LED 網路時鐘溫度計(一)

    我對掛鐘獨有情鍾。

    家裡客廳的兩面牆上各掛了一個時鐘,由不同方向進出都可以清楚看到與聽到滴滴答答競走的長短指針。除了客廳之外,房間與廁所也都有掛鐘,有指針型,也有數字型,工作、讀書、睡覺、如廁,抬頭就可以瞄到。數字型時鐘因為有發亮的LED燈光,特別適合掛在半夜漆黑的臥室,躺在床上遠遠的都看得很清楚。

    除了掛鐘之外,一直想要有個可以像時鐘一樣高掛牆上的溫度計。溫度計不只要能夠顯示室內溫度,同時還能告知戶外溫度。室內溫度計很容易在文具店買到,狹長形的那種,中間有根細長的透明管,管內的紅色液體隨著溫度變化升降。這種溫度計,高度老花的我,不論瞇眼貼近或保持距離,就是看不清楚溫度計的指標。至於戶外溫度計,那就是把室內溫度計掛到室外就成了戶外溫度計了。

    自從去年初冠狀病毒流行以來便窩居在家,上網學習Arduino UNO微控制器與相關感測器的應用。疫情期間接觸Arduino,全屬巧合,與防疫無關。當我認識到DS18B20溫度感測器,腦子裡就醞釀自己動手做室內外溫度計的構想。加上後來看到ESP32具有藍牙與WiFi的功能,同時也找到廠商已經封裝完整的DS18B40延長線,就買了一對ESP32與兩條一公尺長的DS18B20溫度感測線,開始著手設計心目中的溫度計。這期間設計構想反覆變化,過程一波三折。在成品雛型完成之時,兩條一公尺長的DS18B20線路只有短暫派上用場,插在麵包板上的一片ESP32,也因兩眼昏花(老花眼鏡度數又不足了),把電源正負線插入同一色槽,瞬間就壽終正寢了。

參考資料



構想演進

        最初的構想(G1):數據收集端(藍牙從端),掛在窗口,兩條DS18B20分別負責收集室內外溫度。溫度顯示端(藍牙主端)可以放在室內其他地方,透過藍牙通訊與數據收集端連線接收即時溫度資料。雖然無線通訊架構沒有問題,但總覺得大材小用,浪費了ESP322端出的牛肉賣點WiFi,很對不起自己的荷包。左思右想下,資料顯示端再追加NTP網際網路時間對時(G2),除了溫度顯示外還可以顯示時間。但是新的功能就會衍生新的問題,連線WiFi需要SSID 與密碼,我想做得更有彈性,不想要把這些變動的參數寫死在程式裡面,如能夠透過手機藍牙與藍牙從端連線設定參數並儲存在EEPROM,才是比較理想的做法。但因為藍牙從端是架構在資料收集端,於是又將原本設計在藍牙主端的NTP移植到藍牙從端(G3),讓資料收集端負責所有資料(室內外溫度與時間)的收集,而資料顯示端只是單純負責數據顯示。兩端的通訊程式都寫好了,收集端也上架了,顯示端暫時用電腦銀幕輸出做測試。本想說這樣作品已經完成八九成,接下來就是要找合適的輸出顯示器材。但是在顯示器材還沒進來之前我的想法又變了,兩台主機的架構實在浪費空間、以後維護也麻煩,雖然表面上看起來比較有工程上的氣勢。

    於是又有進一步的構想(G4)。氣象局都有各地的即時溫度資料,戶外溫度實在不用自己去收集,假如可以利用WiFi接收氣象局的即時溫度資料,那麼兩台主機就可以濃縮成一台,無須大費周章搞個兩台主機連線。


參考資料

    新北中山國中提供的擷取溫度資料實例,內容完整可套用,只是現在氣象局資料平台已經把未加密的HTTP連線改為加密的HTTPS(SSL)協定。幸好ESP32也提供了SSL解決方案WiFiClientSecure。Arduino IDE File/Examples有應用範本,於是把原始程式改寫成WiFiClientSecure版本,成功取得氣象局即時溫度資料。

    本以為問題解決了,想不到WiFiClientSecure單獨執行沒有問題,開啟藍牙之後就開始鬧脾氣了。

    首先是在Arduino IDE編譯之後出現sketch too big。WiFi加藍牙,程式空間大幅膨脹,這部分要調整Tool裡面的Partition sketch,但是我用的ESP32型號NodeMCU-32S竟然沒有此選單,於是又費了一番功夫將Partition sketch選單掛上IDE。當然若為了方便行事,不堅持正名的話,可以直接選擇Dev Module。

    調整選項後成功通過編譯,程式執行結果,氣象局的SSL就是搭不上線(一點都不遲疑,立即回傳連線失敗)。只是令人不解的是,若連上Examples中指定的伺服器就沒有問題?試了幾個其他非政府機關的伺服器也沒問題,唯獨氣象局的開放平台不買帳,難道氣象局的服務剛好與藍牙沖剋嗎?幾經折騰,決定改弦更張暫時棄守ESP32核心藍牙,換成外掛藍牙模組HC-06,這是當初我買Arduino學習套件中所附的元件之一。簡單修改兩行指令,重新成功上線。雖然為了接HC-06還需要多接線路,不過HC-06可以設定藍牙配對的密碼,ESP32就沒有可設定的密碼(也許是我疏忽沒有發現),就當作是額外資安防護的代價。


參考資料

ESP32與DS18B20 程式庫之間的小小瑕疵,幸好不是大問題,繞道可解決。

↑迷你萬用盒打造的資料收集端,尺寸大小剛好容納一片ESP32。

↑資料收集端安裝場景。藍色溫度感測線一條掛在室內,另一條穿出玻璃窗延伸到戶外陽台。雖然佈置完成,但因通訊架構改變,閒置未用。

材料(G4)

  • ESP32(Ai NodesMCU-32S) 微控制器
  • HC-06藍牙模組
  • DS18B201溫度感測晶片+4.7K歐姆電阻
  • 1吋4位數7段顯示器模組(紅光),74HC595靜態驅動 
  • 0.5吋4位數7段顯示器模組(藍光),74HC595靜態驅動
  • 萬用盒 198*110*37(mm)
  • 電路板、接線端子、線材、microUSB延長線

7段LED顯示器模組

    

    7條線加上小數點就是8段,不知為何名稱少了1段?起初以為7段顯示器是沒有小數點的,所以傻傻搜尋8段顯示器,結果當然是沒著落。

    市面上的7段顯示器模組都是4位數字搭配2個74HC595位移暫存器,巧妙利用人類眼球視覺暫留的特性,以快速掃描(開關)達到同時顯示4位數字的效果,但是萬一程式中途被拖累,來不及掃描,LED的顯示就會露餡了,亮點只會停留在某一位數字上,也就是只有一位數字會發亮,其他三個黯然無光。為避免遇到這種尷尬狀況,特地買了4位數字搭配4顆74HC595的靜態顯示器,好讓設計程式時無後顧之憂。


溫度與時間的顯示排列

    本來打算安裝一個大型1吋顯示器加上兩個小型0.5吋顯示器,但是萬用盒擠不下,最後改成一大一小上下並列。上排大型顯示器輪流顯示室內外溫度與日期/星期,下排小型顯示器顯示時間。起初的規劃是將日期/星期放在下排與時間輪流顯示,感覺上比較合理,但是上下排面板都要切換訊息,反而讓整體視覺的呈現變得很不穩定,最後還是決定把日期放到上排"輪班",下排固定顯示時間,不做任何切換。


拼裝


 
↑以雕磨機與銼刀工具開方孔。無奈工藝不及格,開出的框緣崎嶇變形。所幸LED顯示器是黑色面板,安裝上去後稍微可以遮掩走樣的線條。

↑萬用盒正面上下兩列顯示面板,方角各挖4個螺絲孔,但是孔距誤差太大,只能勉強鎖上一半,各自留下兩個空洞成追憶。上方黑色條狀天線是以熱縮套管包覆的DS18B20感測器。

 ↑為了不讓零件委屈於盒內狹小窒息的空間,應該說不讓自己佈線時太過挫折,LED顯示器只佔了三分之二的空間,另外三分之一留給晶片與其他線材藏身。
右下角那顆就是被我燒壞的ESP32單晶片。 
 
↑沒有掛在牆上,暫時用強力磁鐵吸附在冰箱側面測機。
 

↑2020年底除夕完工試機,剛好碰上寒流來襲,將氣象站指向玉山,藉機測試零度C以下的低溫數據能否正常顯示。

↑室內溫度。

↑ 31日星期四。

收尾

    如何請走HC-06?

    期待ESP32新版的程式庫可以解決問題,不過不敢抱太大的希望。

    ESP32核心藍牙與WiFi既然無法和平共存,而藍牙目前只用於設定參數,也許可以考慮外加個外部開關切換設定模式與跑機模式,將藍牙與WiFi通訊區隔,萬用盒內就不用再塞一片藍牙模組了。留待下一階段改造。



↑ LED 網路時鐘溫度計

續篇:


留言