[ DHT11シリーズ ]
- 温湿度センサ(DHT11)を動かしてCSVに記録する [1]
- 温湿度センサーから得たデータをCSVに記録してグラフ化する [2]
- DiscordBotにコマンドを送ってグラフを作成させる [3]
- ラズパイ同士のファイル共有によって最新データを取得する [4]
今回はラズパイで温度と湿度を計測する方法を紹介します。
また、温湿度が取得できない現象と対策について記録しておきます。
今回使用する物
- 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が出ているわけでもなく、何も出力されない状態が続きます。
原因
そこで以下の部分を消して値を見てみます。
- 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 に変更
- # send initial high
- self.__send_and_sleep(RPi.GPIO.HIGH, 0.05)
さらに、データが取得できなかった時の処理を追加して分かりやすくします。
- 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回取得する」のような処理ではなく、ループ処理で値を取得するべきです。
- 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に送る
という内容をやっていきたいと思います。
DHT11のデータをDiscordWebhookで送信する
0 件のコメント:
コメントを投稿