自宅1階のメダカの水槽に「水温計」、「pH計」、そして「餌やり装置」を設置しているのですが、コンセントからUSBで給電して動かしているので、次は電池で動かすことができれば、自宅の外とかにも設置して、さまざまな情報を吸い上げたいと思うようになりました。
ということで、次は「電池でAuduinoを動かす」ことをテーマに、自宅の気象情報監視装置を自宅の外に設置してみようと思います。
「気象情報を監視する」ということであれば、真っ先に思いついたのが「百葉箱」。よく小学校とかで気温測定するのに使っていった「アレ」ですね!
ということで、今回の監視装置も百葉箱に入れて、自宅の外のフェンスとかにぶら下げるとか、置いておくことで、気象データを吸い上げできるようにしました。
用意したもの
今回はメダカ水槽IoT ESP8266 + WS2812B(LEDテープライト)で照明をコントロールするで使用した時と同様に、ArduinoでWiFi機能が使える「ESP8266 NodeMCU ESP-12E V2U」を使いました。
収集データをWiFi経由でデータ収集しているサーバへアップロードするためのモジュールですね。
「DHT11」は温度と湿度データを収集できるモジュールです。
「BH1750」は光源によって光が照らされた面が受ける光の明るさを測定するモジュールです。
「BMP180」は大気圧を測定できるモジュールです。実は温度もこのモジュールを使って測定ができます。
「LM393」は電圧コンパレータ搭載のモジュールで、デジタル出力、アナログ出力に対応しています。このモジュールを雨滴センサーボード(MH-RD)と接続して使用します。雨がボードに触れると、雨滴にによって通電することで電圧が発生する仕組みです。
- プログラムインストール/リセット/Deep Sleepモード切り替え用スイッチ:超小型スライドスイッチ 2回路2接点 IS-2235(4個入)
秋月電子さんで購入できる2回路2接点の小型スイッチです。後述する切り替え用で購入しました。実際は1回路しか使用しませんでした。
今回電池で動かすので、そのボックスです。屋外に置くのでフタ付きのボックス、かつ電源ON/OFFの切り替えができるものを購入しました。
LEDはサーバへデータ送信した時のステータスを確認する時に使用します。今回は成功の「緑」と、失敗の「赤」を使用しました。サーバ送信で成功であれば「緑」を、エラーがあった場合は「赤」を点灯するようにしました。
- 抵抗:470Ω×2個・・・LEDにつなぐ抵抗用
- ユニバーサル基板:ユニバーサル基板 10個 (PCB 50mm×70mm) PCB回路基板 ユニバーサル ブレッドボード プロトタイプ 実験プレート DIYはんだ付け・・・縦25穴×横18穴
ESP8266と各モジュールを接続するために使用します。
ジャンパーワイヤーは通常のケーブルと、今回VCC, GND, SCL, SDAの4つのコネクタを使用するモジュールがいくつかあったので、セットでくっついているものがあると楽だなと思い、4ピンセットで繋げられるケーブルも用意しました。
よく見る百葉箱はそれなりに大きいので、まさかそんなミニチュアっぽい百葉箱ってあるんかな?と思っていたのですが、ググってみると、やっぱりあるんですね!
お値段も大きさに見合った分、比較的お手頃で「3,850円」でした。
本当はDIYでトライしたかったのですが、構造的にうまく作れる自信がなかったので、手っ取り早くミストラルさんのサイトで購入することにしました。
- ESP8266を入れるプラスチックケース・・・和泉化成のカードケース
ESP8266や基板の格納にフィットしそうないろんなケースをためしたのですが、このケースがかなりフィットしました。幅10cm、奥行6.6cm、高さ2.1cmのものです。ダイソーやセリアなどの100圴で売っているようです。
- 透明のアクリル板(照度センサーを日光に当てる用)・・・ホームセンターで売っているものを必要に応じて切り取り
配置例
基板への実際に取り付けは若干異なりますが、おおよそこんな感じで組みました。(回線が多く、グチャッてして見づらくてすみません・・・)
モジュールによっては共通して使用しているピンもあるので、自分も「これで本当に大丈夫かな・・・」と思いましたが、実際に動きました。ただ、本来考慮すべきものが抜けている感が半端ないので、反面教師的な観点も含め載せました。
各モジュールとの接続は次の通りです。
- 各モジュールへのVCC → 3.3V
- 各モジュールからのGND → GND
- BMP180/BH1750のSCL → D1
- BMP180/BH1750のSDA → D2
- BH1750のADDR → 今回は使用せず
- DHT11のOUT → D3
- LM393のAO → A0
- LM393のDO → D7
- LED「青」のアノード(+)→ D5
- LED「赤」のアノード(+)→ D6
- プログラムインストール/リセット/Deep Sleep用 → RSTとD0の間にスイッチを設置
サンプルコード
今回はブログ記載向けに、必要な箇所のみ絞って記述していますが、実際はもう少しプログラムに手を加えています。プログラム中に取得したデータをサーバへ送信する箇所もありますが、必要に応じてしてカスタマイズしてください。
#include <Wire.h>
#include <DHTesp.h>
#include <BH1750.h>
#include <Adafruit_BMP085.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <time.h>
// DHT11
#define DHTPIN D3
#define DHTTYPE DHT11
// LM393
#define RAIN_PIN_A A0
#define RAIN_PIN_D D7
#define RAIN_PIN_V 10
// LED OK/NG by HTTP status
#define LED_OK D5
#define LED_NG D6
// Constant values
#define JST 3600*9
#define BH1750_ADDRRESS 0x23
#define BMP180_ADDRESS 0x77
ADC_MODE(ADC_VCC);
DHTesp dht;
BH1750 lm(BH1750_ADDRRESS);
Adafruit_BMP085 bmp;
// Wifi Credential
const char* ssid = "ssid";
const char* password = "password";
// Endpoint URL
const char* url = "https://upload-server.example.com";
// 署名証明書 Fingerprint, SHA-1
const uint8_t fingerprint[20] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void setup() {
// Initialization
Serial.begin(9600);
delay(100);
Serial.println("Start");
// Preprocessing
Wire.begin();
connect();
delay(3000); // NTP時間反映待ち
// DHT11
dht.setup(DHTPIN, DHTesp::DHT11);
// BH1750
lm.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
// BMP180
bmp.begin(BMP180_ADDRESS);
// LM393
pinMode(RAIN_PIN_V, OUTPUT);
digitalWrite(RAIN_PIN_V, LOW);
// LEDs setup
pinMode(LED_OK, OUTPUT);
pinMode(LED_NG, OUTPUT);
// Main
captureAndSendData();
// Post-processing
disconnect();
ESP.deepSleep(60 * 1000 * 1000, WAKE_RF_DEFAULT);
delay(1000); // Deep Sleepモード移行までの待ち
}
void loop() {
}
void captureAndSendData() {
// 電源電圧取得
String voltage = String(float(ESP.getVcc()) / 1000);
Serial.println( "3.3V:>>" + voltage);
// 実行時間取得, yyyyMMddhhmmss形式
time_t t;
struct tm *tm;
t = time(NULL);
tm = localtime(&t);
char dt[14];
sprintf(dt, "%04d%02d%02d%02d%02d%02d", (tm->tm_year+1900), (tm->tm_mon + 1), tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
Serial.printf("Date Time: %s\n", dt);
// DHT11
TempAndHumidity newValues = dht.getTempAndHumidity();
float temp = newValues.temperature;
float humi = newValues.humidity;
Serial.println("Temp: " + String(temp) + " °C");
Serial.println("Humidity: " + String(humi) + " %");
// BH1750
float lux = lm.readLightLevel();
Serial.println("Light: " + String(lux) + " lx");
// BMP180
double pres = double(bmp.readPressure()) / 100;
Serial.println("Pressure:" + String(pres) + " hPa");
// LM393
digitalWrite(RAIN_PIN_V, HIGH);
boolean raining = !(digitalRead(RAIN_PIN_D));
if(raining){
Serial.println("Raining");
} else{
Serial.println("No Raining");
}
// "ADC_MODE(ADC_VCC)"を使用しない場合は以下でセンサーの電圧を取得
//int rainVal = analogRead(RAIN_PIN_A);
//Serial.println("Level:" + String(rainVal));
digitalWrite(RAIN_PIN_V, LOW);
// 取得データの送信:JSONで送る場合
// vo: voltage
// dt: datetime
// t: temperature by dht11
// h: humidity
// lx: light intensity
// p: pressure
// ir: is raining
String data = String("") + "{\"vo\":\"" + voltage + "\",\"dt\":\"" + String(dt) + "\",\"t\":\"" + String(temp, 2) + "\",\"h\":\"" + String(humi, 2)
+ "\",\"lx\":\"" + String(lux, 2) + "\",\"p\":\"" + String(pres, 2) + "\",\"ir\":\"" + String(raining)
+ "\"}";
Serial.println("Data: " + data);
putData(data);
}
void connect () {
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.printf("Connected, IP address: ");
Serial.println(WiFi.localIP());
configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
}
void disconnect() {
WiFi.disconnect(true);
Serial.printf("Disconnected.");
}
void putData (String data) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setFingerprint(fingerprint);
// 証明書チェックを無視する場合はこちらをコメントアウト
// client->setInsecure();
HTTPClient https;
// Reset LED
digitalWrite(LED_OK, LOW);
digitalWrite(LED_NG, LOW);
Serial.print("[HTTPS] begin...\n");
if (https.begin(*client, url)) { // HTTPS
Serial.print("[HTTPS] POST...\n");
https.addHeader("Content-Type", "application/json; charset=utf8");
int httpCode = https.POST(data);
if (httpCode > 0) {
Serial.printf("[HTTPS] POST... code: %d\n", httpCode);
String payload = https.getString();
Serial.println(payload);
if (httpCode == HTTP_CODE_OK) {
digitalWrite(LED_OK, HIGH);
digitalWrite(LED_NG, LOW);
} else {
digitalWrite(LED_OK, LOW);
digitalWrite(LED_NG, HIGH);
}
} else {
Serial.printf("[HTTPS] POST... failed, error: %s\n", https.errorToString(httpCode).c_str());
digitalWrite(LED_OK, LOW);
digitalWrite(LED_NG, HIGH);
}
https.end();
} else {
Serial.printf("[HTTPS] Unable to connect\n");
digitalWrite(LED_OK, LOW);
digitalWrite(LED_NG, HIGH);
}
}
試しに送信データの状態を確認するのであれば、Webhook.siteなどのサードパーティのWebhookツールを利用するとよいと思います。
実装のポイントなど
Device is not configured!
実際の配線前に、ブレッドボードで配線、テストプログラムを使って、各モジュールでの動作確認を行なっていたのですが、各センサー(特にBMP180やBH1750)がsetup()による初期化、起動が正常に行えない状況が長く続きました。
例えば、シリアルモニターで確認すると「[BH1750] Device is not configured!」といったエラーが出力されたり、Exceptionのスタックトレースが出力されたり、思ったようにセンサーが認識、動作しませんでした。
モジュール自体がおかしいのか、プログラムがおかしいのか、配線の仕方がおかしいのか、違うモジュールに入れ替えたり、使用するライブラリを変えたり、ググってライブラリ元のgithubやStackExchangeなどのインターネットで同じ事象に出くわしたケースを調べて、これらの原因と解消をするのに、かなりの時間を要しました。
最終的に何がおかしかったかと言うと、結局は「配線」だったのですが、モジュールとピンがしっかり接続されていないと、このようなエラーになることがわかりました。
特にBMP180やBH1750はピンがついていないので、ピンヘッダーをつけて、メスのジャンパーワイヤーで接続して動作確認していたのですが、これがしっかり接続ができていなかったようでした。
で、どうしたかというと、下の画像のように、ピンに指で軽く押し当てて、しっかり配線されている状態を作って動かすと、問題なくセンサーが値をとってきてくれました。
確かに、あるサイトでは配線がしっかりできていなかったことが原因だ、との記事もあったのですが、その状況がうまく捉えきれていませんでした。なるほど、こう言うことだったんですね・・・
これをやりながら、個別のモジュールの動作確認を行うことができました。
I2C使用アドレスの確認
BMP180やBH1780は「I2C」という通信方式で行われます。これらはVCCとGNDに加え、シリアルデータ (SDA) とシリアルクロック (SCL) の2本の信号線も使います。ESP8266ではSDAが「D2」、SCLが「D1」を使うため、2つともこれらのピンに接続します。
各モジュールにあらかじめ設定されているI2Cアドレスを使って通信を行うのですが、プログラムで指定したアドレスに相違があると通信に失敗してしまうため、事前にどのアドレスを使用しているかどうか確認する必要があります。
この確認方法として、Arduino.ccで公開されている、i2c_scannerのサンプルプログラムを使うことで、以下のような感じで各i2c通信を使用するモジュールが使用するアドレスを検出してくれます。
実行例:
Scanning...
I2C device found at address 0x23 !
I2C device found at address 0x77 !
done
これで実行すると、以下のモジュールについてはそれぞれ次のアドレスを使用していることが分かりました。
- BMP180 → 0x77
- BH1750 → 0x23
この確認もブレッドボードやジャンパーワイヤーを使って確認を行う際は、これらモジュールの接続をしっかり確認してから実行します。うまくスキャンできず、「No I2C devices found」が出力されてしまいます。「あれっ」と思ったら上の画像でもあったように、ピンの接続部分はしっかりとくっついていることを確認します。
モジュールによって使用するアドレスが異なるケースがあるらしいので、サンプルプログラムを実行しなくてもおそらく同じアドレスになるはずですが、念の為、上記プログラムを使用して確認したほうが良いと思います。
I2C スキャナーで取得したアドレスについては、実際のコードにて各モジュールの初期化で設定します。
#include <Adafruit_BMP085.h>
#include <BH1750.h>
Adafruit_BMP085 bmp;
BH1750 lm(0x23);
void setup() {
bmp.begin(0x77);
}
VCCの電圧 vs. 雨滴センサーの電圧
今回電源は電池を使って動かすので、どうしても動作中の電圧の状態が気になります。電圧が思ったほど低下すれば、それだけ動作寿命が短くなってしまいます。動作中の電圧がどれだけになるか確認する方法として、ESP8266では電圧測定モードを電源電圧測定モードに設定できる「ADC_MODE(ADC_VCC)」のマクロを記述することで測定ができるようです。(これはコンパイル時に設定が必要になるため、コードブロック中での記述ができません)
この記述を行うと、「ESP.getVcc()」といったコードを記述することで、動作中の電源電圧を確認することができます。
#include <ESP8266WiFi.h>
ADC_MODE(ADC_VCC);
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Voltage :>>" + String(float(ESP.getVcc())/1000));
delay(2000);
}
ただ、この設定にしてしまうと、雨滴センサーの電圧を取得するために接続しているA0ピンからanalogReadで得られる電圧が常に「1024」となってしまい、期待通りの値を取得することができません。
排他的な設定になるらしく、どちらからの選択になります。
今回は実際にどれくらいの電圧を消費するのか把握することが第一にしたかったので、一旦は電源電圧測定モードで動かし、ある程度消費状況に目処がついた段階で雨滴センサーの電圧測定に切り替える方式としました。
WiFiClientによるサーバへのデータ送信
各センサーから取得した情報はデータとして、所定のサーバへアップロードします。このアップロードのためにHTTP通信で行うのですが、宛先のサーバがHTTPSでの通信が必要であるため、「WiFiClientSecureBearSSL.h」にある「WiFiClientSecure」クラスを使ってサーバ証明書をチェックしての通信を行います。
加えて、その証明書のSHA-1のフィンガープリントを事前に設定しておくことで検証を行えるようにしました。
その後は「ESP8266HTTPClient.h」を使ってHTTP通信と、応答メッセージの取得を行う処理を実装しました。
応答については、正常に処理されたか(ここではHTTPステータスコードが200)、エラー(それ以外)だったかを判別し、正常の場合は「緑」のLEDを、エラーの場合は「赤」のLEDを点灯するようにしました。
Deep Sleepモードの組み込み
電池で動かすので、できるだけ電力消費は抑えて、電池交換を長持ちさせたいと考えました。いろいろ調べると、手っ取り早くできるものとしてESP8266では「Deep Sleep」機能が使えるようです。これを使うことでSleep中の電流を極小に抑えることができます。
こちらのサイトを参考にさせていただき、Deep Sleepのための回路とその実装をしました。今回のケースでは、10分毎に測るので、次のような記述になります。マイクロ秒での指定になるようです。2番目の引数はこのサイトで記述されている説明を見たのですが、おそらくデフォルト設定で問題なさそうです。この引数がいまいち理解ができていないのですが、Deep Sleep明けの各センサー間での環境誤差の補正を行うためのオプションなのでしょうか。
// WAKE_RF_DEFAULTはデフォルト設定のようです
ESP.deepSleep(600 * 1000 * 1000, WAKE_RF_DEFAULT);
このサイトから、ESP8266でのDeep Sleepを行うためには、RST → D0を繋ぐことが前提ですが、この状態でつなげると、プログラムのアップロードでブロックされてしまうため、これを一時的に許可するために「スイッチ」を設けました。
これにより、プログラムのアップロード時はスイッチを使って回路を切断し、動かすときは回路をつなげることで運用ができます。
「LM393」のVCC供給方法
Deep Sleepモードで動作確認していたときに気になっていたのが、LM393の電源ランプがずっとつきっぱなしでした。
Deep Sleep中は雨滴センサーを常に動かしておく必要はないので、測る時だけ電力消費する方法がないかどうか調べました。
最終的にはVCCで接続せず、使っていないGPIO10を使って、そのピンのON/OFFで電流を流すようにしました。まあ、これでどれだけ消費量が変わるか、しっかり測っていないので分かりませんが。
以下は必要な時にVCCをONにしてセンサーの電圧を測るサンプルプログラムです。
#define RAIN_PIN_V 10 // GPIO 10
void setup() {
Serial.begin(9600);
pinMode(RAIN_PIN_V, OUTPUT);
digitalWrite(RAIN_PIN_V, LOW);
}
void loop() {
digitalWrite(RAIN_PIN_V, HIGH);
delay(100);
Serial.println(analogRead(A0));
digitalWrite(RAIN_PIN_V, LOW);
delay(5000);
}
Deep Sleep前のWiFi切断
これも動作確認をやっていく中で分かったのですが、Deep Sleepを実施後の立ち上がりにて、青いランプが点灯しっぱなしになり、そのまま動作が進まない状況になりました。
これもいろいろサイトとかで調べると、どうもDeep Sleep前に明示的にWiFiを切断しておく必要があるとのことです。そのため、Deep Sleep前の処理にて、「Wifi.disconnect()」処理を加えることで、Deep Sleep後の立ち上がりも問題なく動作するようになりました。
今回はconnect関数でWifiセットアップと接続をしていますので、対になる関数としてdisconnect関数の中でこの処理を入れるようにしました。
実際の組み立て
ブレッドボードを使っての配線とプログラムコードの動作確認を行なった上で、各モジュールの基板へのハンダ付けと、取り寄せた百葉箱の組み立てを行いました。
今回使用したカードケースが見事に基板のサイズにうまくフィットしました。カードケースにはコード用と電池ボックス用にそれぞれ穴を開けて通し、できるだけ外気の湿気から保護するようにスポンジ等で隙間を埋めました。コードの接続部分についてはビニールテープ等で絶縁処理しておきます。
一方で、取り寄せたミニ百葉箱はある程度組み立てされた状態で届きました。説明書を見ると、組み立てた後に接着、色塗りとあったので、まずは組み立てして問題ないことを確認後、説明書記載通りに進めることにしました。
ただ、その前に今回は照度センサーを使って明るさを測定する必要があります。このセンサーが百葉箱に入っていると、百葉箱が日陰になってしまうので、太陽の光など、想定した情報を取得することができません。
また、雨滴センサーもつける必要があるため、これも百葉箱の中にあると雨が当たりません。
そのため、照度センサー用、雨滴センサー用の設置をするために、この百葉箱の屋根部分を若干加工します。
今回は照度センサーBH1750用に2cm×2cm四方の穴を開け、この穴に透明のアクリル板を詰め込むことで採光窓として、センサーが光を感知できるようにしました。また、雨滴センサーの取り付けるために、モジュール取り付け用の四隅とピン接続用の穴を作りました。
裏側は照度センサーの支え用に付属でついていたスタンド部分を一部使いました。
塗り終わったら、採光窓になっていた部分のマスキングテープを剥がして、完成です。
先ほど作った機器を百葉箱に入れます。照度センサーと雨滴センサーはそれぞれ取り付け固定します。
最後に電源ボックスに単四電池3本を入れ、電源をONにした後、フタを閉じて完成です。
ちなみにご参考までに、今回色塗りで使用したものです。
最終的にミニ百葉箱はこんな感じで設置して家の前の日々の気象情報を収集できるようになりました。
実際に取得したデータ
もともと既存にあるデータ収集したものを表示するWeb GUIを使って、ある1日の気象情報を10分毎 に取得してグラフ化したものです。こんな感じで取得できました。
なお、今回雨滴センサーの値は電源電圧測定を優先したため、測定していません。
結局どのくらい持ちこたえたのか?
想定していたよりも短く、わずか「3日と9時間」でした・・・
もちろん、測定時期が冬だったこともあり、環境的な要因もいくつかあるかもしれませんが、結果的にはあまり長く持たない回路設計だった訳ですね。
収集した電源電圧の推移を確認すると、今回単四3本直列で4.5Vあたりからスタートし、その後じわじわと下降が見られました。1日目で約0.8V、2日目、3日目で約0.4Vの下降になり、3日目での残り9時間は一気に1.5Vまでダウンしてその後お陀仏になった感じです。
他のセンサーの測定状況を確認すると、特に温度/湿度センサーのDHT11については電源電圧が2.7Vあたりから測定不良の状態が時々現れてきて、その後2.6Vで測定不良の状態でした。インターネット上で公開されているDHT11のデータシートを確認すると、測定条件の環境が0°C-50°Cとなっていた点、電流消費が平均で0.2mA-1mAとなっていました。今回冬場だったこともあってか、氷点下での測定環境だった点も起因していたかもしれません。あと、データ線でのプルアップ抵抗を入れるのを忘れていましたが、これは電力消費に直接影響あるものなのでしょうか。いずれにしても、DHT11はそれなりに電力消費するモジュールなのかもしれません。
一方で、照度や気圧を測定していたBMP180やBH1750はこの電圧でも測定できていました。詳細な確認をしないとわからないと思いますが、これらのモジュールはDHT11と比較すると低電流(μA単位)となっているようです。BMP180には温度センサーもついているため、こちらは低電圧下でも測定できていました。
これを考えると、DHT11とBMP180で測定可能なものをすべて持っているBME280に統一したほうがトータル的に電力消費が抑えられるかもしれません。
補足:「zaudy’s 日記」にて紹介されていましたが、amazon、aliexpress、ebay等で出品されているBME280によっては、湿度センサーがついていない、BMP280が出回っています。実は自分も動作検証時のトラブルでamazonでBMP280を購入してしまった一人なのですが、BME/BMP280と書いてあるモジュールについては詳細を確認をしたほうがよいと思います。湿度センサーが付いているBME280は正方形のセンサーが搭載されている点と価格が比較的高めという点です。
それ以外で気になって点としては、USB電源での供給だったときの電源電圧は約3.2Vでした。単四電池3本直接で4.5Vだったことを考慮すると、出力電圧を一定に保つ「レギュレーター」を入れたほうがよさそうです。「コンデンサ」も組み込んでいなかったので、一定に保つ上では必要かもしれません。
いずれもハードウェアの観点で気になった点ですが、ソフトウェアの観点ではWiFi接続時のDHCPを省略し、静的なIPアドレスを事前に割り振る、全体のウェイト時間を極力減らす、ぐらいですかね。HTTPS通信にかかる部分(ハンドシェイクやデータ送受信)での最適化はデータサイズもそれほど大きくないし難しいかなぁ。
今後やりたいこと・改善点など
上記で書いた通り、電池を長持ちしていく上でいくつか改善したいことはあるのですが、まずは次の観点で試してみて、どれだけ改善するか見てみたいと思います。
- WiFi接続での静的IPアドレスの使用
- 全体的なウェイト(delay)時間の削減
- レギュレーターやコンデンサの使用
- DHT11/BMP180 → BME280への切替
改善結果については、また別のブログにて紹介できればと思います。