IoT(ESP32)とバッテリー運用 その7
その6での設定にて、気付いたらいつの間にかモバイルバッテリーが完全放電していました。orz
結局約264時間、10,000mAh 換算で約529時間(22日)稼働していました。
5分に一回の計測でしたが、これを1時間に1回に間隔を広げると頻度が12分の1になります。計測時の消費電力が支配的と仮定して、12倍とはいかなくとも10倍に伸びると仮定すると、10,000mAh 換算なら220 日となり、半年以上の連続稼働が視野に入りそうです。
ハードウェア変更
大体限界値が見えてきましたので、元々のバッテリー18650 での運用下での検証にハードウェアを切り替えたいと思います。
ESP32TTGO18650 - 18650バッテリー・ホルダーとOLEDディスプレー付きのESP32開発ボードです。
DHT11 - 温湿度センサー。気圧は測定できませんが、電源電圧が3.3V-5.5V と幅広いので使い易いセンサーです。またI2Cに比べても電源以外に必要な結線数が1本のみ(I2Cだと2本)というのも使い易い理由の一つです。
ピン・ヘッダーのハンダ付け
これが面倒なので今まで放置していましたが、重い腰をあげ半田ごてを取り出してハンダ付けしました。イモ半田も何カ所かありますが、まあお愛敬という事で。😝
ブレッドボードに付けると、ディスプレーが裏側になるのは少々格好悪いです。
全部でこれだけですので、コンパクトではあります。
コード
その6で使ったコードのセンサー部分をBME280 からDHT11 用へ変更しました。
#include <WiFi.h>
#include <WiFiClient.h>
#include <Ambient.h>
#include "DHT.h"
/*
//
// Global Definitions
//
*/
#define TIME_TO_SLEEP 60*5 // 測定周期(秒)
const char* ssid = "XXXXXXXX"; // %%% Wifi SSID %%%
const char* pswd = "XXXXXXXXXX"; // %%% Wifi パスワード %%%
#define DHTPIN 17 // %%% Digital pin connected to the DHT sensor %%%
#define DHTTYPE DHT11 // DHT 11
WiFiClient client;
Ambient ambient;
unsigned int channelId = XXXXX; // %%% AmbientのチャネルID %%%
const char* writeKey = "XXXXXXXXXXXXXXXX"; // %%% ライトキー %%%
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
void setup(){
unsigned long starttime = millis();
Serial.begin(115200);
while (!Serial) ;
WiFi.begin(ssid, pswd); // Wi-F接続開始
while (WiFi.status() != WL_CONNECTED) { // 接続するまでチェックを繰り返す
delay(500);
Serial.print(".");
}
dht.begin();
// Wait a few seconds between measurements.
delay(3000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
Serial.println();
} else {
float room_temp = t; // センサーからのデータ読み出し値
float room_humi = h;
Serial.println();
Serial.printf("temp: %.2f, humid: %.2f \r\n", room_temp, room_humi);
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
ambient.set(1, room_temp); // Ambientのデータ1に温度をセットする
ambient.set(2, room_humi); // データ2に湿度をセットする
ambient.send(); // Ambientに送信する
delay(2000);
}
// Deep sleepする時間(マイクロ秒)を計算する
uint64_t sleeptime = TIME_TO_SLEEP * 1000000 - (millis() - starttime) * 1000 - 1000000;
esp_deep_sleep(sleeptime); // DeepSleepモードに移行
// ここには戻らない
}
void loop(){
}
%%% で囲まれた行が、環境毎に変更が必要な部分です。
今回DHT11 のデーターピンは17番に接続しています。
このコードをコンパイルし、ESP32にダウンロード。
Ambient にデーターが送付されている事が確認できました。
所が....
さて切り替えが完了したので18650 でどの程度の時間計測可能か確認してみようとした所...
USB から給電されている間は問題無いのですが、18650 での運用に切り替えるとAmbient に適切なデーターが送付されないという問題が発生してしまいました。
はてさて、次はこの問題対応となります。orz