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

Nefryを使った自動水やり機

こんばんは、ゆきです!

今回はNefry BTというIoTモジュールを使って、家庭用の自動水やり機を作ってみました。うちのベランダには水場がないので、家の中からホースを引かないといけません。なので、栽培している家庭菜園のプランターにタンク等から自動で水をあげる仕組みが欲しかったんですよね。やっと実現できました。

土の湿度センサーを使い、ある程度土が乾いたら水をやるという簡単なシステムです。ただ、NefryとIFTTTで、水を上げた場合はLineで自分のスマホに通知する仕組みも組み込んでます。

結構簡単に作れて、Nefryの便利さを感じました!

あわせて読みたい
IoT初心者にオススメ!センサーとすぐ繋げるNefry BTを使ってみた(初期設定編)

用意するもの

今回用意する必要がある材料は以下の通り。

項目価格個数
Nefry BT5,380円(千石電商1個
ポンプ [DC30A-1230]995円(Amazon1個
湿度センサー [YL-69]140円(Amazon1個
9V電池ケース250円(Amazon1個
フォトカプラ [TLP222AF]100円(秋月電子1個
抵抗 200Ω数十円数個
ブレッドボード180円(Amazon1個
モバイルバッテリー1個

上記以外に、以下のものも必要に応じて用意してください。

  • ジャンパーワイヤ(オス-オス)
  • ポンプ用ホース
  • YL-69拡張用の三芯ケーブル

今回構築する回路

今回構築した回路は以下の通りです。

自動水やり機の回路図

実際に作成した水やり機

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

実際に作成した水やり機

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

土壌湿度センサー

プログラムの動作に必要な前準備

IFTTTへの登録と設定

今回のプログラムでは、水やり後にLineで通知します。これにはNefryのIFTTTライブラリ(NefryIFTTT.h)を使い、IFTTTのWebhooksを使ってLineにメッセージを送信します。

そのためには前準備が必要なので、ここではその設定方法について解説します。

IFTTTへの登録方法については「Google HomeをIFTTTと組み合わせてTwitterやLineなどと連携しよう!」の記事の中で紹介しています。

(1)まずはIFTTTで新規のアップレットを作成し、「+this」を選択します。

IFTTTでNew Appletを作成します

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

IFTTTでWebhooksを選択する

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

Webhooksの設定

僕は「water_pour」としました。

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

IFTTTでLineを選択する

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

IFTTTでLineの設定をする

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

僕は次のようにしました。

IFTTTでLineに投稿する内容

あとは最後にFinishを押して完成です。

WebhooksのSecretKeyの取得

また、IFTTTとNefry BTを連携させるためには、WebhooksのSecretKeyが必要です。

(1)IFTTTの「My Applets」から「Service」を選択し、サービス一覧から「Webhooks」を選択します。

WebhooksのSecretkeyの取得

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

WebhooksのSettingsを選択します

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

Webhooksの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で指定)です。

実際に使用すると次のようになります。

Data Storeでの表記例

僕の場合は、土壌湿度センサーの乾燥判定に用いる閾値(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には次のように表示されます。

Lineへの通知の様子

今回はテスト用なので、10秒周期で動作するようにしています。実際に使用するときは動作時間は10分毎等に変更する予定。

あとはNefryでダンボーのバッテリーが何日持つか…。数日持てばとりあえずは満足なんですが、DelayじゃなくてSleepを使わないとダメかも。

本当は給水タンクを用意していたんですが、ポンプの取り付けに色々と課題があり、とりあえずバケツで代用しています。この辺りしっかりとした物を作りたいので、追々改良を加えていきます。

次は水位計測の実現と、センサーデータをデータベースに保管したいなー。

以上!

DIY・電子工作Nefry BT,IFTTT

Posted by