Raspberry Pi(以下ラズパイ)や各種センサーを買ったものの、持てあましていないでしょうか。アイディア次第で色々作れるものの、何となくいいアイディアが思い浮かばない…なんてこともありますよね。

今回はとても簡単に作れて、家庭で役立ちそうなアイディアの紹介です。温度や湿度を測れるセンサーは多いのですが、それを使って家庭内における熱中症対策デバイスを作ってみます。

家庭内での熱中症とは

昨今の温暖化やヒートアイランド現象によって、屋外の温度は年々上がっているようです。35度を超え、40度近くになっていることも少なくありません。そのため、屋外においては水をとったり、日に当たりすぎないといった熱中症対策が取られています。

しかし、その反面屋内においてはおざなりになっているケースが多いようです。クーラーなどを使って28度程度に保つのが望ましいとされていますが、特に年配の人たちはクーラーをつけることが無駄遣いに感じてしまうようです。さらに年配になると体温調整機能が弱まるため、温度が上がっていたり、体が水分不足に陥っているのに気付かずに倒れてしまうといった問題もあります。

対策について

まず温度と湿度の関係で、どの程度まで至ると問題があるのかを知らなければなりません。熱中症対策シンポジウムの住まいと住まい方による熱中症予防によると、暑さ指数(WBGT)が一つの基準になります。これは屋内においては次のように計算されます。

WBGT(℃) =0.7 × 湿球温度 + 0.3 × 黒球温度

via 環境省熱中症予防情報サイト 暑さ指数(WBGT)の測定方法など詳しい情報

この数値が28〜30度の場合は警戒、31度以上の場合は危険という水準になります。しかし湿球温度や黒球温度は測定が面倒です。

そこで、温度と湿度から簡易的にWBGTが分かる表が作成されています。

via WBGT値と気温、相対湿度との関係

この表は計測によって表現されているもので、単純な計算で出るものではありません。しかしIchigoJam S+温湿度センサSi7021で暑さ指数WBGTを計算して、熱中症予防 | ボクにもわかる電子工作のブログでは、計算式を出してくれています。

WBGT = 0.725*Ta + 0.0368*RH + 0.00364*Ta*RH – 3.246

Ta: 室温(摂氏)
RH: 湿度

実際に計算で出したものと並べてみます。一カ所だけ違いますが、ほぼ完璧です。素晴らしい計算式です。

試してみる

後は温湿度センサーを使って値を取り出し、WBGTを算出します。この値が28以上であれば警告、31以上であれば危険というメッセージを出せればいいわけです。メッセージの送り先については、今回はメールにしていますが、例えばLINEボットを作って、そちらに通知を出してもいいでしょう。

温湿度センサーはDHT11を使っています。KKHMF DHT11 湿度センサーモジュール 温度センサーが安価です。コードはラズパイで温湿度を測定(DHT11) | そう備忘録を参考にさせてもらいました。

ヘッダピンの接続も上記記事に書かれていますが、簡易的に書くと次のようになります。

センサーラズパイ
5V02 (5v)
Output07 (GPIO 04)
GND06 (GND)

そして実際のコードです。メールの送信処理はCustomers Mail Cloudを使っています。ここはSMTPでも何でもいいかと思います。実際のコードについてはコメントを参照してください。

今回使ったライブラリは以下の通りです。pipでインストールできます。

  • dht11
  • CustomersMailCloud
# GPIO操作用ライブラリ
import RPi.GPIO as GPIO
# 処理停止用
from time import sleep
# 温湿度センサー用ライブラリ
import dht11
# メール送信用ライブラリ
from CustomersMailCloud.Client import CustomersMailCloud
# メール本文用ライブラリ
import textwrap

# 値を取得するOutput用ピン番号
TEMP_SENSOR_PIN = 4
# 取得するインターバル(秒数)
INTERVAL = 10
# リトライする回数(時々失敗するようです)
MAX_RETRY = 20
# リトライする際に停止する秒数
RETRY_TIME = 2

# Customers Mail Cloudの設定
API_USER = 'API_USER'
API_KEY = 'API_KEY'
client = CustomersMailCloud(API_USER, API_KEY)

# 通知を出すレベル
NOTIFY_LEVEL1 = 28
NOTIFY_LEVEL2  = 31

class EnvSensorClass:
    # 温度湿度を取得して返すクラス
    def GetTemp(self):
        instance = dht11.DHT11(pin=TEMP_SENSOR_PIN)
        retry_count = 0
        while True:
            retry_count += 1
            result = instance.read()
            if result.is_valid():
                return result.temperature, result.humidity
            elif retry_count >= MAX_RETRY:
                return 99.9, 99.9
            sleep(RETRY_TIME)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

#main
try:
    if __name__ == "__main__":
        env = EnvSensorClass()
        # メール送信の初期化
        client.trial()
        client.addTo('宛先の名前', '宛先のメールアドレス')
        client.setFrom('送信元の名前', '送信元のメールアドレス')
        while True:
            # 温度、湿度を取得
            temp, hum = env.GetTemp()
            # WBGTを簡易計算
            value = 0.725*temp+0.0368*hum+0.00364*hum*temp-3.246
            value = round(value)
            # 通知レベルを超えているか確認
            if value >= NOTIFY_LEVEL1:
                # 超えていれば通知処理(今回はメール)
                # 危険レベルによって件名を変更
                if value >= NOTIFY_LEVEL2:
                    client.subject = '危険:温湿度の閾値を超えました'
                else:
                    client.subject = '厳重警戒:温湿度の閾値を超えました'
                # 本文に温度、湿度を載せる
                client.text = textwrap.dedent('''温湿度センサーの値が閾値を超えました。熱中症に注意してください。
                温度 = {temp} 湿度 = {hum}%
                となっています。
                ''').format(temp=temp, hum=hum).strip()
                # メール送信
                client.send()
            sleep(INTERVAL)
except KeyboardInterrupt:
    pass
GPIO.cleanup()

後はこれをラズパイ上で実行するだけです。クーラーを止めてしばらく経った後、実際にメールが飛んできました。

まとめ

家庭内の熱中症対策は、赤ちゃんや年配者がいる家庭にとっては大事なことです。水分補給はもちろん、気付かない内に熱中症になっていて倒れてしまう可能性があります。気付かない内に襲い来る問題に対応するためにもIoTを活用しましょう。

LINEに通知したかったら…

ツクレルマイPCの教材「AI見守りカメラを作ろう(全編)」で、LINEを使って通知する方法について解説しています。ツクレルの有償教材となりますが、もっと知りたい!という方はご覧になってください。

ツクレルマイPC


0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です