M5Stamp Picoでできること 〜ビニールハウスの「温度観測装置」をつくる

知り合いの農家の方が、ビニールハウスでイチゴ栽培をしておられるのですが、そのハウスにて、温度を観測・記録したいと考えています。

イチゴ栽培においては、温度の管理が大切とのことで、特にクラウンと呼ばれる株元の温度により、成長の具合が大きく変わってくるそうです。
知り合いの方は、クラウン周りのみを温める方策を取り入れることで、暖房を利用しない「環境にやさしい」イチゴの栽培を目指しておられます。

ただ、最初から大掛かりな対策は負担が大きいため、今シーズンはハウス内の一部エリアのみに方策を取り入れ、方策の有無による収量への影響を調査したいとのことです。
その際には温度データも蓄積しておき、「方策の有無」→「方策による温度への影響」→「温度による収量への影響」の相関を確認したいと考えておられます。

そのため、ハウス内の温度を観測・蓄積する方法を考えました。

前述のように、ハウス内の多数の地点(いずれもイチゴのクラウン近辺)で温度を観測する必要があります。
ハウスの端には電源コンセントがありますが、そこから多数の観測ポイントまで電源ケーブルを延ばすのは現実的ではありません。
また、ハウス内にはWi-Fi設備はありません。

そのため、以下の方針とすることにしました。

  • ハウス内の電源コンセント付近に、モバイルWi-Fiルータを設置する。
  • IoTデバイスは、バッテリーで長期間連続稼働できるものとする。
  • IoTデバイスで温度を採取し、モバイルWi-Fiルータ経由でWebサーバにデータを蓄積する。
  • Ioデバイスは多数設置するので、安価かつ構成が簡単なものにする。

当初は、IoTデバイスとして「TimerCamera F」+「ENV IIIユニット」の構成としました。

以前調査した内容(こちら)を、ほぼそのまま適用することができます(以前はENV IIユニットを使っていましたが、搭載されている温湿度センサは同じものです)。
今回は15分間隔でデータ採取しようと考えていますが、内蔵バッテリーで20日程度連続稼働できる見込みです。これであれば、シーズン中に1台あたり5〜6回充電すれば良く、十分対応可能と考えました。

ところが、実際にハウスに設置したところ(4台のデバイスを設置しました)、1台は既に20日近く連続稼働できているものの、残り3台は数日でバッテリーがなくなってしまいました。充電し直しても状況は変わりません。
3台が数日おきに止まってしまうとなると、ほぼ毎日いずれかのデバイスの充電が必要となり、さすがにこれでは結構な負担になってしまいます。

TimerCameraの個体によって問題が生じたり生じなかったりしており、原因は不明です(原因を推定した記事は こちら)。
いずれにしろ、TimerCameraにはハードウェア的な工夫の余地はほとんどなく、なんの対処もできません。
「安価」かつ「簡単」という条件を満たしていただけに残念ですが、他の対策を考える必要があります。

M5Stack社の製品で、他に低電力のデバイスといえば「M5Stamp Pico」があります。
コネクタなどが付いておらず「簡単」にデバイスをつくることはできませんが、「安価」「低電力」という条件は満たしているので、今回はこれを使うことにします。

「M5Stamp Pico」にはピンヘッダなどを取り付けることもできますが、ブレッドボードなどを使うと構成がどんどん面倒になり、接触不良などが生じる懸念も増えます。
ただ、端子に外付け部品を直接はんだづけすると、将来的に別の用途に流用することができなくなるので、それも避けたいと思います。
そんな訳で、「M5Stamp Pico」にはGROVEコネクタのみを取り付け、そこに外付け部品を取り付けることにします。

4つの「M5Stamp Pico」を加工します。

ネジを外してカバーを取り外します。

GROVEコネクタをはんだづけします。

今回、「M5Stamp Pico」にスケッチが書き込めないという問題が生じました(記事は こちら)。原因は端子の接触不良だったため、ダウンローダを接続する6ピンについて、ピンソケットもはんだづけしました。

カバーのGROVEポートの部分を切り取ってから本体に取り付けます。これで「M5Stamp Pico」本体については完成です。

電源として単三型Ni-MH電池を4本使います。

スイッチ付きの電池ボックスを用意します。

共立エレショップで「Grove互換コネクタ」というものを見つけました。

圧着ペンチで、電池ボックスのケーブルにコンタクトピンを取り付けます。


コンタクトピンをハウジングに取り付けて、電源についても完成です。

電池はアマゾンで購入しました。


次は「ENV IIIユニット」です。

センサへの日射を遮るために「日よけ」をつくります(つくり方は こちら)。

アマゾンで鉢皿を16個購入しました。


多数の鉢皿に穴を開けなければならないので、目印となる型紙をつくりました。

型紙の目印にあわせて、ドリルで鉢皿に3つの穴を開けます。

左右の穴は直径3.2mmに、中央の穴はステップドリルを使って7mmに広げます。


鉢皿16個のうち12個は、ホールソーを使って、中央の穴を更に32mmに広げます。


長さ60mmのM3ネジで日よけを組み立てます。鉢皿の間のスペーサーにはアイロンビーズを使います。


長さ50cmのGROVEケーブルの片方の端から一旦ハウジングを取り外し、ケーブルを日よけの中央の穴にとおします。

再度ハウジングを取り付け、「ENV IIIユニット」をつなぎます。

鉢皿の穴に「自己融着テープ」を巻き付け、上から水が入ってこないようにして完成です。


「M5Stamp Pico」のひとつのGROVEポートに、「ENV IIIユニット」と電池ボックスのふたつをつなぐ必要があるため、「ハブユニット」を使います。
「M5Stamp Pico」と「ハブユニット」をつなぎ、その先に「ENV IIIユニット」と電池ボックスをつなぎます。

できあがりはこちらです。
左が「TimerCamera F」を使ったもの、右が今回つくったデバイスです。

作成の手間は格段に増えてしまいましたが、材料費は同程度に収まりました。

スケッチはこちらです。
基本的には、TimerCamera用につくったスケッチに対し、スリープ移行時の処理を、単純な「esp_deep_sleep_start();」に変更しただけです。
動作中だけLEDが光るようにしておきました。

#include <FastLED.h>
#include <WiFi.h>
#include "SHT3X.h"

#define NUM_LEDS 1
#define LED_PIN 27
CRGB leds[NUM_LEDS];

SHT3X sht30;
float val0 = 0.0;

const char*  ssid      = "XXXXXXXX";
const char*  password  = "XXXXXXXX";

unsigned long interval = 900; // unit:sec

void sleepStamp() {
  Serial.println("### DEEP SLEEP START");
  leds[0] = CRGB::Black;
  FastLED.show();
  esp_deep_sleep_start();
}

boolean connect_wifi() {
  省略
}

void disconnect_wifi() {
  WiFi.disconnect(true);
  Serial.printf("WiFi disconnected\n");
}

void setup() {
  Serial.begin(115200);
  Serial.println("### Get temperature data with ENV.III Unit & send request");

  esp_sleep_enable_timer_wakeup(interval*1000*1000);

  FastLED.addLeds<SK6812, LED_PIN, GRB>(leds, NUM_LEDS);
  leds[0] = CRGB::Green;
  FastLED.show();

  // Get Data
  if(sht30.get()!=0) {
    Serial.println("### ENV III ERROR");
    sleepStamp();
  }
  val0 = sht30.cTemp;
  Serial.printf("Temperature: %.2f\n", val0);
  // Connect WiFi
  if(!connect_wifi()) sleepStamp();
  // Send Data
  if(!sendRequest(val0, 0, 0, 0)) {
    Serial.println("Failed to send request.");
    sleepStamp();
  }
  Serial.println("Send request is finished.");
  // Disconnect WiFi
  disconnect_wifi();

  sleepStamp();
}

void loop() {}

boolean sendRequest(float val0, float val1, float val2, float val3) {
  省略
}

さて、以前行った調査の結果、この構成で「M5Stamp Pico」を15分間隔で間欠動作させると、半年以上にわたり連続稼働できる見込みが得られています(記事は こちら)。

ただ、今回の回路構成では、「M5Stamp Pico」がディープスリープしている間も、「ENV IIIユニット」には電源供給されることになります。
もしも「ENV IIIユニット」の消費電力が大きければ、連続稼働できる期間が大幅に減ってしまうかもしれません。

そんな訳で、「ENV IIIユニット」の消費電流値を調査してみることにしました。

以下のように、電池ボックスと「ハブユニット」の間にテスターを挿入して、電流値を測定してみました。

調査の結果、「M5Stamp Pico」がディープスリープしている間の消費電流値は「0.88mA」となりました。
「ENV IIIユニット」を取り外すと「0.39mA」になることから、「ENV IIIユニット」自体の消費電流値は「0.5mA程度」となります。

「M5Stamp Pico」が動作している時の消費電流値に比べると2桁小さいため、「ENV IIIユニット」の消費電流値は無視でき、見込みどおりの期間、連続稼働できると思われます。

今後、実際にこのデバイスをビニールハウスに設置して、問題なく運用できるか確認していこうと思います。


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


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


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

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