見出し画像

M5StickC PlusとUIFlowでプログラミング(Ex5) - 測ったデータをGoogleスプレッドシートに記録する

 Ex4でINA226を使用した電流・電圧のデータ測定ができました。表示している数値をメモして記録するのでもよいのですが、せっかくですから、Googleスプレッドシートに記録してみます。

 UIFlowのブラウザ版を使用している関係で、M5StickCPlusは既にインターネットに接続されています。このままGoogleスプレッドシートを使用します。

 Googleスプレッドシートを外部から操作するには、GoogleAppsScript(GAS)というプログラミング言語を使用します。GASとは、Googleが開発・提供しているプログラミング言語で、JavaScriptというWebブラウザ上で動作するプログラミング言語をベースに作成されています。GoogleのサービスをGASから扱うことができます。

まず、Googleスプレッドシートを起動します。

画像1

 Googleスプレッドシートから新しいスプレッドシートとして「空白」を選択します。

画像2

 無題のスプレッドシートができます。A1セルに「時刻」B1セルに「電圧」C1セルに「電流」を入力します。

画像3

 この後の動作ですが、M5StickCPlusからデータを受信したら、2行目に行を追加し、追加した行に時刻、電圧、電流を記録することとします。データ受信は、JavaScriptでよく使用されるJSON形式を使用します。

画像4

 まず、シート名を「データ」に変更します。

画像5

 「ツール」から「スクリプトエディタ」を起動し、新規プロジェクトを作成します。

Googleスプレッドシートの仕様が変更され、「ツール」に「スクリプトエディタ」がなくなりました。「拡張機能」→「Apps Script」が従来の「スクリプトエディタ」と同様のもののようです。

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列目には電流を入れます。

画像6

 スクリプトエディタの「公開」から「ウェブアプリケーションとして導入」を選びます。プロジェクトに名前をつけてなければ、「Edit Project Name」(プロジェクト名の編集)と、名前をつけるよう促されるので、名前をつけます。「Deploy as web app」(ウェブアプリとして使用できるようにする)の表示の中で、「Who has accsess to the app:」(このアプリに誰がアクセスしますか)の項目を「Anyone, even anonymous」(誰でも、匿名でも)にして「Deploy」(使用できるようにする)を押します。「Authorization requierd」(許可が必要)と、出るので、「許可を確認」します。

画像12

 この後は、意味としてはアクセス権の確認や本当に実行していいかの確認になります。アクセス権のある人がアクセスしているのかどうかや、世の中には悪意のあるプログラムもあるので、本当に実行していいのかなどの確認です。今回は自分で作成して自分で(M5StickCPlusからアクセスなので、他人扱いになりますが)使うので全部「許可」ですが、第3者が作成したプログラム等を使う場合は安全をちゃんと確認してから実行しましょう。

 アカウント選択画面になるので、Googleスプレッドシートを作成したアカウントを選択すると「このアプリはGoogleで確認されていません」画面が表示されます。「詳細」から「プロジェクト名(安全ではないページ)に移動」を選んで、ウェブアプリからのアカウントのアクセスのリクエストを「許可」します。すると、URLが発行され、ウェブアプリとして実行できるようになります。そのURLを控えておきましょう。

 UIFlow側のプログラムは以下の様な感じです(電圧・電流の計測、表示は関数化しています)。

画像8

 変数「jsonデータ」を作成して、送信データをJSON形式で用意します。JSON形式は、{"key(キーワード)":"Value(値)"} の形式でデータを表します。"key"を、電圧は"Voltage"、電流を"Ampere"として、「マップを作成」ブロックからマッピングして(対応させて)、JSONデータを作成します。このVoltage、AmpereはGASのプログラムで参照している値ですので、そこと揃えます。

画像12

※この画像ファイルだけアップロードするとなぜか破損ファイルになりました。原因はよく分かりません。管理画面では正常に表示されますが、公開すると埋め込みが機能しませんでした。仕方がないので管理画面で正常表示されたものを再びキャプチャしたものに差し替えてあります。

 送信データを用意できたら「高度なブロック」から「Http」を選択して、インターネットを通じてGoogleスプレッドシートに送信します。

画像10

 Methodを「POST」に、URLは「先程発行されたURL」を、Headersは、「{'Content-Type' : 'Application/json'}」、Dataを「jsonデータ」にします。Successには成功時の処理を、Failは失敗時の処理を入れます。

 成功時に「5000ミリ秒」のウェイトを入れているのは、実際に動作させたときに、あまりにウェイトが少ないと「Fail」の動作が実行されたからです。つまり、送信の間隔があまりに短いと失敗するようです。手元の環境では、間隔がだいたい5000ミリ秒程度で青だけ実行される(つまり失敗がなくなる)ようになりました。通信環境によって違うかもしれませんので、いろいろ試してみてください。どちらにしても5000ミリ秒を下回るような頻繁な更新は避けたほうが安定すると思います。

画像11

 成功すると、Googleスプレッドシートに値が書き込まれます。

【参考】
M5Stick(M5StickC)でArduino IDEとか使わずに、ブロックプログラムUIFlowのみでGoogleスプレッドシートにデータを送っちゃう方法。 - Qiita








この記事が気に入ったらサポートをしてみませんか?