M5Stamp Picoでできること 〜防水温度センサ(DS18B20)を使う

スポンサーリンク
M5Stamp Pico

「M5Stamp Pico」の動作確認(記事は こちら)、および消費電力調査(記事は こちら)が完了したので、次は実際に、簡単なIoTデバイスをつくってみようと思います。

防水タイプの温度センサ「DS18B20」をM5Stamp Picoにつなぎ、一定時間毎に温度を測定し、Ambientに送信するデバイスをつくります。
田んぼの水温を、一定時間毎に測定することを想定しています。


あわせて、デバイス稼働時の消費電流値も確認します。今回は1分毎に温度データを測定することとしますが、実際の使用条件(例えば、単三型ニッケル水素電池3本でデバイスを動かし、1時間に1回温度を測定する場合)での稼働時間も机上計算してみたいと思います。

最初に、M5Stamp Picoと他の部品を接続できるように、M5Stamp Picoの端子にピンソケット(メス)を取り付けておきます。

六角レンチでカバーを外し、基板にはんだづけします。
今回は、ついでにGROVEポートも取り付けておきました。

ステッカーも貼っておきます。

M5Stamp Picoに書き込むスケッチは以下のとおりです。

#include <WiFi.h>
#include "Ambient.h"
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 25
#define ONE_WIRE_VDD 22
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

WiFiClient client;
Ambient ambient;

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

unsigned long interval = 60; // unit:sec

void setup() {
  Serial.begin(115200);

  pinMode(ONE_WIRE_VDD, OUTPUT);
  digitalWrite(ONE_WIRE_VDD, HIGH);

  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.println("Temperature Sensor (DS18B20)");
  sensors.begin();
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);

  ambient.begin(channelId, writeKey, &client);
  ambient.set(1, tempC);
  ambient.send();
  Serial.printf("[temp] %.2f\n", tempC);

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

  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

void loop() {
}

この温度センサは「1-Wire」という通信規格をつかっています(使い方は こちら の記事で詳しく書いています)。
起動するとすぐにWi-Fiに接続し、温度を測定してからAmbientに送信します。その後、Wi-Fiを切断してディープスリープに移行します。

ディープスリープ中にも温度センサに電源供給していると、電池のもちが悪くなるので、M5Stamp Picoが起動している間のみ22番ピンをHIGHにし、温度センサの電源はこのピンにつなぐようにします。

M5Stamp Pico、温度センサ、プルアップ抵抗(4.7kΩ)、電池ボックス(ニッケル水素電池3本)を以下のようにつなぎます。

電池ボックスのスイッチをONにすると、1分毎にAmbientに温度データを送信することができました。

次に、電池ボックスのプラス端子とM5Stamp Picoの「5V」端子の間に、電流センサ「INA226PRC」を挿入します(INA226PRCについては こちら の記事で詳しく書いています)。

電流センサはM5Stackにつながっています。M5Stackには、100ms毎に消費電流値を測定し、CSV形式でSDカードに書き込むようにプログラムを書き込んであります。

M5Stamp Picoを動かし、1分毎にAmbientに温度データを送信させます。
同時にM5Stackも動かし、M5Stamp Picoの消費電流値を測定します。

30分ほど調査を行いました。
結果はこちらです。30分の間に28回、データ送信されていました。

その時の消費電流波形はこちらです。
M5Stamp Picoが起動してデータ送信している時(28回)と、ディープスリープ中の違いがよくわかります。

M5Stamp Picoが起動している時の消費電流波形(拡大)はこんな感じです。

平均消費電流値は 5.53mA となりました。もしも単三型ニッケル水素電池の容量(1900mAh)をフルに使えると仮定すると、1900 / 5.53 = 343.5hr = 14.3日 連続稼働できる計算になります。

また、測定データより、M5Stamp Picoが起動してからディープスリープに移行するまでの時間は平均3.9秒、その間の平均消費電流値は88.55mAでした。
ディープスリープ中の消費電流値を0.35mA(ドキュメント記載値)と仮定して机上計算すると、単三型ニッケル水素電池3本を使い、10分毎に温度を測定すると 85.8日、1時間毎なら 177.7日 稼働できるという結果になります。

ニッケル水素電池の自己放電もあるので、実際にはこんな長期間にわたり連続稼働させることはとてもできないと思いますが、それでもすばらしい結果です。

乾電池で数ヶ月レベルで連続稼働させたいデバイスなら、十分に実現可能だと思います。

 

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


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