注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

2.14 DHT-11

はじめに

このレッスンでは、Raspberry Piを使用してDHT11温湿度センサーを接続し、データを読み取る方法を学びます。DHT11は、気象観測や環境制御など、さまざまな用途で使用される、信頼性が高く低コストなデジタルセンサーです。このプロジェクトでは、外部センサーとの接続方法、リアルタイムデータの処理、そしてPythonにおける基本的な例外処理を学びます。最終的には、温度(摂氏および華氏)と湿度の値を読み取れるようになります。


必要なもの

このプロジェクトに必要なコンポーネントは以下のとおりです。

COMPONENT INTRODUCTION

PURCHASE LINK

湿温センサモジュール

購入

ジャンパーワイヤー

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

以下は、DHT11センサーを接続するための回路図です。

../_images/2.2.3_sch.png

配線図

以下の配線図を参考に回路を組み立ててください。

../_images/2.2.3_bb.png

サンプルの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。

cd ~/ai-lab-kit/python/
sudo python3 2.14_DHT.py

このPythonスクリプトは、GPIO17を使用してFusion HAT+に接続されたDHT11センサーから温度と湿度のデータを読み取ります。実行すると、次のように動作します。

  1. データは1秒ごとにコンソールへ表示され、リアルタイムで更新されます。

  2. データの読み取りに失敗した場合は、 time out と表示され、読み取りエラーであることを示します。


コード

以下は、このプロジェクトで使用するPythonコードです。

# Import the DHT11 temperature & humidity sensor module
from fusion_hat.modules import DHT11
# Import sleep function for delays
from time import sleep

# Create a DHT11 sensor object on GPIO pin 17
dht11 = DHT11(pin=17)

# Loop forever
while True:
   # Read data from the DHT11 sensor
   result = dht11.read()

   # If data was successfully read, unpack humidity and temperature
   if result:
      humidity, temperature = result

      # Print the humidity and temperature values
      print("humidity: %s %%,  Temperature: %s C" % (humidity, temperature))
   else:
      # Print timeout message if reading failed
      print("time out")

   # Wait 1 second before the next reading
   sleep(1)

コードの解説

  1. インポート:

    # Import the DHT11 temperature & humidity sensor module
    from fusion_hat.modules import DHT11
    # Import sleep function for delays
    from time import sleep
    

    これらの行では、このスクリプトに必要なモジュールをインポートしています。

  2. センサーの初期化:

    dht11 = DHT11(pin=17)
    

    この行では、GPIO17に接続されたDHT11センサーを初期化しています。

  3. データの読み取り:

    while True:
       result = dht11.read()
       if result:
          humidity, temperature = result
          print ("humidity: %s %%,  Temperature: %s C`" % (humidity, temperature))
       else:
          print("time out")
       sleep(1)
    

    read メソッドは、DHT11に開始信号を送信してデータを取得します。


トラブルシューティング

  1. 何も表示されない、または常に0.0°Cと0.0%が表示される:

    • 原因: センサーの接続に問題がある可能性があります。

    • 対処方法: DHT11センサーがGPIO17、電源、GNDに正しく接続されていることを確認してください。

  2. スクリプトがValueErrorでクラッシュする:

    • 原因: センサーからのデータが破損している、または不完全である可能性があります。

    • 対処方法: 接続が安定していることを確認し、DHT11が正常に動作していることを確認してください。また、データラインにノイズが入っていないこと、信号が浮いていないことも確認してください。

  3. CPU使用率が高い:

    • 原因: GPIOピンを待機なしで連続的にポーリングしている可能性があります。

    • 対処方法: このコードにはすでに遅延(例: time.sleep(2))が含まれています。これらを削除しないようにしてください。

  4. 温度や湿度の値が正しくない:

    • 原因: キャリブレーションの問題、またはセンサーの故障。

    • 対処方法: DHT11を安定した環境でテストし、精度を確認してください。問題が続く場合はセンサーを交換してください。

  5. スクリプトが安全に終了しない:

    • 原因: 手動中断に対する適切な例外処理が実装されていません。

    • 対処方法: メインループを try...except KeyboardInterrupt ブロックで囲むことで、安全に終了できるようにします。

    try:
       while True:
             humidity, temperature = dht11.read()
             print(f"{time.time():.3f}  Temperature: {temperature}°C  Humidity: {humidity}%")
             time.sleep(2)
    except KeyboardInterrupt:
       print("Exiting gracefully...")
    

拡張アイデア

  1. データログ記録: 温度と湿度の読み取り値をファイルに保存して分析できます。

with open("dht11_log.txt", "a") as log_file:
    log_file.write(f"{time.time():.3f}, {temperature}°C, {humidity}%\n")
  1. しきい値アラート: 温度や湿度が設定したしきい値を超えたときに警告を出すことができます。

if temperature > 30:
    print("Warning: High temperature!")
if humidity > 70:
    print("Warning: High humidity!")

まとめ

このプロジェクトでは、Fusion HAT+を使用してDHT11温湿度センサーと接続する方法を学びました。センサーデータの読み取りと処理の方法を理解することで、気象観測システムから自動気候制御システムまで、さまざまな実用的アプリケーションにこの種のセンサーを組み込めるようになります。