パキラ君の成長日記（自動水やり編）

この記事は [ニフクラ](https://www.nifcloud.com/)等を提供している、[富士通クラウドテクノロジーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fjct)の18日目の記事です。

前日は[@tanopanta](https://qiita.com/tanopanta)さんの「[JavaでもVCRでHTTPテストのモックを生成したい [OkReplay]](https://qiita.com/tanopanta/items/a3166f8578b9c21606f1)」でした。
HTTPでの設計などをやった経験があまりないですが、モックが自動で生成できるととっても楽になりそうですね！

本日は、植物の水やりの自動化について紹介します。観葉植物などは育ててみたいけど水をやるのは忘れてしまいそうだし大変というめんどくさがりの今年の新入社員が水やりの自動化を試してみたいと思います。
植物育ててみたいけど水やりとかはめんどくさいし、水をどのタイミングであげれば良いかわからんという人が植物を育てるきっかけになればと思っています。

## はじめに
今回育てようと思って購入してきたパキラくんを紹介します。
この少し元気のなさそうな見た目の植物がパキラ君です！
パキラ君は、光沢のある５枚1組の葉っぱを広げている植物です。
乾燥や、病気、害虫などに強く育てやすいという特徴があり、観葉植物としても人気の高い植物となっています！
パキラ君の花言葉は、「快活」「勝利」らしいので、毎日元気に過ごしていきたい人などにおすすめです！
今回の主役となってもらうために家の近くのホームセンターで購入してきました!

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/df0b28a7-c4dc-0025-d35c-c58c74e12f37.jpeg' width='500'>

パキラ君を育てるためには、パキラ君が埋まっている土に土壌センサを刺して、土壌の水分量を取得します。
その水分量がパキラ君の好まない水分量まで低下した際に、パキラ君が好む土壌の水分量までポンプから水が給水されます。
今回はその流れをラズパイを使って制御し、データベースに土壌センサの情報を書き込んで後から取得できるようにしたいと思います。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/5ba40daf-ec12-226f-07c9-fbc6db287e4b.jpeg' width='700'>

## 今回使用するセンサ類
#### [Rasberry pi](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/)
簡単に言えば超小型のパソコンです！
今回は、ラズパイにセンサなどの情報を取得させリレーを動かしてポンプを作動してもらいます。
詳細は、この後の開発のところで書いていきます。
ここでは、美味しそうな名前の小さな小さなパソコンであると思っておいてください！

#### [リレー](https://www.elekit.co.jp/product/LK-RB1)
水をやりたいとなった時に、このリレーに電気を送るとモーターが動いて水をホースからあげることができます！
~~秋葉原で購入してきました。~~
~~この後動作しないことが発覚しアドカレ当日に買い直しに行っていますwww~~

#### [モーター](https://www.amazon.co.jp/gp/product/B07VNDY385/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
水入れから、水を吸い出してホースを伝ってパキラ君に水をあげることができるものです！
今回は秋葉原に売っているのを見つけることができなかったので、Amazonで購入しました！

#### [土壌センサ](https://www.sparkfun.com/products/13637)
土に刺すことで、土の中の水分量がわかるようになります。
その水分量が植物に適していない値まで下がったと判断するためのセンサになります。
~~秋葉原で購入してきました。~~
~~デジタル値から、アナログ値に変換するADコンバータが購入できなかったため、今回はデジタル値によって制御をしています。~~

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/04ea3f0d-41d9-e842-f913-a93a2b976fde.jpeg' width='800'>

## リレーの買い直し
一番はじめに、買ったリレーを動かすことができなかったため、改めて秋葉原でリレーを買い直してきました。
今回お邪魔したのは、マルツ秋葉原本店です！
電子パーツなどを様々取り扱っているお店です。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/0ff578b4-fd28-6b50-5cf1-46619aeed091.jpeg' width='1000'>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/c3544755-0abe-453f-bead-a758a7e2cdba.jpeg' width='1000'>

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/92ec013d-886f-bc38-c8de-683559ba312b.jpeg' width='1000'>
地元にいたときは、通販で頼んで3日ぐらい待つという作業が発生していたので、少し電車で行けば電子パーツがたくさん売っているというのは嬉しい限りです！

## 今回使用するモジュールのインストール方法
今回使用した主なモジュールは以下の一つだけです。
バージョン　RPi.GPIO 0.7.0
```terminal
pip install rpi.gpio
```

## 開発言語
開発言語 Python
バージョン　3.9.2

## 水やり機構

### ハードウェア
水入れから水をパキラ君に渡すための、[モーター](https://www.amazon.co.jp/gp/product/B07VNDY385/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)

モーターを動作させるために、秋葉原で追加購入してきた[リレー](https://www.elekit.co.jp/product/LK-RB1)を使います！
今回購入した商品は、ボードとリレー、抵抗、ダイオード、トランジスタが別々で入っており、はんだ付けをしないといけません。
そのため、はんだ付けをするところからスタートします！

はんだ付け後の基盤は次のようになりました！
~~はんだ付け前の写真は撮り忘れていました~~

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/e9a951eb-970d-bc23-d913-1718fd0d9925.jpeg' width='1000'>

次は、ブレッドボードなどを使ってラズパイ基盤と接続させていきます。
画像のように、[ラズパイ](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/)と[リレー](https://www.elekit.co.jp/product/LK-RB1)、[モーター](https://www.amazon.co.jp/gp/product/B07VNDY385/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)を接続します。
~~配線がぐちゃぐちゃで熱圧着チューブも何もしていないのは目を瞑ってください~~

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/9c3f2bff-9ce3-7a04-2126-e6cb8ef2f758.jpeg' width='1000'>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517357/ca789b6b-488b-7c83-a06c-36b8e4b890ef.jpeg' width='1000'>

### ソフトウェア

```python:water_supply.py
import RPi.GPIO as GPIO
import time

def Water_supply():
    relay_channel = 16  

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(relay_channel, GPIO.OUT)
    GPIO.output(relay_channel, True)
    print('water supply')
    time.sleep(1)
```

RPi.GPIOモジュールとtimeを読み込んでいます。
メインの動作となる土壌センサから呼び出しやすいように関数として書いています。
GPIO16ピンに信号を送るだけでポンプが動作します！
このプログラムを利用して、自動で水をやりたい場合は、あげたい水の量に合わせて時間を変更してください。

## 土壌水分取得機構

### ハードウェア
[土壌センサ](https://www.sparkfun.com/products/13637)
~~今回は、ADコンバータが手に入らなかったので使用していませんがADコンバータがあるとより詳細な情報を土壌センサから取得することができます。~~

### ソフトウェア

```python:soil_sensor.py
import RPi.GPIO as GPIO
import time
import water_supply
import line_notify

soil_channel = 21

GPIO.setmode(GPIO.BCM)
GPIO.setup(soil_channel, GPIO.IN)

def main():
    if GPIO.input(soil_channel):
        print('Enough')
    else:
        print('Not Enough')
        water_supply.Water_supply()
        line_notify.send_watering()

    GPIO.cleanup()

if __name__ == '__main__':
    main()
```

#### ※LINEへの送信については今回の主旨とは少し外れますが、私が個人的に水あげた通知をくれないと使いづらいため追加しています。使わない際はコメントアウトしてください。
土壌センサはGPIO21に接続されているので、GPIO.inputで21の情報から土の状態が取得できます。
土の中に水が十分にある時には1が、水が不足している時には0が返り値となっています。
そのため、土壌センサからの返り値が1の時は、何もせずに、0の時だけ水をやるといったプログラムになっています。
このプログラムを使うことで、土の水が減ると自動で水が水入れから給水されるものが完成しました！
植物を育ててみたいけど、私のようにサボテンすら枯らしたことがあるようなめんどくさがりでも今回の自動給水を使うことで明るい観葉植物ライフが始められること間違いなしです！
今回の自動給水に少しでも興味が湧いた方は、今回の記事を参考にしつつ快適な観葉植物ライフを満喫してもらえればと思います！
この後は、私が個人的にやったLINEへの通知方法と、本当はやりたかったけど色々な理由からできなかったことについて書いていきます！
興味があれば読み進めてください〜〜

## LINEへの通知方法

#### ※ 今回の主目的ではないため具体的なやり方については記載していません。　申し訳ありません。
トークンの取得などは、こちらの[記事](https://qiita.com/akeome/items/e1e0fecf2e754436afc8)を参考にしてもらえるとわかると思います！
トークンを発行した後はpythonのrequestsモジュールを使用して、送信したい文字と画像などを入れてpostするだけで送信することができます。
今回は水をあげたことがわかるだけでいいため、一番単純な方法でプログラムは記載しています。
水をあげたときに、line_notify.pyのsend_watering関数を使用してLINEの個人チャットで通知をするようにしています。
カメラをつけたりすると、水をあげた時の植物の様子も記録しておくことができます！

```python:line_notify.py
import requests
import os
from os.path import join, dirname
from dotenv import load_dotenv

def send_watering():
    load_dotenv(verbose=True)

    dotenv_path = join(dirname(__file__), '.env')
    load_dotenv(dotenv_path)

    line_notify_token = os.environ.get('line_notify_token')

    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'水をやりました！'}
    requests.post(line_notify_api, headers = headers, data = data)

```

##  やりたかったこと
自動で植物を育てるの中で本当はやりたかったけど、今回できなかったものが3点あります。

まず1点目が、カメラを使って植物の成長タイムラプスみたいなものを作ってみたかったです。
この件は、単純に時間不足でカメラを使って画像を保存するプログラムやMysqlのデータベースの作成まではできていましたが、リレーが動かなかったりと色々な予期せぬエラーが出たことで時間が足りなく断念しました。
今後の展望として、カメラで撮影した画像をWebサイトから見れるようにしたり、成長していく中でのタイムラプスなどを作ってみたいです！

次に2点目として、ADコンバータで土壌センサの詳細な情報を取得できるようにしたかったです。
この件は、秋葉原でADコンバータが売っておらず、購入することができなかったため断念しました。それと同時に、データベースへの書き込みも断念しました。
~~（デジタルの0と1をデータベースに入れていっても面白くない）~~
今後としては、より詳細なアナログの土壌水分量をデータベースに格納していきWebサイトで見れるようにしたいと思います！

最後に3点目として、水位センサを使って水入れの水の量が少なくなってきたら通知してくれる機構の作成です！
こちらは、水位センサーの購入ができなかったのと、時間であまり調べることができなかったので断念しました。
今後としては、水位センサーで水入れの水が減った時もLINEへの通知を行い基本的には自動で全てが動作するようにしていきたいと考えています！

## おわりに
植物自体は好きだけど育てるとなるととてもめんどくさがりの私がどうにかこうにか水やりを自動化することで植物を育ててやろうという企画でした！
高専時代に少しだけ、電子工作をしていたこともありとても楽しみながら開発をすることができました！
学生の時は、地元が三重ということもあり電子パーツは通販で3日後に到着ということもしばしば、今回はセンサやモータなどの調達は秋葉原で実際のものをみながら購入し、家で組み立てと今までになかった楽しみがいっぱいでした！
今回は、水が少なくなってきたら自動で水をあげるといったところだけでしたが、今後はやりたかったことにも書いた内容でどんどん観葉植物ライフを豊かにしていきたいと思います！
やってみたいことをやった際には、また記事を投稿しようと思います。
リレーの追加購入に秋葉原に行った時に、それだけでは味気ないと自宅サーバ用のPCも購入してきたので、そちらも興味があるので開発してみたいと思います！
自宅サーバについては、初心者も初心者のため、始めたばかりの人でもわかりやすい記事を投稿していきたいと思います！
いつかの記事をお楽しみに！！！

この記事は[富士通クラウドテクノロジーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fjct)の18日目の記事でした！
明日は[@aokuma](https://qiita.com/aokuma)さんの「GitLab Kubernetes Agent を使った GitOps の話」です！

Gitlab CI/CDでKubernetesを連携させてどのような運用ができるようになるのでしょうか？内容がとても楽しみです！
明日の記事もお楽しみに👋