【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を使わないとダメかも。
本当は給水タンクを用意していたんですが、ポンプの取り付けに色々と課題があり、とりあえずバケツで代用しています。この辺りしっかりとした物を作りたいので、追々改良を加えていきます。
次は水位計測の実現と、センサーデータをデータベースに保管したいなー。
以上!
ディスカッション
コメント一覧
まだ、コメントがありません