RaspberryPi Pico を使った土壌水分量監視装置

弊社では、全国に拠点がいくつかありますが、自分がねぐら（寝てない）とする拠点では、毎週当番制でLTを開催しています。LTのネタはなんでもよく、技術のことでもいいし、趣味のことでもいいです。当番はだいたい、1年に3〜4回ぐらいのスパンで回ってきます。

今回は、今年LTしたネタのうちの一つである「肴くん」について紹介します。（唯一の技術ネタでした）

## 肴（さかな）くんとは

いきなり、肴くんってなんじゃいって話ですが・・

今年の春に、プランターでトマトと枝豆を育て始めました。あとは適当に水をやって育てるつもりでしたが、これだけではつまらないと思ったので、なんかITっぽいことやるかと思い立ったのが、**土壌水分量監視装置**の構築です。

DXです。（適当）

トマトと枝豆が、私のビールのつまみになるため、この土壌水分監視装置のことを「肴くん」と名付けました。

**作るシステムに名前をつけると愛着がわきますね。（しらんけど）**

## 全体の構成

![sakanakun_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/90a79f30-9fd8-8e6a-c921-b82f2a47e3f7.png)

はい、上記のような感じです。

Raspberry Pi Picoに土壌水分センサーをつなげて、取得したデータをFirestoreに送ります。
Raspberry Pi Picoの電源はソーラーパネルで確保し、電波は庭なのでWiFiが届きます。太陽が出ているときしか動きませんが、そこは許容します。
Firestoreのデータは、スマホのアプリから参照します。

完璧ですね。
あとは、誰かが構築してくれるのを寝て待ちたいところですが、誰も作ってくれないので、自分で作ります。


## Raspberry Pi Pico 上で動くプログラム

使用するラズパイは「Raspberry Pi Pico W」です。
今回はこれで十分ですね。¥1,000ぐらいで安く購入できます。

細かいことは省きますが、Raspberry Pi Pico に main.py を配置して、電源をONにすると勝手に main.py を実行してくれます。

main.py の中身は下記のように実装しました。

```python:main.py
import gc
import utime
from firebase_manager.firebase_manager import *
from sensor_manager.sensor_manager import *

# 以下、10分おきに動かす
while True:
    # ガーベジコレクションを実施
    gc.collect()

    sensor = SensorManager(temperature=0, soil_moisture=0)
    firebase_manager = FirebaseManager()

    # WiFiに接続
    connected = firebase_manager.wifi_connect()
    if not connected:
        del sensor, firebase_manager
        continue
    
    # センサーデータ取得
    sensor.reload()

    # FireStoreに送信
    try:
        firebase_manager.get_id_token()
        firebase_manager.send_sensor_data(temperature=sensor.temperature(), soil_moisture=sensor.soil_moisture())
        firebase_manager.add_timestamp()
    except Exception as e:
        print(e)
        # 1分待機
        utime.sleep(60)
        del sensor, firebase_manager
        continue

    del sensor, firebase_manager

    # 10分待機
    utime.sleep(600)

```

他のファイルもありますが、内容は省略します。

やたら、ガーベジコレクションしたり、del してるのは、メモリが足りなくなるためです。
実行している途中で落ちたり落ちなかったりしてて、最初なんじゃこりゃと思いましたが、メモリ管理をしっかりしたら落ち着きました。
「Raspberry Pi Pico W」はメモリが2MBしかないので気をつける必要があるんですね。


## Raspberry Pi Pico に給電したい

電源周りは意外と曲者でなかなかうまくいきませんでした。

RaspberryPi Pico をコンセントから給電して動作していたときは、プログラム通りに10分間隔でFireStoreにデータを送信していましたが、ソーラーパネルを使って給電して動作させると、1分間隔でデータが送信されていました。

![sakanakun_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/a2311795-bfd1-d08f-7ae4-0f4c9cd39017.png)

1分ごとぐらいに Raspberry Pi Pico が再起動してるっぽいんですが・・ソーラーパネルの仕様か？誰かご存知でしたら、教えてください。
送信データが増えますが、容量的にも問題ないので、とりあえずヨシ！としました。


## Firestoreにリアルタイムの日時を登録したい

Firestoreの登録・参照はREST APIを使用しています。

Raspberry Pi PicoにはOSもなく、時間も管理できません。登録時は、適当な日時を登録することしかできず、困りました。。

そこで、Firestoreのサーバタイムスタンプを登録してくれる機能を使って、データ登録日時を登録しました。こんな機能もあるのかと神に出会った気分です。

https://cloud.google.com/firestore/docs/samples/firestore-data-set-server-timestamp?hl=ja


## スマホアプリでデータを見る

データを参照するアプリは、スマホアプリにしました。こちらはFlutterを使用しています。
自分がスマホアプリ作成が好きでしたし、自分だけ見るのであれば、サーバも準備しなくてよいので、これで十分ですね。

最新の温度と土壌水分量と、あとは過去がグラフで見れるようにしています。
画面は、全体の構成からご確認ください。

**これでシステムは完成です。**


## 終わりに

技術的なところでは、下記を使って構築しています。組み合わせれば、こういった一つのシステムが作れるのはすごいですね。構築していく上で、いろいろ勉強にもなりました。

- Python
- Flutter
- Raspberry Pi
- Firestore

肝心の野菜は、水やりを忘れることなく（**システム関係なく毎朝水やりしてたけどね！**）、無事に育ちました。枝豆は虫さんに食われまくりましたが・・。

皆さんも、ぜひ生活に開発を取り入れてみてください。

**ちょっと、生活が楽しくなります。**