M5StickCでできること 〜育苗箱の温度を管理する

スポンサーリンク
自然農体験

知り合いの方から畑の一画をお借りして、「自然農」での野菜栽培を体験中です。


先日、この畑に植える夏野菜の苗を育てるために「育苗箱」をつくりました。
スタイロフォームでセルトレイが入るサイズの箱をつくり、中に育苗用ヒーターを入れて保温する仕組みです。

使っているヒーターはこちらです。


ところで、育苗においては地温の管理が重要なようです。そのため、地温を把握するためのIoTデバイスを製作することにしました。
以下のようなものをつくることにします。

  • 10分ごとに土中温度を測定する。参考のためヒーター直上、空中の温度も同時に測定する。
  • 測定した温度データはWebサーバに送信・保存し、Webブラウザでグラフ表示できるようにする。
  • リレーを使ってヒーターのON・OFFを制御する。土中温度が27度以下になったらヒーターをONに、28度以上になったらOFFにする。
  • リレーのON・OFF状態もWebサーバに送信・保存し、Webブラウザで確認できるようにする。

一定時間間隔で処理を行うだけなので、当初はディープスリープ機能を使ってマイコンデバイスを低電力化し、電池駆動させようと考えていました。しかし、試したところディープスリープ中はマイコン出力が直前の状態によらず「Low」になってしまい、その結果リレーがOFFになってしまいます。やむを得ずマイコンデバイスは常時動作させることとし、コンセントから電源供給することにしました。

消費電力のことを気にする必要がなくなったので、マイコンデバイスはLCD画面付きの「M5StickC」を使うことにします。
温度センサは防水仕様の「DS18B20」を使います。また、リレーはM5StickCとつなぐのが簡単な「M5Stack用ミニリレーユニット」を使います。

M5StickC Plus(Yahoo!ショッピング)



接続は以下のようにします。
温度センサとリレーは、M5StickCのGROVEポートにつなぎます。

それでは組み立てていきます。

今回使用している温度センサ(DS18B20)は「1-wire」というバス規格のもので、ひとつの信号線に複数の温度センサをつなぐことができます。
以前、複数の温度センサをマイコンデバイスのGROVEポートにつなぐために、「GROVEプロトシールド」を使って以下のようなパーツをつくっていましたので、今回もこれを利用することにします。
温度センサにジャンパーピンを取り付けておくことで、最大5個の温度センサをひとつのマイコンデバイスに接続することができます。

AC電源用の延長コードの一部をバラし、一方の配線を途中で切断してリレーの「COM」端子と「NO」端子につなぎます。これでリレーの制御信号が「High」の時にリレーがONになり電気が流れます。

「M5Stack用拡張ハブユニット」を使って、「M5Stack用ミニリレーユニット」と「GROVEプロトシールド(温度センサ接続用)」の両方をM5StickCにつなぎます。


Arduinoスケッチは以下のとおりです。

#include <M5StickC.h>
#include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 33
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress temp0 = { 0x28, 0x13, 0x0D, 0x05, 0x5F, 0x20, 0x01, 0xCA };
DeviceAddress temp1 = { 0x28, 0xAF, 0x02, 0xD8, 0x5F, 0x20, 0x01, 0x43 };
DeviceAddress temp2 = { 0x28, 0x4F, 0xD8, 0x24, 0x5F, 0x20, 0x01, 0xEA };

#define RELAY_PIN 32

boolean relayFlag = false;
boolean prevFlag = false;
unsigned long interval = 600; // unit:sec

void setup() {
  M5.begin();
  M5.Lcd.setRotation(1);
  if(!connect_wifi()) ESP.restart();
  sensors.begin();
  pinMode(RELAY_PIN, OUTPUT);
}

void loop() {
  M5.Lcd.setCursor(0, 0, 2);
  sensors.requestTemperatures();
  float val0 = sensors.getTempC(temp0);
  float val1 = sensors.getTempC(temp1);
  float val2 = sensors.getTempC(temp2);
  M5.Lcd.printf("[temp0] %.2f\n[temp1] %.2f\n[temp2] %.2f\n", val0, val1, val2);
  if(val0 < 27.0) relayFlag = true;
  if(val0 > 28.0) relayFlag = false;
  if(relayFlag != prevFlag) {
    if(relayFlag) digitalWrite(RELAY_PIN, HIGH);
    else          digitalWrite(RELAY_PIN, LOW);
    prevFlag = relayFlag;
  }
  M5.Lcd.printf("[relay] %d\n\n", relayFlag);
  int val3 = relayFlag;

  if(!sendRequest(val0, val1, val2, val3)) ESP.restart();
  delay(interval * 1000);
}

boolean connect_wifi() {
  :(省略)
}

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

「1-wire」規格では、各温度センサのアドレスをあらかじめ調べておき、そのアドレスを指定することで温度を測定できます。
今回使用する3つの温度センサのアドレスを、それぞれ「temp0」「temp1」「temp2」という変数に定義しておき、このうち「temp0」の温度センサで土中温度を測定することにします。
「temp0」での測定結果が27度以下だったら「relayFlag」を「true」に、28度以上だったら「false」にします。「relayFlag」が「true」のとき、「M5Stack用ミニリレーユニット」につながる「32」番信号を「High」にします。

スケッチをM5StickCに書き込み、実際に育苗箱に設置します。

延長コードの先は育苗用ヒーターにつながっています。また「GROVEプロトシールド」に3つの温度センサがつながっています。
M5StickCには、USBケーブルでコンセント(ACアダプタ)から電源供給されています。

温度センサは以下のように設置しています。ひとつはセルトレイの土に差し込み、もうひとつはセルトレイの下に潜り込ませ、最後のひとつは育苗箱の壁面に貼り付けています。

温度の推移をWebブラウザで確認した結果は以下のような感じになります。

夜間は安定してヒーターのON・OFFが切り替わり、土中温度も25度〜30度の範囲内で維持できています。
それに対し、昼間は育苗箱を移動したりフタを外したりといろいろやっているため、温度も安定しません。
この日は晴れていたので育苗箱を屋外に出し、フタも外して日光に当てていたのですが、晴れていた割に気温が低かったため、日中ヒーターはずっとONでしたが土中温度は低いままでした。

2024年4月3日追記

今回つくった「育苗箱」と「地温管理システム」については、3月あたまから使ってきましたが、4月に入り暖かくなってきたので、今シーズンの利用を終了しました。
利用開始後も調整を続け、最終的には「5分毎に土中温度を測定」し、土中温度が「25.4℃以下でヒーターON」「25.6℃以上でヒーターOFF」するように変更しました。

この設定での観測結果は以下のような感じです。

昼間は育苗箱のフタを開けたり日光に当てたりと、状況が日によってまちまちなので地温も安定していませんが、夜間は安定して25℃〜26℃程度をキープできています。
一定の地温を維持するシステムとしては、十分機能しているようです。

ただ、実際にこの育苗箱で発芽させた苗の生育具合は今ひとつでした。

トマトやピーマンなど、複数種類のタネを同じセルトレイにまいて同じ環境で育ててしまったため、先に発芽したトマトが暑すぎて萎れてしまったりと、いろいろな問題が発生しました。
来シーズンはセルトレイを苗の種類毎に分割し、種類毎に個別に出し入れできるようにしようと思います。

また、今回はヒーターの上に直接セルトレイを置いたため、セルの場所によって生育にバラツキがありました。
トレイの外枠付近は順調に育っていたのに対し、中央付近は発芽しにくかったり、発芽してもすぐに枯れてしまいました。中央部分は暑すぎたのかもしれません。
来シーズンはヒーターとセルトレイの間に空間を設けるようにしようと思います。

 

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


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