ラズパイで温湿度を測定しGoogleスプレッドシートに送る-農家のIoT入門(6)
前回の第5回で、温湿度センサーDHT11とRaspberryPiを繋いで、温度と湿度の測定を行いました。
温度と湿度をRaspberryPiで読み取る-農家のIoT入門(5)
ただ、RaspberryPiのモニター上で温度と湿度を表示しただけですので、普通の温度計と変わりません。
と、言うことで!
次はその測定データを、インターネット上にアップするところまでやってみます。
そうすれば、離れたところの温度の変化を、スマホなどで確認出来るようになります。
いよいよIoT、インターネット・オブ・シングスへと突入開始ですね!
温湿度をGoogleスプレッドシートに送る
RaspberryPiで取得した温度や湿度などのデータ。
これをインターネット上に送って管理するには、様々なサービスがあるようです。
今回は「Google Cloud Platform」経由で、「Googleスプレッドシート」に記録する方法を使ってみます。
Google Cloud Platform:グーグルが提供するクラウドサービス
Googleスプレッドシート:グーグル版のエクセル
この2つを使った理由は、まずスプレッドシートなら無料で表計算ソフトが使えてグラフ化も簡単な事。
そして、同じGoogleのサービスなら連携もしやすいのかな?・・と。
あと、色々なサイトを参考にさせて頂いたのですが、この連携が一番簡単そうだったというのもあります。
まだまだ勉強不足なので、自分の知識だけじゃやりたい事に追いつかないんですよね(^_^;)
Google Cloud Platformの設定を行う
まず、クラウド側であるGoogle Cloud Platformの設定を行います。
これに関しては、以下のサイトを参考にさせて頂きました。ありがとうございます。
アソビの忘備録 より
プロジェクトの作成・apiの有効化・サービスアカウントとキーの取得までを行います。
要するに、何と連携するかの設定をして、別サービス同士で通信できるような秘密の鍵と鍵穴を作る感じですね。
この手順については、上記リンクを参照するとわかりやすいです。
Googleスプレッドシートの設定を行う
続いて、表示させるGoogleスプレッドシート側の設定を行います。
Googleスプレッドシートは無料で使えるエクセルだと思ってもらえればOKです。
新しいシートで、「日付」「温度」「湿度」の列を作ります。
このファイルを、共有します。
スプレッドシート右上にある「共有」ボタンを押すと、共有先の設定画面が出てきます。
ここで、先程つくったサービスアカウントIDを入力します。
上側のアカウントが、いつも使っているGoogleのメインアカウント。
下側が、今回連携用に先程作ったアカウントです。
設定を送信すると完了なのですが、なぜかメインアカウントのGmailにエラーの通知が来ますが、無視して構いません。(実害無しのようなので)
これだけで、Googleスプレッドシート側の設定も完了です。簡単!
RaspberryPi + DHT11で測定したデータをスプレッドシートに送る
温度と湿度の測定自体は、前回同様DHT11センサーで行います。
ただ、最終的には土やぼかしの温度と湿度を測定したいので、防水センサーが必要になりますが、まずはお手頃なDHT11でやってみましょう。
まず、Googleスプレッドシートにアクセスする為のライブラリを、ターミナルでPythonにインストールします。
$ pip install gspread
$ pip install oauth2client
ライブラリをインストールするときの注意点ですが、お使いのRaspberryPiで標準のPythonのバージョンがどうなっているのか、よく確認しておきましょう。
Python2系からPython3系へと進化し、2021年現在では3系が当たり前のようになっています。
3系でプログラミングし、3系のつもりでライブラリをインストールしたいのに、お使いのRaspberryPiなどのPythonの標準が2系のままだと、ライブラリも2系にインストールされてしまうようです。(結果、ライブラリがうまく動かず、トラブルの沼にどっぷりとハマります(ハマった))
標準でどのバージョンかの確認は、ターミナルで次のコマンドを入れましょう(Vは大文字)
$ python -V
出てきた結果が、3.X.XX とかなら3系。2.X.XXとかなら2系です。
2021年現在、3系が普通になってきていますので、デフォルトで3系になるように変更しておく事をお勧めします。
やり方は、Python デフォルト バージョン変更 とかで検索すればすぐわかります。
さて話を戻して、ライブラリのインストールが完了したら、今度は先程取得したキーを所定の位置のフォルダに格納します。
Pythonのプログラミングをしたファイル(下の画像だとdh11-shee1.py)と同じフォルダ内に、「cert」というフォルダを作り、その中にキー( jsonファイル )を入れておきます。
で、肝心のスプレッドシート送りのプログラムは、前回のDHT11による温湿度取得プログラムを改変する形で作ってみました。(色々なサイトも参考にしています)
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import gspread
- import RPi.GPIO as GPIO
- import dht11
- import time
- import datetime
- from oauth2client.service_account import ServiceAccountCredentials
- # initialize GPIO
- GPIO.setwarnings(True)
- GPIO.setmode(GPIO.BCM)
- # read data using pin 14
- instance = dht11.DHT11(pin=14)
- key_name = './cert/raspberrypi-1-xxx-xxx.json' # GoogleSheet認証キー
- sheet_name = 'RaspberryPi-1sheet' # シート名
- try:
- if __name__ == '__main__':
- scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
- credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
- gc = gspread.authorize(credentials) # JSONキーファイルで認証
- wks = gc.open(sheet_name).sheet1 # sheetをオープン
- while True:
- result = instance.read()
- if result.is_valid():
- print("Last valid input: " + str(datetime.datetime.now()))
- print("Temperature: %-3.1f C" % result.temperature)
- print("Humidity: %-3.1f %%" % result.humidity)
- time.sleep(5)
- datas = [str(datetime.datetime.now()),result.temperature,result.humidity]
- if result.temperature != 0:
- wks.append_row(datas)
-
- except KeyboardInterrupt:
- GPIO.cleanup()
- pass
まず先に言っておくことが、この内容全てを理解していないって事(^_^;)
他サイトからそのまま活用させてもらった部分も多く、もしかしたら無駄まみれのコードかもしれません。
でもまぁ、やってみて慣れていけばいいと思っているので、おかしなところがあっても大目にみてね(笑)
さて簡単な解説。
17行目:certフォルダ内にいれたjsonファイルのファイル名を入れます。
18行目:スプレッドシートで作ったファイルのシート名
28~30行目:確認用で、RaspberryPi上でも温度と湿度を表示
31行目:5秒間隔でデータ取得
33行目:エラー回避。温度が取得出来ない時があるようなので、0以外の数値なら書き込めって命令
34行目:スプレッドシートへの書き込み。自動で一番下の空白行に書き込んでくれる
これをそのままIDE上(Tonnyとか)でRUNしてもいいし、ターミナル上で動かしてもいいみたい。
RUNすると、IDE上では温度・湿度を取得しているのがわかります。
で、肝心のスプレッドシートを別のパソコンから見てみると、34から36行目に、しっかりと記録されていますね。
バッチリ!大成功です!
ただし、ひたすら温度と湿度と日付を記録し続けるだけなので、次はグラフ化してみたいですね。
今回はここまでです。
いやぁ、苦労した回でした(^_^;)