Pico PR

【MicroPython ADC】RaspberryPi Pico Wで土壌湿度センサを使う方法 【観葉植物・家庭菜園 水やり】

記事内に商品プロモーションを含む場合があります

はじめに

RaspberryPi Pico Wを使って、観葉植物・家庭菜園などに使える土壌湿度センサを使う方法について解説します。言語は「MicroPython」を使用します。

環境

この記事で使用する環境は以下の通りです。

環境 バージョンなど 備考
開発用PCのOS Windows11 Windows10でもOKです
言語 MicroPython
開発環境 Thonny 3.3.13
ボード RaspberryPi Pico W ノーマルのPicoでも同じように使えます

DiyStudio土壌湿度検出モジュール

特徴

静電容量式の安価な土壌湿度センサです。3.3V~5.5Vまでに対応しているので、Pico/PicoWの3.3Vにつないで使用できます。

土壌の水分(湿度)に応じて出力ポートからのアナログ電圧を出力されるので、Pico/PicoWのADC(アナログデジタル変換)ピンに接続して使用します。

センサ本体を土に差して使用しますが、屋外や水のかかる場所で使用する際は、大きめの収縮チューブなどで根本の回路部分を保護すると安心です。

土壌湿度センサを紹介する画像
DiyStudio土壌湿度検出モジュール

UnBox

Amazonの以下のページから購入しました。化粧箱に梱包され、基板一つ一つが静電対策のパッケージに個別包装されています。5個入りで1000円の破格の値段ですがクオリティは高いです。

土壌湿度センサの入った外箱の画像
パッケージ
個別包装を説明する画像
個別包装のパッケージ
¥999 (2023/05/06 08:42時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

【参考】「LM393搭載」のセンサとの違い

以下の「LM393搭載」と書かれている土壌湿度センサは、今回解説するセンサとは異なり湿度が「高い/低い」の2パターンをI/Oで出力する仕様です。(判定値/閾値はボリュームで調整可能)

センサ側で湿度の情報を判定してくれるため、ノーマルのRaspberryPiなどのADC非搭載の機器で使う場合は便利なのですが、今回のように「中間」を設ける場合や、電圧値をロギングするなど、細かい変化を見たい場合は不向きです。

単純に「土壌が乾いたら知りたい・水を上げたい」といったシンプルな用途ならこちらで十分かもしれません。

\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

「RaspberryPi Pico W』と「土壌湿度センサ」の接続

Pico Wの「3.3V(OUT)」「GND」「ADC0」に土壌湿度センサの配線を接続します。

土壌湿度センサとPico Wの接続方法を説明する画像

ピン番号 内容 備考
38 GND グラウンド
36 3V3(OUT) 電源(3.3V)
32 ADC0 土壌湿度センサの出力電圧(AOUT)を取得します

※ ノーマルのPicoでも、上記と同じ接続方法で使用できます。

直接ブレッドボードには挿せません

センサ付属の配線は細く、芯線も「より線」です。コネクタをカットしてブレッドボードに直接差すのは厳しいので、固いジャンプワイヤ等で中継した方が楽に使えます。

土壌湿度センサの配線の芯線を説明する画像
付属配線の被覆を剥いた状態

Pico W ピンアサイン(Pin-Out)

Pico W公式サイトより引用

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

使用する部品

今回の記事では以下の部品を使用しています。

Pico W 本体

Raspberry Pi Pico W本体です。技適対応品かどうか心配…という方は、以下のページで出品者を「共立エレショップAセレクト」(国内の有名ショップ)にして購入してください。

¥1,630 (2024/07/22 13:13時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

RaspberryPi Pico

Pico本体です。一時期は半導体不足の影響がありましたが、今は価格・納期とも安定しています。

ロボショップ 楽天市場店
¥937 (2024/07/23 21:52時点 | 楽天市場調べ)
\楽天ポイント4倍セール!/
楽天市場

USBケーブル Micro-B

本体にUSBケーブルが付属していないので、別途購入が必要です。PicoW側の形状は「Micro-B」、ひと昔前のスマホと同じタイプを使います。現在主流のTypeCではないので注意が必要です。

土壌湿度センサ

冒頭で紹介した、今回使用する土壌湿度センサーです。

¥999 (2023/05/06 08:42時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

ブレッドボード

国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、他の海外製と違い、ピン穴の数値がすべて印刷されており、品質も高いのでおすすめです。

あきばお〜楽天市場支店
¥1,192 (2024/04/09 09:18時点 | 楽天市場調べ)
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

プログラム概要

今回のプログラムの概要は以下の通りです。

  • 土壌湿度の出力電圧を計測する。
  • 出力電圧から土の状態を「カラカラ」「ふつう」「しっとり」で表示する

実行結果

後述するプログラムの実行結果は以下の通りです。センサから湿度を電圧値として取得して土の状態を判定します。

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

湿度の判定の部分以外は、以前解説したアナログデジタル変換(ADC)と同じコードを使用しています。ADCについて詳しく知りたい方は、こちらのADCの使い方の記事もご覧ください。

import machine
import time

# ADCを行うピンの設定です。
# GP26(ADC0)を使用します
adc = machine.ADC(0)

# 16bitの数値1単位が、電圧何ボルトか?を設定します
# 3.3(V) ÷ 65535(16bit) = 0.00005035477[V]
unit = 0.00005035477

# 湿度状態の判定値(閾値)です。
thresh_dry    = 1.23
thresh_normal = 1.1

# 電圧値を100回読み込みます
for i in range(100):
    
    # ADCの値を読み込みます(16bitの生の数値)
    voltRaw = adc.read_u16()
    
    # 16bitの値から、電圧値に変換します
    volt = voltRaw * unit
    
    #
    # 判定値に応じて、表示を切り替えます。
    #
    if volt >= thresh_dry:
        print("土は「カラカラ」です。")
    
    elif volt >= thresh_normal:
        print("土は「ふつう」です。")
        
    else:
        print("土は「しっとり」です。")
        
    # 電圧値を表示します(:.3fは少数点以下3桁を表示する設定です)
    print( "電圧:" + "{:.3f}".format(volt))
    
    # 見やすさの改行です
    print("\n")
    
    # 1秒待機します
    time.sleep(1)

コードのポイント

アナログデジタル変換(ADC)の設定

ADC関数を使って、ADCとして使用するピンを設定します。ADC0のピンを使用するので括弧の中の引数に「0」を指定しています。

ピンを変更する場合は該当のADCの番号「0~2]を記載してください。

# ADCを行うピンの設定です。
# GP26(ADC0)を使用します
adc = machine.ADC(0)

ADCの値を読み込む

read_u16関数を使って、ADCで読み取った電圧値を取得します。上記関数では、ピンの電圧値(0~3.3V)を、16ビット(0~65535)の値で取得できます。

    # ADCの値を読み込みます(16bitの生の数値)
    voltRaw = adc.read_u16()

電圧値への変換

read_u16関数から取得した生値を、電圧値に変換します。

read_u16関数は、3.3Vを0~65535の範囲で表します。そのため関数からの1カウントは、3.3V ÷ 65535 = 0.00005035477[V] となります。

# 16bitの数値1単位が、電圧何ボルトか?を設定します
# 3.3(V) ÷ 65535(16bit) = 0.00005035477[V]
unit = 0.00005035477

取得した生値と、上記の1カウントあたりの電圧をかけることで、ADCで読み込んだ電圧値を計算することができます。

    # 16bitの値から、電圧値に変換します
    volt = voltRaw * unit

水分量の判定

取得した電圧に応じて、湿度の判定を行います。

実際に濡らした布を使ってセンサの電圧を計測したところ、以下のような値になったため
実測値を基に判定値(閾値)を決定しています。

センサの状態 電圧 判定
何も触れない 1.23[V] カラカラ
水を絞った布にあてる 1.10[V] 普通
水につける 1.00[V] しっとり

センサの個体差や、土の種類・状態によって判定値(閾値)は上記の値と異なる可能性があります。判定値はお使いの環境に合わせて調整してください。

コード上では、if文を並べる順番を工夫することで、以下のように判定させています。

1.2V以上
 カラカラ

(1.2Vよりは少ないが) 1.0V 以上
 普通

それ以外( 消去法で、1.0V よりも小さい)
 しっとり

# 湿度状態の判定値(閾値)です。
thresh_dry    = 1.23
thresh_normal = 1.1

# ~~~~~ 中略 ~~~~~

    #
    # 判定値に応じて、表示を切り替えます。
    #
    if volt >= thresh_dry:
        print("土は「カラカラ」です。")
    
    elif volt >= thresh_normal:
        print("土は「ふつう」です。")
        
    else:
        print("土は「しっとり」です。")

まとめ

観葉植物・家庭菜園、農業などに簡易的に使える土壌湿度センサを、RaspberryPi Pico Wで使う方法について解説しました。参考になればうれしいです。

実際使ってみると、DIY向けとは言っても湿度(電圧)の再現性も高く、家庭や趣味で使うには充分なクオリティだと思います。本格的なものは数千円~数万円するので、趣味やちょっと使ってみたいだけ、という方にピッタリなセンサーです。

※ 以前、土壌湿度センサとポンプのセットを紹介していましたが、Picoでは使えない仕様であったため、リンクと紹介を削除しました。申し訳ありません。

お知らせ

そぞらさんのRaspberryPi Pico Wの本が登場

RaspberryPi 界隈で有名、Xでもバズり中の「そぞら」さんがPico Wの本を出しました。

Pico Wを使って、電子工作やMicroPythonの文法、AI活用にいたるまでをゼロから学ぶことができるので、興味のあるかたはぜひご覧ください!

著:そぞら
¥2,803 (2024/07/23 14:38時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

MicroPythonのプログラミングガイドブックが遂に発売!

このブログでよく使用している「MicroPython」の本が遂に発売になりました。

MicroPythonの言語仕様から、プログラミングの仕方までが”みっちり”学べます(笑)。

普段別言語で組み込み系の開発をしている人や、これからマイコンの学習が必要となってしまった(専門分野の)学生などを対象としているため、初心者用とはいきませんが、自前のライブラリの作成を目標にしているので、これ一冊で「ガッツリ」と使い方を学ぶことができます。

全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも圧巻の内容です。

Pico/Pico W関連のおすすめ本

RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index