Raspberry Piで計測したデータがLINEで定期的に送信されてきたら、家庭菜園などデータ管理に便利ですよね。
本記事では、Raspberry Piで計測したデータを「LINE Notify」というサービスを使ってスマホへ送信。更にcronというLinux機能で定期的に送信実行する方法について解説します。
私は温湿度センサDHT20と土壌湿度センサYL-69を使って、家庭菜園の気温・湿度・土壌水分計測に用いていますので、この例を基に解説していきます。
それでは始めましょう!
準備したもの
- Raspberry Pi 3 model B
- 温湿度センサ DHT20
- 土壌湿度センサ YL-69
- A/Dコンバータ MCP3208
- ブレッドボード
- ジャンパワイヤ
システム構成
Raspberry Piで気温・湿度・土壌水分を計測。Wifi経由でRaspberry Piをインターネットに繋ぎ、LINE Notifyへデータ送信リクエスト。LINE Notifyがスマホへデータを送信する仕組みです。
回路図
Raspberry PiとDHT20、YL-69、MCP3208との接続方法は下図の通りです。
LINE Notifyとは
LINE Notifyについては、別記事で解説していますので、本記事ではPythonでのLINE Notifyの使い方を中心に解説します。
トークンを発行する
LINE Notifyを利用するにはまずトークン発行が必要です。
LINE Notifyのホームページからログインし、トークンを発行しましょう。
PythonでのPOSTメソッドを使ったリクエスト送信方法
POSTメソッドを使って計測データを送信するPythonスクリプトは以下の通りです。
messageに送信したい計測データを設定して下さい。
line_notify_token = '****************************'
line_notify_api = 'https://notify-api.line.me/api/notify'
message = '計測データ'
headers = {'Authorization': 'Bearer ' + line_notify_token}
data = {'message': message}
requests.post(line_notify_api, headers = headers, data = data)
Pythonスクリプト
気温・湿度はDHT20、土壌湿度センサはYL-69を使って計測しています。
import spidev
import smbus
import RPi.GPIO as GPIO
import requests
from time import sleep
#LINE Notify
line_notify_token = '******************************'
line_notify_api = 'https://notify-api.line.me/api/notify'
Vref = 3.3
# I2C設定
i2c = smbus.SMBus(1)
address = 0x38
set = [0xAC, 0x33, 0x00]
dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
# LINEへメッセージを送信する関数
def send_line_message(notification_message):
headers = {'Authorization': 'Bearer ' + line_notify_token}
data = {'message': notification_message}
requests.post(line_notify_api, headers = headers, data = data)
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):
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
volt = Vref*data/4096
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)
messageStr = voltStr + "\n" + humStr + "\n" + tmpStr
send_line_message(messageStr)
spi.close()
GPIO.cleanup()
DHT20、YL-69の使い方については別記事で解説していますので、ここでは割愛させて頂きます。
cronで3時間おきにPythonスクリプト実行
作成したPythonスクリプトを定期的に実行するため、crontabファイルに設定を追加していきます。
crontabファイルは以下のコマンドを打つことで開くことができます。
$ crontab -e
今回は3時間おきにPythonスクリプトを実行するようにしました。
0 */3 * * * /bin/python3 ***.py
これで時間になったらPythonスクリプトが実行されるはずです。
LINEで計測データ受信
スマホのLINE画面です。3時間おきに計測データが受信出来ていますね。
まとめ
Raspberry Piで計測したデータを「LINE Notify」を使ってスマホへ送信。更にcronで定期的に送信実行する方法について解説しました。
私は温湿度センサDHT20と土壌湿度センサYL-69の計測データをスマホで確認するのに活用しています。
興味を持たれた方は是非挑戦してみて下さい。
最後までお読み頂きありがとうございました。