RaspberryPi

コーヒーの木を冬越しさせたい(ラズパイで室温を測る)

RaspberryPi

[PR]当サイトはアフィリエイト広告を利用しています。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

背景

今回はラズパイで温度を計ってみようという話。

なんで温度を測るのかというと、以前気温のSVRを作ると言っていたことにつながります。

私は毎日コーヒーを飲んでいるのですが、コーヒーの木を観葉植物として育ててみたくなったのです。

しかしコーヒーの木は冬場の温度管理が難しく、我が家で過去に育てていたのですが、枯れてしまいました。

調べてみるとコーヒーの木の気温のボーダーは10度となっていました。

日の当たる廊下くらいでは、夜間の保温ができずに10度を割り込んでしまっていたようです。

ラズパイで何かできないかと考えた結果、二つの点で使えそうだと感じました。

1. 室温を測って、ある一定の温度以下になったら知らせる

2. 保温するときの湯たんぽがどのくらいもつか予測する

1に関しては、昼間置いておく部屋の気温が下がりすぎるようなら温かい部屋に移動させるということをしたいわけです。

その時定期的にコーヒーの木のある部屋に行って温度計を見るのが面倒なので、その部屋にあるラズパイで温度を測って、ある温度以下になったらメールでお知らせするということを考えました。

2に関しては、私は家族の中で早寝するほうなので、深夜まで家族の誰かがいる居間にコーヒーの木を移動させて、温かい時間が少しでも長くすることを考えました。

最初から温度が高い時間が長い居間でコーヒーを育てればいいという話ではあるのですが、居間がそれほど広くなくて、コーヒー以外の植物がもうすでに置けそうな場所をすべて占有しているためスペースがないのです。夜だけ自分が座っている場所が空くのでそこの近くに置くという話なのです。

その際コーヒーの木は段ボールに入れて、中に湯たんぽのようにペットボトルにお湯を入れたものを入れて保温します。

お湯は石油ストーブで温めたものを使うので爬虫類用ヒーターより光熱費がかからないという話です。

しかし2の場合、お湯がどのくらい温かいままなのかというのが知りたいわけです。

朝まで温かさがそれなりに持続しないと、朝起きて一番寒い時に段ボールの中の温度が足りないという話になってしまいます。

以上1と2に関してラズパイを使っていこうと考えました。

今回は1に関しての記事です。

ラズパイで温度を測る

今回はセンサーを使って温度を取得します。

使用したセンサーはDHT22という温度センサーを使います。

センサーのつなぎ方や温度の取得は以下の二つのサイトを参考にしました。

(1) いなきたものづくりラボ. “簡単!Raspberry pi(ラズパイ)で温度・湿度(DHT22)を測る方法”. 2021-01-05. https://inakita-monolab.com/iot-210105/, (参照2021-11-28)

(2) Device Plus – デバプラ – Powered by ROHM. “ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう”. 2020-11-08. https://deviceplus.jp/hobby/raspberrypi-gpio/, (参照2021-11-28)

コネクタのVCCとGNDはわかりやすいのですが、DATのコネクタはGPIO18につなげました。

(1)の通りにやってみたらちゃんと温度と湿度が出力できました。

ただしAdafruit_DHTのインストールは”python”ではなく”python3″で行いました。つまり

$ sudo python setup.py install

の代わりに

$ sudo python3 setup.py install

としました。

定期的に温度を測って指定温度以下になったらメールでお知らせ

メールの送信については以下のサイトを参考にしました。

(3) @kawa-Kotaro. “Pythonでメールを送信”. 2019-01-06. Qiita. https://qiita.com/kawa-Kotaro/items/460977f050bf0e2828f2, (参照2021-11-28)

全体のコードは次のようになりました。

#!/usr/bin/python3
# coding: utf-8
import Adafruit_DHT as DHT
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import time
import schedule
SENSOR_TYPE = DHT.DHT22
DHT_GPIO = 18
global count
count = [2]
def job2(count):
	if(count[0] >= 0):
		h,t=DHT.read_retry(SENSOR_TYPE,DHT_GPIO)
		message_temp="Temp={0:0.1f}deg C".format(t)
		message_humidity="Humidity={0:0.1f} %".format(h)
		message=message_temp + ". "+ message_humidity
		if(t < 11):
			smtpobj=smtplib.SMTP('smtp.gmail.com',587)
			smtpobj.ehlo()
			smtpobj.starttls()
			smtpobj.ehlo()
			smtpobj.login('メールアドレス','パスワード')
			msg = MIMEText(message)
			msg['Subject'] = 'roomTemperature'
			msg['From'] = 'メールアドレス'
			msg['To'] = 'メールアドレス'
			msg['Date'] = formatdate()
			smtpobj.sendmail('メールアドレス','メールアドレス',msg.as_string())
			print('send mail success')
			smtpobj.close()
			count[0] -= 1
def job3(countin):
	countin[0] = 2
schedule.every().day.at("08:30").do(job3, countin = count)
while True:
	job2(count)
	schedule.run_pending()
	time.sleep(1800)

●温度を測って指定した温度より低くなったらメールを送る

def job2(count):
	if(count[0] >= 0):
		h,t=DHT.read_retry(SENSOR_TYPE,DHT_GPIO)
		message_temp="Temp={0:0.1f}deg C".format(t)
		message_humidity="Humidity={0:0.1f} %".format(h)
		message=message_temp + ". "+ message_humidity
		if(t < 11):
			smtpobj=smtplib.SMTP('smtp.gmail.com',587)
			smtpobj.ehlo()
			smtpobj.starttls()
			smtpobj.ehlo()
			smtpobj.login('メールアドレス','パスワード')
			msg = MIMEText(message)
			msg['Subject'] = 'roomTemperature'
			msg['From'] = 'メールアドレス'
			msg['To'] = 'メールアドレス'
			msg['Date'] = formatdate()
			smtpobj.sendmail('メールアドレス','メールアドレス',msg.as_string())
			print('send mail success')
			smtpobj.close()
			count[0] -= 1

やっていることは参考サイトとほぼ同じ基本的なことなのですが、所々出てくるcountという変数の挙動を説明します。

まずcountの初期値は2です。

これがメールを送るたびに一つ減少します。

そしてcountが0より小さくなったらcountを使い切ったと判断して温度の測定とメールの送信をしないという処理をします。

ただしこのcountは一日経つとまた補充されます。

なんでこんなことをしているかというと、夜間室温が低下した際に私は眠っているので、この間にたくさんメールが送られても意味がないわけです。

それに日中でも、知りたいのは寒くなったタイミングの室温だけなので、寒いのがわかってから何回もメールしなくてよいわけです。

なのでメールの送信回数の上限を設定して、一日に3回くらい送られればいいかなと考えました。

この回数に関しては実際に運用してみて変えるかもしれません。

あ、countがリスト型なのは参照渡しをするためですよ。

●カウントを一日経ったら復活させて30分に一回温度を測る

def job3(countin):
	countin[0] = 2
schedule.every().day.at("08:30").do(job3, countin = count)
while True:
	job2(count)
	schedule.run_pending()
	time.sleep(1800)

job3はカウントを復活する処理。

その次がそれをスケジュールに登録する処理。

while文の中がスケジュールと室温の測定を30分(1800秒)に一回実施する処理です。

あとはラズパイ起動時にこのプログラムを実行します。

やり方は「ラズパイとscikit-learnとFlaskとnginxでお手軽?なWebアプリ」などを参考に作りました。

まとめ

今回はラズパイを用いて室温を測って、指定温度以下になったらメールを送るという処理について書きました。

もう少し寒くなったら稼働が始まると思います。

コーヒーを冬越しさせられるか挑戦してみます。