ラズパイで温湿度を測定し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の設定を行います。

これに関しては、以下のサイトを参考にさせて頂きました。ありがとうございます。

Raspberry Pi 4Bで気温・湿度を取得してGoogleスプレッドシートに記録する(DHT22)後編

アソビの忘備録 より

プロジェクトの作成・apiの有効化・サービスアカウントとキーの取得までを行います。

要するに、何と連携するかの設定をして、別サービス同士で通信できるような秘密の鍵と鍵穴を作る感じですね。

この手順については、上記リンクを参照するとわかりやすいです。

Googleスプレッドシートの設定を行う

続いて、表示させるGoogleスプレッドシート側の設定を行います。

Googleスプレッドシートは無料で使えるエクセルだと思ってもらえればOKです。

新しいシートで、「日付」「温度」「湿度」の列を作ります。

このファイルを、共有します。

スプレッドシート右上にある「共有」ボタンを押すと、共有先の設定画面が出てきます。

ここで、先程つくったサービスアカウントIDを入力します。

上側のアカウントが、いつも使っているGoogleのメインアカウント。

下側が、今回連携用に先程作ったアカウントです。

設定を送信すると完了なのですが、なぜかメインアカウントのGmailにエラーの通知が来ますが、無視して構いません。(実害無しのようなので)

これだけで、Googleスプレッドシート側の設定も完了です。簡単!

RaspberryPi + DHT11で測定したデータをスプレッドシートに送る

温度と湿度の測定自体は、前回同様DHT11センサーで行います。

ただ、最終的には土やぼかしの温度と湿度を測定したいので、防水センサーが必要になりますが、まずはお手頃なDHT11でやってみましょう。

まず、Googleスプレッドシートにアクセスする為のライブラリを、ターミナルでPythonにインストールします。

$ sudo pip install gspread
$ sudo 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による温湿度取得プログラムを改変する形で作ってみました。(色々なサイトも参考にしています)

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import gspread
  4. import RPi.GPIO as GPIO
  5. import dht11
  6. import time
  7. import datetime
  8. from oauth2client.service_account import ServiceAccountCredentials
  9. # initialize GPIO
  10. GPIO.setwarnings(True)
  11. GPIO.setmode(GPIO.BCM)
  12. # read data using pin 14
  13. instance = dht11.DHT11(pin=14)
  14. key_name = './cert/raspberrypi-1-xxx-xxx.json' # GoogleSheet認証キー
  15. sheet_name = 'RaspberryPi-1sheet' # シート名
  16. try:
  17.     if __name__ == '__main__':
  18.         scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
  19.         credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
  20.         gc = gspread.authorize(credentials) # JSONキーファイルで認証
  21.         wks = gc.open(sheet_name).sheet1 # sheetをオープン
  22.     while True:
  23.         result = instance.read()
  24.         if result.is_valid():
  25.             print("Last valid input: " + str(datetime.datetime.now()))
  26.             print("Temperature: %-3.1f C" % result.temperature)
  27.             print("Humidity: %-3.1f %%" % result.humidity)
  28.         time.sleep(5)
  29.         datas = [str(datetime.datetime.now()),result.temperature,result.humidity]
  30.         if result.temperature != 0:
  31.             wks.append_row(datas)
  32.         
  33. except KeyboardInterrupt:
  34.     GPIO.cleanup()
  35.     pass

まず先に言っておくことが、この内容全てを理解していないって事(^_^;)

他サイトからそのまま活用させてもらった部分も多く、もしかしたら無駄まみれのコードかもしれません。

でもまぁ、やってみて慣れていけばいいと思っているので、おかしなところがあっても大目にみてね(笑)

さて簡単な解説。

17行目:certフォルダ内にいれたjsonファイルのファイル名を入れます。
18行目:スプレッドシートで作ったファイルのシート名
28~30行目:確認用で、RaspberryPi上でも温度と湿度を表示
31行目:5秒間隔でデータ取得
33行目:エラー回避。温度が取得出来ない時があるようなので、0以外の数値なら書き込めって命令
34行目:スプレッドシートへの書き込み。自動で一番下の空白行に書き込んでくれる

これをそのままIDE上(Tonnyとか)でRUNしてもいいし、ターミナル上で動かしてもいいみたい。

RUNすると、IDE上では温度・湿度を取得しているのがわかります。

で、肝心のスプレッドシートを別のパソコンから見てみると、34から36行目に、しっかりと記録されていますね。

バッチリ!大成功です!

ただし、ひたすら温度と湿度と日付を記録し続けるだけなので、次はグラフ化してみたいですね。

今回はここまでです。

いやぁ、苦労した回でした(^_^;)