はじめに
こんにちは!!!会津大学学部二年のHAMADAです。 このブログはAizu Advent Calendar 2022 17日目のブログです。 会津では、雪も積もり始めました。寒いのでお風呂にゆっくり浸かりたいものです。
さて、今回はラズパイとLINEの連携の話です。
目的・動機
お風呂が溜まったことをLINEに通知してくれたら嬉しいなぁとずっと思っているので、足掛かりとなるシステムを作ってみました。 実際に運用できるようにもしたいですね。
使用したもの
Raspberry Pi 4 Model B 4GB
供給がそろそろ追いつくみたいですね。
土壌センサー
水があるか無いかを調べるのには十分すぎる精度でした。
MCP3008
ADコンバータです。
LINE Notify
LINE Botより汎用性には乏しいが通知する分には十分
-
インデントがぁぁぁぁ。ツールとしては便利だと思います。
百均のペン立て
水を貯めるのにちょうど良くて便利でした。
湿潤センサーのデータを取れるようにする
セットアップ
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よりも簡単にできる印象を受けました。センサーを使った開発などをきちんとやったことがなかったのでとてもやっていて新鮮でした。実際にお風呂で使えるように、電源を電池にしてみたり、水からラズパイを守ったりとまだまだ改良の余地があるので頑張りたいと思います。ここまで読んでいただきありがとうございました。何かの参考になれば幸いです。次回またよろしくお願いいたします!!!
所属サークル
私のTwitter
私のgithub