センサーの湿度が102%ってアリ?ろらたんに即バレでツッコまれた!

ろらたんが湿度計を見ながら考え込んでいる様子。LoRa環境モニターで湿度が102%になったエピソード。 技術ブログ

センサーの湿度が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 までお気軽にどうぞ。

🎀 もし、ハマった話があったら、ぜひ教えてね〜📡


🔗 関連リンク

しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:

💬「シャチラボ」で検索してきた方も大歓迎!
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬

コメント

タイトルとURLをコピーしました