弊社では、全国に拠点がいくつかありますが、自分がねぐら(寝てない)とする拠点では、毎週当番制でLTを開催しています。LTのネタはなんでもよく、技術のことでもいいし、趣味のことでもいいです。当番はだいたい、1年に3〜4回ぐらいのスパンで回ってきます。
今回は、今年LTしたネタのうちの一つである「肴くん」について紹介します。(唯一の技術ネタでした)
肴(さかな)くんとは
いきなり、肴くんってなんじゃいって話ですが・・
今年の春に、プランターでトマトと枝豆を育て始めました。あとは適当に水をやって育てるつもりでしたが、これだけではつまらないと思ったので、なんかITっぽいことやるかと思い立ったのが、土壌水分量監視装置の構築です。
DXです。(適当)
トマトと枝豆が、私のビールのつまみになるため、この土壌水分監視装置のことを「肴くん」と名付けました。
作るシステムに名前をつけると愛着がわきますね。(しらんけど)
全体の構成
はい、上記のような感じです。
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 の中身は下記のように実装しました。
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分間隔でデータが送信されていました。
1分ごとぐらいに Raspberry Pi Pico が再起動してるっぽいんですが・・ソーラーパネルの仕様か?誰かご存知でしたら、教えてください。
送信データが増えますが、容量的にも問題ないので、とりあえずヨシ!としました。
Firestoreにリアルタイムの日時を登録したい
Firestoreの登録・参照はREST APIを使用しています。
Raspberry Pi PicoにはOSもなく、時間も管理できません。登録時は、適当な日時を登録することしかできず、困りました。。
そこで、Firestoreのサーバタイムスタンプを登録してくれる機能を使って、データ登録日時を登録しました。こんな機能もあるのかと神に出会った気分です。
スマホアプリでデータを見る
データを参照するアプリは、スマホアプリにしました。こちらはFlutterを使用しています。
自分がスマホアプリ作成が好きでしたし、自分だけ見るのであれば、サーバも準備しなくてよいので、これで十分ですね。
最新の温度と土壌水分量と、あとは過去がグラフで見れるようにしています。
画面は、全体の構成からご確認ください。
これでシステムは完成です。
終わりに
技術的なところでは、下記を使って構築しています。組み合わせれば、こういった一つのシステムが作れるのはすごいですね。構築していく上で、いろいろ勉強にもなりました。
- Python
- Flutter
- Raspberry Pi
- Firestore
肝心の野菜は、水やりを忘れることなく(システム関係なく毎朝水やりしてたけどね!)、無事に育ちました。枝豆は虫さんに食われまくりましたが・・。
皆さんも、ぜひ生活に開発を取り入れてみてください。
ちょっと、生活が楽しくなります。