top of page


皆さんこんにちは、D2-PLANの小柳です。


今回ご紹介するのRaspberry Pi Zero WHで温湿度をスプレッドシートに定期記録しグラフ化編です。


これからIoTをかじろう、ラズパイ買ってみようと考えている方、


また既にラズパイを買ってみたという方には為になれば幸いと思います。






 

『使いこなせラズパイ企画!』


この企画は誰だって買えるRaspberry Piを使用したIoT化を目指し初歩的な電子工作から高度なIoTにもチャレンジしていく企画です。特に田舎、地方に特化したIoT活用方法を考えながら進め少しでも現場で使えるIoT化ができればと思っています。私自身ラズパイは初心者なのでブログを通して成長して行ければと思います。



 

本題 

『Raspberry Pi Zero WHで温湿度をスプレッドシートに定期記録しグラフ化』

 
  1. ラズパイ購入から温湿度取得まで

  2. Google APIの設定

  3. Googleスプレッドシートの準備

  4. 必要モジュールのインストール

  5. 温湿度の定期記録プログラム作成

 






ラズパイ購入から温湿度取得まで

 

前々回までの記事です。必要な方はチェックしてみてください。

  1. Raspberry Pi Zero WHって?

  2. Raspberry Pi Zero WHの初期設定

  3. 必要なもの

  4. 事前にSSHとVNCの設定

  5. 配線方法

  6. 必要パッケージのインストール

  7. 温湿度取得プログラムの準備と実行









Google APIの設定

 

まずは初めにGoogle APIの設定をします。APIとはアプリケーションプログラムインターフェースの略になります。言葉のまま、アプリ同士をプラグラムで繋ぐインターフェースの役割ということですね。


今回はスプレットシートを使うのでGoogleAPIを使用します。これはGoogleが提供しているAPIサービスです。Google以外にもAmazonやその他にも沢山の会社が提供しています。


私もプログラミングを再度勉強し始めてから深く知りましたが、このサービスを活用することでIoT関係への活用は無限大です。


詳しくは、YouTube等で勉強してみましょう。


さておき、GoogleAPIのサイトでAPIの設定をします。

https://console.developers.google.com/cloud-resource-manager


まず、プロジェクトを作成します。上記のURLをクリックすると以下のような画面が表示されるので赤丸のところをクリックします。







次に、任意のプロジェクト名を設定し作成します。







次に、使用するAPIの有効化を設定します。画面左上のナビゲーションをクリックし、「APIとサービス」→「ライブラリ」の順で進み選択します。





検索にて 「Google Sheets API」で検索し、下記を選択します。





そして、下記画面の「有効にする」をクリックします。




これで初めに作成したプロジェクトに対して、このAPIサービスのライブラリを有効化したということになります。




次にもう一つ「Google Drive API」サービスのライブラリを有効化します。

先程の検索画面で検索して、下記を有効にしてください。






次に、認証情報の設定を行います。外部との紐付けをするための作業です。

下記、「APIとサービス」→「認証情報」をクリックします。





「認証情報を作成」→「サービスアカウント」をクリックします。





サービスアカウント名を設定します。任意の名前で問題ありません。

「完了」をクリックします。




次に、サービスアカウントが作成されるので、画面右側の鉛筆マーク編集をクリックします。※ここに書いているメールアドレスは後ほど使用するのメモしておくといいです。







項目タブより「キー」を選択し、「鍵を追加」をクリックします。




「新しい鍵を作成」をクリックします。キーのタイプ「JSON」で作成をクリックします。すると、キーがダウンロードされます。このJSONファイルを後ほど使用します。紐付けを行うための認証情報になります。取扱いには注意が必要です。










Google スプレッドシートの準備

 

スプレッドシートを準備します。任意の名前でスプレッドシート作成し、画面右上の共有をクリックします。






そして、先程作成したサービスアカウントのメールアドレスを入力して共有を完了します。


これでスプレッドシートの紐付け設定は完了です。


またスプレッドシートには取得した情報が入る枠を用意しておきます。タイプスタンプ、温度、湿度を1行目に入力しておきます。










必要モジュールのインストール

 

ラズパイの作業に移ります。まずはラズパイに必要モジュールをインストールします。今回インストールが必要ななのは下記です。



pip3 install gspread
pip3 install oauth2client

まず、上の「gspread」これはその名の通りGoogleスプレッドシートを制御する為のライブラリです。今回の場合、スプレッドシートに取得した情報を格納したりする際に働いてくれます。


次に「oauth2client」これはGoogleAPIとの連携をしてくれるライブラリです。今回の場合、スプレッドシートとの接続を行うために、作成した認証キーを介して紐付けを行ってくれます。


※ちなみに私はpython3を使用しております。








温湿度定期記録プログラムの作成

 

最後にプログラムを書いていきます。プログラムはいろんな書き方があるので、一概にこれが正解ではないです。が、初心者の私はこのように書きました。もっといい書き方があれば教えて欲しいです。よろしくお願いいたします。



#!/usr/bin/python3
# -*- coding: utf-8 -*-

#実行モジュールのインポート
import datetime
import time
import requests
import Adafruit_DHT
import gspread
from oauth2client.service_account import ServiceAccountCredentials
 

#センサの設定
sensor = Adafruit_DHT.DHT22
pin = 23
    
    
    
#スプレッドシートの住所的なもの
key_name = 'raspi-test-330502-2ca9d26dbe7a.json'
sheet_name = 'raspi_test'


 
#GoogleAPIを通してスプレッドシートに接続
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)

wks = gc.open(sheet_name).sheet1




#繰り返しループで入力
gyo = 2
while True:
    x = 0
    while x < 1:
        try:
            humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
            x = 1
            dtnow = str(datetime.datetime.now())
        except:
            x = 0
    wks.update_cell(gyo,1, dtnow)
    wks.update_cell(gyo,2, temperature)
    wks.update_cell(gyo,3, humidity)
    gyo = gyo +1
    
#5分間隔ストップさせる
    time.sleep(300)

python3で実行させる場合は初めの「python3」をお忘れなく。そんなことあり得ないのかもしれないけど、ここがずっと「python」になっていた為私はかなり迷いました。


実装している内容は、5分間ごとにスプレッドシートに、日時、温度、時間を記録していくというプログラムです。


これを実行すると、このように、データ収集を自動でしてくれます。いい感じですね。グラフも初めから列に対して作っておけばグラフも自動化です。スプレッドシート素晴らしい。そしてGoogleAPI素晴らしい。





っと思いきや、データ収集がストップしてしまいました。


なんでだろうと思い調べていると、MacからSSHでラズパイに接続しプログラムを実装していましたが時間経過するとSSHが自動で切断させてしまうようでした。


解決策は下記でした。


Mac上でのSSH設定として、下記場所にconfigというファイルと作ります。

~/.ssh/config

そして内容に下記を書き込みます。


ServerAliveInterval 300
TCPKeepAlive yes

一体これがなんなのかというと、サーバーとの通信が一定時間ないとSSHは接続を自動で切るようです。そのため、一定の間隔で信号を飛ばすようなことです。ここでは300秒(5分間隔)で自動的に信号を出すような宣言になっています。

これにより、接続が切れることなくずっとプログラムが動いてくれる...と思います。




今晩試します。



さて、次回は何をしようか、面白いネタがあればまた書きます。



それではまた!



※走り書きで文章を書いておりますので、間違った内容や不備がある場合があります。お気づきになられましたら是非ご連絡下さいますと幸いです。



instagram 宗一郎 → @soichiro_koyanagi



instagram D2-PLAN → @d2_plan