見出し画像

【GASでIoT】GASと「Pico W」を使ったギミックのケーシングを考える~(5)データ採取元のスプレッドシートを用意する~

Goole Apps Script(GAS)を使って、ネット通信可能なマイコンと連携して、「IoT」をするのが本記事シリーズです。

今回取り上げるIoTのギミックは、スプレッドシートに表記された天気予報の情報を、マイコンで読み取って、予報内容をLEDの点灯色で表示する「お天気インジゲータ」です。そして特に本記事シリーズでは、低コストで見栄え良くするために「ラズベリーパイPico W」を使い、これをペーパークラフトの箱を使ってケーシングすることを試みています。

先回までの記事で、ハードウェアの準備についてご紹介しました。

表示デバイスである「NeoPixcel」をレンズカバー付きでケース材におさめました。



以下の記事では「ラズベリーパイPico W」、「バッテリー」と「NeoPixcel」を配線しました。





今回の記事までのご紹介が長くなりましたが、ハードウェアの準備が出来たところで、次にソフトウェアを準備します。

今回の記事では、まずは、天気予報のデータを用意したスプレッドシートを準備します。

この記事は、一介のアマチュアが、断片的な手がかりを寄せ集め、試行錯誤しならがら行った記録です。

ラズベリーパイPico Wのプログラム書き込みには、「Arduino IDE」を使っていますが、失念による「手順の記載もれ」、たまたま上手くできた条件を見逃している「前提条件の未記載」、誤認や理解の浅さによる「誤り」を含んでいる可能性が大いにあります。

また、配線をはじめとしたハードウェアの準備では、様々の理由により、意図した様に作動しない場合がありえます。

こうした背景から、本記事の内容がうまく再現できない場合があることをご了承頂き、自己責任、自己解決を前提にお読み頂くことをお願いします。


天気予報の情報を採取したスプレッドシートを用意する


はじめに、ネット上の天気予報の情報をスプレッドシートに展開し、LEDの点灯情報に変換するシートを用意します。以下の記事で紹介したシートを転用します。


記事では、気象庁の公開データを取り込み、以下の形で成形したあと・・・


LEDの色を表す数字に置き換え・・・


最終的に、簡単なテキスト列に集約するところまでをご紹介しています。

記事で触れています様に、気象予報のデータを我流で解釈しているので、適切に利用できていない可能性があります。ご参考にする場合は、表示のミスや誤りを含んでいる事をご了承いただいて自己責任でご利用の上、ノークレームでお願いします。

上記記事を参考に、天気予報用のスプレッドシートをまず用意します。

上記記事に、インポート用のワークシートを用意しています。地域名などを修正してお使いください。

また、ユーザ関数ImportJSON()と、データ転記のためのスクリプトの追加もしていますので、再現される場合は、これも対応しておいてください。

データ公開用のシートを追加する


天気予報を記載したスプレッドシートを用意したら、ここに、シートを1枚追加します。

ラズベリーパイPico Wへのデータ送信は、データをHTML形式で公開したシートを用意して、ここにPiocからアクセスすることで行います。

そのため、データ公開用のシートが必要になるわけです。シート名は「ピコ表示」とでもしておきます。

A1セルに関数を1つ記載する


以下に示す、LEDの点灯情報についてのテキストを新しく追加したシートに転記します。

この情報は、「ラズパイ表示」というシートに記載していますが、ここからスクリプトを使って転記します。

スプレッドシートのメニューバーから「拡張機能」を選択し、「AppsScript」を選びます。

以下の記事で書いてある、スクリプトを修正します。

こちらが修正したコードです。元の文字列に「▼▼▼▼」と「●●●●」を追加してコピーするだけの機能です。

function myWeather() {
   
 //アプリケーションを取得|★スプレッドシートID★は各自のものを記入
  var myApp = SpreadsheetApp.openById('★スプレッドシートID★');

  //対象シートをシートの名前を指定して取得
  var mySheet = myApp.getSheetByName('ラズパイ表示');
  var mySheet2 = myApp.getSheetByName('ピコ表示');

 //データ記録範囲を指定して範囲を取得
  var myWeather = mySheet.getRange(2,1,1,1).getValue();

  //値の書き出し
  if(myWeather!='D00000000000000000000'){
    mySheet.getRange(2,2,1,1).setValue(myWeather);
    mySheet2.getRange(1,1,1,1).setValue('▼▼▼▼'+myWeather+'●●●●');
  }
}

このスクリプトを保存したら、1時間程度の間隔でトリガーを設けて自動実行する様にしておきます。

トリガー設定はネットなどでご確認ください。AppsScriptメニューから、エディターを開くと、時計の様なアイコンがあるので、そこで設定します。

うまくいけば、こんなデータが表示されるはずです。

シートを公開する

このシートを公開します。

スプレッドシートのメニューバーから、「ファイル」→「共有」→「ウェブに公開」と進みます。

単独のシートだけをウェブ形式で公開します。


セキュリティ面などから、ブック全体を公開しないでください。


データの天気でわざわざスクリプトを使った理由

Googleスプレッドシートでは、シートを跨いだデータの同期は、ユーザが編集している時以外は保障されません。

そのため、スクリプトで明示的にコピーするか、ImportRange関数を使ってリンクさせる必要があります。

今回の記事で、サーバ側であるスプレッドシートの用意ができました。

さて、次回は、クライアント側である、ラズベリーパイPico Wのプログラムを用意します。使用する開発環境は「ArduinoIDE」です。



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