ラズパイを使ってやってみたかったことの一つ、センサーを用いた温度湿度の計測。
今回はセンサを用いて部屋の温度室温を計測してみることとしましたが、せっかく計測するなら、ラズパイでできる他の機能も活かして、何か生活に役立てられるようなものができないか、と考え、今回思いついたのが、「赤ちゃん快適室温設定システム」。
今回は、温度湿度センサーと、これまで本ブログで紹介してきたいくつかの簡単な技術、機能を組み合わせて、赤ちゃんが快適に過ごすことができる部屋をつくるためのシステムを構築しました。
ラズパイで赤ちゃん快適室温設定システム構築したよ!
赤ちゃん快適室温設定システムの概要
経緯と目的
ラズパイの特徴と言えば、センサなどいろいろな電子機器を繋げて、計測したり、制御したりできることです。接続できるセンサは、本当にいろんな種類のものがあり、ラズパイを始めた身としては、全種類扱ってみたいところですが、今回はその中の一つである、温度湿度センサーを扱ってみることとしました。
ただ、温度湿度センサーを使って、温度と湿度を図るだけでは面白くないので、なにか実用的なものができないかと考えました。
やはり、温度湿度を測るので、その情報を見て室温を調整したいところですが、大人になると、別に温度湿度のデータのことを考えて調整するわけではなく、暑いと感じれば下げるし、寒いと感じれば上げる、蒸し蒸ししていると感じれば除湿するし、といった感じで、体感として得た定性的な情報をもとに、自分で室温を調整すると思います。
一方で、赤ちゃん、特に生まれて間もない赤ちゃんは、暑い、寒いは体感として感じることはできても、口では言えず、また、自分で室温を調整することもできません。そんな赤ちゃんが快適に過ごすことができる温度、湿度は以下と言われているようです。
<赤ちゃんが快適に過ごせる温度、湿度>
・温度:夏は25〜28℃、冬は19〜23℃程度
・湿度:50~60%
以上の情報より、今回は、ラズパイと温度湿度センサを使って、赤ちゃんが、快適に過ごすことができる、不快な思いをしないための部屋をつくるためのシステムを構築することとしました。
仕様
前述の目的を果たすシステムの仕様を、今回は以下のようにまとめました。
<システムの仕様>
1.赤ちゃんが過ごす部屋の温度・湿度を常時計測。
2.快適に過ごせる温度、湿度(事前設定)を逸脱したら警告メッセージを出力。
3.スマートスピーカーよりエアコンを操作して温度、湿度を調整。
上記仕様に基づく、全体の動作イメージは下図の通り。
今回は、上記仕様にてシステムを構築したいと思います。
なお、究極を言えば、赤ちゃんの体温や表情などから、不快な状況、快適な状況を読み取って温度や湿度を変更したいですが、それは難しいので、そういったものもいつかは実現したいところです。
また、本当はエアコンの操作は本当はラズパイから直接したかったのですが、その方法がわからなかったため、スマートスピーカ―を使用していていますが温度を変更するようにしています。いつかは直接操作できるようにしてみたいと思います。
赤ちゃん快適室温設定システムに必要なもの
赤ちゃん快適室温設定システムに必要な機器は、ラズパイを除き以下の4点です。
- 温度湿度センサ
- ジャンパーワイヤ
- ラズパイから音声を出力するためのスピーカー
- スマートスピーカー
なお、ラズパイはラズパイ4を使用します。ラズパイ4の購入に関する記事は以下を参照ください。
それでは、赤ちゃん快適室温設定システムに必要なラズパイ以外のものの詳細を次にまとめます。
1.温度湿度センサ
今回は、「DHT11」という、空気中の温度と湿度を同時に測定することができるセンサを使用します。
▼表
▼裏
2.ジャンパーワイヤ(メスーメス:3本)
機器と機器を電気的に繋げるワイヤ。今回はラズパイと温度湿度センサを繋げます。
3.ラズパイから音声を出力するためのスピーカー
警告メッセージを出力するため、スマートスピーカ―を操作するために、ラズパイのイヤホンジャックに繋げて、音声を出力できるようにします。今回はダイソーで買った300円のものを使用しました。
以下の記事でまとめた節電システムでも使用しているものです。
4.スマートスピーカー
エアコンを操作するために使用します。今回は家で使用していた「Amazon Echo Show 5」を使用します。ちなみに、動かすエアコンは、ダイキンですので、プログラムではダイキンを動かす音声出力をしています。
以上が、赤ちゃん快適室温設定システムで必要なものです。
システム構成(ラズパイと電子機器の接続)
ここでは、システムの構成として、ラズパイと電子機器との接続についてまとめます。
ラズパイと温度湿度センサのジャンパーワイヤでの接続方法は次の通り。
<ラズパイ側>
ラズパイ側の接続方法は、以下の通りです。
- 1番ピン:3V3 power → 黄色ジャンパーワイヤで接続
- 8番ピン:GPIO 14 → 緑色ジャンパーワイヤで接続
- 14番ピン:Ground → 青色ジャンパーワイヤで接続
<温度湿度センサ側>
温度湿度センサ側の接続方法は、以下の通りです。
- 1番左のピン:+ → 黄色ジャンパーワイヤで接続
- 左から2番目のピン:out → 緑色ジャンパーワイヤで接続
- 左から3番目のピン:- → 青色ジャンパーワイヤで接続
スピーカーの付け方については、以下の記事の「システム構成」の章を参照ください。
以上の機器を接続した後の全体像は下図の通りです。
ぱっと見は何ができるかわかりませんが、プログラムを動かすと、これが相互に機能して、赤ちゃんが快適に過ごせる空間を創り出してくれます。
プログラム
プログラムを作成する前に、今回使用する温度湿度センサであるDHT11を容易に使用するために、ターミナルを開いて以下のコマンドを実行し、ライブラリを取得します。
$ git clone https://github.com/szazo/DHT11_Python.git
上記コマンドを実行すると、/home/piの直下に、「DHT11_Python」というフォルダができます。さらに、そのフォルダの中に、「dht11」というフォルダが作成されているため、このフォルダを、下記で作成するプログラムと同じフォルダにコピーして保存しましょう。
それでは次にプログラムを示します。今回は、私は以下の「SaveBaby.py」というファイル名でディスクトップに保存しました。「dht11」もディスクトップに保存しておきます。
※いろいろと動かし方を試行錯誤していたら長くなってしまいました。。その点はご了承ください。。
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import subprocess
# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
# read data using pin 14
instance = dht11.DHT11(pin=14)
def jtalk(phrase):
open_jtalk=['open_jtalk']
mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
htsvoice=['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']
speed=['-r','1.0']
outwav=['-ow','open_jtalk.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
devnull = open('/dev/null','w')
c = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=devnull,stderr=devnull)
c.stdin.write(phrase.encode())
c.stdin.close()
c.wait()
aplay = ['aplay','open_jtalk.wav']
wr = subprocess.Popen(aplay,stdout=devnull,stderr=devnull)
return
def csvsetting(temp,humidity, flg):
dt_now = datetime.datetime.now()
today = dt_now.date().strftime('%Y%m%d')
filename = today + '_temp.csv'
with open( filename, 'a') as f:
currenttime = dt_now.time().strftime('%H:%M:%S')
f.write(currenttime + "," + str(temp) + "," + str(humidity) + "," + str(flg) + "\n")
try:
interval = 30 # 温度湿度計測周期[秒]
temp = 0 # 温度変数初期化
humi = 0 # 湿度変数初期化
tempmin = 25 # 温度下限値(夏の下限を設定中)
tempmax = 28 # 温度上限値(夏の上限を設定中)
humimin = 50 # 湿度下限値
humimax = 60 # 湿度上限値
flg = 0 # 温度湿度基準超過発生フラグ
cnt = 0 # 温度湿度基準超過回数変数初期化
cntmax = 20 # 動作禁止周期回数
phrdetect = '温度もしくは湿度が赤ちゃん不快領域に到達。'
phrTemp1 = 'アレクサ。ダイキンを使ってエアコンの設定温度を27度にして。'
Temp1flg = 0
phrTemp2 = 'アレクサ。ダイキンを使ってエアコンの設定温度を26度にして。'
Temp2flg = 0
phrHumi1 = 'アレクサ。ダイキンを使ってエアコンの設定湿度を高めにして。'
Humi1flg = 0
phrHumi2 = 'アレクサ。ダイキンを使ってエアコンの設定湿度を低めにして。'
Humi2flg = 0
while True:
sttime = time.time()
result = instance.read()
dt_now = datetime.datetime.now()
print(dt_now.time().strftime('%H:%M:%S'))
lossflg = 0
if result.is_valid():
temp = result.temperature
humi = result.humidity
CurrentCondition = "温度:" + str(temp) + "度, 湿度:" + str(humi) + "%"
print(CurrentCondition)
csvsetting(temp,humi,lossflg)
if ((temp < tempmin or temp > tempmax) or ( humi < humimin or humi > humimax )):
# 一度温度湿度基準超過を検出したら動作禁止周期回数の間はアラームのみとする
if (flg == 1):
endtime = time.time()
exetime = endtime - sttime
cnt = cnt + 1
if (cnt > cntmax) :
cnt = 0
flg = 0
if interval - exetime < 0 :
exetime = 0
time.sleep(interval - exetime)
continue
jtalk(CurrentCondition)
time.sleep(5)
jtalk(phrdetect)
time.sleep(5)
# 温度湿度詳細チェックとエアコン操作
# 温度が快適領域下限より小さい場合
if ((temp < tempmin) and (Temp1flg == 0)):
jtalk(phrTemp1)
time.sleep(5)
flg = 1
Temp1flg = 1
Temp2flg = 0
# 温度が快適領域上限より大きい場合
elif ((temp > tempmax) and (Temp2flg == 0)):
jtalk(phrTemp2)
time.sleep(5)
flg = 1
Temp1flg = 0
Temp2flg = 1
# 湿度が快適領域外の場合
if ((humi < humimin) and (Humi1flg == 0)):
jtalk(phrHumi1)
time.sleep(5)
Humi1flg = 1
Humi2flg = 0
flg = 1
elif ((humi > humimax) and (Humi2flg == 0)):
jtalk(phrHumi2)
time.sleep(5)
Humi1flg = 0
Humi2flg = 1
flg = 1
else:
print('good condition!!')
flg = 0
else:
lossflg = 1 #欠損前値保持
print("温度:", temp, "度, 湿度:",humi, "%")
csvsetting(temp,humi,lossflg)
endtime = time.time()
exetime = endtime - sttime
if interval - exetime < 0 :
exetime = 0
time.sleep(interval - exetime)
except KeyboardInterrupt:
GPIO.cleanup()
なお、プログラムのポイントは以下。
なお、我が家のダイキンのエアコンは、Alexaから温度は数値で設定変更できましたが、湿度は高め/低めのいずれかのみの設定変更しかできなかっため、下限逸脱時は”高め”に設定するようにし、上限逸脱時は”低め”に設定するようにしました。
赤ちゃん快適室温設定システム稼働させてみた
以上で準備が完了しましたので、実際に赤ちゃん快適室温設定システムを動作させてみたいと思います。動作開始時点で、温度は上下限範囲(25~28度)内ですが、湿度は上限(60%)を逸脱している状態での動作になります。
動作を動画で撮ったものは↓
なお、動画中で写っている真ん中下側の白い四角いモノは、家に持っていた温湿度計(左の表示が温度、右の表示が湿度)です。計測結果の比較のために置いています。
動画で映っている通り、ラズパイからの音声出力の温度湿度は、温度湿度計の値と概ね一緒であり、ちゃんと計測できていることがわかります。
また、温度が上下限範囲内でしたが湿度の上限逸脱を検出したことから、湿度を低めに設定するようAlexaに呼びかけて、Alexaが動作して湿度を低めに変更したことがわかります。
※温度は事前のエアコン設定が28.5度の設定であったため、28.5度となっています。
この結果から、冒頭に示した目的を果たしてくれるシステムが構築できたかと思います!
まとめ
今回は、ラズパイを使った赤ちゃんが快適に過ごすことができる室温を自動で設定するシステムを構築してみました。
簡単な技術の組み合わせで、便利なもの、新しいものを創り出したいという、モットーに基づき構築してみました。簡単にできると思うので、ラズパイを知らない方でも、ぜひ、小さな子供がいらっしゃる方の参考になればうれしいです。
ラズパイとは何か、以下の記事にまとめていますので興味のある方は是非ご覧ください。
本ブログでラズパイでやってみたこと、今後やりたいことは、以下の記事にもまとめていますので、興味のある方は是非ご覧ください。
コメント