温湿度・気圧センサモジュール、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”編は完了です。後日、今回の仕組みの一部を使って、予め定めた温度になったら扇風機を回すホームオートメーションにトライしてみようと思います。お楽しみに。
|
|
|
ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。