見出し画像

IoT(ESP32)とバッテリー運用 その6 #根本変更

その5の結果を受け、センサー・液晶へのアクセス頻度を1/4 に減らしてみた結果...

画像1

返って短く無くなってしまいました... orz

これは拉致があかないと、根本的に変更してこのボードの限界性能を先に確認する事にしました。

具体的には、下記の様に抜本的変更を行いました。
現在考え得る最も消費電力の小さい方法だと思います。

1. 計測データーのプル待ちを、Ambient というサービスへのプッシュ方式に変更(5分間隔)

2.液晶表示を全く行わず、待機時間は低消費電力モード(DeepSleep mode)にする

実装コード

以上2点を実装したコードが下記となります。
コメントで’%%%’ の有る行が、環境毎に変更が必要な部分です。

#include <WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_BME280.h>
#include <Ambient.h>

/*
//
// Global Definitions
//
*/
#define TIME_TO_SLEEP  60*5      // 測定周期(秒)

const char* ssid = “XXXXXXX”;   // %%% Wifi SSID      %%%
const char* pswd = “XXXXXXXX”;  // %%% Wifi パスワード %%%


WiFiClient client;
Ambient ambient;

unsigned int channelId = 40063;      // %%% AmbientのチャネルID %%%
const char* writeKey = “XXXXXXXXX”;  // %%% ライトキー %%%

Adafruit_BME280 bme; // I2C


/*
//
// Main 
//
*/

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(".");
   }

   ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化

   Serial.println(F("BME280 check")); // BME280用セットアップ
   unsigned status;    
   status = bme.begin(0x76);

       // You can also pass in a Wire library object like &Wire2
   // status = bme.begin(0x76, &Wire2)
   if (!status) {
       Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
       Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
       Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
       Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
       Serial.print("        ID of 0x60 represents a BME 280.\n");
       Serial.print("        ID of 0x61 represents a BME 680.\n");
       //while (1) delay(10);
   }
   Serial.println(F("BME280 OK"));
   Serial.println();

   float room_temp = bme.readTemperature();  // センサーからのデータ読み出し
   float room_humi = bme.readHumidity();
   float room_prss = bme.readPressure() / 100;

   Serial.printf("temp: %.2f, humid: %.2f, vbat: %.1f\r\n", room_temp, room_humi, room_prss);

   ambient.set(1, room_temp);  // Ambientのデータ1に温度をセットする
   ambient.set(2, room_humi);  // データ2に湿度をセットする
   ambient.set(3, room_prss);  // データ3にバッテリー電圧をセットする
   ambient.send();  // Ambientに送信する
   delay(1000);

   // Deep sleepする時間(マイクロ秒)を計算する
   uint64_t sleeptime = TIME_TO_SLEEP * 1000000 - (millis() - starttime) * 1000 - 1000000;
   esp_deep_sleep(sleeptime);  // DeepSleepモードに移行
   // ここには戻らない
}

void loop(){
}

データー確認

送られたデーターは下記URL にて確認できます。

https://ambidata.io/bd/board.html?id=29813

さあ、何時間持つか楽しみ😄

この記事が気に入ったらサポートをしてみませんか?