2020/03/20 部屋の温度を監視したい2 -温度センサ-
部屋の温度を監視したいプロジェクトその2
まずは、温度を測定する部分。
このセンサは部屋の温度と湿度を検知してくれる。
ADコンバータも内蔵されており、デジタル信号で出力。
データシートにかかれているように8bit×5で送られてくるようで、
8bitずつ順に、湿度整数、湿度小数、温度整数、温度小数、パリティチェック。
湿度に関して小数以下の値は常に0が送られてくるらしい。
これらの仕様に合わせてコーディングをするのは面倒、、、
そもそもデータシートが英語で読みたくない。英語わかんない。翻訳おかしい。やりたくない。
嬉しいことに、DHT11のpythonのライブラリが公開されている。
ありがたく使わせてもらうことにした。
https://gyazo.com/a379d1c655b924ba363f3cd2b554f42b
配線はこのようにする。
ラズパイの5V電源、GPIO、GNDのピンに対し、
DHT11のVCC、DATA、GNDに接続する。
DATAに関しては5V電源でプルアップし(10kΩ抵抗)、電圧のブレがないようにする。
利用するGPIOピンはBCM14
データを取得する際にエラーが起こるケースがあるため、
正常に受け取れなかった場合は何度かリトライする。
データを受信したら、SQLite3のdbに保存する。
まずはdbを作成する。
# sqlite3 get_temp.db
(sqlite)>create table data(date text, temp real, hum int)
作成することができたらそこにデータを格納するためのコードを書いていく。
データの保管
table:データベース
date temp hum
2020/03/15 12:30 26.4 30
のように記録していく
テーブルのカラムは日時、温度、湿度で、日時はText型、温度は小数型、湿度は整数型にした。
続いて取得してDBに書き込むプログラムをPythonで
code:get_tmp_project.py
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from dht11 import dht11
import time
import datetime
import sqlite3
READPIN = 14
# 初期化
# cleanupされていなくても場合にエラーを表示しない。
GPIO.setwarnings(False)
# BCMモード。
GPIO.setmode(GPIO.BCM)
# 読み込みピンの設定
instance = dht11.DHT11(pin=READPIN)
# 温度読み取り
# エラー10回までは5秒間隔で再受信
def GetTemp():
error_cnt = 0
while True:
error_cnt += 1
result = instance.read()
if result.is_valid():
return result.temperature, result.humidity
elif error_cnt >= 10:
return 0, 0
time.sleep(5)
try:
if __name__ == "__main__":
temp, hum = GetTemp()
print ('温度=%s, 湿度=%s' % (temp, hum))
connect = sqlite3.connect('/home/izumin/python/get_temp_project/get_tmp.db')
connect.row_factory = sqlite3.Row
connect.text_factory = str
cursor = connect.cursor()
nowtime = datetime.datetime.now()
nowtime2 = nowtime.strftime('%Y年%m月%d日 %H:%M')
datas = (nowtime2, temp, hum)
cursor.execute('insert into data values (?,?,?)', datas)
cursor.execute('delete from data where date < (select min(date) from data where date in(select date from data order by date desc limit 8928))')
connect.commit()
connect.close()
GPIO.cleanup()
except KeyboardInterrupt:
print('Ctrl+Cにより中断')
pass
5分間隔でデータを取得するようにする。
1時間で12件、1日で288件、31日で8928件。
それより前のデータは削除されるようにした。
一週間のデータを保管。
次は5分間隔で取得する方法。
このコードを実行すれば、その時間のデータが1行追加される。
なのでこのコードを5分間隔で実行すればいいので、crontabを利用する。
crontab -e
環境変数の問題などもあるのでPATHには気をつけながら、
*/5 * * * * フルパス/python フルパス/get_tmp.py
を追記する。
そうすることでcrontabで5分毎にコードが実行される。
今回はrasbianで設定した。cronを使うには若干設定が必要だったが割愛。
ここまでで、5分毎にデータを格納することに成功した。
実際に動くとこのようになる。
https://gyazo.com/f17786a3b00a34fb49eb81e51abcbf55
このようにデータが格納される。