見出し画像

【SALZminiSolo】(ザルツミニソロ)初お披露目です。順調に稼働しています。

AtomMatrixとポンプユニットを使うと、とても簡単に自動潅水装置ができることが分かりました。

【SALZmini】完成しました。

今回は【SALZmini】からWifi機能をなくした、自立型自動潅水装置【SALZminiSolo】(ザルツミニソロ)を作りました。作ってからしばらく様子を見ていました。別記事でちらちら映り込んでいましたが、今回が初お披露目です。

できたもの:

貯水式自動潅水装置です。
20分に一度、土壌水分率を計測し、その状態をLED表示をします。
水分率が30%より少ない場合、2分間ポンプを動作させて、下のタンクから水を吸い上げ、水やりを行います。あふれた水は下のタンクへ還ります。通常の水やりも行えます。

装置の材料:

AtomMatrix
M5Stack用 水分測定センサ付き給水ポンプユニット
Type-C USBケーブル
針金
布(3cm × 3cm)
プラ容器(ソフトワンタッチボトル、ダイソー)
プラケース(ダイソー)

Atom Matrix

M5Stack用 水分測定センサ付き給水ポンプユニット

他に用意するもの:

深植えした鉢(深さ8cm以上)
USB電源
工具(キリ、リーマ、はさみ、千枚通しなど)
PC、ArduinoIDE(プログラムのコンパイル、転送用)

作り方:

1.プラケースに穴をあけます。(給水ホースが入る穴と排水が還る穴です。)
2.ホースを適当な長さに切って、千枚通しで2cm間隔で穴をあけます。先端は折返し針金で縛ります。(散水用ホース)
3.ホースを適当な長さに切って、先端に布を巻きつけます。(給水用ホース)
4.2つのホースをポンプに差し込みます。
5.プログラムを入れたAtom Matrixをポンプユニットと接続します。
6.Atom MatrixとType-C USBケーブルを接続して、USB電源につなぎます。
7.プラ容器のキャップ部分をカットし、装置にかぶせます。

ギリギリのサイズでした。直径、長さともにもう少し大きいものが欲しいと思いましたが、なんとかはまりました。

用土について:

今回は富士砂と赤玉土を1:1でブレンドしました。スリットが大きかったため、網を切って底に敷いています。

松の実生苗を植替えました。

赤玉土100%の用土と比べて、水分量の%が低めに表示されます。ただ、給水直後は3本立っていて、1本になると給水しているようです。

この時期、夏バテが怖くて、肥料をやっていませんが、給水ホースを直接用土の上に置いているので、用土の上に置いた肥料には水が掛からないことになります。肥料の季節になったら、給水パイプのはわせ方を考える必要があります。

ソースコード:

// SALZminiSolo bbd

#include <M5Atom.h>

//デモモード(ON:1, OFF:0)
//#define DEMO_MODE 1
#define DEMO_MODE 0

#define P(col, row)   (((row) * 5) + (col))
#define RGB(r, g, b)  (((g) << 16) + ((r) << 8) + (b))

#define SECONDS(s)    ((s) * 1000)
#define MINUTES(m)    SECONDS(m * 60)

const int WAIT_TIME = (DEMO_MODE) ? SECONDS(10) : MINUTES(20);
const int PUMP_TIME = (DEMO_MODE) ? SECONDS(10) : MINUTES(2);

#define INPUT_PIN 32
#define PUMP_PIN 26


void
DispLevel(int lv) {
 static int barColor = RGB(00xf00xf0);
 static int lvPrev = 0;
 if (lv == lvPrev)
   return;
 lvPrev = lv;

 for (int i = 1 ; i <= 3; i++) {
   M5.dis.drawpix(P(0, i), (lv > 10) ? barColor : 0);
   M5.dis.drawpix(P(1, i), (lv > 30) ? barColor : 0);
   M5.dis.drawpix(P(2, i), (lv > 50) ? barColor : 0);
   M5.dis.drawpix(P(3, i), (lv > 70) ? barColor : 0);
   M5.dis.drawpix(P(4, i), (lv > 90) ? barColor : 0);
 }
}

int
WlRate(int wl)
{
 //校正済の水分%を返す。
 //センサーを水に浸けた状態:1400
 //センサーを外に出した状態:2100
 const int wetWl = 1400;
 const int dryWl = 2100;

 return (int)((1.0 - ((float)(wl - wetWl) / (float)(dryWl - wetWl))) * 100.0);
}

int
GetWl(void)
{
 float val = 0.0;
 pinMode(INPUT_PIN, INPUT);
 for (int i = 0; i < 10; i++) {
   float v = analogRead(INPUT_PIN);
   //Serial.printf("ML(%d):%8.3f\r\n", i, v);
   val += v;
   delay(10);
 }
 return (int)(val / 10.0);
}

void
PrintData(int wl) {
 static int c = 0;

 c++;
 Serial.printf("SendData():\n");
 Serial.printf("1:waterLevel:%d\n", wl);
 Serial.printf("2:c:%d\n", c);
}

//---------------------------------------

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

 pinMode(INPUT_PIN, INPUT);
 pinMode(PUMP_PIN, OUTPUT);
}

void loop() {
 int wl = WlRate(GetWl());
 DispLevel(wl);
 PrintData(wl);

 if (wl < 30) {
     digitalWrite(PUMP_PIN, true);
     M5.dis.drawpix(P(44), RGB(0xf00xf00));
     delay(PUMP_TIME);
     digitalWrite(PUMP_PIN, false);
     M5.dis.drawpix(P(44), RGB(000));
 }
 else
   delay(WAIT_TIME);
}

とてもスッキリとしたプログラムになりました。
ご興味があれば是非!お試しください。

これならば、Atom Matrixの中にプログラムを書き込んで、お渡しする事もできそうです。仕掛けを考えてみたいと思います。

最後までお読みいただきまして、ありがとうございいました。


#自動潅水機 #SALZminiSolo #AtomMarrix #ポンプユニット #ダイソー

この記事が気に入ったらサポートをしてみませんか?