ラズパイ使って赤ちゃん快適室温設定システム構築してみた

ラズパイを使ってやってみたかったことの一つ、センサーを用いた温度湿度の計測。

今回はセンサを用いて部屋の温度室温を計測してみることとしましたが、せっかく計測するなら、ラズパイでできる他の機能も活かして、何か生活に役立てられるようなものができないか、と考え、今回思いついたのが、「赤ちゃん快適室温設定システム」。

今回は、温度湿度センサーと、これまで本ブログで紹介してきたいくつかの簡単な技術、機能を組み合わせて、赤ちゃんが快適に過ごすことができる部屋をつくるためのシステムを構築しました。

 

こうがくん
こうがくん

ラズパイで赤ちゃん快適室温設定システム構築したよ!

目次

赤ちゃん快適室温設定システムの概要

経緯と目的

ラズパイの特徴と言えば、センサなどいろいろな電子機器を繋げて、計測したり、制御したりできることです。接続できるセンサは、本当にいろんな種類のものがあり、ラズパイを始めた身としては、全種類扱ってみたいところですが、今回はその中の一つである、温度湿度センサーを扱ってみることとしました。

ただ、温度湿度センサーを使って、温度と湿度を図るだけでは面白くないので、なにか実用的なものができないかと考えました。

やはり、温度湿度を測るので、その情報を見て室温を調整したいところですが、大人になると、別に温度湿度のデータのことを考えて調整するわけではなく、暑いと感じれば下げるし、寒いと感じれば上げる、蒸し蒸ししていると感じれば除湿するし、といった感じで、体感として得た定性的な情報をもとに、自分で室温を調整すると思います。

一方で、赤ちゃん、特に生まれて間もない赤ちゃんは、暑い、寒いは体感として感じることはできても、口では言えず、また、自分で室温を調整することもできませんそんな赤ちゃんが快適に過ごすことができる温度、湿度は以下と言われているようです。

<赤ちゃんが快適に過ごせる温度、湿度>
 ・温度:夏は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番目のピン:- → 青色ジャンパーワイヤで接続

    <経験談>
    ワイヤのつなぎ方を誤った状態でプログラムを実行したところ、センサから強い熱が発生し、さらにその後焦げた匂いを発しましたため、途中でプログラムを止めました。そのまま繋げっぱなしだと、燃えたりしていたかもしれないので、接続については、十分にご注意ください!
    なお、その後そのセンサは使用できなくなっていました。。
    (購入したものが2つ入りセットだったので、もう1つで作業は進めました。)

    スピーカーの付け方については、以下の記事の「システム構成」の章を参照ください。

    あわせて読みたい
    ラズパイ使って防犯システム構築してみた ラズパイを使って、”安価に”、”容易に”、何か生活に役立てられるようなものができないかと、日々考えながら過ごしていた時に思いついたのが、外出時/就寝時の防犯シス...

     

    以上の機器を接続した後の全体像は下図の通りです。

    ぱっと見は何ができるかわかりませんが、プログラムを動かすと、これが相互に機能して、赤ちゃんが快適に過ごせる空間を創り出してくれます。

     

    プログラム

    プログラムを作成する前に、今回使用する温度湿度センサである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()

    なお、プログラムのポイントは以下。

    • 30秒周期で温度・湿度を計測
    • 計測結果はCSVにも出力
    • 温度上下限、湿度上下限を超過したらアラーム出力
      ※アラームは、現在温度・湿度と赤ちゃんの不快領域に達した旨のメッセージ
    • 温度の上下限逸脱、湿度の上下限逸脱の状況に応じて、設定温度や湿度を変更
    • 一度温度湿度基準逸脱を検出し、エアコン設定を変更したら、一定期間動作しないようにする
      ※上記プログラム上は20回(30秒周期のため10分間)
    • エアコンへの操作は直前と同じ操作はしないようにする

    なお、我が家のダイキンのエアコンは、Alexaから温度は数値で設定変更できましたが、湿度は高め/低めのいずれかのみの設定変更しかできなかっため、下限逸脱時は”高め”に設定するようにし、上限逸脱時は”低め”に設定するようにしました。

     

      赤ちゃん快適室温設定システム稼働させてみた

      以上で準備が完了しましたので、実際に赤ちゃん快適室温設定システムを動作させてみたいと思います。動作開始時点で、温度は上下限範囲(25~28度)内ですが、湿度は上限(60%)を逸している状態での動作になります。

      動作を動画で撮ったものは↓
      なお、動画中で写っている真ん中下側の白い四角いモノは、家に持っていた温湿度計(左の表示が温度、右の表示が湿度)です。計測結果の比較のために置いています。

       

      動画で映っている通り、ラズパイからの音声出力の温度湿度は、温度湿度計の値と概ね一緒であり、ちゃんと計測できていることがわかります。

      また、温度が上下限範囲内でしたが湿度の上限逸脱を検出したことから、湿度を低めに設定するようAlexaに呼びかけて、Alexaが動作して湿度を低めに変更したことがわかります。

      ※温度は事前のエアコン設定が28.5度の設定であったため、28.5度となっています。

       

      この結果から、冒頭に示した目的を果たしてくれるシステムが構築できたかと思います!

       

      まとめ

      今回は、ラズパイを使った赤ちゃんが快適に過ごすことができる室温を自動で設定するシステムを構築してみました。

      簡単な技術の組み合わせで、便利なもの、新しいものを創り出したいという、モットーに基づき構築してみました。簡単にできると思うので、ラズパイを知らない方でも、ぜひ、小さな子供がいらっしゃる方の参考になればうれしいです。

      ラズパイとは何か、以下の記事にまとめていますので興味のある方は是非ご覧ください。

      あわせて読みたい
      Raspberry Pi(ラズベリーパイ)とは?その特徴を簡単にまとめてみた 大人の自由工作にうってつけのアイテム「Raspberry Pi(ラズベリーパイ)」。 このラズベリーパイが何ものか、その特徴とできることをまとめます。 こうがくん ラズパイ...

       

      本ブログでラズパイでやってみたこと、今後やりたいことは、以下の記事にもまとめていますので、興味のある方は是非ご覧ください。

      あわせて読みたい
      【初心者向け】「ラズパイでできること」分野別にまとめてみた ラズベリーパイ、通称ラズパイは、センサなどいろんな電子機器をつけて、それをプログラミングを使用して容易に制御したりできる、小型で安価なコンピュータです。 この...
      よかったらシェアしてね!
      • URLをコピーしました!
      • URLをコピーしました!

      コメント

      コメントする

      日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

      目次