先日、「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」を使えば、本当に内蔵バッテリーだけで長期間の温度データを採取できるのか、確認してみることにしました。
Timer Camera X(Yahoo!ショッピング)「ファイル」>「スケッチ例」>「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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。