【手順を完全公開】土壌水分センサーデータをラズパイで自動取得する方法(実践編)

全3回でお送りする土壌水分量の自動取得ですが、今回で完結となります。

準備編、構築編が完了し、土壌水分センサーからラズベリーパイで情報を取得できるようにはなりました。

しかし、実用化に向けては「情報を記録する」「定期的に実行する」この2点を自動化する必要があります。

今回の記事では実践編として、「情報の記録」「定期実行」の機能をラズベリーパイに導入する方法をご説明していきます。

プログラミングに自信のない方、もしくはやったことないかたでも実践できるように心がけますので最後までお付き合いいただければと思います。

スポンサーリンク

取得した情報をGoogleスプレッドシートに記録する

今回はGoogleスプレッドシートに土壌水分の計測データを記録していきます。

最終的にはこのようなグラフを作っていこうと思います。

Googleスプレッドシートとは?

Googleスプレッドシート(以降、スプレッドシート)とは、Googleが提供している表計算ソフト(Excelのようなもの)です。

Webサービスですので、他の色んなサービスと連携が可能です。

もちろん無料です。

Googleのアカウントが必要になりますのでお持ちでない方はGoogleアカウントを作成してください。

Google Cloud Platform(グーグルクラウドプラットフォーム)の登録

スプレッドシートにデータを送るには、Google Cloud Platformに登録する必要があります。

Google Cloud PlatfromはGoogleのアカウントがあれば使えます。

こちらも利用制限を超えなければ無料です。今回紹介する方法は無料の範囲内です。

こちらのページを開くと、以下のような画面が表示されると思いますので「プロジェクトを作成」ボタンを押します。

プロジェクト名は今回は「soil-moisture」とします。ここはお好きな名前を設定してください。

プロジェクトができたらホーム画面のメニューから「APIとサービス」「ダッシュボード」を選択します。

APIとサービスのページが開きますのでメニューから「ライブラリ」を選択します。

APIライブラリで「Google Drive API」を検索して選択します。

Google Drive APIの画面に変わりますので「有効にする」ボタンを押しましょう。

同じ要領で「Google Sheets API」も有効にしていきます。

続いて、認証情報を設定していきます。

「APIとサービス」のメニューから「認証情報」をクリックします。

ページ上部の「認証情報を作成」ボタンを押して、「サービス アカウント」を選択します。

サービス アカウント名を決めます。今回は「soil-moisture」にします。

サービス アカウントの説明はわかりやすいように「土壌水分量の記録」にします。

入力したら「作成」ボタンを押しましょう。

②、③は省略可能ですので、今回は入力を省いて「完了」ボタンを押しましょう。

すると「APIとサービス」のページの「サービス アカウント」に先ほど作成した認証情報が表示されますので、こちらを選択して開きます。

「キー」のタブを選択し、「鍵を追加」ボタンを押します。

秘密鍵の作成でキータイプを求められるので、ここは「JSON」を選択して「作成」ボタンを押します。

作成された秘密鍵は後ほど使うので大事に取っておきましょう。

しょちお

ここ重要です!秘密鍵は後でも出てくるのでしっかりとっておきましょう。

スプレッドシートの設定

以上で準備は整いましたのでスプレッドシートを開きましょう。

Googleのトップページ右上のアカウントの横のボタンから「スプレッドシート」選択します。

テンプレートは「空白」を選びましょう。

空のスプレッドシートが開きます。

左上のファイル名を「soil-moisture」としておきます。

続いて、右上の共有ボタンを押します。

「ユーザーやグループと共有」に先ほどの秘密鍵ファイルの中にある「cliant_email」の内容をコピペしてエンターで追加します。

追加したら「完了」ボタンを押しましょう。

しょちお

cliant_email は秘密鍵ファイルの中の赤字部分にありますよ

「ユーザを追加しました」と表示されれば、スプレッドシートの準備は完了です。

スポンサーリンク

土壌水分量取得のプログラムにスプレッドシート書き込みを追記する

必要な部品のインストール

スプレッドシートの準備ができましたので、プログラムを記述していきます。

まずは前準備として必要なプログラム部品をインストールしていきましょう。

ラズベリーパイのターミナル(黒い画面)に以下のコマンドを入力して、それぞれエンターを押してインストールします。

pip3 install gspread
pip3 install oauth2client

最後に「Successfully」が出ていれば部品のインストールは完了です。

スプレッドシートへの書き込みプログラム

では、ラズベリーパイで土壌水分量取得のプログラム(soil-moisture.py)を開きましょう。

今回は「soil-moisture.py」に以下のプログラムを追記をした、以下のプログラムを使います。

import busio
import digitalio
import board
import time
import requests
import RPi.GPIO as GPIO
import adafruit_mcp3xxx.mcp3002 as MCP
import gspread
import json
import datetime
from oauth2client.service_account import ServiceAccountCredentials
from adafruit_mcp3xxx.analog_in import AnalogIn

pin = 22

#出力用関数
def output_fromGPIO(pin, output):
    GPIO.output(pin, output)
    time.sleep(0.1)

#Google Spread Sheetsにアクセス
def connect_gspread(jsonf,key):
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(jsonf, scope)
    gc = gspread.authorize(credentials)
    SPREADSHEET_KEY = key
    worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
    return worksheet

GPIO.setup(pin, GPIO.OUT)
 
#spiバスの作成
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
 
#チップセレクト(cs)の作成
cs = digitalio.DigitalInOut(board.CE0)
 
#mcpオブジェクトの作成
mcp = MCP.MCP3002(spi, cs)

#mcpのpin0にアナログインプットチャネルを作成
chan = AnalogIn(mcp, MCP.P0)

#土壌水分センサーを起動
output_fromGPIO(pin,1)
try:
    while True:
        print('Raw ADC Value: ', chan.value)
        print('ADC Voltage: ' + str(chan.voltage) + 'V')
        if chan.value != -1:
            #スプレッドシート書き込み用の値を格納
            spread_value = chan.value
            spreat_voltage = chan.voltage
            break;
        time.sleep(1)
except KeyboardInterrupt:
    pass

#土壌水分センサーを停止
output_fromGPIO(pin,0)

#jsonfileとスプレッドシートのキーを用意
jsonf = "soil-moisture-XXXXXX-XXXXXXXXXXXX.json"
spread_sheet_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

#スプレッドシートに接続
ws = connect_gspread(jsonf,spread_sheet_key)

#スプレッドシートの値を更新
#タイトルを設定
ws.update_cell(1,1,"DATE")
ws.update_cell(1,2,"VALUE")
ws.update_cell(1,3,"VOLTAGE")

#日付を取得
dt_now = datetime.datetime.now()

#セルに値を入力
datas = [dt_now.strftime('%Y/%m/%d %H:%M'), spread_value, spreat_voltage]
ws.append_row(datas)

基本的にはコピペで使えますが、唯一63行目、64行目だけは自分で記載する必要があります

63行目は秘密鍵のファイル名です。間違えると動かないのでコピペで記述するようにしましょう。

64行目はスプレッドシートのIDです。

スプレッドシートを表示したときのURLの「d」の後ろの「/(スラッシュ)」から次の「/」までがIDになります。

こちらをコピーしてプログラムに貼り付けましょう。

しょちお

以下のアドレスバーの赤い部分です

秘密鍵の配置

プログラムが記述できましたら、秘密鍵を配置します。

秘密鍵は先ほどパソコンでダウンロードしたと思いますが、このファイルをラズベリーパイの「soil-moisture.py」ファイルがある場所にコピーします。

ここはファイルごとコピペができないと思いますので、ラズベリーパイで同じファイルを作っていきましょう。

「soil-moisture.py」 と同じフォルダで右クリックから「New File」を選択しましょう。ファイル名はパソコンにダウンロードしたファイル名と同じにしてください。

ファイルができたらパソコンで秘密鍵の内容をコピペしましょう。

以上で、プログラム実行の準備が整いました。

「Run」ボタンで実行してみましょう。

土壌水分センサーの結果がスプレッドシートに書き込まれれば成功です。

プログラムを定期的に実行しよう

ここまで来たらあとはプログラムを定期的に実行できれば自動的に土壌水分の計測データが溜まっていきます。

プログラムを定期的に実行するには「cron(クーロン)」という機能を使います。

cronはターミナル(黒画面)で設定していきますので、ラズベリーパイでターミナルを起動しましょう。

ターミナルを起動したらこちらのコマンドを打ちます。

sudo crontab -e
しょちお

コピペしたらエンターをしましょう

初めてコマンドを打った時は以下のように「エディターを選択してください」ということを聞かれます。

こだわりがなければ「1」を入力してエンターを押しましょう。

するとエディターが開きますので、一番最後に以下の内容を書き込んでいきます。

HOME=/home/pi/
00 * * * * python3 /home/pi/soil-moisture.py > /var/log/myjob.log 2>&1

2行目が定期的にプログラムを実行する命令部分になります。

今回の例では1時間に1回プログラムを実行する登録です。

最初に「00」という記述があると思いますが、ここが「00分になったら」という意味になります。

実行する時間を変えたい場合は、この前半の「00 * * * * 」部分を書き換えてください。

内容は「分 時 日 月 曜日」の順で設定可能です。

毎日朝8:15に実行したい場合は「15 8 * * *」
毎月1日の夜9:30に実行したい場合は「30 9 1 * *」
曜日の指定は日~日を0~7でしてい可能です。例:日曜⇒0or7、水曜⇒4

cronの内容が書けたら保存いたします。

保存方法がやや特殊ですので注意してください。

ctrl+O(オー) 書き込み ⇒ ファイル名を聞かれるのでそのままエンター ⇒ ctrl+X(エックス) で保存しましょう。

以下のように表示されれば更新完了です。

以上で、プログラムの定期実行の設定が完了しました。

しょちお

お疲れさまでした!

グラフで可視化をする

データが溜まってきたらスプレッドシートでグラフを作って土壌水分の推移を可視化しましょう。

グラフ化は簡単です。

対象のデータ(今回はA列とB列)を選択して「挿入」から「グラフ」を選択します。

デフォルトだと棒グラフになっていて見にくいので折れ線グラフに変更しましょう。

これでグラフの完成です。

まとめ

お疲れさまでした。

全3回にわたる土壌水分量の自動取得はこれにて完了になります。

土壌水分センサーをご自身の畑やプランターに挿して、水やりの基準にしていただければと思います。

スプレッドシートはスマホからも見れますので、外出先からも土壌水分を監視することができます。

また、遠隔水やりと組み合わせることで、畑に出なくても、土の乾き具合を確認して、水をやることができるようになります。

一昔前はこのような制御機器は一般の家庭菜園で導入することは難しかったですが、今回紹介したように私のような一般人でも導入することができました。

ITは企業のものだけでなく、一般家庭でも導入できますので、難しそうという理由であきらめてしまうのはもったいないです。

ただどうしても壁はあると思いますので、私はそんな壁を取っ払うために、今後も家庭で導入できる便利なIT技術を紹介していきたいと思います。

しょちお

これからも家庭菜園にITを取り込んでいきます!

コメント

  1. たいぺー より:

    素晴らしいですね!!!私も真似して真似してラズパイ買いました( ´ ` )
    2つ教えてください。外に設置する時は電源はどうしてますか?また、ボード使うとラズパイの蓋が閉まらないのですが、なにか入れ物に入れてますか?

    • しょちお より:

      コメントありがとうございます!
      電源は屋外コンセントから屋外用のコンセントリールを伸ばして使っております。
      ラズパイ自体は防水容器に入れて、センサーや電源コードだけ出せるようにしています。

      ラズパイはケースの種類によってジャンパーワイヤが外部に出せない構造になっているものもあるので、ケースを別で買うか、もしくは100均などで売っているプラスチックケースを加工してもよいかと思います。

      • たいぺー より:

        なるほど〜。防水容器ないと外だとダメですよね😅探してみます!!

        しょちおさんの説明の通りやって、サーバーにデータアップ出来ました😆ありがとうございます🙏ちなみにこのセンサーの「VALUE」が湿度でしょうか?64960と謎の数値が出るのですが…

        • しょちお より:

          無事にできたようでよかったです。
          土壌水分センサーは電圧で水分量を計っています。VOLTAGEが電圧値です。
          電圧を水分量として変換した値がVALUEになります。
          VOLTAGEとVALUEを比較すると連動しているのがわかるかと思います。

  2. たいぺー より:

    VOlTAGEとVALUEの違いについて承知しました!確認してみますね〜!!

  3. たむ太郎 より:

    とても参考になりました。ありがとうございます。
    自動で測定できるようになったのですが
    ここ最近突然水分量の値が異常値になってしまうのですが
    理由は分かりますでしょうか。。
    ラズベリーパイzeroを使用しているのですが
    触ってみると割と発熱していたので
    もしかしたらそれかな?と思ったのですが
    発熱が原因で水分量の値がおかしくなることは
    あるのでしょうか。

    • しょちお より:

      たむ太郎さん初めまして。
      お読みいただきありがとうございます。
      自動測定ができるようになったようでなによりです。

      水分量の値が異常値になってしまうとのことで、原因ははっきりとはお答えできないのですが、
      考えうるポイントを2つあげてみます。
      1.ラズパイに異常な負荷がかかり電圧が低下している。(異常な発熱も負荷に起因している可能性もあります。)
      2.センサーが腐食している。プログラムは必要な時だけ電圧をかけるようにしていますが、頻度が高かったり、常時測定したりすると酸化が早くなり、センサーが腐食するようです。

      どんな環境で使われているか、また異常値の内容や頻度がわかればもう少しお答えできるかもしれませんが、いかがでしょうか?

      • たむ太郎 より:

        お返事ありがとうございます。
        まず異常としては値が127~256の間で推移するセンサーで値が0.35などの明らかにおかしな数値が出るようなかんじです。
        静電容量を測定するセンサーを使用しているので腐食の可能性はあまりなさそうです。
        見た目も購入時とほぼ変わっていないので。
        そして最後に使用頻度ですが5秒に1回値を測定するように設定しているので負荷がかかりすぎているのでしょうか。
        初期の頃は問題なく稼働していたのですが他に様々な機能をつけていくうちに異常な値が出るようになってしまいました。

        • たむ太郎 より:

          すみません。異常値の頻度としては
          測定開始したら基本的に1回目から先程のような異常値が出ます。
          ただ2割くらいの確率で通常の値が出ますが何回か測定すると結局異常値が出てしまいます。

          • たむ太郎 より:

            で、1番よく分からないのがこのサイトのように30分ごとに値を測定してグーグルスプレッドシートに記入するスクリプトでは正常に値が測定できるんです、、、

          • しょちお より:

            たむ太郎さん

            なるほど・・・謎の事象ですね。。
            30分毎に値を測定すると正常ということで、頻度の問題なのかもしれないですね。
            センサーや機器に問題がないようでしたら、測定間隔を調整して使うしかないかもです。

            どうしても5秒間隔での計測が必要な場合は、プログラムで取得した値が異常値の場合は再度計測する(もしくはスプレッドシートに記録しない)などの工夫も可能かと思います。

  4. こん より:

    初めまして、とても興味深い記事を掲載していただきましてありがとうございます。

    一点質問がございます。
    本記事では一つの土壌センサを使用しておりますが、複数個接続して同時に水分量を計測することは可能なのでしょうか…?
    私自身調べてみたのですが、調べ方が悪いのかなかなか出てこなくて悩んでおりました…

    もしよろしければご回答いただければ幸いです。

    • しょちお より:

      こん様
      コメント返しが遅くなりました。申し訳ございません。

      複数の土壌水分センサーを同時接続することは私も実践しておらず、可能かどうかの検証ができておりません。
      申し訳ございません。
      今後やることがあればまた投稿させていただきますね。

  5. mo より:

    参考にさせていただき、すべて正常に動作できました。
    水分が減ったらLINE通知するようにしてみました。
    素晴らしい記事、楽しい時間をありがとうございます!!

    質問ですが、ラズベリーパイは1つで、土壌水分センサーのデジタルデータを無線でラズベリーパイへ飛ばして、複数の植物を管理する方法が調べても分かりませんでした。(電子工作は今回が初めてのレベルです。)

    しゃちおさんは複数の土壌水分の管理を実践されていますか?
    もしくは実践するための知識をインプットするために、何か参考にできる書籍や記事が分かれば、教えていただきたいです。

    • しょちお より:

      mo 様
      コメント返しが遅くなり申し訳ございません。
      LINE通知とも連動できたようで、お役に立てたのであれば何よりでございます。

      1つのラズベリーパイで複数の水分センサーは私もやったことがないですね。
      知識インプットはオンライン講座を探したり、ひたすらググったり、あとはトライアンドエラーでなんとかしています。

      あまり参考になる回答ができずに申し訳ないです。。

      • mo より:

        お返事ありがとうございます!

        もう少し自分で調べてみます。
        色々な取り組みの記事を楽しみにしております〜