05-26-2024 06:53 AM
LabVIEWで収録した測定データをGoogleスプレッドシートにアップロードする方法について紹介したいと思います。
小規模なロギングで測定データをクラウドに保存してデータを共有したい時や、できるだけコストをかけずにデータをクラウドに保存したい場合に役に立つかもしれません。
********************************************************
LabVIEWで行うデータ収録ではPCのストレージが利用できるのでわざわざGoogleスプレッドシートに保存したいという状況はあまり無いと思いますが、WiFiが利用できるマイコンを使って温湿度を記録したいと思いGoogleスプレッドシートとGoogle Apps Scriptが使えないかと事例を探していたところ、ESP32とArduinoで事例が見つかりました。
https://make-iot.com/2020/12/19/m5stickcを使用したセンサーの値をgoogleスプレッドシート/
ESP32が使われているM5stickCの例ですが、他のESP32を使用したボードでも動作させることができました。
Google Apps Scriptに関しては、神戸大学国際人間科学部の学部共通科目(選択科目)として開講している「プログラミング基礎演習1・2」の講義テキストの「Google Apps Script編」が大変参考になりました。
https://www2.kobe-u.ac.jp/~tnishida/programming/
LabVIEWでもこの方法を使えば簡単にGoogleスプレッドシートにデータを記録できそうなので試したところとても簡単だったので記事として残そうと思います。他にLabVIEWからGoogleスプレッドシートにアクセスする方法を調べると「Report Generation Toolkit for Google Sheets」が見つかりましたのでこれを活用するのも良いかもしれません。ブロックダイアグラムが公開されていないので詳細は不明です。
Google Apps ScriptでHTTPサーバーを動かしてPOSTリクエストが来たときにGoogleスプレッドシートにデータを書き込んでレスポンスを返す仕組みを作ります。LabVIEWからはHTTPサーバーにJASON形式のデータをPOSTリクエストで送るだけです。
私の理解はこの程度ですが、仕組みの背景は神戸大学の講義、具体的な中身はESP32の記事を読んでいただければ良いと思います。
下の図のようにグーグルドライブに新しいシートを作成して、ここではシート名をmyDataに変更しました。1行目に項目名を記入しておきます。機能拡張メニューのApps Scriptからプロジェクトにスクリプトを作成します。
ここではdataUploadというプロジェクト名にしました。コード.gsを作成します。POSTリクエストが来た時にdoPost関数が作動します。24時間、1年中、POSTを待ってくれているのでありがたいことです。setData関数がシートへの操作です。2行目に1行挿入して、2行目にデータを書きます。
一応コードをコピーできるようにしておきます。
function setData(sheet, val) {
sheet.insertRows(2,1);
sheet.getRange(2, 1).setValue(new Date());
sheet.getRange(2, 2).setValue(val);
}
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('myData');
var params = JSON.parse(e.postData.getDataAsString());
var val = params.data0;
// スプレッドシートに値を代入
setData(sheet, val);
}
デプロイするとしたの図のようにURLが生成されて、外部からPOST出来るようになります。
LabVIEWでのデータ書き込みは60秒おきに12.34 x (i)を送る例です。header, value, urlを入力します。
V Iを添付します。LabVIEW2023Q1 Mac版で作ったVIなのでWindowsでは崩れるかもしれませんが、ご容赦ください。
ラズベリーパイPico WのMicroPythonでも同様に動作しています。
データを記録するという役目は果たしていますが、レスポンスでエラーが返っているようです。詳しい方時間があるようでしたら教えてください。
05-27-2024 01:06 AM
ラズパイPico Wでのロギングもついでに紹介します。
秋月のBME280基板で温度湿度気圧を測定してGoogleスプレッドシートに記録します。BME280での測定プログラムは「最新Pico W対応!ラズパイPico完全ガイド」の例をそのまま使いました。
https://info.nikkeibp.co.jp/media/RAS/atcl/books/021300015/
シートへの記録例です。時刻、温度、湿度、気圧を20秒間隔で記録しています。
グーグルスクリプトは3個のデータに対応させました。
function setData(sheet, val0, val1, val2) {
sheet.insertRows(2,1);
sheet.getRange(2, 1).setValue(new Date());
sheet.getRange(2, 2).setValue(val0);
sheet.getRange(2, 3).setValue(val1);
sheet.getRange(2, 4).setValue(val2);
}
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('weather');
var params = JSON.parse(e.postData.getDataAsString());
var val0 = params.data0;
var val1 = params.data1;
var val2 = params.data2;
// スプレッドシートに値を代入
setData(sheet, val0, val1, val2);
}
pico Wのプログラムです。bme280.pyという測定用ライブラリがpico W内にコピーされています。PCに接続していない時には下記のプログラムをmain.pyという名前でpico W内に保存したプログラムが起動します。
#weatherDataUpload.py 20240527 Koji Ohashi
#bme280.py by Kazuhiro Fukuda
from machine import Pin, I2C
import time
import bme280
import network
import urequests as requests
import ujson
ssid = '*********'
passwd = '***********'
request_url = 'https://script.google.com/macros/s/AKfycbytz.......X1r-X705_6tGqt/exec'
header = {'Content-Type' : 'application/json'}
wifi = network.WLAN( network.STA_IF )
wifi.active( True )
wifi.connect( ssid, passwd )
while wifi.isconnected() == False:
print("Try to connect wifi network.")
time.sleep( 1 )
wifi_status = wifi.ifconfig()
print( "Connected network." )
def http_post_data(data0, data1, data2):
post_data = ujson.dumps({ "data0": data0, "data1": data1, "data2": data2})
res = requests.post(request_url ,data = post_data ,headers = header )
res.close()
BME280_ADDR = 0x76
I2C_SDA = 12
I2C_SCL = 13
I2C_CH = 0
i2c = I2C( I2C_CH, scl=Pin( I2C_SCL ), sda=Pin( I2C_SDA ), freq=100000)
i2c.scan()
sensor = bme280.bme280( i2c, BME280_ADDR )
sensor.setup()
while True:
( temp, humi, press ) = sensor.get_value()
http_post_data(temp, humi, press)
print( "Temperature:{:.2f}C Humidity:{:.2f}% Pressure:{:.2f}hPa".format( temp, humi, press ) )
time.sleep(20)
アドバイスがあればどうぞよろしくお願いします。