M5StickCとWatering Unitを使って、メロンを自動栽培してみました。
Watering Unitは、給水ポンプ、それを駆動するモータ、コントローラ、静電容量式土壌水分センサがセットになっているので、シンプルな構成で水やり機を作ることができます。
今回は「やる夫と学ぶ〇〇」のスタイルで記事を書きました。
春頃、あるホームセンターにて
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) 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ノ_/」/_/\」
/ ̄ ̄\
/ _ノ \ 無事届いたな
| ( ●)(●) これのほかにもモバイルバッテリが必要だが流石に持っているよな
. | (__人__) 常識的に考えて……
| ` ⌒´ノ
. | }.
. ヽ }
ヽ ノ \
/ く \ \
| \ \ \
| |ヽ、二⌒)、 \
____
/ \
/ ─ ─ \
/ (●) (●) \ もってるお!
| (__人__) | それにしても、こんなので水やりがちゃんとできるのかお!?
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
ノ ∧ /) ∧
彡 ノ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に書き込んだら
. | (__人__) センサーを土にさして、給水ホースの片方をバケツの中につけて設置するだけだ
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ \
/ く \ \
| \ \ \
| |ヽ、二⌒)、 \
お盆の頃に収穫
____
/ \
/ \ メロンうまいお!
/ ⌒ ⌒ \ 来年は増産するお!
| :::(__人__)::: |
\ /
おわり