9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

パソナのX-TECHエンジニア室Advent Calendar 2023

Day 5

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

Last updated at Posted at 2023-12-04

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

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

肴(さかな)くんとは

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

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

DXです。(適当)

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

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

全体の構成

sakanakun_1.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 の中身は下記のように実装しました。

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

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

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

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

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

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

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

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

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

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

終わりに

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

  • Python
  • Flutter
  • Raspberry Pi
  • Firestore

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

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

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

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?