.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_dht:
2.14 DHT-11
================
**はじめに**
このレッスンでは、Raspberry Piを使用してDHT11温湿度センサーを接続し、データを読み取る方法を学びます。DHT11は、気象観測や環境制御など、さまざまな用途で使用される、信頼性が高く低コストなデジタルセンサーです。このプロジェクトでは、外部センサーとの接続方法、リアルタイムデータの処理、そしてPythonにおける基本的な例外処理を学びます。最終的には、温度(摂氏および華氏)と湿度の値を読み取れるようになります。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :ref:`cpn_humiture_sensor`
- |link_humiture_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
以下は、DHT11センサーを接続するための回路図です。
.. image:: img/fzz/2.2.3_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
以下の配線図を参考に回路を組み立ててください。
.. image:: img/fzz/2.2.3_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.14_DHT.py
このPythonスクリプトは、GPIO17を使用してFusion HAT+に接続されたDHT11センサーから温度と湿度のデータを読み取ります。実行すると、次のように動作します。
1. データは1秒ごとにコンソールへ表示され、リアルタイムで更新されます。
2. データの読み取りに失敗した場合は、 ``time out`` と表示され、読み取りエラーであることを示します。
----------------------------------------------
**コード**
以下は、このプロジェクトで使用するPythonコードです。
.. raw:: html
.. code-block:: 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. **インポート:**
.. code-block:: python
# Import the DHT11 temperature & humidity sensor module
from fusion_hat.modules import DHT11
# Import sleep function for delays
from time import sleep
これらの行では、このスクリプトに必要なモジュールをインポートしています。
2. **センサーの初期化:**
.. code-block:: python
dht11 = DHT11(pin=17)
この行では、GPIO17に接続されたDHT11センサーを初期化しています。
3. **データの読み取り:**
.. code-block:: python
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`` ブロックで囲むことで、安全に終了できるようにします。
.. code-block:: python
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. **データログ記録**: 温度と湿度の読み取り値をファイルに保存して分析できます。
.. code-block:: python
with open("dht11_log.txt", "a") as log_file:
log_file.write(f"{time.time():.3f}, {temperature}°C, {humidity}%\n")
2. **しきい値アラート**: 温度や湿度が設定したしきい値を超えたときに警告を出すことができます。
.. code-block:: python
if temperature > 30:
print("Warning: High temperature!")
if humidity > 70:
print("Warning: High humidity!")
----------------------------------------------
**まとめ**
このプロジェクトでは、Fusion HAT+を使用してDHT11温湿度センサーと接続する方法を学びました。センサーデータの読み取りと処理の方法を理解することで、気象観測システムから自動気候制御システムまで、さまざまな実用的アプリケーションにこの種のセンサーを組み込めるようになります。