PR

【農業IoT】ESP32で作物への自動給水システムを作ってみた

ビジネスアイデア
立プロ

新卒でメーカーに入り、10年間組み込みの現場で設計を行う。
今は個人事業主として自作の組み込み機器開発や、エージェント様に紹介いただき業務委託を行っています。
C,C#,JavaScript, Vue, PHP, VBA, GAS, Kotlinなど、扱う言語が増えゆく日々。

立プロをフォローする

はじめに

この1年、複数の会社と契約して組み込み機器の開発を行ってきました。

依頼していただけるなんて大変ありがたい話なんですけど、 制作途中の仕様追加や修正に始まり、 お客様自身が具体的な形が見えてない中でこちらで模索しながら作った結果文句を言われるなど、メーカーでエンジニアをやってた時と違った感覚に苦しい思いをすることがありました。

案件の区切りがついた時にふと心が疲弊してると感じて、 一度自分で好きなようにモノづくりをしてみようと思いこの取り組みを始めた次第です。

ちょうどこれを始める時は桜が満開の時期で、周辺では田んぼや畑が始まるところだったので、自分もちょっとやってみるかと、けどせっかくやるなら IoT 化してみるのもいいなと思い作物への自動給水システムを作ってみます。

うまくいかないこともいろいろあると思いますけど、 それらも経験として自分が満足するまでやってみようと考えています。

1日目

こういうイメージのものを作ろうと決めました。

もともと手元にESP 32 のマイコンボードがあったのでこれを使うことにして、 Amazon で検索すると自動水やり装置というものが売っていたので これを買って作ろうという考えです。

制作2日目

物が届きましたので早速とりかかることに。
近所のホームセンターで二十日大根の種を買ってきました。

土壌水分量センサが正常に動作することを確認し、予め決めたしきい値で出力ピンのH/L切替ができるように。

さらに出力ピンの先をリレーに接続することで給水ポンプの制御ができるようになりました。

ここまでできたなら、種に水撒くかと早速近くにあった虫かごに土と種入れて給水開始、これがとっても良い感じに動いています!

…と思ったんですが、この動画の後にホースから水が流れ続けてたんですね。

上から撮ったので分かりづらかったのですが、給水タンクの水位が土壌水分量センサ側の位置より高く、水位が釣り合うまで水が流れ続けてました…サイフォンの原理って言うんですよね、これ。

気づいた時にはすでに遅く、土がヒタヒタです。とりあえず放置して進めます。

振り返ると1日でここまで出来れば十分でしょう。

制作3日目

とりあえず動くようにはなったものの、色々と気になる点があったのでまとめます。

土壌水分量センサの出力電圧

仕様を見ると、土壌水分量によってセンサ信号線からDC 0 ~ 3.0Vが出てくるようですが、マイコンのADコンバータに突っ込むと乾燥状態で3200、水に浸した状態で2000くらいになるんですね。

センサは4つ付属していて、どれも同じような値を出したのでそういう設計なんだろうな、と。

ESP32のADコンバータは3.3Vの12bit(=4096)なので、3200だと2.58V、2000だと1.61V…んー、土壌水分量センサの実際の出力はかなり狭いレンジだなあというのが正直なところ。

キャリブレーションすればいいんですけど、ちょっと粗いかなあという印象は否めない。

とりあえずAD値2700をしきい値として、これを超えたら乾燥とみなして給水するように設計。

状態AD出力電圧換算
乾燥32002.58V
水没20001.61V

リレー

リレーはjqc-3ff-s-zで、動作に問題は無し。

ただマイコン周りやポンプは3.3Vで動くのにリレーだけ5V供給が必要になるのがけっこうめんどくさく、商用電源に差すわけじゃないし、FETへの置換を検討。

手元にFETがなかったので、2SC1815のトランジスタで組み替える。おかげで配線周りがすっきり!

2SC1815が定格150mAなのでポンプをドライブするためのスイッチに使うのってどうなの?と思いつつ、いったん様子見て問題なければこのままで…と思ってる自分もいて葛藤中。

通信

AD値の確認はvscodeのシリアルプロッタでやっていたが、ポンプのドライブでUSBから電流引っ張られるのが嫌になってきた。

そこでパソコンでなくモバイルバッテリから電源取るようにした状態でAD値を任意のタイミングで確認できるようBluetooth通信機能を実装した。

またしきい値や測定周期を適宜変更・確認できるようコマンドも入れた。

BluetoothSerialTerminalアプリで送受信しているが、早いうちにスマホアプリを作っておきたい。いちいちコマンドうつのがめんどくさい。

あといつ給水したか分かるようにもしときたい。とりあえずEEPROMに持たせるか。

制作4日目

自動給水も便利だが、もっと効率よく野菜作るようにするにはどうすればよいか考えてるうちに、植物用LEDという存在を知った。

赤と青の可視光波長領域の吸収がよいそうで、それで植物工場のライトは紫色なんだなあと感心。

そしてどこから電源を取るか悩みだす。できれば安く早く簡単に野菜が作れる仕組みがほしいと思っている。

LEDライトの電源をコンセントから取るってトータルで安いのか高いのかわからない。

時間とのトレードオフなのかと考えてると、将来的には屋外設置するかもしれないしソーラーパネルから電源供給するのが最適な気がしてきた。

ライトがどれだけ電流食うかによってバッテリ容量決める。疲れたのでまた改めて。

現状の回路構成まとめておく。

制作5日目

朝見たら芽が出てた、嬉しい!

制作7日目

前述したとおり、センサ出力信号のレンジが小さいので、ADの誤差でポンプドライブのしきい値を行ったり来たりする恐れがあることに気づいた。

そこでいったんADしきい値を超えたら(しきい値 – 100)を下回ったところでポンプを停止するようソフトを変更。

制作9日目

いやー、体調が悪い。長野県は本当に過酷。昨日は最高気温10℃だったのに、今日の昼は30℃…福岡帰りたい…。

まあそれは良いとして、スマホアプリの制作に取り掛かり始めました。

ペアリング済みのbluetoothデバイスのMACアドレスを取得するところまで。明日は通信と画面設計してとりあえずアプリリリース予定。

制作10日目

別件で時間取れず、とりあえず簡単な制御だけ。

Androidスマホで、言語はKotlin。Bluetoothでコマンド送受信してます。

いったんBluetooth通信の現状を整理するために、アプリ開発におけるBluetooth通信の考え方を記事としてまとめた。

制作13日目

Androidアプリ側で給水の履歴を残したいとずっと考えていて、Roomによるデータベース実装を学習。

使い方を別記事としてまとめました。これで土台ができました、植物だけにね。

制作18日目

月の終わりで何とか形にしたく、半端な状態ではありますが、Androidアプリを審査に出しました。

組み込み機器だけだと自動給水機能に限定されますが、アプリと連携することで

  • 自動給水のタイミング設定
  • 土壌水分量の可視化
  • 土壌水分量測定インターバル設定
  • 植物LEDの点灯制御
  • 手動給水制御
  • ファームウェアバージョン確認

ができるようになります。どんどんアップデートしていく予定ではありますので、都度こちらで連絡できればな、と。

これから組み込み機器側の提供体制を整えるべく、がんばっていきます!

制作21日目 230503

Androidアプリが無事リリースされました!

詳細はこちら

今後の予定ですが、

Bluetoothによるファームウェアバージョンアップ機能

を実装する予定です。しばらく潜ります。

制作69日目

OTAやろうと試みるも、どうにもうまくいかない…。

単純にROM容量が足りない。

OTA中に回すapp0かapp1の方のコードを最小限にすれば、いけると思うのだが…分からないので一旦これで終了とする。

230702追記:
InitArduino()から制御できるっぽい
esp32フォルダのmain.cpp⇒app_main()⇒InitArduino()
下記参照

ESP32のFreeRTOS入門 その2 タスクの作成
...

コメント

タイトルとURLをコピーしました