星期四, 8月 10, 2017

使用 Arduino 程式庫讀取新版 DHT11 溫濕度模組出錯的原因

DHT11 是許多人都用過的溫濕度模組, 不過在 2017 年 3 月時 DHT11 開始供給新版本的模組, 舊版模組就停產了。新版模組可說是功能加強版, 可偵測的範圍變大, 而且溫度也可以提供到小數 1 位。不過就是因為這小數 1 位, 如果您是使用 Arduino Playground 的程式庫讀取溫濕度, 遇到新版的 DHT11 模組就會發生校驗不正確, 幾乎無法讀取溫濕度的情況。

會出現這樣的問題, 主要是因為從 DHT11 讀取到的資料共 5 個位元組, 依序是相對濕度的整數部分、小數部分, 攝氏溫度的整數部分、小數部分, 以及由前面這 4 個位元組相加所得到的校驗值, 在程式庫中就是 bits[0]~bits[4]。不過由於舊版 DHT11 的濕度與溫度精確度都只到整數, 不會有小數, 也就是 bit[1] 和 bit[3] 永遠為 0, 所以程式庫中計算校驗值時就偷懶的只把 bit[0] 和 bit[2] 相加, 如以下所示:


當遇到溫度有小數部分時, 上列程式最後一行的校驗值檢查就一定不相等, 所以就無法正確讀取溫濕度了。要解決這個問題很簡單, 只要在計算校驗值時乖乖的把 4 個位元組相加就可以了:


雖然市面上可能還有為數不少的舊版模組, 不過我自己最近買到的就是新版的模組, 還差點因為這個問題以為買到了瑕疵品。大家可以先修改程式庫, 這樣不論新舊版模組都不會有問題。