49
Raspberry Pi Pico WとTelegramを使って観葉植物を監視する方法

観葉植物は手入れが必要ですが、デスクで仕事をしていると、ついつい手入れを忘れてしまいます。今回の患者様は、IKEAで買ったガステリアの多肉植物「ゲイリー」です。あまり手入れを必要としないため、水やりを忘れてしまうことがあります。Raspberry Pi Pico Wは、ゲイリーの手入れをもっと楽にしてくれるのでしょうか?

土壌水分センサーは土壌の導電率を測定し、その値を電圧としてRaspberry Pi Pico W(または他のマイクロコントローラー)に送信します。この電圧はアナログGPIOピンで読み取られ、0~65535の値に変換されます。数値が低いほど、土壌は乾燥しています。この値は、メッセージを送信するためのトリガーとして使用できます。

このハウツーでは、一連のセンサーデータを取得し、その中央値を算出して、ゲイリーが飲み物を必要としているかどうかを判断する方法を学びます。ゲイリーはTelegramボット経由で私たちにメッセージを送信します。

このプロジェクトに必要なもの

  • ラズベリーパイ ピコW
  • ハーフブレッドボード
  • 土壌水分センサー
  • メス-オスジャンパーワイヤー
  • 観葉植物

回路の構築

ピコ W テレグラム ボット

(画像提供:Tom's Hardware)

回路は非常にシンプルです。土壌水分センサーをGPIOの3つのピンに接続します。最初の2つのピン、3V3電源とGNDがセンサーに必要な電源を供給します。 

3番目のピン「Signal」は、Raspberry Pi Picoに値を送信する出力ピンです。出力は電圧で、対応するGPIOは0~65535の範囲の値として読み取ります。この値は、植物が水を欲しているかどうかを判断するためにコード内で使用されます。

土壌水分センサーは次のように接続します。

スワイプして水平にスクロールします

土壌水分センサーラズベリーパイ ピコ
+ / VCC3V3(物理ピン36)
黄色S / シグナルGP26
- / GND任意のグラウンド/GNDピン

Telegramボットの設定

Telegram は、Raspberry Pi Pico W から通信できる非常にシンプルな手段を備えた、使いやすいインスタント メッセージング サービスです。ボットを使用すると、観葉植物やホーム セキュリティ専用のチャンネルを作成できます。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

Telegram ボットの作成は簡単なプロセスであり、幸いなことに、BotFather が手伝ってくれます。

1. Telegramアカウントにサインインします。ワークフローを簡素化するため、Windowsクライアントを使用しました。

2. BotFatherでチャットを作成します。BotFatherはボットの作成と管理に使用されるボットです。

3. /newbot コマンドを使用して新しいボットを作成し、Enter キーを押します。BotFatherがボット作成プロセスをガイドするウィザードを作成します。

/newbot

4. APIキーをメモしておいてください。これはプロジェクトに必要です。これがないと、コードを使ってボットと通信できません。

5. TelegramでIDBotと新しいチャットを作成し、IDを尋ねます。IDをメモしておきましょう。

/getid

コードを書く 

すべてのプロジェクト コードは、Raspberry Pi Pico W 用の最新の MicroPython リリースを使用して MicroPython で記述されています。Thonny を使用して、Raspberry Pi Pico W で直接コードを記述およびテストします。 

1. Raspberry Pi Pico W用の最新バージョンのMicroPythonをダウンロードするには、以下の手順に従ってください。最も重要な手順は、UF2ファームウェアイメージのダウンロードとインストール、そしてThonnyのセットアップです。残りはオプションです。

2. Thonny を開き「停止」ボタンをクリックして接続を更新します。これにより、Python シェルが開いて正常に動作していることが確認できます。

3.新しいファイルを作成し、このリンクの内容を貼り付けます。ファイルをstatistics.pyとしてRaspberry Pi Pico Wのルートに保存します。このファイルは、データリストから中央値を選択するために必要なすべての統計関数を含むモジュールです。このプロジェクトはRoberto Colistete Juniorによって作成されました。

4.新しいファイルを作成し、そこにSSID、PASSWORD、API、ID の 4 つのオブジェクトを作成します。

5. SSID オブジェクトには、Wi-Fi アクセス ポイント/ルーターの名前を割り当てます。

SSID = “YOUR WI-FI AP NAME HERE”

6.パスワードには、Wi-Fi パスワードを割り当てます。

PASSWORD = “YOUR SECRET PASSWORD”

7. APIには、Telegram Bot APIキーを割り当てます。キーが「」で囲まれていることを確認してください。

API = "YOUR TELEGRAM BOT API KEY"

8. IDには、TelegramのユーザーIDを入力してください。IDが「」で囲まれていることを確認してください。そうすることで、値が文字列として設定されます。

ID = “YOUR USER ID HERE”

9.ファイルを secrets.py として Raspberry Pi Pico W に保存します。

SSID = “YOUR WI-FI SSID”
PASSWORD “YOUR WI-FI PASSWORD”
API = “YOUR TELEGRAM BOT API KEY”
ID = “YOUR TELEGRAM USER ID”

10.新しいファイルを作成し、一連の Python モジュールをインポートします。

     a.マシンには、GPIO (ピン) とアナログ入力 (ADC) を使用するために必要な関数とクラスが含まれています。

     b.時間はコードに遅延を追加するために使用されます。

     c.ネットワークがWi-Fi 接続を確立します。

     d. Urequests (マイクロ リクエスト) は、ネットワーク経由でデータを送受信するために使用されるリクエストの MicroPython バージョンです。

     e. Statistics は、データの統計分析を実行するための関数を含むモジュールです。

     f. Secrets : Wi-Fi の詳細と API キーがすべて含まれるモジュール。

from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets

11.オブジェクト「sensor」を作成し、GPIO 26で土壌水分センサーへの接続を作成します。このオブジェクトは、センサー入力をアナログに設定し、土壌の導電率を表す0~65535の値を使用します。数値が大きいほど、導電率は高くなります。

sensor = ADC(Pin(26))

12.オブジェクト wlan を作成し、これを使って Wi-Fi アクセスポイントに接続します。接続がアクティブになり、secrets.py に保存されている SSID とパスワードを使用してアクセスポイントに接続します。5秒間の待機時間で接続が安定し、その後、現在の接続状態を表示します。接続に成功した場合は TRUE、失敗した場合は FALSE が表示されます。

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())

13. 「readings」という空のリストを作成します。リストは配列とも呼ばれ、複数の値を読みやすい形式で保存するために使用します。

readings = []

14. try, except文の最初の部分を作成し、while Trueループを実行するように設定します。try , exceptはエラー処理文です。このコードは、その文に含まれる内容を実行しようとしますが、例外またはエラーが発生した場合は、それを処理するコードセクションにデフォルトで切り替わります。

try: while True:

15. forループを使用して、土壌水分センサーから5つの測定値を収集し、1秒間隔で各測定値を測定値リストに追加します。このコードセクションは、センサーに接続されたGPIOピンを読み取り、その値を取得してリストに格納します。測定値を出力することは、問題のデバッグに役立ちます。

 for i in range(5): reading = sensor.read_u16() readings.append(reading) print(readings) time.sleep(1)

16. for ループの外側で、オブジェクト median_value を作成し、そこに読み取り値のコレクションからの中央値 (中間点) を保存します。

 median_value = statistics.median(readings)

17.条件文を使用して、median_value をハードコードされた値と比較します。テストでは、ガステリアが水を必要とするポイントとして400を選択しました。この値は、植物のニーズに合わせて調整してください。

 if median_value < 400:

18.植物に水が必要な場合は、urequestsを使ってTelegramにメッセージを送信し、Pythonシェルにメッセージを出力します。APIキーを挿入するためにsecrets.APIを使用し、ユーザーIDを送信するためにsecrets.IDを使用していることに注意してください。実際のメッセージはsendMessage?text=Gary is thirsty.です。

 urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID) print("Message Sent")

19. else文を使用すると、植物は十分な水があり、現時点では水を必要としないと判断します。これにより、コードに1時間の遅延が発生します。

 else: print("Gary has enough water") time.sleep(3600)

20. OSエラー(Wi-Fi接続なし)を処理するための例外ハンドラを作成し、Pythonシェルにメッセージを表示します。print (“@”*68)行は、メッセージの上下に装飾的な境界線を作成します。

except OSError: print("@"*68) print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @") print("@"*68)

21. Raspberry Pi Pico W にコードを main.py として保存します。これにより、Pico W は電源を入れ直すたびにコードを強制的にロードするようになります。

22. Pico W の電源を入れ直し、観葉植物が水を要求するのを待ちます。

完全なコードリスト

from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
sensor = ADC(Pin(26))
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
readings = []
try: while True: for i in range(5): reading = sensor.read_u16() readings.append(reading) print(readings) time.sleep(1) median_value = statistics.median(readings) if median_value < 400: urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID) print("Message Sent") else: print("Gary has enough water") time.sleep(3600)
except OSError: print("@"*68) print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)

Pythonのハウツー

  • Windows 10と11にPythonをインストールする方法
  • PythonでForループを使う方法
  • Pythonで列挙する方法
  • Pythonで実行可能なアプリケーションを作成する方法
  • Pythonで画像から背景を削除する方法
  • Python、HTML、ThonnyでWebアプリを作成する方法
  • Raspberry Pi カメラモジュール 3 を Python コードで使う方法