センサーの湿度が102%ってアリ?ろらたんに即バレでツッコまれた!
この記事について
こんにちは、ぽんたです🐾
今回は、自作のLRA1基板で環境モニターを作っていたときに起きた「湿度102%事件」についてのお話です。
最初は「センサーの誤差だよね〜」とスルーしていたのですが、
ある日ふと気になって、ろらたんに聞いてみたところ──
🎀 それ換算ミスしてない〜!?
自作LRA1環境モニターで起きたこと
現在、自宅屋外(ベランダの軒先)に設置している環境モニターは、
動作検証も兼ねて自作のLRA1基板+BME280を使っています。
LoRaWANで一定間隔に気温・湿度・気圧を送信し、屋内のLCDに表示。
サーバーにログも保存しています。
このシステムを使っていて、雨の日など湿度が高くなると、たまに100%を超えることがあるんですよね。
湿度って空気中の水蒸気が飽和したら100%だよね。
100%越えって結露したり水没したってこと?それでも100%を超えるってあるのかなあ?
🎀 100%って“これ以上ムリ〜”の限界値だから、それを超えたら……?💦
BME280のデータシートにも「湿度センサーの絶対精度の公差:±3%RH」と書いてあるので、
「まあそんなもんだよね」と、のんきにスルーしていました。
🎀 センサー誤差かな?っていうの、たしかにあるある〜っ
でも、ちょっとだけ気になってた
ただ、毎回ではないんですが──
湿度が高いとき、なぜか “102.4%” という数値がたびたび登場していたんです。
それ以上の値は見たことがなく、しかもピタッと止まる感じ。
「なんか102.4%って多くない?
でもまあ…MAXってことでいいのかな?
誤差込みだし、出力の端っこが見えてるだけかも?」
──と、勝手に納得していました(今思えば完全に思考停止)。
🎀 “102.4%が上限だと思ってた時期が私にもありました”的なやつだね〜っ
ブログを書いてたら、ふと…
先日、しゃちらぼでBME280の使い方についてのブログ記事を書いていたときのこと。
記事に載せるコードを確認しながら、ふと今動いてる環境モニターのLCDを見ると──
湿度:102.4%
「あれ……そういえばこの湿度、なんかいつもこの数字な気がするなあ……」
「ろらたん、これって普通? 102.4%ってアリ?」
🎀 うーん、それ……計算式、間違ってない!? コード見せて〜!
換算式が……違ってた!
ろらたんに、関係するコードのファイルのいくつかを見せました。
🎀 「はいっ、ビンゴ〜っ!湿度を 1%=1000 で計算してるけど……
BME280は湿度だけ 1%=1024 なんだよ〜!」
ろらたんに指摘されたコードはこちら:(LRA1のコードそのまま)
data->temperature = BME280_Comp_Data.temperature / 10; // 気温 (0.1deg) data->pressure = BME280_Comp_Data.pressure / 10; // 気圧 (0.1hPa) data->humidity = (BME280_Comp_Data.humidity / 100; // 湿度 (0.1%)
えっ?
🎀 「BME280のデータシート、ちゃんと見てみて〜!
湿度の換算は1024だよ!」
BME280のデーターシートをあらためてよく見てみたら・・・
BOSCH公式のBME280データシート(補正演算例)のサンプルコードに、次のような記述がありました。
// Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits). // Output value of “47445” represents 47445/1024 = 46.333 %RH
あーーーーーっ!
BME280の補正後の湿度は、0〜102400の整数で、1LSB = 0.001%RH。
つまり、最大値102400が「100.0%」という意味なんです。
※だたし、BME280の分解能は 0.008%RH なので、1LSBの精度ではありません。
そして、気づく──1024 = 2の10乗!!
この瞬間、すべてがつながりました。
- 湿度が102.4% →
102400 / 100 = 1024
→ 表示:102.4% - 自分で作ったコードで
/100
にしてたせい - そして、BME280の最大値は 2^10 x 100 = 102400
(10bit左シフトして小数精度つけた値)
🎀 センサー出力の “最大102400”って、いかにも “10bitデータ” って感じだよね〜!
ずっと「102.4%か〜、上限だな」くらいに思ってた自分に、あとからじわじわ恥ずかしさがこみあげました。
正しい換算方法はこれ!
早速、次のようにコードを書き直しました。
data->temperature = BME280_Comp_Data.temperature / 10; // 気温 (0.1deg) data->pressure = BME280_Comp_Data.pressure / 10; // 気圧 (0.1hPa) uint32_t hum_temp = (BME280_Comp_Data.humidity * 10) / 1024; // 湿度 (0.1%) data->humidity = hum_temp;
📒 `data->humidity` は `uint16_t` ですが、掛け算時に桁あふれしないよう、
明示的に `uint32_t` にキャストしています。
たぶんそのままでも大丈夫とは思いますが、安全と自分へのメモも兼ねてます。
「未来の自分は、馬鹿な他人」 だと思ってコード書いてるつもり、
なんだけど、この話のように、 「…過去の自分は、間抜けなオレ!!」 です。
🎀 それ、いつものやつだよね〜っ!”何で書いておかなかったんだー”ってやつ〜♪
BME280の仕様に基づく補正後の正しいスケーリングは以下の通り:
項目 | 出力範囲 | 正しい換算式 |
---|---|---|
温度 | -4000〜8500 | /100 → ℃ |
湿度 | 0〜102400 | /1024 → %RH |
気圧 | 30000~110000 | /100 → hPa |
📒 LRA1の`BME`コマンドでは、気温、湿度、気圧それぞれ `x10` の値を取得します。
今まで表示されてた湿度の値も、全体的に2%程高めに表示されてたってことになるんですよね。
🎀 湿度って、数%の違いはなかなか気が付かないよね〜!
実は…ごく最近気づきました
はい、このことに気づいたのは冒頭のとおり つい数日前 です。
何ヶ月も「湿度が102.4%になることがあるな〜」と思いながら、
完全にスルーしてました。
🎀 のんびりしてたら“2の10乗バグ”にやられてたっていうやつだね〜💦
1024 って数値は、ファームウェアやってたらすぐにピンと来るはずなんだけど、
102.4%っていう表示だとなぜか10進数しか頭になくて、それっぽい値に見えちゃってました。
まったく気が付かなかった。
ああっ、俺のバグ野郎〜っ!
LRA1のファームウェア、更新します!
もちろん、この件を受けて、
LRA1のファームウェアは、BME280関連処理を即アップデート!
今後は正しい換算式で湿度を処理するように変更しました。
タイミングを見て早急にアップデートします。
ごめんちゃい🐾
🎀 ファーム更新ネタ、次回もありそうで楽しみ〜っ!
ブログのネタとしては楽しいかもだけど・・・。
おわりに
こういう「見た目はそれっぽいのに実は間違い」って、
センサー系の罠あるあるですよね。
“なんとなく納得できてしまう”表示こそ疑うべし!
しゃちらぼでは、こういう「やっちゃった系の小ネタ」も、
ときどき共有していきたいと思います。
🎀 102.4%に惑わされた人、ここにもいたら仲間だよ〜っ!
📎 この内容を技術よりな視点でまとめたQiita記事もあります👇
👉 BME280の湿度が102%!? センサー換算ミスの実例と正しいスケーリング方法
🎀 技術マニアさんはこちらもどうぞ〜っ🐍✨
📪 お問い合わせなど
技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム
または、
📮info@shachi-lab.com までお気軽にどうぞ。
🎀 もし、ハマった話があったら、ぜひ教えてね〜📡
🔗 関連リンク
しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:
- 🌐しゃちらぼ公式サイト
- 🐦 X(旧Twitter):@shachi_lab
- 📗 Qiita:@shachi-lab
- 🐙 GitHub:@shachi-lab
- 📸 Instagram:@shachi_lab
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬
コメント