見出し画像

【SALZmini】完成しました。

ハードウェアは前回の記事、【SALZminiへの道】おおよそできました。

にてできておりましたが、ソフトウェアを乗っけて、SALZminiが完成しました。

装置の名前:SALZmini(ザルツミニ)

主な機能:

 水分センサーの値を元に自動で水やりします。
 水分センサーの値をAmbientで送りモニタリングします。

装置の材料:

 AtomMatrix
 WateringUnit
 レンジパックL(ダイソー)
 アクセサリースタンド(ダイソー)
 Type-C USBケーブル
 針金
 布(3cm × 3cm)
 ビニール袋(装置の保護用)
 ミニクリップ(ビニール袋を留めるため)

必要なもの:

 深植えした鉢(深さ8cm以上)
 USB電源
 工具(キリ、リーマ、はさみ、千枚通しなど)
 PC、ArduinoIDE(プログラムのコンパイル、転送用)
 Ambientのアカウント、チャンネル
 Wifi(ネット経由でAmbientへデータを送信し、グラフ化する場合)

作り方:


 1.レンジパックLのふたに排水用の穴と給水ホース用の穴をあけます。
 2.AtomMatrixとWateringUnitをGROVE線でつなぎます。
 3.WateringUnitに付属しているホースを必要な長さでカットします。
 4.取水ホースの先端を布で巻き、ゴミが入らないよう保護します。
 5.給水ホースは鉢の円周+5cm程度の長さでカットします。
 6.給水ホースに千枚通しで穴をあけます。この時、ホースのカールを考慮し、穴が下向きになるようにします。
 7.WateringUnitのINに取水ホースを差し込み、針金で固定します。
 8.WateringUnitのOUTに給水ホースを差し込み、針金で固定します。
 9.用意した鉢にセンサーを挿します。センサー部分が内側を向くようにします。

AtomMatrixのソース:

wifiのssidとパスワード、Ambientのチャンネルキーの指定が必要です。

// SALZmini bbd

#include <M5Atom.h>
#include <Wire.h>
#include "Ambient.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);

WiFiClient client;
Ambient ambient;

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

unsigned int channelId = 0; // AmbientのチャネルID
const char * writeKey = "xxxx"; // ライトキー

#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
SendData(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);
 
 ambient.set(1, wl);
 ambient.set(2, c);
 ambient.send();
}

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

void setup() {
 Serial.begin(115200);
 M5.begin(true, false, true);

 WiFi.begin(ssid, password);  //  Wi-Fi APに接続 ----A
 while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
   M5.dis.drawpix(P(4, 0), RGB(0xf0, 0, 0));
   delay(500);
   M5.dis.drawpix(P(4, 0), RGB(0, 0, 0));
   delay(500);
   Serial.print(".");
 }
 M5.dis.drawpix(P(4, 0), RGB(0, 0, 0xf0));
 Serial.print("WiFi connected\r\nIP address: ");
 Serial.println(WiFi.localIP());

 while (!ambient.begin(channelId, writeKey, &client)) { // チャネルIDとライトキーを指定してAmbientの初期化
   M5.dis.drawpix(P(4, 0), RGB(0xf0, 0, 0));
   delay(500);
   M5.dis.drawpix(P(4, 0), RGB(0, 0, 0));
   delay(500);
   Serial.print("*");
 }
 M5.dis.drawpix(P(4, 0), RGB(0, 0, 0xf0));

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

void loop() {
 int wl = WlRate(GetWl());
 DispLevel(wl);
 SendData(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);
}

使い方:

 1.AtomMatrixにType-C USBケーブルを挿し、通電します。 
 2.Wifi接続を試行します。左上のLEDが赤点滅します。
 3.正常に接続できると、左上のLEDが青点灯します。
 4.水分量%を5段階で表示します。

この水分量%はセンサーを空中に置いたときの値を0%、水中に置いたときの値を100%になるように補正しています。土壌中での%ではありません。

画像1


 5.20分に一度水分量%をチェックします。Ambientに値を送信します。

画像4

 6.水分量%の値が29以下になった時、2分間ポンプを回します。この時、右下のLEDが黄点灯します。
 7.上記の作業を繰り返します。

今後の課題:

Wifi、Ambient機能を外せば、どこでも動く装置となりました。
装置はもっと単純に作れるような気がします。
さらなるブラッシュアップを行い、可用性を高めていきたいと考えています。

さいごに:

なんども書いていますが、今回の装置作りはあまり難しく考えず作りましたが、なかなかの出来栄えで満足しています。電子工作でいつもつまづいていた配線はGROVEコネクターで解消し、部品の取り付けに関しても、アクセサリースタンドがよい働きをしています。

水分計について、もやもやが続いておりますが、盆栽のことについて非常に詳しく、丁寧に説明されている「キミのミニ盆栽びより」のYouTubeチャンネルで盆栽の用土に関する動画がありました。今回の装置を作る際にも非常に参考になりました。

盆栽の土【キミのミニ盆栽びより】Bonsai soil

土の乾き方を観察してみました【キミのミニ盆栽びより】Observation of how the soil dries

私にとってはドンピシャな企画でして、大変参考になりましたので、ご紹介させてください。

自分なりに表面の土を目で見て乾いているか湿っているか判断していましたが、表面は乾いていても中が湿っていることがあることや、「水やりは一日一回やらなければいけない」という気持ちでおりましたが、決してそんなことはなく、あくまでも、「一鉢一鉢の土の乾き具合を見て水をやるべきである」ことなど、非常にわかりやすく説明されていて、改めて納得いたしました。

盆栽を丁寧に育ててらっしゃる方は、一鉢一鉢持ち上げ重さを確かめることによりその鉢の水分量を知り、今水やりが必要かどうかを確認しながらされているとお聞きします。「水やり三年」、「水やり一生」の言葉が沁みます。

また、用土についても、今後しっかり調べていきたいと思っておりましたので、これからも参考にさせていただきたいと思います。

Atom Matrix

Watering Unit

レンジパックL(ダイソー)

画像2

アクセサリースタンド(ダイソー)

画像3

最後までご覧いただき、ありがとうございました。

#自動潅水装置 #SALZmini #盆栽 #園芸 #電子工作 #AtomMatrix #WateringUnit #ダイソー

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