家庭菜園で毎日の温度をチェックすることは大切ですが、毎日計測し続けるのは大変ですよね。
今回、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スプレッドシートに自動で記録し、インターネット上から確認出来るシステム構築について解説しました。
実際に我が家で、このシステムを運用しています。温度記録が全自動になり、とても助かっています。
興味を持たれた方は、ぜひ参考にして下さい。
最後までお読み頂きありがとうございました。