RaspberryPi+BME280で温湿度と気圧を測定してTwitterとGoogleスプレッドシートに記録してみる

前回のRaspberryPi動体検知に続いて、今度はRaspberryPiとセンサーを使って温湿度の測定と記録に着手しました。これで湿気あふれる沖縄の梅雨を快適に過ごすための仕組みを作ってみたいと思います。

できること

  • RaspberryPiに繋げたセンサーで「温度」「湿度」「気圧」を測定
  • 測定値をTwitterにポスト
  • 測定値をGoogle スプレッドシートに記録

材料

前回組み立てたRaspberryPi動体検知セットをそのまま流用して、環境情報測定用に秋月電子でセンサーモジュールキットを追加購入しました。

キットといっても、小さな基盤とピンヘッダの2点だけです。

ピンヘッダをはんだ付けして完成です。

参考サイト

回路接続

AE-BME280のデータシートを見ると、I2C通信をする場合は基盤のJ3をはんだジャンパするようにとありますが、3pinを3.3Vに繋げばOKということなので、半田ジャンパはしないで接続しました。

  • BME280 1pin(VDD) – ブレッドボード – RasPi 1pin(3.3V)
  • BME280 2pin(GND) -ブレッドボード – RasPi 6pin(GND)
  • BME280 3pin(VDD) -ブレッドボード – RasPi 1pin(3.3V)
  • BME280 4pin(SDI) -ブレッドボード – RasPi 3pin(GPIO02)
  • BME280 5pin(SDO) -ブレッドボード – RasPi 6pin(GND)
  • BME280 6pin(SCK) -ブレッドボード – RasPi 5pin(GPIO03)

RaspberryPi の設定

1. raspi-configでI2Cを有効にする

$ sudo raspi-config
5 Interfacing Options Configure connections to peripherals
  P5 I2C Enable/Disable automatic loading of I2C kernel module

2. I2Cを制御するためのライブラリをインストール

$ sudo apt-get update
$ sudo apt-get install i2c-tools
$ sudo apt-get install python-smbus

3. I2Cの接続確認

$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

4. pythonでBME280を制御する

プログラムはSWITCHSCIENCEが公開しているものを使います。

SWITCHSCIENCE/BME280

$ git clone https://github.com/SWITCHSCIENCE/BME280.git
$ wget https://github.com/SWITCHSCIENCE/BME280/archive/master.zip
$ unzip master.zip
$ cd BME280-master/Python27

実行してみる。

$ python bme280_sample.py
Traceback (most recent call last):
File "./BME280-master/Python27/bme280_sample.py", line 3, in <module>
from smbus2 import SMBus
ImportError: No module named smbus2

エラーが出るので、一部修正する。

$ vim BME280-master/Python27/bme280_sample.py
 - from smbus2 import SMBus
 + from smbus import SMBus

再度実行。

$ python BME280-master/Python27/bme280_sample.py
 temp : 27.61 ℃
 pressure : 1007.32 hPa
 hum : 69.77 %

取得完了!

測定値をTwitterにTweetする

1. TwitterのConsumer keyとAccess tokenを取得する

Twitter Application Management

アプリを登録して、キーを取得します。電話番号の登録が必要です。

Consumer Key (API Key) 
Consumer Secret (API Secret)

2. Twitterのライブラリ twython をインストール

$ sudo pip install twython
$ sudo pip install requests_oauthlib

3. PythonでTweetする

センサーから値を取得するプログラムに、Tweet機能を追加する。

$ cp BME280-master/Python27/bme280_sample.py bme280_tweet.py

コードに必要部分を追加します。compensate_P/T/Hは測定値を文字列で戻すようにして、変数tweet_strで組み立てて出力しました。

from twython import Twython, TwythonError
from datetime import datetime
:
tweet_str = ''
:

def read_data():
 global tweet_str
:
 tweet_str = compensate_T(temp_raw)
 tweet_str = tweet_str + ' ' + compensate_P(pres_raw)
 tweet_str = tweet_str + ' ' + compensate_H(hum_raw)
 print tweet_str
:

def tweet_data():
 consumerKey = "{Consumer Key (API Key)}"
 consumerSecret = "{Consumer Secret (API Secret)}"
 accessToken = "{Access Token}"
 accessSecret = "{Access Token Secret}"
 twitter = Twython(consumerKey, consumerSecret, accessToken, accessSecret)
 twitter.update_status(status=datetime.now().strftime("%Y/%m/%d %H:%M:%S") + ' ' + tweet_str)
 :

def compensate_P(adc_P):
:
return " / 気圧: %7.2f hPa" % (pressure/100)

def compensate_T(adc_T):
:
return " / 温度: %-6.2f℃" % (temperature)

def compensate_H(adc_H):
:
return " / 湿度: %6.2f %%" % (var_h)

if __name__ == '__main__':
 try:
:
read_data()
tweet_data()
:

測定値を Google スプレッドシートに記録していく

1. GoogleAPIs の API コンソール を使用してプロジェクトを作成する。

2. API 一覧から「Drive API」を選んで有効にする。

3. 「認証情報の作成」をする。

サービスアカウントキーを作成します。

4. 「プロジェクトへの認証情報の追加」でサービスアカウントを作成する。

(画像はP12になってますが)秘密鍵ファイルをJSONでダウンロードする。

5. スプレッドシートを共有する。

共有するユーザーに、APIのサービスアカウントを指定します。

6. Pythonのモジュールのインストール

$ sudo pip install --upgrade oauth2client
$ sudo pip install gspread

7. 秘密鍵ファイルをRaspberryPiに転送する

$ scp ~/Desktop/RaspberryPi/{KEY_FILE_NAME}.json pi@{raspberrypi.local}:/home/pi/

8. PYTHONでGoogleスプレッドシートに記録する

以下の部分を測定プログラムに追加した。column_datasに測定値を配列で入れて、write_data()でAPIに投げる。

:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
:
column_datas = []
:
def read_data():
global column_datas
:
column_datas.append(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
:

def write_data():
 global column_datas
 filename = '/home/pi/{KEY_FILE_NAME}.json'
 client_email = "{サービスアカウントID(メールアドレス)}"
 with open(filename) as f: private_key = f.read()
 scopes = ['https://spreadsheets.google.com/feeds/', 'https://docs.google.com/feeds']
 credentials = ServiceAccountCredentials.from_json_keyfile_name(filename, scopes)
 gs = gspread.authorize(credentials)
 doc = gs.open('{スプレッドシート名}')
 sheet = doc.worksheet("{シート名}")
 sheet.append_row(column_datas)
:

def compensate_P(adc_P):
global column_datas
:
column_datas.append("%7.2f" % (pressure/100))
:

def compensate_T(adc_T):
global column_datas
:
column_datas.append("%-6.2f" % (temperature))
:

def compensate_H(adc_H):
global column_datas
:
column_datas.append("%6.2f" % (var_h))
:

if __name__ == '__main__':
 try:
:
read_data()
 tweet_data()
 write_data()
:

実際にシートに書き込む部分は、sheet.append_row() で行っている。最終行に追加するので、スプレッドシートは予め1行だけ残して削除しておく。

9. crontabで定時起動を設定する

$ sudo crontab -e

10分起きに起動して、ツイート&保存。

*/10 * * * * python /home/pi/bme280_tweet.py

10. Googleスプレッドシートに保存可能なデータ容量

Google スプレッドシートで作成したスプレッドシートまたは Google スプレッドシート形式に変換したスプレッドシートは 200 万セルまで。

Google ドライブに保管可能なファイル – Google ドライブ ヘルプ

だそうなので、10分毎に1回4セル(日時、温度、湿度、気圧)保存すると、50万回分、50万回x10分≒9.5年分ぐらい記録できるのかな?

補足

今回測定した温湿度の情報をもとに、次は自動もしくはリモートでエアコンを動作させてみようと思います。

また、今後は屋外の天候情報も測定&記録していきたい。

ちなみに、動画で時刻をしゃべっているのは、Open JTalkを使って各種情報や定刻のアナウンスさせています。こちらは別途まとめる予定です。

感想

RaspberryPiはセンサーやモーターを目的に合わせて自由に組合わせることができるので自由度が高くて楽しいし、事例やサンプルが豊富なので着手しやすいのがとても良いです。

色んな用途の実装を試して、子供にも「こんなのもできるんだねー」というのを見せていきたいですよ。

コメントを残す

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