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

2024/02/13

DHT11 ラズパイ

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

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

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

今回使用する物

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

ラズパイ側の準備

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

gitをインストール

sudo apt-get install git

クローンを行う

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

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

DHT11_Python
    |_____ .git
    |_____ dht11
    |          |_____ _init_.py
    |_____ LICENSE.md
    |_____ README.md
    |_____ setup.py
    |_____ example.py

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

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

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

回路図

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

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

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

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

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

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

動かない

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

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

原因

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

example.py
if result.is_valid():

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

Last valid input: 2024-02-12 21:57:06.288574
Temperature: 0.0 C
Humidity: 0.0 %
Last valid input: 2024-02-12 21:57:07.361881
Temperature: 0.0 C
Humidity: 0.0 %
    ・
    ・
    ・

対処(動いた)

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

0.05 => 0.6 に変更

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

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

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

実行結果

Error: 2024-02-13 09:30:37
Error: 2024-02-13 09:30:43
Error: 2024-02-13 09:30:50


Last valid input: 2024-02-13 09:30:56
Temperature: 14.1 C
Humidity: 51.0 %


Error: 2024-02-13 09:30:57
Error: 2024-02-13 09:31:04

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

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

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

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

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

追記

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

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

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

example.py
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import csv
from time import sleep

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
instance = dht11.DHT11(pin=14)

try:
    while True:
        dt = datetime.datetime.now().replace(microsecond=0)
        unix = int(time.time())
        #15分(900秒)
        unix_15 = unix + 900
        print('Start: ' + str(dt))
        while True:
            result = instance.read()
            if result.is_valid():
                u_time = int(time.time())
                s_time = unix_15 - u_time
                
                print('\n')
                print("Last valid input: " + str(dt))
                print("Temperature: %-3.1f C" % result.temperature)
                print("Humidity: %-3.1f %%" % result.humidity)
                print('\n')
                
                temp = result.temperature
                humi = result.humidity
                data = [[dt, temp, humi]]
                
                with open('data.csv', 'a') as f:
                    writer = csv.writer(f)
                    writer.writerows(data)
                
                print('\nsleep')
                sleep(s_time)
                break

            else:
            	e_time = datetime.datetime.now().replace(microsecond=0)
                print("Error: " + str(e_time))
                sleep(1)

except KeyboardInterrupt:
    print("Cleanup")
    GPIO.cleanup()

プログラムの説明

測定を開始する直前の時刻を取得(UNIX時間)---①
取得した時刻の15分後の時刻を計算---①+900

値が取得できるまで測定
取得した値をCSVに追記
現在時刻の取得(UNIX時間)---②

②から①を引いてsleep時間を計算する

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

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

実行結果



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

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

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

DateTime,Temperature,Humidity
2024-02-13 11:42:06,21.4,44.0
2024-02-13 11:57:06,21.4,42.0
2024-02-13 12:12:06,18.2,48.0
2024-02-13 12:27:06,19.4,45.0
2024-02-13 12:42:06,19.4,46.0
2024-02-13 12:57:06,19.8,46.0
2024-02-13 13:12:06,20.2,47.0
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

Community

Search