Raspberry Piで計測したデータをLINEで定期的に確認する方法

Raspberry Pi

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

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社が提供しているLINE Notifyを使うとWebサービスからの通知をLINEで受信出来るようになります。

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スクリプト実行

cronとは、設定したスケジュールに従ってスクリプトを自動実行してくれるデーモン(常駐プログラム)です。「crontab」というコマンドでスケジュールを設定します。
cronの使い方は↓で詳しく解説しています。

作成したPythonスクリプトを定期的に実行するため、crontabファイルに設定を追加していきます。

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

$ crontab -e

今回は3時間おきにPythonスクリプトを実行するようにしました。

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

これで時間になったらPythonスクリプトが実行されるはずです。

LINEで計測データ受信

スマホのLINE画面です。3時間おきに計測データが受信出来ていますね。

まとめ

Raspberry Piで計測したデータを「LINE Notify」を使ってスマホへ送信。更にcronで定期的に送信実行する方法について解説しました。

私は温湿度センサDHT20と土壌湿度センサYL-69の計測データをスマホで確認するのに活用しています。

興味を持たれた方は是非挑戦してみて下さい。

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