IoTで水耕栽培研究

水耕栽培とかIoTの備忘録

Raspberry PiとGoogleスプレットシートの連携

水耕栽培の水質データをGoogleスプレッドシートに集約する試みです。

f:id:amesyabody:20220205173313p:plain
raspiからgoogleスプレットシードへ

前々回の記事でECを測定するArduinoの仕組みを紹介しました。 amesyabody.hatenablog.com

ここで紹介した記事のプログラムをArduinoに書き込んでいると、シリアルポート出力でECや水温データを出力してくれます。
今回はArduinoRaspberry PiをUSBで接続して、Raspberrypi側でシリアルポート出力を定期的に読みだしてgoogleスプレットシートに 定期的に書き込む仕組みを紹介します。

新たに準備したもの

RaspBerry Pi側の準備

ラズパイのセットアップ方法はほかの記事にお任せします。
とにかくwifiに繋げるなりしてインターネットに接続できる状態まで持っていきましょう。
USBケーブルでラズパイとArduinoを接続し、ラズパイ側のコマンドプロンプトで下記コマンドを打ちます。

lsusb

f:id:amesyabody:20220205180948p:plain
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 スプレッドシート - オンラインでスプレッドシートを作成、編集できる無料サービス

f:id:amesyabody:20220205182440p:plain
こんな感じで記録できます。

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上で「公開」→「ウェブアプリケーションとして導入」をクリックし、 ウェブアプリケーションを導入します。

f:id:amesyabody:20220205183829p:plain
Google Apps Script

公開時には「Who has access to the app」は「Anyone, even anonymous」にするのに注意してください。
認証を求められますがきちんと認証しておきましょう。
ラズパイに保存したpythonのプログラム中の変数「url」には「Current web app URL」で表示されているURLを入れましょう。
そうすることでラズパイがhttpsでデータをpostリクエストするときにこのGASアプリを起動し、 データ取得&Googleスプレッドシートに保存する…という寸法です。 長くなりましたが、これで完了です。導入が面倒でもセットアップしておけば、後はデータを取得し続けてくれるのでとても楽です。
2月なので水温が低くなることもあり、地味に水温データも有用です。
(このデータで水温が低すぎるのに気づいて、水槽用ヒータを導入したりしました。また別の記事で書くかもしれません。)
皆さんもこれで水耕栽培の水のデータを取得してみては如何でしょうか。ではまた!