M5StickC PlusとUIFlowでプログラミング(Ex5) - 測ったデータをGoogleスプレッドシートに記録する
Ex4でINA226を使用した電流・電圧のデータ測定ができました。表示している数値をメモして記録するのでもよいのですが、せっかくですから、Googleスプレッドシートに記録してみます。
UIFlowのブラウザ版を使用している関係で、M5StickCPlusは既にインターネットに接続されています。このままGoogleスプレッドシートを使用します。
Googleスプレッドシートを外部から操作するには、GoogleAppsScript(GAS)というプログラミング言語を使用します。GASとは、Googleが開発・提供しているプログラミング言語で、JavaScriptというWebブラウザ上で動作するプログラミング言語をベースに作成されています。GoogleのサービスをGASから扱うことができます。
まず、Googleスプレッドシートを起動します。
Googleスプレッドシートから新しいスプレッドシートとして「空白」を選択します。
無題のスプレッドシートができます。A1セルに「時刻」B1セルに「電圧」C1セルに「電流」を入力します。
この後の動作ですが、M5StickCPlusからデータを受信したら、2行目に行を追加し、追加した行に時刻、電圧、電流を記録することとします。データ受信は、JavaScriptでよく使用されるJSON形式を使用します。
まず、シート名を「データ」に変更します。
「ツール」から「スクリプトエディタ」を起動し、新規プロジェクトを作成します。
GASはテキストベースのプログラミング言語です。新規プロジェクトの
function myFunction() {
}
を以下のコードと置き換えます。
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ'); //”データ”シートをアクティブにする。
var jsonString = e.postData.getDataAsString();
var params = JSON.parse(jsonString);
// データをシートに追加
sheet.insertRows(2,1); // 2行目に行を追加
sheet.getRange(2, 1).setValue(new Date()); // 受信時刻を記録
sheet.getRange(2, 2).setValue(params.Voltage); // 電圧
sheet.getRange(2, 3).setValue(params.Ampere); // 電流
}
簡単にコードの説明をします。
GASでM5StickCPlusからデータを受け取るにはdoPost(e)関数を使います。
function doPost(e) {
}
変数Sheet、jsonString、paramsを作成して、Sheetには「データ」シートを、jsonStringには受信した文字列を、paramsには、受信した文字列をJSON形式として、展開した結果を入れます。
2行目に行を追加し、1列目には受信時刻を、2列目には電圧を、3列目には電流を入れます。
スクリプトエディタの「公開」から「ウェブアプリケーションとして導入」を選びます。プロジェクトに名前をつけてなければ、「Edit Project Name」(プロジェクト名の編集)と、名前をつけるよう促されるので、名前をつけます。「Deploy as web app」(ウェブアプリとして使用できるようにする)の表示の中で、「Who has accsess to the app:」(このアプリに誰がアクセスしますか)の項目を「Anyone, even anonymous」(誰でも、匿名でも)にして「Deploy」(使用できるようにする)を押します。「Authorization requierd」(許可が必要)と、出るので、「許可を確認」します。
この後は、意味としてはアクセス権の確認や本当に実行していいかの確認になります。アクセス権のある人がアクセスしているのかどうかや、世の中には悪意のあるプログラムもあるので、本当に実行していいのかなどの確認です。今回は自分で作成して自分で(M5StickCPlusからアクセスなので、他人扱いになりますが)使うので全部「許可」ですが、第3者が作成したプログラム等を使う場合は安全をちゃんと確認してから実行しましょう。
アカウント選択画面になるので、Googleスプレッドシートを作成したアカウントを選択すると「このアプリはGoogleで確認されていません」画面が表示されます。「詳細」から「プロジェクト名(安全ではないページ)に移動」を選んで、ウェブアプリからのアカウントのアクセスのリクエストを「許可」します。すると、URLが発行され、ウェブアプリとして実行できるようになります。そのURLを控えておきましょう。
UIFlow側のプログラムは以下の様な感じです(電圧・電流の計測、表示は関数化しています)。
変数「jsonデータ」を作成して、送信データをJSON形式で用意します。JSON形式は、{"key(キーワード)":"Value(値)"} の形式でデータを表します。"key"を、電圧は"Voltage"、電流を"Ampere"として、「マップを作成」ブロックからマッピングして(対応させて)、JSONデータを作成します。このVoltage、AmpereはGASのプログラムで参照している値ですので、そこと揃えます。
※この画像ファイルだけアップロードするとなぜか破損ファイルになりました。原因はよく分かりません。管理画面では正常に表示されますが、公開すると埋め込みが機能しませんでした。仕方がないので管理画面で正常表示されたものを再びキャプチャしたものに差し替えてあります。
送信データを用意できたら「高度なブロック」から「Http」を選択して、インターネットを通じてGoogleスプレッドシートに送信します。
Methodを「POST」に、URLは「先程発行されたURL」を、Headersは、「{'Content-Type' : 'Application/json'}」、Dataを「jsonデータ」にします。Successには成功時の処理を、Failは失敗時の処理を入れます。
成功時に「5000ミリ秒」のウェイトを入れているのは、実際に動作させたときに、あまりにウェイトが少ないと「Fail」の動作が実行されたからです。つまり、送信の間隔があまりに短いと失敗するようです。手元の環境では、間隔がだいたい5000ミリ秒程度で青だけ実行される(つまり失敗がなくなる)ようになりました。通信環境によって違うかもしれませんので、いろいろ試してみてください。どちらにしても5000ミリ秒を下回るような頻繁な更新は避けたほうが安定すると思います。
成功すると、Googleスプレッドシートに値が書き込まれます。
【参考】
M5Stick(M5StickC)でArduino IDEとか使わずに、ブロックプログラムUIFlowのみでGoogleスプレッドシートにデータを送っちゃう方法。 - Qiita
この記事が気に入ったらサポートをしてみませんか?