【DHT11】温湿度センサ(DHT11)を動かしてCSVに記録する [1]

2024/02/13

DHT11 ラズパイ

  • B!
サムネ
サムネ
[ DHT11シリーズ ]

今回はラズパイで温度と湿度を計測する方法を紹介します。

また、温湿度が取得できない現象と対策について記録しておきます。

今回使用する物

  • RaspberryPi 4
  • DHT11モジュール
  • ブレッドボード
  • ジャンプワイヤ

ラズパイ側の準備

まずは、DHT11を使用するために必要なライブラリを取得してきます。

gitをインストール

  1. sudo apt-get install git

クローンを行う

  1. git clone https://github.com/szazo/DHT11_Python.git

/home/piにDHT11_Pythonというフォルダが作成されます。

  1. DHT11_Python
  2. |_____ .git
  3. |_____ dht11
  4. | |_____ _init_.py
  5. |_____ LICENSE.md
  6. |_____ README.md
  7. |_____ setup.py
  8. |_____ example.py

プログラムを作成する場合は「DHT11_Python」フォルダ内で作ります。

これでラズパイ側の準備はOKです。

次は回路を組んでいきます。

回路図

モジュールを使用するのでそこまで難しくありません。

今回使用するモジュールは左からDATA、VCC(+)、GND(-)となっていました。

プログラムを実行してみる

ラズパイのGPIOとの接続が出来たらプログラムを実行してみます。

git cloneしたフォルダの中に「example.py」があるのでこれを実行します。

example.pyは6秒おきに気温と湿度のデータをprintするという内容のプログラムとなっています。

動かない

プログラムを実行してしばらく待っても結果が出力されませんでした。

errorが出ているわけでもなく、何も出力されない状態が続きます。

原因

そこで以下の部分を消して値を見てみます。

example.py
  1. if result.is_valid():

どうやらデータが上手く取得できておらず、「if result.is_valid():」がFalseになっていたことで空回りしていたようです。

  1. Last valid input: 2024-02-12 21:57:06.288574
  2. Temperature: 0.0 C
  3. Humidity: 0.0 %
  4. Last valid input: 2024-02-12 21:57:07.361881
  5. Temperature: 0.0 C
  6. Humidity: 0.0 %

対処(動いた)

色々調べた結果「_init_.py」を編集する必要があるようです。

0.05 => 0.6 に変更

_init_.py
  1. # send initial high
  2. self.__send_and_sleep(RPi.GPIO.HIGH, 0.05)

さらに、データが取得できなかった時の処理を追加して分かりやすくします。

example.py
  1. try:
  2. while True:
  3. result = instance.read()
  4. if result.is_valid():
  5. print('\n')
  6. print("Last valid input: " + str(datetime.datetime.now().replace(microsecond=0)))
  7. print("Temperature: %-3.1f C" % result.temperature)
  8. print("Humidity: %-3.1f %%" % result.humidity)
  9. print('\n')
  10. #取得できなかった時
  11. else:
  12. print("Error: " + str(datetime.datetime.now().replace(microsecond=0)))
  13. sleep(6)

実行結果

  1. Error: 2024-02-13 09:30:37
  2. Error: 2024-02-13 09:30:43
  3. Error: 2024-02-13 09:30:50
  4.  
  5.  
  6. Last valid input: 2024-02-13 09:30:56
  7. Temperature: 14.1 C
  8. Humidity: 51.0 %
  9.  
  10.  
  11. Error: 2024-02-13 09:30:57
  12. Error: 2024-02-13 09:31:04

たまに取得できるようになっていますね。

errorを回避することはできないようです。

DHT11から確実に値を取得する方法

15分間隔で温度と湿度を取得し、CSVに記録するプログラムを書いてみます。

このプログラムで使用する「data.csv」は「DHT11_Python」フォルダ内においています。

追記

このプログラムを実行してしばらく放置しているとセンサーからの値の取得が安定しました。

実行直後はerrorが数回発生しますが、その後はほとんど一発で取得できていました。
(たまに2〜3回errorが出たりする)

数回のerrorが発生することを前提に、「1回取得する」のような処理ではなく、ループ処理で値を取得するべきです。

example.py
  1. import RPi.GPIO as GPIO
  2. import dht11
  3. import time
  4. import datetime
  5. import csv
  6. from time import sleep
  7.  
  8. GPIO.setwarnings(False)
  9. GPIO.setmode(GPIO.BCM)
  10. instance = dht11.DHT11(pin=14)
  11.  
  12. try:
  13. while True:
  14. dt = datetime.datetime.now().replace(microsecond=0)
  15. unix = int(time.time())
  16. #15分(900秒)
  17. unix_15 = unix + 900
  18. print('Start: ' + str(dt))
  19. while True:
  20. result = instance.read()
  21. if result.is_valid():
  22. u_time = int(time.time())
  23. s_time = unix_15 - u_time
  24. print('\n')
  25. print("Last valid input: " + str(dt))
  26. print("Temperature: %-3.1f C" % result.temperature)
  27. print("Humidity: %-3.1f %%" % result.humidity)
  28. print('\n')
  29. temp = result.temperature
  30. humi = result.humidity
  31. data = [[dt, temp, humi]]
  32. with open('data.csv', 'a') as f:
  33. writer = csv.writer(f)
  34. writer.writerows(data)
  35. print('\nsleep')
  36. sleep(s_time)
  37. break
  38.  
  39. else:
  40. e_time = datetime.datetime.now().replace(microsecond=0)
  41. print("Error: " + str(e_time))
  42. sleep(1)
  43.  
  44. except KeyboardInterrupt:
  45. print("Cleanup")
  46. GPIO.cleanup()

プログラムの説明

  1. 測定を開始する直前の時刻を取得(UNIX時間)---①
  2. 取得した時刻の15分後の時刻を計算---①+900
  3.  
  4. 値が取得できるまで測定
  5. 取得した値をCSVに追記
  6. 現在時刻の取得(UNIX時間)---②
  7.  
  8. ②から①を引いてsleep時間を計算する

先に時刻を取得し、値が取得できるまでループすることで15分インターバルを乱すことなく動作可能です。

記録された時刻と実際に計測した時刻には少しずれが生じますが気にしないことにします。

実行結果



次はCSVファイルを見てみましょう

取得日時、温度、湿度を記録しています。

1行目のヘッダーは予め入力していたものです。

  1. DateTime,Temperature,Humidity
  2. 2024-02-13 11:42:06,21.4,44.0
  3. 2024-02-13 11:57:06,21.4,42.0
  4. 2024-02-13 12:12:06,18.2,48.0
  5. 2024-02-13 12:27:06,19.4,45.0
  6. 2024-02-13 12:42:06,19.4,46.0
  7. 2024-02-13 12:57:06,19.8,46.0
  8. 2024-02-13 13:12:06,20.2,47.0
  9. 2024-02-13 13:27:06,22.2,45.0

まとめ

今回はDHT11を使って温度と湿度が記録できるようになりました。

次回は、

  • 温度が35℃以上になったらDiscordに通知を飛ばす
  • 一定間隔で記録をとったCSVをグラフ化してDiscordに送る

という内容をやっていきたいと思います。

Writer

アイコン
Python×Raspi IoTシステム・Bot・ラズパイの記録
  • プログラミング
  • IoT
  • Python
\FOLLOW ME/ 𝕏

Ranking

blogmura_pvcount

Community

Search