[Arduino World] 月光曲,我的Arduino自動小夜燈:WS2812B燈條

    以月光曲來命名這次的小夜燈作品,聽起來既浪漫又好眠。

    我是個就寢時連幽微光線都難以入眠的人,一定非得把臥室裡大小燈光統統熄滅才能安心上床,但是隨著年紀愈來愈大,不得不擔心自己容易陷入摸黑起床跌倒的風險。

    市面上充斥著各式USB 充電感應LED燈條,可放置衣櫥充當臨時光源,也可以安裝於床側當作自動小夜燈。這些小夜燈雖然安裝方便,但是沒有參數可以調整,在不同的居家環境條件下,實用性難免受限。如果想在夜間動線有精準的燈光控制,達到照明安全保障,就必須藉由Arduino的神技來自我實現了。自行設計的夜間自動明滅光源,除了提供安全的照明外,不論是年長者還是年輕者,也都能在黑夜裡享受瞬間光彩變幻的浪漫。

主要元件:

  • 單晶片微處理器: ESP32-S3-SuperMini
  • 光照感應器:光敏電阻
  • 被動紅外線感測器PIR(Passive Infrared): SR602
  • 小夜燈照明:5v WS2812B燈條。

    單晶片微處理器 :ESP32-S3-SuperMini,這是我第一次用ESP32-S3的迷你版本取代之前常用的ESP32-S。雖然新版本的芯片表面高溫燙手,但到目前為止還沒當機過。由於正式跑機時間不長,尚難以斷論其穩定性。WiFi用途:設計OTA功能,方便自己以無線方式更新軟體。藍牙用途:用來設定軟體參數,如儲存WiFi的SSID、密碼,感應器啟動條件設定等等。

    光照度感應器:光敏電阻與TEMT6000都是屬於ADC型感應器,用來偵測環境亮度是否需要自動開啟小夜燈。最初是使用TEMT6000,因為被產品的高性能說辭(實際上看不懂)給迷惑了,反正單價不高就買來試用。實地在臥室測試結果,當感應器回饋偵測到最低光度時,我的眼睛告訴我,周遭環境仍然夠亮,還不到開啟小夜燈的時機。回頭找出以前學習Arduino使用的感應元件光敏電阻,測試比較後,發現它更適合偵測低照度的光源,更適合我的使用環境,所以最終捨去TEMP6000,改採成本更低的光敏電阻。看來這次光照感應器的選擇真的捨近求遠了。

    紅外線感應器PIR:可用來偵測人體的移動,也是開啟小夜燈的另一個必要條件。我測試了幾款應用在Arduino的PIR,感應元件功能差異不大,關鍵材料反而是感應元件的外罩。外罩表層的菲涅爾透鏡決定了感應角度範圍、感應距離、感應的靈敏度。我選擇SR602的原因在於它的電路板體積小,適合裝進小型的塑膠容器。但是SR602附的感應元件外罩,角度只有60度,而且外罩看起來就只是一般的塑膠殼,感應靈敏度相當遲鈍。後來我把外罩換成比較大型的,表面看得出來是有菲涅爾透鏡設計的外殼,感應角度與靈敏度就無條件三級跳。

    前述光照感應器的輸出是ADC信號,PIR則是屬於邏輯信號。ESP32的腳位信號電壓是3.3v,所以我很注意感應器的工作電壓一定要接同樣電壓3.3v,避免讀取誤解的信號數值。至於邏輯信號,根據以往的經驗,ESP32腳位可以相容讀取5v的邏輯信號,為了接線方便,直接把PIR電源線接入5v。但是過往行得通的經驗卻往往暗藏錯誤的認知,讓我這次吃足苦頭,浪費一整天的時間花在軟體除錯。MCU雖然可以正確讀取PIR的邏輯信號,但是每當PIR輸出高電平的時候,卻嚴重干擾了ADC腳位,導致從TEMT6000或光敏電阻讀到的數據瞬間飆升(突波?)。最後還是得將PIR的工作電壓規規矩矩接入3.3v,ADC腳位才恢復理性的輸入,同時也解除MCU受傷的危機。

    小夜燈照明:5v WS2812B 5050 RGB燈條。將一串一公尺60顆燈珠燈條,平均切割為兩條,分別掛在床鋪的兩側。每條30個燈珠亮度是否足夠?理論上燈條愈長燈珠愈多燈光效果愈炫耀,但是黑暗中的超級星光明亮刺眼,太多、太亮,反成小夜燈殺手。我們需要的是輔助性的柔和光源,能夠在漆黑的環境中指引自己,同時也要能避免瞬間的強光照射妨礙枕邊人。燈珠亮度設定可從1級到255級,30顆255級亮度的燈珠恐怕每次從黑夜中亮起都會驚醒枕邊人,實際上我只設定成3級的亮度就能足以供給夜間視網膜的需求了。

    燈條的安裝配線也讓我認識到新的課題。安裝於床鋪A側的燈條,從MCU到燈條的線路大約一公尺,燈珠的色彩、亮度與開關都在MCU的掌控中,但是安裝於床鋪B側的燈條,距離MCU比較遠,線路長度超過2公尺半,此時的燈條已經鞭長莫及,不按理出牌亂閃一通;但是若將線路長度縮減到一公尺內,就恢復正常了。

    觀察B側閃爍無序的燈珠,亮度已經高過程式設定的等級,推斷是信號不穩定的現象,並非5v工作電壓不足的因素。前面ESP32腳位信號電壓3.3v輸入的問題已經讓我有所警戒,現在輪到信號輸出問題浮現檯面。WS2812B標準工作電壓5v,雖然可以接受3.3v電壓信號,線路超出一公尺很可能就會導致信號扭曲不全。Google AI(不請自來)給的解方是,將邏輯信號輸出電壓3.3v拉高到5v;有很多方法可以達成,但都不是可以立即動工的方法。另外,可以在信號線,接近燈條第一顆燈珠前的位置,串接一顆370到470歐姆的電阻,藉以提高信號的完整性。我不太了解AI所述的的電性原理,但是這個方法最單純。動手焊接一顆430歐姆電阻後,就順利通過線路2公尺半長度的考驗。

↑ 月光曲配線圖。

↑ A側PIR。

↑ B側PIR。

↑ 光照感應器-光敏電阻。

↑ 點亮中的WS2812B燈條。

↑ 木板床架配線:利用活動的魔鬼氈當作電纜固定夾;感應器窩身在小型透明塑膠容器內。自家用,不談美觀,只求維修方便。


↑ MCU控制盒。

↑ 成品展示。

留言