DHT22+RaspZW2の温湿度データを、遠く離れたFideafact.ddns.netに送ってWordPressでグラフで見る方法 Part1

目的は、DHT22測定・送信を安定化し、落ちた時や送信失敗時に原因を追えるようにすることです。

主なポイント:

  • INTERVAL = 900 で15分間隔 :好きな秒数でOK
  • flush=True でログをすぐjournalに出す
  • DHT22/GPIOエラーとHTTP送信エラーを分けて表示
  • 1回の測定失敗・送信失敗でプログラムを終了しない
  • None の温湿度は送信しない
  • 想定外エラーは traceback を出して調査可能にする

上記のコードでもOKですが、更にUpgardeさせたコードはこちら

Ver.2

/home/pi/script/dht22.py

以下のように変更。

  • 5分ごとに送信
  • 送信前に 1分間で12回測定
  • 測定間隔は 5秒
  • None、範囲外、読み取りエラーは除外
  • 残った値から上下を捨てる
  • 平均値を送信

高頻度測定なら、DHT22より Sensirion SHT45 がおすすめです。

おすすめ順

センサーおすすめ度特徴
SHT45高精度、I2C接続、Raspberry Piで扱いやすい。測定自体は数ms級、湿度応答は約4秒
SHT31 / SHT35入手性がよく、実績が多い。最大10回/秒モードあり。ただし湿度応答は約6〜8秒
SHT85高精度で交換しやすい形状。業務寄り。湿度応答は約8秒
BME280温湿度+気圧が取れる。安価で便利だが、温湿度の精度重視ならSHT系の方が無難
DHT22×低速。2秒以上あける必要があり、高頻度測定には不向き

結論:

Raspberry Pi Zero 2 Wで使うなら、まずは SHT45搭載のI2Cモジュール(価格は高い) を選ぶのが一番よいです。AdafruitなどのSHT45ブレイクアウトはRaspberry Pi用Pythonライブラリもあり、DHT22から置き換えやすいです。ただし注意点があります。温度は比較的速く追従しますが、湿度は空気中の水分がセンサー内部に拡散する時間があるため、1秒に何十回読んでも実際の変化追従は数秒単位です。つまり実用上は 1秒ごと、または2秒ごと の記録で十分です。

DHT22の代替としては:

DHT22 -> SHT45
DATA 1本 -> I2C SDA/SCL
読み取り間隔 5分 -> 1〜2秒も可能
精度・安定性アップ

Raspberry Piへの接続例:

SHT45 VIN -> 3.3V
SHT45 GND -> GND
SHT45 SDA -> GPIO2 / SDA
SHT45 SCL -> GPIO3 / SCL

DHT22なら SAMPLE_INTERVAL = 5 はかなり安全です。もっと細かくしたい場合でも、DHT22では 2秒未満 にはしない方がよいです。

主なポイント:

  • network-online.target でWi-Fi/DNSが使える状態に近づいてから起動
  • Restart=always で落ちたら自動再起動
  • RestartSec=10 で10秒待って再起動
  • PYTHONUNBUFFERED=1 でログを即時出力
  • User=pi でpiユーザーとして実行

3. 反映コマンド

4. ログ永続化
再起動前のログも残すために実施済み。

5. 確認コマンド

現在状態:

直近ログ:

15分後の動作確認例:

期待ログ:

今回分かったこと
落ちた直接ログは、journal永続化前だったため残っていませんでした。
ただし、現在はログ永続化済みなので、次回もし再起動や異常終了が起きても原因を追いやすくなっています。

また、起動直後に以下のDNS失敗が出ていました。

そのため、dht22.service を network-online.target 待ちに修正しました。今は HTTP 200 が返っており、測定・送信は正常です。


Part2は受信側になります。


追記

GPOIエラーで、センサーが読み取れない状態になった。
/home/pi/script/dht22.pyを修正(掲載は修正済コード)
/etc/systemd/system/dht22.service(掲載は修正済コード)
Pi Zeroシリーズはそもそもpulseioが不安定なことで知られており、use_pulseio=False が推奨設定です。

確認・反映手順

zero

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です