因為使用照度計抓取照度值時間枯燥攏長而且數值會一直飄動,所以萌生了自動抓取照度值的想法。在這選上了GY-39模組做照度感測模組,此模組是一款包含氣壓,溫濕度,光強度模組,價格可接受並且光強度模組為MAX44009標榜高精度數位環境光光強度感測器可uart功能直上。
直接使用GY-39模組撈照度值後發現照度值飄動很大,無法區分LED燈精細增減5%亮度的照度值差別,依照之前照度計使用經驗,手上的照度計的照度檔位有分成20LUX、200LUX、2000LUX、20000LUX,因此先假設GY-39模組可能使用高照度模式才會有飄動大的問題,為了解決此飄動問題決定把GY-39模組改成不經由GY-39模組的控制IC,改由外部MCU直接對MAX44009感測器I2C控制讀寫,如下圖設定,選擇第3種模式。
在改成第3種模式之前使用邏輯分析儀撈GY39串口工作模式MAX44009的I2C數據,發現每25ms抓取資料一次,從MAX44009的使用手冊可發現手動模式底下的照度檔位有11階,25ms的更新頻率至少是高照度前3檔位(下圖紅色框框),從手冊上看積分時間選擇100ms或200ms之上是會比較理想的(下圖綠色框框)。
而GY-39模組在讀取照度值時是選擇讀取高低照度模式的,但是在讀取高低照度的流程沒有照手冊的走;手冊上指出要一次讀取高低照度的正確方式應該是要讀取完高照度資料後不要發送STOP命令應該要發送REPEATED START命令再做讀取低照度資料(如下圖),但是GY-39模組卻是在接收高照度資料後就接著發送STOP命令,這個bug也是造成照度數值飄動的原因之一。
在選用手動模式、積分時間200ms的設定後,可發現LED燈亮度已經可以區分出精細1%的差異,但是因為MAX44009照度抓取ADC數值會有飄動的情形顯示的照度值會有輕微飄動的現象,如下圖所示可以發現我們想要抓取的照度值是1543但是數值會有上下飄動的現象,
要解決此現象可以"每組取樣16次並輸出處理後的結果,接著再取樣下一組重複同樣步驟",每組取樣的16次中出現相同數值的就給予較重的權重,最後輸出最重的權重當做濾波的功能,此濾波效果就可以解決飄動的現象。從網路上搜尋類似的方法或濾波方式為"摩爾投票算法(Boyer–Moore majority vote algorithm)"或"加權移動平均濾波(Weighted Moving Average Filter)",不過我所使用的濾波方式應該要稱為"加權投票濾波(Weighted Voting Filter)"比較恰當。
如下圖所示,其中一個是"加權投票濾波(Weighted Voting Filter)"的示意,另一個是實際應用輸出,實際應用部分可看出,經過16次取樣選別已經可以穩定的顯示一樣的數值。
留言
張貼留言