Raspberry PiとGoogleスプレットシートの連携
水耕栽培の水質データをGoogleスプレッドシートに集約する試みです。
前々回の記事でECを測定するArduinoの仕組みを紹介しました。 amesyabody.hatenablog.com
ここで紹介した記事のプログラムをArduinoに書き込んでいると、シリアルポート出力でECや水温データを出力してくれます。
今回はArduinoとRaspberry PiをUSBで接続して、Raspberrypi側でシリアルポート出力を定期的に読みだしてgoogleスプレットシートに
定期的に書き込む仕組みを紹介します。
新たに準備したもの
USBケーブル(Type A⇔Type B)
RaspBerry Pi Model 3B+
- Raspberry Piのファン付きケース
RaspBerry Pi側の準備
ラズパイのセットアップ方法はほかの記事にお任せします。
とにかくwifiに繋げるなりしてインターネットに接続できる状態まで持っていきましょう。
USBケーブルでラズパイとArduinoを接続し、ラズパイ側のコマンドプロンプトで下記コマンドを打ちます。
lsusb
画像のようにArduinoがちゃんと識別されていればok!
続いて下記のpythonプログラムファイルを作成します。
ファイル名は適当に、「read_serial.py」とでもしておきましょう。
#!/usr/bin/env python # Read the analog sensor value via Arduino. import serial import datetime import os import json import requests #Google GASアプリ URL url = "https://script.google.com/macros/s/hogehoge/exec" headers = {"Content-Type": "application/json"} #シリアルポートを開ける。 ser = serial.Serial("/dev/ttyACM0",9600) #Arduinoからデータを受け取って、ファイルに保存するプロセス while True: arduinoData = ser.readline().strip().decode('utf-8') arduinoData = arduinoData.split(',') #listにします sendData = { "WSN":{ "NodeData":{ "nodeRN":"RP1" } }, "EC25":arduinoData[0], "EC":arduinoData[1], "Rc":arduinoData[2], "WTemp":arduinoData[3], "Vdrop":arduinoData[4] } r = requests.post(url,data=json.dumps(sendData)) print(r) print(json.dumps(sendData)) break ser.close()
Google GASアプリ URLとして指定するURLは後程GASウェブアプリを公開した時に取得するURLを記入します。
最後にcrontabで5分間間隔でプログラムを実行するように仕込みます。
まずcrontabを開きます。
crontab -e
個人的にはnanoで編集するのがおすすめです。 crontabの最終行に下記を追記して保存して閉じます。
*/5 * * * * /usr/bin/python /home/pi/Desktop/read_serial.py
これでラズパイ側の準備は完了です。
Googleスプレッドシート
今回はデータ蓄積をgoogleスプレッドシートで行います。
これ、無料で使えるのはとんでもない事だと思ってます…活用しない手はないです。
Google スプレッドシート - オンラインでスプレッドシートを作成、編集できる無料サービス
googleアカウントでスプレットシートを作成し、「sensor_data」というシートと「waterinfo」というタブを作成しておきます。
このシートの先頭行に適当にEC25等の項目名をあらかじめ入れておきましょう。
シート上の「拡張機能」→「Apps Script」をクリックし、下記のスクリプトを追加します。
var spreadsheetId = 'hogehoge'//←スプレッドシートのIDを入れる //Postされたデータを受け取り function doPost(e){ var params = JSON.parse(e.postData.getDataAsString()); // JSONパース var LicCharge; var data; //////////////////////////////////////////////////////////////////////// if (params.WSN.NodeData.nodeRN == 'RP1'){ dev_name = 'waterinfo'; data = [ new Date(), // アップロード終了時刻 params.EC25, // EC(25℃補正) params.EC, // EC(生値) params.Rc, // Rc水中抵抗値 params.WTemp, // 水温 params.Vdrop, // 水中電圧降下 ]; } //////////////////////////////////////////////////////////////////////// addData(dev_name, data); return ContentService.createTextOutput("ok"); } //スプレッドシートへのデータ行書き込み function addData(sheetName, data){ var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName); sheet.appendRow(data); }
スクリプトを保存したらGAS上で「公開」→「ウェブアプリケーションとして導入」をクリックし、 ウェブアプリケーションを導入します。
公開時には「Who has access to the app」は「Anyone, even anonymous」にするのに注意してください。
認証を求められますがきちんと認証しておきましょう。
ラズパイに保存したpythonのプログラム中の変数「url」には「Current web app URL」で表示されているURLを入れましょう。
そうすることでラズパイがhttpsでデータをpostリクエストするときにこのGASアプリを起動し、
データ取得&Googleスプレッドシートに保存する…という寸法です。
長くなりましたが、これで完了です。導入が面倒でもセットアップしておけば、後はデータを取得し続けてくれるのでとても楽です。
2月なので水温が低くなることもあり、地味に水温データも有用です。
(このデータで水温が低すぎるのに気づいて、水槽用ヒータを導入したりしました。また別の記事で書くかもしれません。)
皆さんもこれで水耕栽培の水のデータを取得してみては如何でしょうか。ではまた!