温湿度・気圧センサモジュール、Raspberry Pi、Google Homeで快適なお部屋作り (前半)

人感センサーを活用してPhilips Hue 電球専用のオンオフを自動化、省電力化を実現

ワンコインでお部屋の温度をHomeKitをベースに外出先でもモニターできるようにしてみました

Raspberry PiとGoogle カレンダでGoogle Homeにゴミの日を教えてもらう“の続きです。

 

先日のTALK “ワンコインでお部屋の温度をHomeKitをベースに外出先でもモニターできるようにしてみました“で、”温度湿度センサーモジュール [DHT11-3P]“を使って温度と湿度をiOSアプリ”ホーム”に表示するようにしました。で、今回は、温度と湿度に加えて、気圧も計測できるモジュールを使って、“Google Home“にお部屋の環境データを喋ってもらったり、温度が高くなったら扇風機をオンする、といったホームオートメーションにトライしてみようと思います。

 

(1) センサーモジュールを購入しましょう

今回は、”スイッチサイエンス“で、”BME280搭載 温湿度・気圧センサモジュール ピンヘッダ実装済“という製品を購入しました。送料を無料にするため、っていう理由もあったのですが、序に、”Raspberry Pi Zero WH“も合わせて購入。ま、こいつは、いずれ別の電子工作で使うつもりです。

前回と同様、はんだ付けが面倒なので、ピンヘッドが既に付いているタイプをチョイスしました。

 

(2) センサーモジュールをラズパイに接続しましょう

ジャンパーワイヤーを使って、今回購入したセンサーモジュールをラズパイに接続します。

 

センサーモジュールの裏に印刷されているインターフェイス名を左から順に、

SD0をpin #09 (Ground)

SCKをpin #05 (GPIO03)

SDIをpin #03 (GPIO02)

CSBをpin #01 (DC Power 3.3V)

GNDをpin #25 (Ground)

Vioをpin #17 (DC Power 3.3V)

という具合に接続しました。ちなみに、手前の使い勝手の良いピンは、ラズパイ本体を冷やすファン用に使用済みでしたので、ちょっと離れているピンも使って接続した次第です。

 

(3) ラズパイ側のセットアップをしておきましょう

まずは、ラズパイの設定パネル上で、”I2C”を有効にします。

で、

sudo i2cdetect -y 1

とターミナルから打つと、下のような表示になればOKです。

 

(4) Pythonのサンプルコードを実行してみましょう

スイッチサイエンス“が今回購入したセンサーモジュール用のPythonサンプルコードを”ここ“で公開してくれています。

“Python27″というフォルダに入っている”bme280_sample.py”がサンプルコードです。ただ、そのままではエラーになってしまうので、

from smbus2 import SMBus

from smbus import SMBus

と変更して下さい。

サンプルコードを実行して下さい。

python bme280_sample.py

 

(5) サンプルコードをちょっとだけ書き換えましょう

“Google Home”に、センサーモジュールで測定した環境データを読み上げてもらうテキストファイルを作成する部分を追記します。

それから、ファイル名も”get_atmospheric_data.py”としておきます。

 

まずは、”atmospheric_data”というグローバル変数を用意して、この変数に、テキストファイルに書き出すテキスト文を保存していきます。

 

#coding: utf-8

from smbus import SMBus

import time

bus_number  = 1

i2c_address = 0x76

bus = SMBus(bus_number)

digT = []

digP = []

digH = []

t_fine = 0.0

atmospheric_data = ""

 

こちらは、温度、気圧、湿度の順に、センサーモジュールで計測したデータを取得する関数です。この関数の最後の方で、温度、気圧、湿度の全ゼータを記録した”atmospheric_data”の内容を、”atmosphere_google_home_notifier.txt”というテキストファイルに書き出しています。

 

def readData():

data = []

for i in range (0xF7, 0xF7+8):

data.append(bus.read_byte_data(i2c_address,i))

pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)

temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)

hum_raw  = (data[6] << 8)  |  data[7]

global atmospheric_data

compensate_T(temp_raw)

compensate_P(pres_raw)

compensate_H(hum_raw)

file = open('/home/pi/atmosphere_google_home_notifier.txt', 'w')

file.writelines(atmospheric_data)

file.close()

 

こちらの関数では、気温データを取得しているので、最後の方で、そのデータを”atmospheric_data”に記録しています。

 

def compensate_P(adc_P):

global  t_fine

pressure = 0.0

v1 = (t_fine / 2.0) - 64000.0

v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5]

v2 = v2 + ((v1 * digP[4]) * 2.0)

v2 = (v2 / 4.0) + (digP[3] * 65536.0)

v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8)  + ((digP[1] * v1) / 2.0)) / 262144

v1 = ((32768 + v1) * digP[0]) / 32768

if v1 == 0:

return0

pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125

if pressure < 0x80000000:

pressure = (pressure * 2.0) / v1

else:

pressure = (pressure / v1) * 2

v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096

v2 = ((pressure / 4.0) * digP[7]) / 8192.0

pressure = pressure + ((v1 + v2 + digP[6]) / 16.0)  

pressure_data = "気圧は %7.2f ヘクトパスカル \n" % (pressure/100)

global atmospheric_data

atmospheric_data = atmospheric_data + pressure_data

 

こちらの関数では、気圧データを取得しているので、最後の方で、そのデータを”atmospheric_data”に追記しています。

 

def compensate_T(adc_T):

global t_fine

v1 = (adc_T / 16384.0 – digT[0] / 1024.0) * digT[1]

v2 = (adc_T / 131072.0 – digT[0] / 8192.0) * (adc_T / 131072.0 – digT[0] / 8192.0) * digT[2]

t_fine = v1 + v2

temperature = t_fine / 5120.0

global atmospheric_data

atmospheric_data = “現在の温度は %-6.2f 度 \n” % (temperature)

 

こちらの関数では、湿度データを取得しているので、最後の方で、そのデータを”atmospheric_data”に追記しています。

 

def compensate_H(adc_H):

global t_fine

var_h = t_fine - 76800.0

if var_h != 0:

var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) * (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h)))

else:

return0

var_h = var_h * (1.0 - digH[0] * var_h / 524288.0)

if var_h > 100.0:

var_h = 100.0

elif var_h < 0.0:

var_h = 0.0

humidity_data = "湿度は %6.2f %です。" % (var_h)

global atmospheric_data

atmospheric_data = atmospheric_data +humidity_data

 

テキストファイルに書き出すテキスト文を作成する時のポイントとしては、”Google Home”に出来るだけ自然な感じで喋ってもらうように、各データを改行コードで区切ることで、一呼吸分の間を設けています。

 

(6) google-home-notifierをインストールしましょう

“Google Home”に喋ってもらうためには、”google-home-notifier“をインストールする必要があります。

詳しい内容は、以前のTALK “Raspberry Piを使ってGoogle Homeに時報サービスをしてもらいましょう”を参考して下さい。

 

(7) Google Homeにテキストファイルの内容を読んでもらいましょう

前回のTALK “Raspberry Piを使ってGoogle Homeに1時間後に雨が降る可能性を予測してもらいましょう“と同様、テキストファイルに書き出した文書を”Google Home”で読んでもらうためのスクリプトを用意します。

 

nano googlehome-atmosphere_report.js

 

var googlehome = require('google-home-notifier');

var language = 'ja'; // if not set 'us' language will be used

googlehome.device('書斎', language); // Change to your Google Home name

// or if you know your Google Home IP

//googlehome.ip('192.168.1.2', language);

var fs = require('fs');

fs.readFile("/home/pi/atmosphere_google_home_notifier.txt", 'utf8', function (err, data) {

        if (err) {

        throw err;

        }

        

        googlehome.notify(data, function(res) {

                console.log(res);

        });

});

 

それでは、スクリプトを実行しましょう。

node googlehome-atmosphere_report.js

 

(8) 書いたスクリプトを定期的に実行するクーロンを設定しましょう

cronを使って、上記で用意したスクリプト 2本を定期的に実行するようにしておきましょう。なお、一日中、喋られても何なので、POOHの場合は、午前7時から22時までの間、毎時1回、喋ってくれるようにしました。

 

crontab -e

05 7-22 * * * python /home/pi/get_atmospheric_data.py

 

06 7-22 * * * nodegooglehome-atmosphere_report.js

 

 

sudo /etc/init.d/cron start

 

以上で、”Google Home”編は完了です。後日、今回の仕組みの一部を使って、予め定めた温度になったら扇風機を回すホームオートメーションにトライしてみようと思います。お楽しみに。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Funeshop BME280 大気圧センサ 温湿度センサー ブ Arduino用
価格:1193円(税込、送料別) (2018/3/14時点)

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Google Home Mini チョーク(グーグル ホーム ミニ チョーク)
価格:6480円(税込、送料無料) (2018/3/14時点)

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Google Home(グーグル ホーム)
価格:15120円(税込、送料無料) (2018/3/14時点)

 

ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。

tomohiko

長年に渡りMacintosh向けの自作アプリを作り続けているPOOHです。最近はiPhone,iPad向けアプリ開発にも挑戦中。グルメ、旅行、露天風呂、写真、サイクリング、映画、STAR TREKが大好き。レトロでSFなおもちゃを大量にコレクション。プレーリードッグと同居中。

おすすめ

コメントを残す