ラズパイ(ラズベリーパイ)を使って、温度・湿度、不快指数をテキスト化する

アイキャッチ画像 ラズパイ
ラズパイ

ラズパイでなんちゃってスマートホームを構築するにあたり、初心者の私がwebや書籍を調べてやったことを備忘録のようにつづっています。

温湿度センサを使って測定

今回のネタは、ラズパイで検出した温湿度をBluetoothスピーカーに喋らせます。そして、不快指数を計算して、部屋の状態をLEDで表現します。

さらに、外気の温湿度をBluetoothスピーカーに喋らせて、不快指数を計算して、外の状態をLEDで表現します。

初心者でもできます。全体の流れ

流れは以下のような感じです。難しいことは何もやっていません。初心者の私でもできるようなことしかやっていませんので、初心者の方も安心してチャレンジしてください。中身が非常に長くなるので、四部作で紹介します。

今回は第一部です。

部屋の温湿度を測定

  1. ラズパイに温湿度センサ(DHT11)を接続します。
  2. ライブラリを使って、温湿度を検出します。
  3. 温湿度から不快指数を計算します。
  4. 温湿度、そして不快指数をテキスト化して、スピーカーに喋らせます
  5. 不快指数から部屋の状態をLEDで表現します。

外の温湿度を入手

  1. ラズパイからopenweathermapのAPIを叩き、温湿度を入手する
  2. 入手した温湿度から不快指数を算出します。
  3. 温湿度、不快指数をテキスト化して、スピーカーに喋らせます
  4. 不快指数から外の状態をLEDで表現します。

ラズパイと温湿度センサがあれば、準備OK

準備するものは、

  • ラズパイ
  • 温湿度センサ(DHT11)
    今回使った温湿度センサはこれです。精度も十分ですし、設定や接続も簡単なのでおすすめです。

by カエレバ

  • ラズパイとセンサをつなぐケーブル類
  • Bluetoothスピーカー

となります。

ラズパイとBluetoothスピーカーを接続する方法については、本ブログで紹介した記事を参考にしてください。↓
【ラズパイ】Google Homeの連携。エラーで音が出なくなったときの対処方法。
ラズパイ(ラズベリーパイ)とGoogle Homeの連携。時報としてGoogle Homeに喋らせる方法を紹介します。時々、Google Homeが喋らなくなるトラブルへの対処方法を初心者の方にも分かるように紹介します!

それでは実際の作業について説明します。

ラズパイはぜひスターターキットを買ってください。必要なものが全部そろっています。

ラズパイと温湿度センサ(DHT11)の接続

接続に関しては、以下のサイトと書籍を参考にしました。その通りにやれば、簡単に温湿度は測定できるようになります。

参考サイト↓(外部サイトへリンク)

Raspberry PiとDHT11で温度・湿度を測る - Qiita
はじめにRaspberry Piでセンサーを接続し、部屋の温度・湿度を測ります。今回は「DHT11」という温湿度センサーを使用します。温湿度センサー「DHT11」DHT11は、価格も安価で入…

使うセンサ(DHT11)はこんな感じのものです。非常に安く入手できます。

strコマンドを使った温湿度のテキスト化

測定値が出せたとします。

すると、

tempという数字のパラメータに温度が、
humiという数字のパラメータに湿度が入ります。

ただし、このままでは温度をテキストとして認識してくれないので、喋られません。そのため、数字のパラメータである、temp,humiをテキストとして認識させます

ところで、ここがプログラミングの独特なところだと思います。日常会話や資料などでは、
数字とテキストというのはごっちゃにして考えていますが、プログラミングにおいては、
そこを正しく定義する必要があります。
そのあたりについては、本ブログでも述べています。気になる方は見てみてください。
さて、本題に戻ります。数字をテキストとして認識させるために、strというコマンドを使います
テキスト = str(数字)
という風に使うことで数字をテキストに変換します。具体的には、
temp_say = str(temp)
とすることで、テキスト化された温度”temp_say”が定義されました。湿度も同様に、
humi_say = str(humi)
としてテキスト化します。そして、喋る言葉を決めます。 喋る言葉は、例えば以下のようなものです

”ただいまの温度は25度、湿度50パーセントです。”
”不快指数は、××です。”
”今の部屋の状態は、心地良い状態です。”

こんな風に喋らせるためには、言葉をテキスト化します。

str関数については、本ブログ”str関数を使ってPytonで文字列を定義する”でもう少し詳しく説明しています。参考にしてください。

温湿度を喋る言葉のテキスト化

すでに、温湿度はテキスト化しているので、それと定型文をつなぐだけです。簡単です。

say1 = “只今の部屋の温度は” + temp_say + “度”
say2 = “湿度” + humi_say + “パーセントです。”

と、喋るフレーズを定義して、それをさらにつなげるだけです。

say = str(say1 + say2)

また、strコマンドによりテキスト化しました。これで温湿度を喋るところはテキスト化に成功しました。

不快指数の計算、テキスト化

次に、不快指数を計算します。

計算式はネット上に落ちていた式を使いました。

不快指数=0.81x温度+0.01x湿度x(0.99x温度-14.3)+46.3

この式の本当の意味は良く分かりませんが、人間の感覚と合うように計算されているようです。

やや米国人向けのような気がするので、私は少し調整を入れています。

そこは別途説明します。

不快指数を”fukai”変数として、定義します。不快指数、温度、湿度、いずれも数字なので、
計算するためには、テキスト化は不要です。ただ計算するだけです。具体的には、

fukai = 0.81 * temp + 0.01 * humi * (0.99 * temp -14.3) + 46.3

としています。

不快指数の計算が完了です。

これを喋らせるのは先ほどの温湿度と同じ手順です。

まずはstrコマンドによりテキスト化します。そして、フレーズをテキスト化します。

ここで、不快指数を簡単に表現するために、喋らせるときは、小数点2桁は四捨五入しています。小数点をずらずらと喋らせると、聞いていて煩わしいからです。そのため、

fukai_say_round = round(fukai, 1)

としています。そして、さらにテキスト化します。

fukai_say = str(fukai_say_round)

もうやっていることは繰り返しです。あとはフレーズをテキスト化します。

say3 = “不快指数は、” + fukai_say + “です。”

これで不快指数の計算とテキスト化は完成です。続きは、第二部です。

ラズパイ(ラズベリーパイ)で部屋の状態(暑い・寒いなど)を喋らせる
ラズパイでなんちゃってスマートホームを構築するにあたり、初心者の私がwebや書籍を調べてやったことを備忘録のようにつづっています。 ラズパイと温湿度センサを使って、部屋の状態を喋るためには、、、 前回に引き続き、ラズパイで検出した温湿度をB...

以下、コードです。

#coding: utf-8

import subprocess
import RPi.GPIO as GPIO
import dht11
import time
import datetime
from datetime import datetime
import requests

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
#GPIO.setup(Gr_LED, GPIO.OUT)
#GPIO.setup(Y_LED, GPIO.OUT)
#GPIO.setup(R_LED, GPIO.OUT)

#GPIO.output(Gr_LED, GPIO.LOW)
#GPIO.output(Y_LED, GPIO.LOW)
#GPIO.output(R_LED, GPIO.LOW)

fukai85 = "今の部屋の状態は、暑くてたまらない状態です。クーラーを付けるか、クーラーの温度を下げた方が良いです。"
fukai80 = "今の部屋の状態は、暑くて汗が出る状態です。クーラーを付けるか、クーラーの温度を下げた方が良いです。"
fukai75 = "今の部屋の状態は、少しだけ暑い状態です。"
fukai70 = "今の部屋の状態は、暑くはない状態です。"
fukai65 = "今の部屋の状態は、非常に心地よい状態です。"
fukai60 = "今の部屋の状態は、寒くはない状態です。"
fukai55 = "今の部屋の状態は、肌寒い状態です。"
fukai50 = "今の部屋の状態は、寒い状態です。"
fukai45 = "今の部屋の状態は、非常に寒い状態です。"
fukai40 = "今の部屋の状態は、寒くてたまらない状態です。"
humi_low = "部屋が、非常に乾燥しています。"

instance = dht11.DHT11(pin=2)
talk = "sh /home/pi/Documents/talking.sh "
talk_RoomHOT = "sh /home/pi/Documents/VoiceText/Voicetext_RoomHOT.sh "
talk_humi = "sh /home/pi/Documents/talking_humi.sh " 

while True:

    for i in range(2):
        result = instance.read()
        time.sleep(1)
        temp = result.temperature
        time.sleep(1)
        humi = result.humidity
        fukai = 0.81 * temp + 0.01 * humi * (0.99 * temp -14.3) + 46.3
        time.sleep(3)
        if result.is_valid():
            print("Temperature: %d C" % result.temperature)
            print("Humidity: %d %%" % result.humidity)
    
    if humi == 0:
        continue
    else:
        break

time.sleep(2)

temp_say = str(temp)
humi_say = str(humi)
fukai_say_round = round(fukai,1)
fukai_say = str(fukai_say_round)

say1 = "只今の部屋の温度は" + temp_say + "度,"
say2 = "湿度" + humi_say + "パーセントです。"
say = str(say1 + say2)
say3 = "不快指数は、" + fukai_say + "です。"

print(say)
print(fukai_say_round)
subprocess.call(talk + say ,shell=True)
subprocess.call(talk + say3 ,shell=True)

if fukai_say_round > 85:
    subprocess.call(talk + fukai85 ,shell=True)

elif fukai_say_round > 80:
    subprocess.call(talk_RoomHOT ,shell=True)
elif fukai_say_round > 75:
    subprocess.call(talk + fukai75 ,shell=True)
elif fukai_say_round > 70:
    subprocess.call(talk + fukai70 ,shell=True)
elif fukai_say_round > 65:
    subprocess.call(talk + fukai65 ,shell=True)
elif fukai_say_round > 61:
    subprocess.call(talk + fukai65 ,shell=True)
elif fukai_say_round > 56:
    subprocess.call(talk + fukai55 ,shell=True)
elif fukai_say_round > 51:
    subprocess.call(talk + fukai50 ,shell=True)
elif fukai_say_round > 46:
    subprocess.call(talk + fukai45 ,shell=True)

else:
    subprocess.call(talk + fukai40 ,shell=True)

if humi < 40:
    subprocess.call(talk + humi_low ,shell=True)

シェアする
子どもとおでかけ 公園遊びブログ

コメント