「Timer Camera」と「ENV IIユニット」で温度データを測定する

先日、「Timer Camera」を内蔵バッテリーのみで動作させた時に、何枚の写真を撮影できるか実験を行いました(記事は こちら)。

270mAのバッテリーを搭載した「Timer Camera F」を使い、5分に1枚のペースで写真を撮影させたところ、稼働時間は106時間40分(約4日半)、1280枚の写真を撮影することができました。
また、Timer Cameraのスタンバイ電流はわずか2μAとのことで、例えば撮影間隔を1時間に広げると、1ヶ月以上連続で稼働させることができるそうです。

さて、これまで使ってきたM5Stack社の各種製品(M5Stack、M5StickC、ATOMなど)の消費電流値は、スタンバイ時でも数mA程度と、とても大きな値でした。
M5Stack社の製品は、GROVEポートに各種センサをつなぐだけで、ハンダづけなどをしなくてもIoTデバイスが簡単に構築できるという、とてもよいコンセプトの製品ですが、スタンバイ時の消費電流が大きいのが残念な点でした。

それに対し、「Timer Camera」のスタンバイ時の消費電流値は2μAと、他の製品の1/1000です。
また、「Timer Camera」にはGROVEポートも搭載されています。

そのため、「Timer Camera」をカメラとして使うのではなく、「M5Stack」などの代替デバイスとして使うことで、低消費電力のIoTデバイスがつくれるのではないかと考えました。

例えば、「Timer Camera」のGROVEポートに「ENV IIユニット(温湿度センサ)」をつなぎ、5分に1回のペースでWebサーバに温度データを送信、送信が完了したらスタンバイに移行するようにすれば、内蔵バッテリーだけで、写真を撮影した時と同等の期間(約4日半)は連続稼働できそうです。
温度データはそれほど頻繁に測定する必要はありませんので、例えば1時間に1回の測定でよければ、電源を外付けしなくても1ヶ月以上にわたりデータ採取することができるはずです。

そんな訳で、「Timer Camera」を使えば、本当に内蔵バッテリーだけで長期間の温度データを採取できるのか、確認してみることにしました。


「ファイル」>「スケッチ例」>「M5Stack」>「Unit」>「ENVII_SHT30_BMP280」をベースにし、「ファイル」>「スケッチ例」>「Timer-CAM」>「wakeup」の内容を反映して、以下のようなスケッチをつくりました。

#include "SHT3X.h"
#include "battery.h"
#include "bmm8563.h"
#include <WiFi.h>
#include "Ambient.h"

SHT3X sht30;
WiFiClient client;
Ambient ambient;

const char*  ssid      = "XXXXXXXX";
const char*  password  = "XXXXXXXX";
unsigned int channelId = XXXXX;
const char*  writeKey  = "XXXXXXXX";

float tmp = 0.0;
float hum = 0.0;

unsigned long interval = 300; // unit:sec

void sleepTimerCam() {
  bat_disable_output(); // disable bat output, will wake up after interval sec, Sleep current is 1~2μA
  // if usb not connect, will not in here;
  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

void setup() {
  Serial.begin(115200);
  Serial.println("[ENV.II Unit (SHT30)]");
  bat_init(); // hold bat output
  bmm8563_init();
  bmm8563_setTimerIRQ(interval); // interval sec later will wake up
}

void loop() {
  if(sht30.get()==0) {
    tmp = sht30.cTemp;
    hum = sht30.humidity;
  }
  Serial.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi connected\n");

  Serial.printf("Temperatura: %2.2f*C  Humedad: %0.2f%%\r\n", tmp, hum);
  
  ambient.begin(channelId, writeKey, &client);
  ambient.set(1, tmp);
  ambient.set(2, hum);
  ambient.send();

  WiFi.disconnect(true);
  Serial.printf("WiFi disconnected\n");
  
  sleepTimerCam();
}

5分に1回の間隔で温度データ、湿度データを測定し、Wi-Fiに接続してambientに送信、送信が完了したら速やかにWi-Fiを切断してスタンバイに移行するというものです。

「Timer Camera」のGROVEポートに「ENV IIユニット」をつなぎ、上記のスケッチを書き込みます。

防水のため、「Timer Camera」と「ENV IIユニット」を袋に入れ(外付けバッテリーなどはつないでいません)、自宅ベランダに置いておきます。

さて、この条件で「Timer Camera」が停止するまで放っておいたところ、稼働時間は158時間20分約6日半)、データ送信回数は1900回となりました。
画像送信枚数の1.5倍です。

画像データに比べて送信するデータサイズが小さく、データ送信処理にかかる時間が短いため、より多くの回数、データ送信できたのだと思います。

データ送信を1時間に1回にすると、1900時間→79日(約2.5ヶ月)も連続稼働できる計算になります。
外付けバッテリーなしでこれだけの期間にわたり稼働できるとなると、本当に色々な用途が考えられそうです。

2021年12月1日追記

大切なことを書き忘れていました(この記事をご覧になった方から問い合わせがありました)。

TimerCameraには「BM8563」というチップが内蔵されているのですが、このチップがI2Cを使っています。
そのため、I2C方式のユニットをそのまま使おうとすると、両者のI2Cが競合してしまい、正常に動作しません(私の場合は、TimerCameraが強制リブートを繰り返す状態になってしまいました)。

この問題を回避するため、私の場合は以下のように対処しています。

  • 「UNIT_ENV」ライブラリ内の「SHT3X.h」「SHT3X.cpp」というふたつのファイルを、作成したスケッチフォルダの下(XXX.ino と同じ場所)にコピーする。
  • コピーした「SHT3X.cpp」内の「Wire」という記述を、全て「Wire1」に変更する。
  • コピーした「SHT3X.cpp」内の「Wire1.begin();」という記述について、「Wire1.begin(4, 13);」に変更する(GROVEポートのピン名を追記する)。

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。