【ラズパイ×家庭菜園】Googleスプレッドシートへの温度記録を自動化してみた

Raspberry Pi

こんにちは! ぜろはちです。

家庭菜園で毎日の温度をチェックすることは大切ですが、毎日計測し続けるのは大変ですよね。

今回、Raspberry Piで計測した温度をGoogleスプレッドシートに自動で記録し、インターネット上から確認出来るシステムを構築したので、作り方を解説します。

システムは、Raspberry Piで計測した温度データをGoogle Sheets APIを使ってGoogleスプレッドシートに書き込む方法で構築しました。

実際に我が家で運用していますが、温度記録が全自動になって楽ちんです。

この記事はこんな人におすすめ!

  • 家庭菜園で毎日の温度計測を自動化したい人
  • Raspberry Piを家庭菜園に活用したい人

それでは始めましょう!

システム紹介

Raspberry Piは屋外に設置しています。Raspberry Piを防水ケースの中に収め、電源は屋外コンセントから引っ張りました。

ボックスの中にはRaspberry PiとA/Dコンバータが入っています。配線はぐちゃぐちゃですね。

Raspberry Piは家の中のWifiルータと接続し、インターネットにアクセスします。

Raspberry Piを常時ONにしておくと電気代がかかりますので、必要なときにRaspberry Piの電源がONになるようデジタルプログラムタイマーを接続しました。3時間ごとにタイマーが電源をON/OFFします。

温湿度センサ(DHT20)は、ボックス下の穴から外に出しています。ボックス内は機器で熱がこもり、正確な気温が計測できないためです。DHT20はI2C通信でRaspberry Piに温度データを送信します。

土壌湿度センサ(YL-69)もボックスの下穴から外に出し、プランターの土に刺しています。

YL-69は土の水分量に応じて電圧値が変化します。この電圧値をA/Dコンバータがデジタル値に変換して、Raspberry Piへ送信します。

データ計測、Googleスプレッドシート書き込みのプログラムはPythonで書きました。このPythonスクリプトを3時間おきに実行しています。

Googleスプレッドシートがこちら↓

3時間おきの計測データが次々と蓄積されていきます。毎日の気温、湿度、土壌水分量がどのように変化しているかが一目瞭前ですね。

製作方法

システムの製作方法について大まかに解説していきます。それぞれの要素については、別記事で詳細に書いていますので、今回は割愛させて頂きます。

準備したもの

今回のシステム構築には、以下のものを準備しました。

  • Raspberry Pi 3 model B
  • 温湿度センサ DHT20
  • 土壌湿度センサ YL-69
  • A/Dコンバータ MCP3208
  • ブレッドボード
  • ジャンパワイヤ

防水ケース類は上記に含めていません。こちらの記事で防水ケース類を紹介していますので、興味のある方はぜひご覧ください。

システム構成

Raspberry Piで気温・湿度・土壌水分を計測。Wifi経由でRaspberry Piをインターネットに繋ぎ、Google Drive上のGoogleスプレッドシートに計測データを書き込み。PCやスマホでGoogleスプレッドシートを確認する仕組みです。

回路図

Raspberry PiとDHT20、YL-69、MCP3208との接続方法は下図の通りです。

Pythonサンプルコード

プログラムはPythonで書いています。まずは全コードを載せます。

import spidev
import smbus
import RPi.GPIO as GPIO
import datetime
from time import sleep
import gspread

#Googleスプレッドシート
key_name = '***********.json'
sheet_name = 'temp_data'

Vref = 3.3

# I2C設定
i2c = smbus.SMBus(1)
address = 0x38

set = [0xAC, 0x33, 0x00]

dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

# DHT20データ取得関数
def readTemp():
    # 測定開始
    sleep(0.01)
    i2c.write_i2c_block_data(address, 0x00, set)
    
    # データの読み込み
    sleep(0.08)
    dat = i2c.read_i2c_block_data(address, 0x00, 0x07)
    
    # データ変換
    hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
    tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
    
    # 物理量変換
    hum = hum / 2**20 * 100
    tmp = tmp / 2**20 * 200 - 50

    return hum, tmp

# 初期チェック
sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)

if ret != 0x18:
    exit

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)

spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz

sleep(10)
aveVolt = 0
aveHum = 0
aveTmp = 0

for i in range(10):
    # YL-69データ取得
    adc = spi.xfer2([0x06,0x00,0x00])
    data = ((adc[1] & 0x0f) << 8) | adc[2]
    volt = Vref*data/4096

    # DHT20データ取得
    hum, tmp = readTemp()

    aveVolt = (aveVolt * i + volt)/(i+1)
    aveHum = (aveHum * i + hum)/(i+1)
    aveTmp = (aveTmp * i + tmp)/(i+1)
    voltStr = "Volt = " + str(aveVolt) + "V"
    humStr = "Humidity = " + str(aveHum) + "%"
    tmpStr = "Temperature = " + str(aveTmp) + "'C"
    
    print (voltStr)
    print (humStr)
    print (tmpStr)
    
    sleep(1)


spi.close()
GPIO.cleanup()
 
#Googleスプレッドシートに書き込み
gc = gspread.service_account(filename= key_name)
 
wks = gc.open(sheet_name).sheet1
rowNum = wks.row_count + 1
wks.add_rows(1)
wks.update_cell(rowNum, 1, str(datetime.datetime.now()))
wks.update_cell(rowNum, 2, str(aveVolt))
wks.update_cell(rowNum, 3, str(aveHum))
wks.update_cell(rowNum, 4, str(aveTmp))

ここからは各要素について解説していきます。

温湿度センサ DHT20から温度・湿度データを取得

DHT20からI2C通信でデータを取得します。下記コードは、DHT20に関する部分の抜粋です。

# I2C設定
i2c = smbus.SMBus(1)
address = 0x38

set = [0xAC, 0x33, 0x00]

dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

# DHT20データ取得関数
def readTemp():
    # 測定開始
    sleep(0.01)
    i2c.write_i2c_block_data(address, 0x00, set)
    
    # データの読み込み
    sleep(0.08)
    dat = i2c.read_i2c_block_data(address, 0x00, 0x07)
    
    # データ変換
    hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
    tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
    
    # 物理量変換
    hum = hum / 2**20 * 100
    tmp = tmp / 2**20 * 200 - 50

    return hum, tmp

# 初期チェック
sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)

if ret != 0x18:
    exit


# DHT20データ取得
hum, tmp = readTemp()

初期チェック→測定開始→データ読み取り→データ格納→温度・湿度に変換といった流れとなります。

I2C通信にはsmbusライブラリを使用していますので、コード自体はそれほど長くないと思います。

下記の記事でDHT20の使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。

土壌湿度センサ YL-69から土壌湿度データを取得

YL-69はA/Dコンバータ MCP3208を経由してSPI通信でデータ取得しています。下記コードは、YL-69に関する部分の抜粋です。

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)

spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz

# YL-69データ取得
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
volt = Vref*data/4096

spi.close()
GPIO.cleanup()

spidevライブラリを使用していますので、コード自体はシンプルです。

YL-69は通電し続けると電極が錆びてしまいますので、プログラムが動作していないときはYL-69への通電を停止するよう、最後にGPIO.cleanup()を記述しました。

下記の記事でYL-69の使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。

10秒間の平均データを記録

記録するデータは10秒間の平均値としました。

aveVolt = 0
aveHum = 0
aveTmp = 0

for i in range(10):
    aveVolt = (aveVolt * i + volt)/(i+1)
    aveHum = (aveHum * i + hum)/(i+1)
    aveTmp = (aveTmp * i + tmp)/(i+1)
    voltStr = "Volt = " + str(aveVolt) + "V"
    humStr = "Humidity = " + str(aveHum) + "%"
    tmpStr = "Temperature = " + str(aveTmp) + "'C"
    
    print (voltStr)
    print (humStr)
    print (tmpStr)
    
    sleep(1)

Googleスプレッドシートに計測データを書き込み

計測した温度・湿度・土壌水分量データをGoogle Sheets APIを使ってGoogleスプレッドシートに書き込みます。下記コードは、Googleスプレッドシートへの書き込みに関する抜粋です。

#Googleスプレッドシート
key_name = '***********.json'
sheet_name = 'temp_data'

#Googleスプレッドシートに書き込み
gc = gspread.service_account(filename= key_name)
 
wks = gc.open(sheet_name).sheet1
rowNum = wks.row_count + 1
wks.add_rows(1)
wks.update_cell(rowNum, 1, str(datetime.datetime.now()))
wks.update_cell(rowNum, 2, str(aveVolt))
wks.update_cell(rowNum, 3, str(aveHum))
wks.update_cell(rowNum, 4, str(aveTmp))

「temp_data」というGoogleスプレッドシートを作成し、これに計測データを書き込んでいます。

計測データと合わせて計測時間も書き込みました。

ここで、コードをただ書いたのでは、Googleスプレッドシートにデータを書き込むことは出来ません。

Google Cloud PlatformというGoogleが提供するクラウドコンピューティングサービスでの設定が必要となります。

下記の記事でGoogleスプレッドシートへの書き込み方法を解説していますので、詳しく知りたい方はぜひご覧下さい。

cronでPythonスクリプトを3時間ごとに実行

3時間ごとのGoogleスプレッドシートへの書き込みは、cronを使用する方法を用いました。

ターミナルソフトからcrontabファイルを開き設定します。

crontabファイルは以下のコマンドを打つことで開くことができます。

crontab -e

3時間おきに作成したPythonスクリプトを実行するよう設定しました。

0 */3 * * * /bin/python3 ******.py

下記の記事でcronの使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。

まとめ

Raspberry Piで計測した温度をGoogleスプレッドシートに自動で記録し、インターネット上から確認出来るシステム構築について解説しました。

実際に我が家で、このシステムを運用しています。温度記録が全自動になり、とても助かっています。

興味を持たれた方は、ぜひ参考にして下さい。

最後までお読み頂きありがとうございました。