【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(0, 0xf0, 0xf0);
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(true, false, true);
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(4, 4), RGB(0xf0, 0xf0, 0));
delay(PUMP_TIME);
digitalWrite(PUMP_PIN, false);
M5.dis.drawpix(P(4, 4), RGB(0, 0, 0));
}
else
delay(WAIT_TIME);
}
とてもスッキリとしたプログラムになりました。
ご興味があれば是非!お試しください。
これならば、Atom Matrixの中にプログラムを書き込んで、お渡しする事もできそうです。仕掛けを考えてみたいと思います。
最後までお読みいただきまして、ありがとうございいました。
#自動潅水機 #SALZminiSolo #AtomMarrix #ポンプユニット #ダイソー