前回は無事にインターネットへ繋げたましたか?今回は「データの送信」と言う少し実践的なことをやっていきます。
インターネットを介してデータを保存する方法はいつくかあります。その中で割と簡単な『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);
}
解説
↓
↓
※クリックで拡大
流れとしては、測定→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日追記)
開発ボードに繋ぐ電源について、分かったことがありますのでご報告します。どうもコンセントに差すタイプのUSB充電器から電源を取ると再起動ループに陥り、データ送信が全くできないことが判明しました。見た感じでは最初のwifi接続の時点で落ちるようです。そこで電源の種類を変えて挙動を調べてみました。その結果が以下になります。
- パソコンのUSBポートから給電→問題なし
- USB充電器(5V1A)→NG(再起動ループ)
- USB充電器(5V1.8A)→NG(再起動ループ)
- 開発ボードのvinに5Vを給電→問題なし
(ブレッドボード用電源モジュール MB102にACアダプター(12V1A)を接続して使用)
5VのUSB充電器を使うとwifi接続が全くできませんでした。しかし同じ電圧でもvinから給電すると問題なく接続し、データもしっかりと送れました。もしかしたら開発ボードのUSB端子を通して給電する場合、5Vでは電圧不足になって再起動を繰り返すのかもしれません。ちなみに開発ボードの仕様書を確認したところ、電源は7~12Vを推奨しています。5Vではちょっと足りていないですが、とりあえずは動いているのでこのまま様子を見ます。
HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード
《Amazonでの検索結果はこちら》
今回使用したのが「ESP32-WROOM-32 開発ボード」です。形が微妙に似ているボードもあるので、間違えないように購入する必要があります。wifi通信機能が付いているのに価格はお手頃です。プログラミングの勉強にも使えそうですね。
【IoTで水耕栽培 参考記事】
- IoTで水耕栽培 第1回目。目指せ、水耕栽培とウェブの融合!
- IoTで水耕栽培 第2回目。基板上のLEDを光らせましょう
- IoTで水耕栽培 第3回目。センサーモジュールを繋げて温湿度を測定しましょう
- IoTで水耕栽培 第4回目。ESP32開発ボードをインターネットに接続します
- IoTで水耕栽培 第5回目。Googleスプレッドシートに測定データを送信します
- IoTで水耕栽培 第6回目。温湿度センサーで取得したデータを無線で飛ばしましょう
- IoTで水耕栽培 第7回目(最終回)。栽培装置にセンサーを入れて26時間のデータ取りを行います