LoginSignup
44

More than 1 year has passed since last update.

毎日の水やりが面倒なので、メロンを自動栽培した件

Last updated at Posted at 2021-09-30

M5StickCとWatering Unitを使って、メロンを自動栽培してみました。
Watering Unitは、給水ポンプ、それを駆動するモータ、コントローラ、静電容量式土壌水分センサがセットになっているので、シンプルな構成で水やり機を作ることができます。
今回は「やる夫と学ぶ〇〇」のスタイルで記事を書きました。
s-0013_01sum.jpg

春頃、あるホームセンターにて

    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )   園芸コーナーにきたけど、今年は何か栽培してみたいなぁ
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     'u-u'. `u-u' 

    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )   おうちで網の掛かったメロンの栽培、夢だよね。
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     'u-u'. `u-u' 

    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )   でも、毎日水やりしなきゃだ。大変そう。
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     'u-u'. `u-u' 

帰宅後

    /       \    
   /  ─    ─   \   
 /    (●)  (●)   \   結局、メロン苗と栽培用土を買ってしまったお
 |     (__人__)      | 
  \     ` ⌒´       ,/ 


     /      \       毎日毎日、重労働にサビ残……。
   /  _ノ  ヽ、_  \     ちゃんと水やりできなさそうだお……
  / o゚((●)) ((●))゚o \  
  |     (__人__)  |   きっと夏場に枯らしてしまうお!
  \     ` ⌒´     /  

近所のやらない夫がやってきた

   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) Arduinoを使って自動化すればいいだろ
  |     ` ⌒´ノ  常識的に考えて……
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

やらない夫は二流SIに勤めるエンジニアであり、
やる夫とは職場も職種も違うが、昔からの友人であり、今でも時々夕食を共にする仲である。
腐れ縁とも言える。

       ____
     /⌒  ⌒  \
   /( ●)  (●)   \
  /:::::⌒(__人__)⌒::::\   やらない夫、いいところに来たお!
  |     |r┬-|     |   そのArduinoってやつを使えばいいのかお?
  \      `ー'´     /    いろいろ教えてほしいお!



   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)  チッ、しょうがないな幼馴染のよしみで教えてやるよ・・・
  |     ` ⌒´ノ   それと必要なもの揃えるから、3000円くれ。
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

数日後...

お荷物のお届けですにゃ
  |\_/|
  |― ―|
  ∧_∧_ノ___//
  (・ω・`)    /
  O旦⊂|  _  ヽ
  OOノ_/」/_/\」

M5StickC
M5StickC

Watering Unit
Watering Unit

   / ̄ ̄\
 /   _ノ  \      無事届いたな
 |    ( ●)(●)     これのほかにもモバイルバッテリが必要だが流石に持っているよな
. |     (__人__)   常識的に考えて……
  |     ` ⌒´ノ     
.  |         }.       
.  ヽ        }      
   ヽ     ノ        \ 
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

     ____     
   /      \     
  /  ─    ─    \    
/    (●)  (●)   \   もってるお!
|       (__人__)  |   それにしても、こんなので水やりがちゃんとできるのかお!?
/     ∩ノ ⊃  /       
(  \ / _ノ |  |     
.\ “  /__|  |  
  \ /___ /



  ノ     ∧     /) ∧
  彡  ノW \从/V  W \   ミ
  (  ノ        |      ノ \)
  ∩V      、、 |       >V7
  (eLL/ ̄ ̄\/  L/ ̄ ̄\┘/3)
  (┗(      )⌒(      )┛/
   ~| \__/ |  \__/ |~     / ̄ ̄ ̄ ̄ ̄ ̄
    爻     < |  ;     爻    < ああ、問題ない
    ~爻     \_/  _, 爻~     \______
     ~爻__/⌒ ̄ ̄ ̄~~ヽ_ 爻~
     /    ー ̄ ̄\_ ̄\
  _一‘     < ̄ ̄\\\J
<\       ー ̄ ̄ヽ_ヽJ   ̄\_
  \     _ニニニヽ )       ~\
   \  _/⌒|\ ヽ_~~ ~⌒\_
  __/~    V \_|     ~\_


   / ̄ ̄\
 /   _ノ  \      
 |    ( ●)(●)    M5StickCとWatering UnitはGroveケーブルで接続するだけだから
. |     (__人__)   次は、ArduinoIDEでコードを書くぞ
  |     ` ⌒´ノ    サンプルコードで十分動くだろうから確認しておいてくれ
.  |         }.       
.  ヽ        }      
   ヽ     ノ        \ 
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \
                                  

サンプルコードで動作確認


                  ___
                /     \
               /   \ , , /\   
             /    (●)  (●) \   
              |   u.   (__人__)   |      .___________
               \      ` ⌒ ´  ,/ガチャ  | |             |
               /⌒ヽ   ー‐    ィヽ ガチャ .| |             |
               |  |          | \ ガチャ.| |             |
          タン.  |  |       i i|  i\,,c`ヽ彡.| |             |
         .  タン | ⌒ ̄ ̄r~ノソィ" |  inルソノノ|_|___________|
          |\ ̄ ̄ ー─‐─oー"o ̄ ̄~´ ̄ ̄     _|_|__|_

     ____  
   /      \
  /  ─    ─  \ 
/    (●)  (●)  \ 一応動いたけど、これじゃ流行りのスマートな農業とは程遠いお
|       (__人__)  |  また今度やらない夫に聞いてみるお
/     ∩ノ ⊃   /
(  \ / _ノ |  |
.\ “  /__|  |  
  \ /___ /

再びやらない夫がやってきた

     /      \       
   /  _ノ  ヽ、_  \     やらない夫、流行りのスマートな農業っぽいことしたいんだお……
  / o゚((●)) ((●))゚o \    どうやったら良いか、わからないお
  |     (__人__)  |    
  \     ` ⌒´     /  


   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) AWSとかGCPとかのIoTサービスを使えばいいだろ
  |     ` ⌒´ノ   常識的に考えて……
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \


     /      \       
   /  _ノ  ヽ、_  \     今お小遣い、10円しか残ってないお……
  / o゚((●)) ((●))゚o \    そもそも、水やりにそんなランニングコストかけたくないお
  |     (__人__)  |    
  \     ` ⌒´     /  


   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) 常識的に考えて……そうだよな
  |     ` ⌒´ノ   じゃあ俺の私物鯖にAPI立てて、Arduinoのライブラリ作るしかないな
.  |         }   
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

APIとライブラリ開発をすることになったやらない夫

   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) APIはDjango, リバースプロキシはNginx, SSLはLet's Encrypt, Dockerで..あsdfg
  |     ` ⌒´ノ  
.  |         }   
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \


          ____
       / ノ  \\
      / (●)  (●)\
    / ∪  (__人__)  \     ガチっぽくて、さすがの俺もひくわ
    |      ` ⌒´    |
     \ /⌒)⌒)⌒)   //⌒)⌒)⌒)
    ノ  | / / /   (⌒) / / / /
  /´    | :::::::::::(⌒)  ゝ  :::::::::::/
 |    l  |     ノ  /  )  /
 ヽ    ヽ_ヽ    /'   /    /
  ヽ __     /   /   / 

    ___
    /    \       ___
  /ノし   u;  \   ;/(>)^ ヽ\;
  | ⌒        ) ;/  (_  (<) \;
  |   、       );/   /rェヾ__)⌒::::  ヾ;
  |  ^       | i   `⌒´-'´  u;  ノ;;
  |          | \ヽ 、  ,     /;
  |  ;j        |/ \-^^n ∠   ヾ、
  \       / ! 、 / ̄~ノ __/ i;
  /      ⌒ヽ ヽ二)  /(⌒    ノ
 /       r、 \ /  ./   ̄ ̄ ̄/


          ____
       / ノ  \\
      / (●)  (●)\
    / ∪  (__人__)  \     Node-RE....でもいいn......
    |      ` ⌒´    |
     \ /⌒)⌒)⌒)   //⌒)⌒)⌒)
    ノ  | / / /   (⌒) / / / /
  /´    | :::::::::::(⌒)  ゝ  :::::::::::/
 |    l  |     ノ  /  )  /
 ヽ    ヽ_ヽ    /'   /    /
  ヽ __     /   /   / 



      / ̄ ̄\
    /ノ( _ノ  \
    | ⌒(( ●)(●)
    .|     (__人__) /⌒l    ロマンなんだよ
     |     ` ⌒´ノ |`'''|    あわよくばポートフォry
    / ⌒ヽ     }  |  |          __________て
   /  へ  \   }__/ /             | | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | |(
 / / |      ノ   ノ           | | \      / | | |’, ・
( _ ノ    |      \´       _    | |   \ ノ(  /   | | | ,  ’
       |       \_,, -‐ ''"   ̄ ゙̄''―---└'´ ̄`ヽ   | | | て
       .|                        __ ノ _| | | (
       ヽ           _,, -‐ ''" ̄|_ ̄_o o o___|_|r'"

完成

   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) ともかく完成したぞ
  |     ` ⌒´ノ  APIはhttps://github.com/spadr/django_iot_core
.  |         }  ライブラリはhttps://github.com/spadr/Canaspad_ESP32_Library
.  ヽ        }   サービスはhttps://canaspad.com/
   ヽ     ノ        \ 
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

ライブラリはhttps://github.com/spadr/Canaspad_ESP32_Library
APIはhttps://github.com/spadr/django_iot_core
サービスはhttps://canaspad.com/

実際に使ってみる

水やりにはどうやって使えばいいかわからないお
         ____     ━┓
       / ―   \    ┏┛
     /ノ  ( ●)  \   ・
      | ( ●)   ⌒)   |
      |   (__ノ ̄   /
      |            /
     \_   ⊂ヽ∩\
       /´    (,_ \.\
         |  /     \_ノ
       \

   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) そう言うと思って、サンプルコードをライブラリに入れといたぞ
  |     ` ⌒´ノ  
.  |         }   
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

#include <M5StickC.h>
#include <Canaspad.h>

#define INPUT_PIN 33
#define PUMP_PIN 32


const char  ssid[]       = "WiFi_ssid";
const char  password[]   = "WiFi_pass";
const char* api_username = "user@mail.com";
const char* api_password = "password";


Canaspad api;

String sensor_moisture;

float vol, moisture, threshold_moisture;


void setup() {
  M5.begin();

  Serial.begin(115200);

  if(not api.begin(ssid, password, 9, api_username, api_password)){
    Serial.println("Api Connection Faild");
    Serial.println(api.httpCode);
  }

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

  //Get the uuid
  sensor_moisture   = api.set("moisture",  "watering", "number", 3, true);
  //control_threshold   = api.set("moisture",  "control", "number", 3, true);//You can also fetch the thresholds recorded in the cloud.

}

void loop() {
  if (api.gettimestamp() % 60*60 == 0){// interval
    Serial.println();
    Serial.println("---------------------------------------------");

    //Get the measured value
    float adc =  analogRead(INPUT_PIN);
          adc += analogRead(INPUT_PIN);
          adc += analogRead(INPUT_PIN);
          adc += analogRead(INPUT_PIN);
          adc += analogRead(INPUT_PIN);
          adc = adc / 5;

    vol = (adc + 1) * 3.3 / (4095 + 1);//0-3.3V,12bit(0-4095)
    moisture  = 100 * (1.65 - vol) / (1.65 - 1.2);//100 * (dry_voltage - now_voltage) / (dry_voltage - full_of_water_voltage)

    Serial.printf("Voltage: %2.2fV  Moisture: %0.2f%%\r\n", vol, moisture);

    //Add the measured values to JSON
    api.add(moisture, sensor_moisture);

    //Send JSON to API
    if (api.send()) { 
      Serial.print("Now : ");
      Serial.println(api.gettime());//current time
      }
    else {
      int err_num = api.httpCode;
      Serial.print("Error on HTTP request! HttpCode : ");
      Serial.println(err_num);

      }

    //Getting values from API
    float res_moisture =  api.get(sensor_moisture);

    Serial.printf("Moisture: %0.2f%%(Received from the API)\r\n", res_moisture);

    //Judge the watering
    threshold_moisture = 50.0;//Turn on when 50% or less
    //threshold_moisture = api.get(control_threshold);//You can also fetch the thresholds recorded in the cloud.

    if (moisture <= threshold_moisture){
      Serial.println("Needs watering");

      digitalWrite(PUMP_PIN,HIGH);
      delay(1000*1);//pump discharge:8.3 ml/s (without height difference)
      digitalWrite(PUMP_PIN,LOW);
    }

    Serial.println("---------------------------------------------");
    delay(10*1000);
  }
}
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)  コードをM5StickCに書き込んだら
. |     (__人__) センサーを土にさして、給水ホースの片方をバケツの中につけて設置するだけだ
  |     ` ⌒´ノ 
.  |         }   
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

s-0013_00.jpg

s-0013_01.jpg

s-0013_05.jpg

画面
aaqiita_melon.jpg

お盆の頃に収穫

s-0013_06.jpg

                
       ____  
     /     \   
   /          \    メロンうまいお!
  /  ⌒     ⌒   \    来年は増産するお!
  |  :::(__人__):::   |
  \             / 

おわり

次:メロンを自動栽培していたら、水を補給するタイミングがつかめないので水位監視装置をつくる

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44