最近、水耕栽培を始めました。水耕栽培は水の管理が大切なのですが、なかなか大変です。
もっと簡単に水を管理したいと思い、今回の方法を考えました。
本記事は後編です。前編(スケッチ含む)はこちら。
前編・・・・ESP32でGoogle sheetとLineに水耕栽培の水温と流量を通知して管理する方法【スケッチ(前編)】
何をしたいかは本編に記載しています。本記事ではスケッチについて書いています。
本編・・・・ESP32でGoogle sheetとLineに水耕栽培の水温と流量を通知して管理する方法【本篇】
目次(クリック)
スマホで水の流れていることを確認[ブラウザとwebサーバー]
リアルタイムで水温、気温、流量を見たくなり、家のWiFiに接続し、スマホのブラウザで見れるようにしました。
まずは、必要なライブラリ。
#include <WiFi.h>
#include <WebServer.h>
まずは、WiFiのssid/パスワードを入れて、serverの定義を。
const char* ssid = "**********"; //ssid
const char* passwd = "*************"; //ネットワークパスワード
WebServer server(80); //スマホ表示用 通信を受けるポート番号80
setup()の中では、WiFiに接続し、Web Serverを起動します。
WiFi.begin(ssid, passwd); //アクセスポイント接続のためのIDとパスワードの設定
while (WiFi.status() != WL_CONNECTED) { //接続状態の確認
delay(300); //接続していなければ0.3秒待つ
mySerial(".",false); //接続しなかったらシリアルモニタに「.」と表示
}
//WiFi通信が可能となったら各種情報を表示する
mySerial(""); //改行
mySerial("WiFi Connected"); //接続したらシリアルモニタに「WiFi Connected」と表示
mySerial("IP Address : " +WiFi.localIP().toString()); //IPアドレスをシリアルモニタに表示
//スマホ表示 serverアクセスされたときの処理
server.on("/", handleRoot); //TOPページのアドレスにアクセス処理
server.onNotFound(handleNotFound); //異常アドレスへのアクセス処理
server.begin(); //WebServer起動
あとは、表示する画面を設定するだけ。
void handleRoot() { //スマホブラウザ表示
String html;
//HTML記述
html = "<!DOCTYPE html>";
html += "<html lang='ja'>";
html += "<head>";
html += "<meta charset=\"utf-8\">";
html += "<title>Flow Status</title>";
html += "</head>";
html += "<body>";
html += "<h1>水耕栽培の状況</h1>";
html += "<p><h2>" +suion + "</h2></p>";
html += "<p><h2>" +kion + "</h2></p>";
html += "<p><h2>" +ryuuryou + "</h2></p>";
html += "</body>";
html += "</html>";
// HTML出力
server.send(200, "text/html", html);
}
//スマホブラウザ表示 異常アドレスへのアクセス処理
void handleNotFound(void) {
server.send(404, "text/plain", "Not Found ");
}
表示画面は、こんな感じ。setup()の中でシリアル出力されたipアドレスに家のWiFi経由でスマホのChromeからアクセス。
Google spreadsheetにデータ保存
Google spreadsheetに水温、気温、流量をずっと記録して、過去のデータを見たり、推移をグラフで確認できるようにしました。
スケッチを作成する前に、Google spreadsheet側の準備が必要です。
- Google spreadsheet に spreadsheet を作成する。
- spreadsheet のメニューの「拡張機能」→「Apps Script」でプロジェクトを作成し、実行コードを作成する。(後述)
- プロジェクトをデプロイする。ここで「ウエブアプリ」のアドレス
- PCなどのブラウザから「ウエブアプリ」のアドレスにアクセスし動作確認する。
この1~4については、Suzukyさんという方が詳細を記述されていましたので参考にさせてもらいました。とても判り易く書かれています。感謝してます。・・・・・・参考にしたSuzukyさんのサイト
なお、上の2.のコードは次のようにしました。const urlは、1.で作成したspreadsheet のurlです。コードの最後にreturnしているのは、書き込んだデータが記録されたspreadsheet の行数です。ESP32から、データを書き込むと、ESP32に返されます。(それほど使い道はありませんが)
function doGet(e) {
const url = "https://docs.google.com/spreadsheets/d/1mK***********************0CU/edit#gid=0";
const ss = SpreadsheetApp.openByUrl(url);
const sheet = ss.getSheets()[0];
const params = {
"timestamp": new Date(),
"waterTemp": e.parameter.waterTemp,
"airTemp": e.parameter.airTemp,
"waterFow": e.parameter.waterFlow
};
sheet.appendRow(Object.values(params));
return ContentService.createTextOutput(sheet.getLastRow());
}
ここまで、できたら、ESP32のスケッチの作成です。上の方の3.で作成した「ウエブアプリ」のアドレスや必要な変数を定義します。
#include <HTTPClient.h>
//Google sheet
const String url = "https://script.google.com/macros/s/AKfy******************************************************************************Ng/exec";
volatile int gglshtCounter =0;
int gglshtPeriod = 20 * 60 ; //20分ごとにgoogle sheet 書き込み
それと、タイマーも定義して
hw_timer_t * timer = NULL;
setup() の中でタイマーを起動して、
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true); //1秒ごとにタイマー割込み
timerAlarmEnable(timer);
タイマー割込みで1秒ごとにgglshtCounter をカクントアップし、
void IRAM_ATTR onTimer() { //タイマー割込みでカウントアップ
ledCounter++;
gglshtCounter++;
}
loop()の中で、そのgglshtCounter がgglshtPeriod=20分を超えたら、気温、水温、流量をspreadsheets に送信します。
//google sheet更新
if (gglshtCounter >= gglshtPeriod){ //更新間隔到達で更新
String urlFinal = url + "?waterTemp=" + temp1
+ "&airTemp=" + temp2 + "&waterFlow=" + flow1;
mySerial(urlFinal);
HTTPClient http;
http.begin(urlFinal.c_str());
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
int httpCode = http.GET();
mySerial("HTTP Status Code: " ,false);
mySerial(String(httpCode));
//---------------------------------------------------------------------
//getting response from google sheet
String payload;
if (httpCode > 0) {
payload = http.getString();
mySerial("Payload: "+payload);
} //---------------------------------------------------------------------
http.end();
gglshtCounter = 0;
}
これで、google spreadsheet に、水温、気温、流量が記録されます。なお、A列の時刻は、ESP32から送信しているデータではなく、spreadsheet のApps Scriptの時刻を記録しています。
google spreadsheet の機能で、グラフ表示もできます。
このグラフで黄色い線(流量)が、一気に増えて徐々に減っていることが確認できます。水が減ってきてタンクに水を追加したときに一気に流量が増えて、水が減るにつれて流量が減っていきます。これをうまく使うと、流量センサーで水の量が予想できます。
水の流量が減ったらLINEに通知
Google spreadsheet をスマホで見たり、ブラウザで状況が判るのですが、頻繁に見るのも何なので、水量が一定量から少なくなったらLINEに通知するようにしました。通知の周期は1時間に1回としました。スケッチの詳細は別途書きたいと思っています。
マイコンボードの動作状況は、スマホでBluetooth LE経由で確認
スケッチの動作している状況をスマホで確認したいと思い、Bluetooth LEを使い、スマホ(Android)にSerial Bluetooth Terminal というアプリで受信しています。スケッチの詳細は別途書きたいと思っています。
本記事のハードでやっていること
ー>ESP32でGoogle sheetとLineに水耕栽培の水温と流量を通知して管理する方法【本篇】
本記事のハード
ー>ESP32でGoogle sheetとLineに水耕栽培の水温と流量を通知して管理する方法【ハードウェア】