はじめに
もうすぐ春ですね。
Raspberry Piと水分センサを使用して植物の水分を検知し、乾いている場合はMessaging APIで通知する仕組みを作りました。
本記事はRaspberry Piと水分センサを使用して、Messaging APIで通知する簡単レシピです。
構成
仕組み
水分センサを植物に取り付けてアナログ電圧を取得します。取得したアナログデータをデジタルデータに変換させて、しきい値で条件分岐を行い水分が少なかったら、Messaging APIで通知します。
Raspberry PiのGPIO端子はアナログデータの入力ができないため、デジタルデータに変換させてあげる必要があります。
今回はI2CデバイスとしてTexas Instruments社製のA/Dコンバーター「ADS1015」を使用します。また、その他のA/Dコンバーターとしては、「MCP3800」とかがよくRaspberry Piとの組み合わせで使われています。
ADS1015は、12ビットのデータに変換するため4096の数値まで扱えます
概要図
- 部品一覧
部品 | 値段 | 備考 |
---|---|---|
ブレッドボード | 270 | 1個 |
ジャンパー線(オス-メス) | 330 | 4本 |
ジャンパー線(オス) | 350 | 7本 |
抵抗1w10kΩ | 200 | 1個 |
ADS1015使用12ビット4チャンネルADコンバータ | 1,280 | 1個 |
GROVE - 水分センサ | 580 | 1個 |
合計3,010円 |
- 使用ソフト
名前 | 備考 |
---|---|
Python3 | インストール済み |
Adafruit_ADS1X15 | GitHubより取得 |
Messaging API | Developer Trial(※) |
(※)Messaging APIを検証用途で無料使用する場合は、「Developer Trial」または「フリー」プランより選択することができます。違いとしては「Developer Trial」の場合プッシュメッセージと応答メッセージが両方使えます。詳細については公式のプラン・料金をご確認ください。 |
はんだ付け
ADS1015を使用する場合はブレッドボードに取り付けるため、はんだ付けが必要です。
配線
Fritzingで作成した図になります。
※GROVE - 水分センサのパーツは見つからなかったので他のパーツを使用。
Messaging API
Messaging APIはLINEが公開しているAPIです。
Messaging APIはプッシュメッセージと応答メッセージがありますが、本記事のプログラムはプッシュメッセージを使ってRaspberry Piから通知します。
プッシュメッセージと応答メッセージ
プッシュメッセージとは、任意のタイミングでユーザーに送信するメッセージです。応答メッセージとは、ユーザーからのメッセージに対して応答するメッセージです。
前提条件
Messaging APIを使用するためにはLINEアカウントが必要です。
※また、PCでコンソールログインする場合は、LINEのアカウント設定で「ログイン許可」が有効になっている必要があります。
チャネルの作成
まずはじめに、コンソールにログインを行います。
クイックスタートを参考にしチャネルを作成します。なお、初回ログイン時のみ、LINE Developersコンソールで開発者アカウントを作成します。
LINEプラットフォームを利用するには、アプリがチャネルにリンクされていなければなりません。チャネルを作成すると、固有のチャネルIDが識別用に発行されます。チャネルには、名前、説明文、およびアイコン画像が必要です。
実装
前提条件
- I2Cの設定
水分センサなどのデバイスを利用する場合は、I2Cの設定が必要です。
I2Cの設定は以前書いたRaspberry Pi の基本の「I2Cの設定」を参照。
ライブラリ準備
※Pythonの環境変数に注意
RaspbianのPython(デフォルト)は「/usr/bin/python」のシンボリックリンクで2.7のPythonになっているため、Python3を使用する場合はPython3を指定するなど考慮が必要です。
- Pythonの環境変数確認(2.7系)
$ which python
- Pythonの環境変数確認(3系)
$ which python3
ADS1015の導入
Adafruit社よりADS1015のライブラリがGitHubで公開されているので、クローンしてインストールします。
- ADS1015をクローン
$ git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- ディレクトリを移動
$ cd Adafruit_Python_ADS1x15/
- セットアップスクリプトを実行
$ sudo python3 setup.py install
※ADS1015は「smbus」ライブラリを使用するが、最新のRaspbianを使用する場合は最初から含まれているので導入不要
line-bot-sdk-pythonの導入
Messaging API SDKとして各種ライブララリをpipでインストールします。
- pip3でインストール
$ pip3 install line-bot-sdk
- インストール確認
$ ls -l /home/pi/.local/lib/python3.5/site-packages/
プログラム(Python)
#! /usr/bin/env python3
# _*_ coding: utf-8 _*_
# ADS1015の関数を読み込む
import time, signal, sys
import Adafruit_ADS1x15
# Messaging APIのパスを通す
sys.path.append('/home/pi/.local/lib/python3.5/site-packages/')
# Messaging APIのモジュールをインポート
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError
# channel access tokenを指定
line_bot_api = LineBotApi('<channel access token>')
# user IDとプッシュメッセージを指定
def message1():
try:
line_bot_api.push_message('<to>', TextSendMessage(text='お水ください'))
except LineBotApiError as e:
# error handle
print("Error occurred")
# 計測の範囲を指定(1を指定した場合は-4.096Vから4.96Vまで計測可能)
GAIN = 1
abc = Adafruit_ADS1x15.ADS1015()
while True:
volts = abc.read_adc(0, gain=GAIN)
if volts >= 100:
print( "State with moistured : " + str(volts) + "V" )
elif volts < 100 and volts >= 1:
print( "Condition with reduced moisture : " + str(volts) + "V" )
else:
print( "No moisture condition : " + str(volts) + "V")
message1()
break
time.sleep(1)
※実際に運用するときは「time.sleep(N)」でNの値を調整したり、cronで定期的に動かすのがよさそうです。
実験
本プログラムの実行例になります。
応答メッセージ
自動応答メッセージを使えば、植物とあいさつしたりちょっとした会話ができます。
Channel基本設定ページより自動応答メッセージの「設定はこちら」をクリックします。
自動応答メッセージのページが表示されるので、こちらで設定ができます。
おはようと話しかけると、設定したメッセージを返してくれます。
さいごに
Raspberry Pi + 水分センサ + Messaging API = 面白い
電子工作は面白いです。はんだ付けから電子回路、Python、API、各種ライブラリ等色々学習できます。また、自分で作って想定した通りに動いたときはいいですね。
本プログラムもまだまだ改良の余地があるので、改善して色々やってみたいと思います。
- 気になること
Messaging APIのモジュールインポートが少し長い
→timeコマンドで計測すると、プログラム実行時の読み込みで2秒弱ぐらいかかっています。単純にMessaging API使うだけだったら、サンプルにあるようなcurlコマンドでスクリプトにした方が早かったです。あとで調べてみよう。