
[技術]Raspberry Pi Pico Wの温度計測データをGoogleスプレッドシートを使ってロギングする方法
背景
温度ロギングができる装置をRaspberry Pi Picoで作成中
温度をオンラインで確認できるようにしたいが、データ受信用のサーバーを用意したくない
この記事で挑戦すること
Raspberry Pi Pico Wで取得したデータをオンラインで送信し、Googleスプレッドシートにリアルタイムにロギングできるようにする
(※IFTTTは使用しない)
※IFTTT(イフト):様々なインターネット上のサービスを連携させられるサービス。IFTTTを中継してRaspberry PiとGoogleスプレットシートを連携させるチュートリアルが多く存在するが、2024年5月現在有料化されている
方針
Google Apps Script (GAS)を利用して、Raspberry Pi Pico WからGoogleスプレッドシートに直接データを送信する
実験
GASを作成する
Googleスプレッド上に空のシートを作成
Apps Scriptを選択

プログラムの作成
今回は下記のように入力した
doGet関数は、Getリクエストを受け取った時に実行される
Getリクエストを通して、センサー温度の値、目標値、PID制御のパラメーター(P値、I値、D値、PID出力)、ヒーターオン時間、ヒーターオフ時間を受け渡し、それをシートの最後の行に追記する。

function doGet(e) {
//データを取り出す
var temp = e.parameter.temp;
var target = e.parameter.target;
var p = e.parameter.p;
var i = e.parameter.i;
var d = e.parameter.d;
var power = e.parameter.power
var ontime = e.parameter.ontime
var offtime = e.parameter.offtime
//現状Activeになっているsheetを取得
var sheet = SpreadsheetApp.getActiveSheet();
//日時と送信されたデータ値 を追記
sheet.appendRow([new Date(), temp, target, p, i, d, power, ontime, offtime]);
}
デプロイ
アクセス権を設定する。New deployment→Web app→Anyone(URLを知っている人なら誰でもアクセスできる状態になるのでURLの取扱注意)



進んでいくと下記のような画面が出るのでAdvancedを選択し
「安全でないページに移動」という項目をクリック

発行されるURLをコピーしGASの準備完了

PythonからGet送信
requestライブラリをインポートし、発行したURLにGetリクエストでデータを送信する。
Getでデータを送信する時のフォーマットは下記のようになる。
https://URL?temp=AAA&target=BBB&p=CCC& ・・
今回はmkurlという名前の関数を定義して、このURLを文字列としてupdurl変数に返している。
その後、requests.get(updurl)とすればgetリクエストで送信される。
うまく送信されるとGAS側で定義したdoGet関数が実行される。
import network
import requests
url ="https://script.google.com/macros/s/(発行したURL)"
(省略)
def mkurl(url, temp, target, p, i, d, power, ontime, offtime):
newurl = url+"?"
newurl += "temp=" + str(temp)+"&"
newurl += "target=" + str(target)+"&"
newurl += "p=" + str(p)+"&"
newurl += "i=" + str(i)+"&"
newurl += "d=" + str(d)+"&"
newurl += "power=" + str(power)+"&"
newurl += "ontime=" + str(ontime)+"&"
newurl += "offtime=" + str(offtime)
return newurl
(省略)
def main():
(省略)
updurl = mkurl(url, temp, target, pg, ig, dg, power, on, off)
requests.get(updurl)
結果
成功!
自動的にロギングデータがGoogleスプレッドシートに飛んできます。
改善点としてはGetリクエストは時々エラーを出すので、エラーの場合は再度リクエストするようなエラーの処理をした方がいいですね。
次は、これを手元のエクセルに同期するようにしたい。
