【DIY】Nefry BTとArduino IDEで作る自動水やり機(散水機)

こんばんは、ゆきです!
今回はNefry BTというIoTモジュールを使って、家庭用の自動水やり機を作ってみました。うちのベランダには水場がないので、家の中からホースを引かないといけません。なので、栽培している家庭菜園のプランターにタンク等から自動で水をあげる仕組みが欲しかったんですよね。やっと実現できました。
土の湿度センサーを使い、ある程度土が乾いたら水をやるという簡単なシステムです。ただ、NefryとIFTTTで、水を上げた場合はLineで自分のスマホに通知する仕組みも組み込んでます。
結構簡単に作れて、Nefryの便利さを感じました!
目次
用意するもの
今回用意する必要がある材料は以下の通り。
| 項目 | 価格 | 個数 |
|---|---|---|
| Nefry BT | 5,380円(千石電商) | 1個 |
| ポンプ [DC30A-1230] | 995円(Amazon) | 1個 |
| 湿度センサー [YL-69] | 140円(Amazon) | 1個 |
| 9V電池ケース | 250円(Amazon) | 1個 |
| フォトカプラ [TLP222AF] | 100円(秋月電子) | 1個 |
| 抵抗 200Ω | 数十円 | 数個 |
| ブレッドボード | 180円(Amazon) | 1個 |
| モバイルバッテリー | ー | 1個 |
上記以外に、以下のものも必要に応じて用意してください。
- ジャンパーワイヤ(オス-オス)
- ポンプ用ホース
- YL-69拡張用の三芯ケーブル
今回構築する回路
今回構築した回路は以下の通りです。

実際に作成した水やり機
実際に作成した水やり機が以下のようなもの。バケツの中にポンプがあり、水をくみ上げます。

土壌湿度センサー(YL-69)は、フリスクの箱の中に組み込んで加工しています。はんだ付けもっとうまくなりたい…。

プログラムの動作に必要な前準備
IFTTTへの登録と設定
今回のプログラムでは、水やり後にLineで通知します。これにはNefryのIFTTTライブラリ(NefryIFTTT.h)を使い、IFTTTのWebhooksを使ってLineにメッセージを送信します。
そのためには前準備が必要なので、ここではその設定方法について解説します。
IFTTTへの登録方法については「Google HomeをIFTTTと組み合わせてTwitterやLineなどと連携しよう!」の記事の中で紹介しています。
(1)まずはIFTTTで新規のアップレットを作成し、「+this」を選択します。

(2)IFTTTのサービスの選択ウィンドウにwebと入力すると、サービスが絞り込まれて「Webhooks」が表示されるため、選択します。

(3)Webhooksを選択すると、「Receive a web request」のみが表示されているので、選択します。選択すると、以下のようにEvent Nameを付ける必要があります。ここでつけるEvent NameはNefry BTでも使用するのでメモしておきましょう。

僕は「water_pour」としました。
(4)次に「That」にあたる部分のアクションを選択します。今回はLineを使います。

(5)Lineのアクションは1つしかありません。「Send Message」を選択すると次の画面になります。Recipientでは送信先を選択することが出来ます。特にグループに配信しなくてよいのであれば「1:1でLine Notifyから通知を受領する」を選択しましょう。

Messageの中には、Lineへ通知する内容を規定することができます。デフォルトでは3つの値を使用することができ、「{{Value1}}~{{Value3}}」の中に、プログラムで記入した内容が表示されます。その他の所は固定で表示されます。
僕は次のようにしました。

あとは最後にFinishを押して完成です。
WebhooksのSecretKeyの取得
また、IFTTTとNefry BTを連携させるためには、WebhooksのSecretKeyが必要です。
(1)IFTTTの「My Applets」から「Service」を選択し、サービス一覧から「Webhooks」を選択します。

(2)Webhooksの「Settings」を選択します。

(3)表示されているURLの「https://maker.ifttt.com/use/」以降の値をすべてコピーします。ここに表示されているのが、Secretkeyになります。

以上で前準備は終了です。
プログラム
プログラムの処理フロー
プログラムの処理は以下のようにしています。

※yは乾き判定用の閾値です。今回はNefryのData Storeから指定できるようにします。
実際に作成したプログラム
プログラムは以下のように作成しました。エラー処理は含まれていないシンプルなものです。
#include <Nefry.h>
#include <NefryIFTTT.h>
#define VOLTAGE_OUTPUT A0
#define ANALOG_INPUT A2
#define PUMP_ON A1
#define DELAY_TIME 10000
#define PUMP_TIME 5000
String Event, SecretKey;
long sensorData;
int humidValue, pumpCnt, sensorCnt;
unsigned long startTime, delayTime;
void setup() {
// put your setup code here, to run once:
pinMode(VOLTAGE_OUTPUT, OUTPUT);
pinMode(PUMP_ON, OUTPUT);
Nefry.setConfHtmlValue("humid_threshold",0);
humidValue = Nefry.getStoreValue(0);
sensorData = 0;
pumpCnt = 0;
//Line通知用の初期設定(Webhookキーを取得)
Nefry.setConfHtmlStr("SecretKey",1); //Nefry DataStoreのタイトルを指定
Nefry.setConfHtmlStr("Event",2); //Nefry DataStoreのタイトルを指定
SecretKey = Nefry.getStoreStr(1); //Nefry DataStoreからデータを取得
Event = Nefry.getStoreStr(2); //Nefry DataStoreからデータを取得
}
void loop() {
// プログラミング開始時刻の保存
startTime = millis();
// センサーへの印加電圧をオン
digitalWrite(VOLTAGE_OUTPUT, HIGH);
// 立ち上がり待ち。
delay(5);
//センサーデータ読み取り
sensorData = analogRead(ANALOG_INPUT);
//Nefry Web Consoleでの確認用
Nefry.println("Get sensor data:");
Nefry.println(sensorData);
//電圧をオフに
digitalWrite(VOLTAGE_OUTPUT, LOW);
//土の乾燥度合いが規定値を下回ったら水をあげる(4025が乾燥状態)
if(humidValue<sensorData){
pumpCnt = 0;
while(pumpCnt <= (PUMP_TIME / 1000)){
digitalWrite(PUMP_ON, HIGH);
pumpCnt = pumpCnt + 1;
Nefry.setLed(255, 255, 255); //動作中の場合、白色点灯
delay(1000);
}
Nefry.setLed(0, 255, 0); //緑色に戻す
digitalWrite(PUMP_ON, LOW);
bool sendData = IFTTT.send(Event, SecretKey,(String)(sensorData),"水やりをしました","no error");//IFTTTにデータを送信
//Value1:Nefry,Value2:Nefryが起動してからの秒数,Value3:送信カウンタ
if (!sendData) {//IFTTTにデータを送信が成功したか失敗したかの判定
Nefry.setLed(255, 0, 0); //Errの時、赤色点灯
}
}
//
if( millis() <= startTime){
delayTime = DELAY_TIME - millis(); //オーバーフロー時
}else{
delayTime = DELAY_TIME - ( millis() - startTime ); //通常時
}
Nefry.println(millis());
delay(delayTime);
}
ソースコードの解説
必要なライブラリ
今回必要なライブラリは次の通りです。NefryIFTTT.hは、NefryでIFTTTを動作させるのに必要です。
#include <Nefry.h> #include <NefryIFTTT.h>
Nefry.setConfHtmlValueとNefry.setConfHtmlStr
この2つの関数は、NefryのWeb Configから値を操作するのに必要です。それぞれを記述することで、Nefryの起動後Web ConfigのData Storeから値を登録できるようになります。
Data Storeから登録された値は電源を切った後も保持されています。
Nefry.setConfHtmlValue("humid_threshold",0);
humidValue = Nefry.getStoreValue(0);
//Line通知用の初期設定(Webhookキーを取得)
Nefry.setConfHtmlStr("SecretKey",1); //Nefry DataStoreのタイトルを指定
Nefry.setConfHtmlStr("Event",2); //Nefry DataStoreのタイトルを指定
SecretKey = Nefry.getStoreStr(1); //Nefry DataStoreからデータを取得
Event = Nefry.getStoreStr(2); //Nefry DataStoreからデータを取得
2つの関数の違いは以下の通り。
- Nefry.setConfHtmlValue:数値情報
- Nefry.setConfHtmlStr:文字列情報
Nefry.setConfHtmlValue(引数1,引数2)のように記載して使用します。引数1はData Storeに表示するときのタイトルで、引数2はデータを保持するメモリの位置(0~7で指定)です。
実際に使用すると次のようになります。

僕の場合は、土壌湿度センサーの乾燥判定に用いる閾値(humid_threshold)と、IFTTTへのデータ送信用の鍵(SecretKeyとEvent)をWeb Configから設定可能としています。わみさんのプログラムを参考にさせていただきました。
登録された情報は、それぞれNefry.getStoreValueとNefry.getStoreStrで読み込む事が可能です。
IFTTTとの連携
IFTTTへのデータ送信は、IFTTT.send(Event名, SecretKey, Value1, Value2,Value3)のように記述します。Value1はセンサーの値を、Value2は水やりした旨を、Value3はエラー処理について記載しています。ただ、エラー処理は今回組み込んでないので、永遠に"no error"です。
bool sendData = IFTTT.send(Event, SecretKey,(String)(sensorData),"水やりをしました","no error");//IFTTTにデータを送信
ループ時間の処理
ループ時間は、水やりをしようがしまいが約10秒ごとにプログラムが動作するようにしています。startTimeはプログラム開始時のミリ秒時間を格納しています。動作周期(DELAY_TIME)から現在の動作分のミリ秒を引いて、残りをdelayします。若干誤差は出ますが、そんなに精度もいらないのでこんな感じで。
if( millis() <= startTime){
delayTime = DELAY_TIME - millis(); //オーバーフロー時
}else{
delayTime = DELAY_TIME - ( millis() - startTime ); //通常時
}
delay(delayTime);
完成したアプリケーション
実際に動作させた動画が以下のものです。
Lineには次のように表示されます。

今回はテスト用なので、10秒周期で動作するようにしています。実際に使用するときは動作時間は10分毎等に変更する予定。
あとはNefryでダンボーのバッテリーが何日持つか…。数日持てばとりあえずは満足なんですが、DelayじゃなくてSleepを使わないとダメかも。
本当は給水タンクを用意していたんですが、ポンプの取り付けに色々と課題があり、とりあえずバケツで代用しています。この辺りしっかりとした物を作りたいので、追々改良を加えていきます。
次は水位計測の実現と、センサーデータをデータベースに保管したいなー。
以上!



ディスカッション
コメント一覧
まだ、コメントがありません