IoTで水耕栽培 第5回目。Googleスプレッドシートに測定データを送信します

f:id:haruirosoleil:20200201175716j:plain

 前回は無事にインターネットへ繋げたましたか?今回は「データの送信」と言う少し実践的なことをやっていきます。

 インターネットを介してデータを保存する方法はいつくかあります。その中で割と簡単な『Googleスプレッドシート』を使った方法を紹介します。Googleスプレッドシートとはネット上で使うエクセルみたいなもので、ここに測定データ送って書き込みを行います。

 今回はスケッチを理解しやすくするために、実際の測定データは使わず仮の数値を入れています。開発ボード以外にGoogleスプレッドシートの設定もありますので、少々難易度が高いです。何とか頑張りましょう。

 

 

 

 

用意するもの
  • ESP32-WROOM-32 開発ボード(DOIT社 V1互換機)

 

準備
  • Googleスプレッドシートのスクリプトエディタに以下のコードを書き込み、webアプリとして設定する

 

var id = 'ここにシート固有のIDを記入';

function doGet(e) {

  if (e.parameter == undefined) {
    result = 'Parameter undefined';
  }else {
    var sheet = SpreadsheetApp.openById(id).getActiveSheet();
    var newRow = sheet.getLastRow() + 1; // 次の行に入力する
    var rowData = [];
    rowData[0] = new Date(); //タイムスタンプ

    for (var param in e.parameter) {
      var value = e.parameter[param];
      rowData[parseInt(param)] = value;
    }

    var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
    newRange.setValues([rowData]);
    var result = 'Ok'// Text des Anworts
  }
  return ContentService.createTextOutput(result);
}

 

出典:ラズベリーパン
【arduino_IDE】googlesheetに書き込んでみた

 

スケッチ

 

#include <WiFi.h>
#include <WiFiClientSecure.h>

// 接続先のSSIDとパスワード
const char* ssid = "××××××××××××"; //無線ルーターのssidを入力
const char* password = "××××××××××"; //無線ルーターのパスワードを入力


void setup() {
  Serial.begin(115200);
}


void loop() {
  sendData();
  delay(10000);
}


//WiFiに接続
void connectWiFi(){

  Serial.print("ssid:");
  Serial.print(ssid);
  Serial.println(" に接続します。");

  WiFi.begin(ssid, password);

  Serial.print("WiFiに接続中");
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("接続しました。");

  //IPアドレスの表示
  Serial.print("IPアドレス:");
  Serial.println(WiFi.localIP());
}

 

//測定データの送信
void sendData(){

  WiFiClientSecure sslclient;

  const char* server = "script.google.com";
  String url = "https://script.google.com/macros/s/××××××××××××";  //googlescript web appのurlを入力

  //測定値を準備
  float sensor_data1= 12.34; //仮の測定値
  float sensor_data2= 56.78; //仮の測定値
  float sensor_data3= 91.23; //仮の測定値

  //wifiに接続
  connectWiFi();

  //測定値の表示
  Serial.println(sensor_data1);
  Serial.println(sensor_data2);
  Serial.println(sensor_data3);

  //urlの末尾に測定値を加筆
  url += "?";
  url += "&1_cell=";
  url += sensor_data1;
  url += "&2_cell=";
  url += sensor_data2;
  url += "&3_cell=";
  url += sensor_data3;

  // サーバーにアクセス
  Serial.println("サーバーに接続中...");

  //データの送信
  if (!sslclient.connect(server, 443)) {
    Serial.println("接続に失敗しました");
    Serial.println("");//改行
    return;
  }

  Serial.println("サーバーに接続しました");

  sslclient.println("GET " + url);
  delay(1000); //私の環境ではここに待ち時間を入れないとデータが送れないことがある
  sslclient.stop();

  Serial.println("データ送信完了");
  Serial.println("");//改行

  //WiFiを切断
  WiFi.mode(WIFI_OFF);
}

 

 

解説

f:id:haruirosoleil:20200202085620p:plain

f:id:haruirosoleil:20200202085626p:plain

f:id:haruirosoleil:20200202085631p:plain
※クリックで拡大

 流れとしては、測定→wifi起動→url送信(スプレッドシートへの書き込み)→wifi切断→待機→測定→…の繰り返しとなります。しばらくの間待っていくと、自動的に測定値が書きこまれていくのが分かるかと思います。

 スプレッドシートへの書き込みは、末尾にデータを結合させたurlで行います。調べたところによるとurl形式の他に、「json形式」でも書き込みができるらしいです。しかし素人に毛が生えただけの私にとって、json形式を理解するには時間がかかりそうです。データ量が多い時はこちらの形式が良いのでしょうが、今回は数値データを数個送るだけだったので簡単にできるurl形式を選びました。

 urlを送信すると、スプレッドシートの一番下の行にそのデータが追加されていきます。同時に書き込み日時も入力されるので、いつの測定結果なのかがすぐに分かります。ただし『データの測定時間』とスプレッドシートへの『書き込み時間』には数秒の差があるので注意が必要です。それでも水耕栽培で取るデータならば秒単位の正確さは必要ないので、これで十分でしょう。

 今回は分かりやすい様に仮のデータ《sensor_data1= 12.34;》を使いました。つまりこの12.34の部分を実際の測定値に置き換えれば、データの保存と蓄積ができるわけです。

 今回を含めた「IoTで水耕栽培」の講座で、

  • LEDの点灯
  • 温湿度の取得
  • wifi通信
  • 測定値の記録

ができるようになりました。そこで次回はこれらを組み合わせてみます。温湿度センサーでデータを取り、開発ボードをインターネットに繋ぎ、測定値をGoogleスプレッドシートに書き込むのです。そこそこ複雑なスケッチになりそうなので、気を引き締めて行きましょう!

 

追記

シリアルモニターの謎表示(2020年2月5日追記)

 データを送信した後に、不定期で「E (××××××) wifi: addba response cb: sta conn deleted」がシリアルモニターに表されることがあります。××××××は6桁の数値で、毎回違う値です。この表示が出てもデータは送られるようですが、なぜ表示されるのか不明です。現在調査中。

 

不定期な再起動(2020年2月8日追記)

 スケッチ実行中に不定期で再起動することがあります。連続で発生する場合や、反対に全く起きないこともあり。ただしタイミングは同じことが多く、wifiに接続しようとするとESP32が落ちて再起動するみたいです。再現性がなく、同じスケッチや同じ電源ケーブル、はたまた開発ボードを同じ位置にしていても、起きる時と起きない時があります(昨日はダメだったのに、今日は大丈夫など)。

→供給電圧が足りていないのが原因かもしれません。下記の追記(2020年2月9日)を参照。

 

電源について(2020年2月9日追記)

f:id:haruirosoleil:20200209073951j:plain
 開発ボードに繋ぐ電源について、分かったことがありますのでご報告します。どうもコンセントに差すタイプのUSB充電器から電源を取ると再起動ループに陥り、データ送信が全くできないことが判明しました。見た感じでは最初のwifi接続の時点で落ちるようです。そこで電源の種類を変えて挙動を調べてみました。その結果が以下になります。

  • パソコンのUSBポートから給電→問題なし
  • USB充電器(5V1A)→NG(再起動ループ)
  • USB充電器(5V1.8A)→NG(再起動ループ)
  • 開発ボードのvinに5Vを給電→問題なし
    (ブレッドボード用電源モジュール MB102にACアダプター(12V1A)を接続して使用)

f:id:haruirosoleil:20200209074009j:plain
 5VのUSB充電器を使うとwifi接続が全くできませんでした。しかし同じ電圧でもvinから給電すると問題なく接続し、データもしっかりと送れました。もしかしたら開発ボードのUSB端子を通して給電する場合、5Vでは電圧不足になって再起動を繰り返すのかもしれません。ちなみに開発ボードの仕様書を確認したところ、電源は7~12Vを推奨しています。5Vではちょっと足りていないですが、とりあえずは動いているのでこのまま様子を見ます。
 

 


HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード

《Amazonでの検索結果はこちら

今回使用したのが「ESP32-WROOM-32 開発ボード」です。形が微妙に似ているボードもあるので、間違えないように購入する必要があります。wifi通信機能が付いているのに価格はお手頃です。プログラミングの勉強にも使えそうですね。