こんにちは!エンジニアの岩間です。
今回のブログは、夏といえば自由研究だ!ということで初の電子工作についてです。
植物の手入れが楽になる自動水やり機を自作してみたので、その制作過程と実際の使い方をご紹介していきます。
目次
きっかけ
数年前、ふるさと納税で盆栽をゲットして以来、家で大事に育てています。
しかし旅行等で家を空けることが続くと、盆栽に水やりができず枯れかかってしまうという事案が発生。
そこで、自動水やり機をネットで探していたところ、AmazonでWayinTop社製の水やり電子工作キットを発見します。
これに自動通知のプログラムを組み込めば土壌の状態や水やりタイミングを自分のスマホに通知できたりもして面白そう!と思い購入しました。
キット付属物
注文後数日で水やりキットが届きました。水やりキットの内容物は以下です。
- センサー
土壌の水分を測定できる湿度センサー
- ホース
- ポンプ×2
- リレー(1チャンネル)
外部からの電気信号を受けて内部にある開閉素子(接点など)を動作させ、電気回路をオン/オフしたり切り替えたりする部品です。
その他購入品
上記のキットだけでは自動水やり機は作れないため、別で以下を揃えました。
- マイコンボード(Amazonリンク)
NodeMCU V3を購入しました。Espressif Systems社製のESP8266を基盤にした開発ボードで、USB接続を介してArduino IDEでプログラムの書き込みが行えます。
今回の開発ではLINEのAPIを叩きたかったためWi-Fi接続機能を持ち低コストであるマイコン、ESP8266を選びました。(マイコンボード3点セットを購入していますが必要なのは1つのみです。)
Arduino UNOでも動作しますが、Wi-Fiを繋ぎたい場合別売りの無線モジュールを購入する必要があります。
- ジャンパーワイヤー(Amazonリンク)
回路を組むのに使います。
- ブレッドボード(Amazonリンク)
ハンダ付け不要で回路を組むことができる便利ツールです。
- バッテリー(Amazonリンク)
IoT対応のモバイルバッテリーです。
-
絶縁被覆付圧着スリーブ(Amazonリンク)
キット付属のポンプの導線が短いため、ジャンパワイヤーの被膜を剥き、圧着スリーブでポンプの導線と接続することで長さ出ししています。(下の画像の黄色枠部分)
- ニッパー
ジャンパーワイヤーの被膜を剥く際に使用します。
- ドライバー
リレーモジュールと導線を接続する際に使用します。
(+αで実運用を考慮すると、電子機器を収納するための屋外用の防水箱もあると良いと思います。)
手順書
水やりキットに手順書は付属してませんが、wayintop社のGitHubに手順書が公開されています(Arduino UNO R3用とESP8266用)。
この手順を参考に進めていきます。
手順
事前準備
事前にLINE通知で使用するAPIトークンの取得と、ArduinoのIDE(開発環境)をpcにインストールします。
LINE APIトークン取得
LINE通知で必要となるAPIトークンを事前に取得しておきます。
- LINEアプリの友だち検索にて「@linenotify」と入力し検索します。
- LINE Notifyのアカウントが表示されるので、「追加」をタップします。
- LINE Notify マイページにログインします。
- アクセストークンの発行(開発者向け)からアクセストークンを発行し、アクセストークンをコピーしておきます。
ArduinoのIDEインストール
ArduinoのIDE(開発環境)をpcにインストールしておきます。
インストール後の各種設定はwayintop社のGitHubの手順書を参考に行いましょう。
回路を作る
手順書を参考に回路を組み立てていきます。
完成した回路は下の画像の通りです。
プログラムの配置
PCとマイコンボードを接続し、ArduinoIDEを開きプログラムをマイコンにアップロードします。
以下はライン通知機能を組み込んだ参考プログラムです。
※ArduinoIDEのシリアルモニタを使うとデバッグが行えます。MOISTURE LEVELがシリアルモニタに表示されていれば正常動作しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#include <ESP8266WiFi.h> // ESP8266用のWiFiライブラリをインクルード #include <WiFiClientSecure.h> // SSL/TLS通信をサポートするクライアントライブラリをインクルード // 接続端子 const int pumpPin = 4; // ポンプ制御用デジタル出力ピン番号 const int sensePin = 0; // 湿度センサーの接続アナログ入力ピン番号 float moistureValue = 0; // 湿度センサーからの読み取り値 // Wifi接続情報 const char* ssid = "ssid"; // WiFiネットワークのSSID(SSIDをここに設定) const char* password = "password"; // WiFiネットワークのパスワード(パスワードをここに設定) // LINE Notify設定 const char* host = "notify-api.line.me"; // LINE Notify APIのホスト名 const char* token = "token"; // LINE Notifyのアクセストークン(アクセストークンをここに設定) const char* message = "Watering"; // LINE Notifyで送信するメッセージ WiFiClientSecure client; // HTTPS通信を行うためのクライアントオブジェクト /* * 初期化関数 */ void setup() { Serial.begin(9600); // シリアル通信初期化 Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // 接続しようとしているWiFiのSSIDを表示 WiFi.begin(ssid, password); // WiFiネットワークに接続を開始 // WiFi接続が確立するまでループ while (WiFi.status() != WL_CONNECTED) { Serial.print("."); // 接続中にドットを表示 delay(1000); // 1秒待機 } Serial.print("Connected to "); Serial.println(ssid); // 接続が成功したらSSIDを表示 client.setInsecure(); // SSL証明書の検証を無効化 // サーバーへの接続を試みる Serial.println("\nStarting connection to server..."); if (!client.connect(host, 443)) { // ホストとポート443(HTTPS)で接続 Serial.println("Connection failed!"); // 接続失敗を表示 return; } pinMode(pumpPin, OUTPUT); // pumpPinピンを出力モードに設定 pinMode(sensePin, INPUT); // sensePinを入力モードに設定(湿度センサー) digitalWrite(pumpPin, HIGH); // pumpPinピンをHIGHに設定(ポンプを初期状態で停止) delay(500); // 0.5秒待機 } /* * 湿度センサーからの値を読み取り * 湿度が指定の閾値を超えた場合、LINE Notify APIにPOSTリクエストを送信 */ void loop() { Serial.print("MOISTURE LEVEL:"); // 湿度レベルの表示 moistureValue = analogRead(sensePin); // 湿度センサーの値を読み取る Serial.println(moistureValue); // 読み取った値をシリアルモニタに表示 // 湿度が閾値750を超えた場合 ※750は参考閾値 if (moistureValue > 750) { String query = String("message=") + String(message); // 送信するメッセージの準備 String request = String("") + "POST /api/notify HTTP/1.1\r\n" + // HTTPリクエストライン "Host: " + host + "\r\n" + // ホストヘッダー "Authorization: Bearer " + token + "\r\n" + // 認証トークン "Content-Length: " + String(query.length()) + "\r\n" + // コンテンツ長 "Content-Type: application/x-www-form-urlencoded\r\n\r\n" + // コンテンツタイプ query + "\r\n"; // メッセージのボディ // 接続が切れている場合は再接続を試みる if (!client.connected() && !client.connect(host, 443)) { Serial.println("ReConnection failed!"); // 再接続失敗をシリアルモニタに表示 return; // loopの終了 } client.print(request); // HTTPリクエストを送信 // サーバーからのレスポンスを読み取る while (client.connected()) { String line = client.readStringUntil('\n'); // レスポンスを読み取る Serial.println(line); // レスポンスの内容を表示 if (line == "\r") { // ヘッダーとボディの区切りを確認 break; } } digitalWrite(pumpPin, LOW); // ポンプを動作させる } else { digitalWrite(pumpPin, HIGH); // 湿度が閾値以下の場合、ポンプを停止させる } delay(1000); // 1秒待機 } |
④動作確認
最後に以下のセッティングを行い、動作確認をしていきます。
- マイコンボードとモバイルバッテリーを接続
- バケツに水をため、ポンプを水中に入れる
- 土壌センサーを植物の土に差し込む
動作確認中の動画は以下です。
(センサーを土から一時的に抜くことで乾燥状態を実験的に作っています)
水やりのタイミングでLINE Notifyに通知がきます。
苦労点
- 部品を揃えること
- 水やりキット以外にも必要な部品があるので、家に部品が0の状態からスタートした私は必要な道具を調べる&揃えることに一番時間を要しました。
- スマホ用モバイルバッテリーと相性が良くなかったこと
- コンビニ等で売っているスマホ用のモバイルバッテリーを接続してみたところ正常に動作しませんでした。
原因を調べてみると、多くのモバイルバッテリーには、一定の消費電力以下の機器に対して自動的に電源供給を停止する機能が搭載されており、モバイルバッテリーは主にスマートフォンやタブレットなど、比較的高い消費電力を持つデバイスに最適化されているそうです。
マイコンのような低電力デバイスに対しては、「アイドル状態」や「電力供給中断」と誤認識し、バッテリーを保護するために電源供給を停止することがあるということで、低電流状態でも電力共有が停止しないIoT用のモバイルバッテリーを購入することで解決できました。
- コンビニ等で売っているスマホ用のモバイルバッテリーを接続してみたところ正常に動作しませんでした。
- ブレッドボードの存在
- 回路を組む際、導線を分岐接続するためにハンダ付けしないといけないのかな、、中学の技術の授業以来やっていないしちゃんとできるかな、、と不安に思っていたそんな時、ブレッドボードの存在を知り不安が解消されました。
- ブレッドボードは、プラスチック製の板に、配線のための金属製の接点が組み込まれており、導線を差し込むだけで電気的に接続できちゃう便利ツールです。これを使えば、ハンダ付けをせずに回路を組むことができ、部品の追加や変更も非常に簡単に行えます。
ブレッドボードを使うことで回路の設計や試作がスムーズに行えました。
初の電子工作をしてみての感想
初めての電子工作ということで完成するかドキドキでしたが、回路の設計や実装について学びつつ楽しみながら完成させることができ非常に良い経験となりました。
日常生活の中で生まれた「こんなもの欲しいけどない」というアイデアを形にできて面白かったです。
また、電源はソーラーパネルや乾電池駆動など、さまざまな電源オプションを試してみるのも面白そうだと思いました。
さらに、AWSのIoT Coreと連携してセンサーデータを管理したり、拡張性を持たせることで、より多機能なシステムにするのも良いと思いました。
皆さんもぜひ、電子工作に挑戦してみてください!
ここまでお読みいただきありがとうございました。
- 電子工作で自作した植物の自動水やり機から土壌データをAWS IoT Coreに連携してみた - 2024-09-13
- 【ESP8266 NodeMCU】電子工作で植物の自動水やり機を作ってみた - 2024-08-14
- Amazon Bedrock APIでTypeScriptのテストコードを出力してみた - 2024-05-07
- AWS CDK × CodeBuild × CypressでE2Eテストを自動化&実行動画をS3に保存してみる - 2024-04-16
- AWS ECSでブルーグリーンデプロイメント!~デプロイメントタイプ別の動作比較~ - 2024-04-03