HAMADAの語り草

興味のある技術のアウトプットをしたいと思います

お風呂の水位センサーを作るために、ラズパイからLINEに通知できるようにしてみた話

はじめに

こんにちは!!!会津大学学部二年のHAMADAです。 このブログはAizu Advent Calendar 2022 17日目のブログです。 会津では、雪も積もり始めました。寒いのでお風呂にゆっくり浸かりたいものです。

さて、今回はラズパイとLINEの連携の話です。

目的・動機

お風呂が溜まったことをLINEに通知してくれたら嬉しいなぁとずっと思っているので、足掛かりとなるシステムを作ってみました。 実際に運用できるようにもしたいですね。

使用したもの

  • Raspberry Pi 4 Model B 4GB

    供給がそろそろ追いつくみたいですね。

  • 土壌センサー

    水があるか無いかを調べるのには十分すぎる精度でした。

www.amazon.co.jp

  • MCP3008

    ADコンバータです。

akizukidenshi.com

  • LINE Notify

    LINE Botより汎用性には乏しいが通知する分には十分

  • Python

    インデントがぁぁぁぁ。ツールとしては便利だと思います。

  • 百均のペン立て

    水を貯めるのにちょうど良くて便利でした。

    湿潤センサーのデータを取れるようにする

セットアップ

interface wlan0
static ip_address=192.168.##.###/24
static routers=192.168.0.1

という風に設定する

GUIを使える場合は、ラズパイのネットワークマークを右クリックしてWireless & Wired Network Settings… からIPv4 Address と Routerをセットします。こっちの方が簡単にできる。

配線

データシートを見ながらやりました。

http://akizukidenshi.com/download/ds/microchip/mcp3008.pdf

見た目はこんな感じ

SPI通信をするための設定

$ sudo raspi-config を実行する

書いたコード

import time
import spidev

Vref = 3.334  

spi = spidev.SpiDev()

spi.open(0, 0)  
spi.max_speed_hz = 100000 

def readAdc(channel):
    adc = spi.xfer2([1, (8 + channel) << 4, 200])
    data = ((adc[1] & 3) << 8) + adc[2]
    return data

def convertVolts(data, vref):
    mois = (data * vref) / float(1023)
    return mois

if __name__ == '__main__':
    try:
        while True:
            data = readAdc(channel=0)
            mois = convertVolts(data, Vref)
            print("CH0 volts: {:.2f}".format(mois))

            time.sleep(2)

    except KeyboardInterrupt:
        spi.close()

LINEとの連携

今回はLINE Notifyを用いて、水が湿潤センサーに触れるとお湯が溜まったことを通知してくれるようにした。

LINE Notifyの設定

https://notify-bot.line.me/ja/にアクセスしてログインします。

右上の自分の名前>マイページを選択します。

トークンを発行するを押します。

アクセストークンは一度しか表示されないので必ずコピーしましょう。

実行するコードの作成

以下のようなコードになりました

# -*- coding:utf-8 -*-
import time
import spidev
import requests

import os

from dotenv import load_dotenv
load_dotenv()

# 発行されたトークンID
ACCESS_TOKEN =os.environ['ACCESS_TOKEN']
STR_NOTICE_MESSAGE = 'お湯張りができました'

Vref = 3.334 

spi = spidev.SpiDev()

spi.open(0, 0) 
spi.max_speed_hz = 100000  

def readAdc(channel):
    adc = spi.xfer2([1, (8 + channel) << 4, 200])
    data = ((adc[1] & 3) << 8) + adc[2]
    return data

def convertVolts(data, vref):
    mois = (data * vref) / float(1023)
    return mois

def fnc_line_notify():
    line_notify_api  =  "https://notify-api.line.me/api/notify"
    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
    data = {'message': f'{STR_NOTICE_MESSAGE}'}
    requests.post(line_notify_api, headers=headers, data=data)
    return

if __name__ == '__main__':
    try:
        while True:
            data = readAdc(channel=0)
            mois = convertVolts(data, Vref)
            print("CH0 mois: {:.2f}".format(mois))
            if mois < 1.8:
                fnc_line_notify()
                break
            time.sleep(2)

    except KeyboardInterrupt:
        spi.close()

.envファイルを同じディレクトリ内に作成し、ACCESS_TOKENとして保存しています。

load_dotenv()を使用し、os.environ['ACCESS_TOKEN']で取得しています。

moisが1.8を下回った時にfnc_line_notify() を呼び出して、LINEに通知する処理を行っています。

moisというのは、実際には電圧で湿潤センサーを水につけた際に電圧が1.8以下になっていたのでこういった扱いにしています。

デモ

例に倣って、gifを用いていますので見にくいところがあると思いますがご容赦ください。

感想と展望

LINE Notifyを使うのは初めてでしたが、LINE Botよりも簡単にできる印象を受けました。センサーを使った開発などをきちんとやったことがなかったのでとてもやっていて新鮮でした。実際にお風呂で使えるように、電源を電池にしてみたり、水からラズパイを守ったりとまだまだ改良の余地があるので頑張りたいと思います。ここまで読んでいただきありがとうございました。何かの参考になれば幸いです。次回またよろしくお願いいたします!!!

所属サークル

A-PxL@C101土曜西こ44b (@aizu_PxL) / Twitter

私のTwitter

HAMADA (@AHMOS_HMD) / Twitter

私のgithub

ahmos0 (HAMADA) · GitHub

参考リンク

101010.fun

notify-bot.line.me