プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

ラズパイで来客を通知する

最近はどこのマンションにもあるモニターホンですが、リビングから離れた部屋に居たり、イヤホンでテレビを見ていたりすると気が付かないことがあります。
そこで、ラズパイを使ってスマホに通知する仕組みを作りました。

モニターホンは来客があると、カメラでお客さんの姿を映します。
このとき液晶が明るくなるので、これをセンサーで検出しました。
このへんの話は、以前のCDSを使った話のそのままです。
s51517765.hatenadiary.jp

これによって、来客を検出したらLINEのメッセージを送ります。
LINE APIの使い方はこの辺で説明しています。
s51517765.hatenadiary.jp

もちろん、Slackやその他、メールなども応用できます。
s51517765.hatenadiary.jp

完成イメージ

モニターホンにラズパイと回路を設置します。
f:id:s51517765:20180324122054j:plain

工程 (じゃー~~n)

 (※脳内BGMタモリ倶楽部風にベートーベンのピアノ協奏曲第五番「皇帝」)

CDSの土台はTAMIYAの5mmの角棒を加工して作成しました。
500円ほどで買えて、カッターやのこぎり、ドリルなどで加工できて便利です。

タミヤ 楽しい工作シリーズ No.131 プラ材5mm角棒 6本入 (70131)

タミヤ 楽しい工作シリーズ No.131 プラ材5mm角棒 6本入 (70131)

ちなみに今回は、100円ローソンで見つけたのこぎりで切断しました。
f:id:s51517765:20180324122536j:plain

先端にドリルで半分ぐらいの深さまで穴を掘ります。
実際にCDSをはめ込みながら深さを調整します。
f:id:s51517765:20180324122943j:plain
f:id:s51517765:20180324123203j:plain

CDSの足にリード線をつけて埋め込みます。
本来は接着するのがベストですが、とりあえず動作確認からということでテープで止めているだけです。
今回は足を片側に2本とも出したので、ショートしないように気を付けます。
本来は両側に出す予定だったが、空けた穴が少し寄ってしまったのでこんな形に。

はんだ小手は今まで使っていた30Wのものから23Wに変えました。
Amazonでは温度が低すぎて使えない、という意見もありますがそんなことはないと思います。
(品番はKS-20Rと20Wのような名前なのに、実際には23Wと書かれている。)

goot 一般電気用はんだこて KS-20R

goot 一般電気用はんだこて KS-20R

今後はこちらをメインに使ってみようと思います。

プログラム

# -*- coding: utf-8 -*-
import wiringpi
import time
import requests
from datetime import datetime as dt
import token1
print("Start WiringPi!")

# プルアップ INPUT
collector_pin = 15 # 10番pin(GPIO15)
# OUTPUT
LED_pin =23 #16番pin(GPIO23)

# GPIO初期化
wiringpi.wiringPiSetupGpio()
# GPIOを入力モード(0)/出力モード(1)に設定
wiringpi.pinMode( collector_pin,0)
wiringpi.pinMode( LED_pin,1)

wiringpi.digitalWrite(LED_pin,0)

def send_line():
    url = "https://notify-api.line.me/api/notify"
    LINE_TOKEN=token1.LINE_TOKEN #トークンは別ファイル(token1.py)から読み込む
    headers = {"Authorization": "Bearer " + LINE_TOKEN}
    tdatetime = dt.now()
    message = 'お客さんだよ! '+tdatetime.strftime('%H%M%S')
    payload = {"message": message}
    r = requests.post(url, headers=headers, params=payload)

while(True):
    if (wiringpi.digitalRead(collector_pin))==1:
        #print("High")
        wiringpi.digitalWrite(LED_pin, 1)
    else:
        tdatetime = dt.now()
        print("来客!"+tdatetime.strftime('%H%M%S'))
        wiringpi.digitalWrite(LED_pin, 0)
        send_line()
        print("Send message!")
        time.sleep(10) #短い時間の間に複数回LINE を呼び出すと実行されないため
    time.sleep(1)

動作確認


Cds(明るさセンサー)で来客を通知する

f:id:s51517765:20180324124548p:plain

注意

tokenのキーを読み込ませるファイルを最初token.pyとしたら、なぜかErrorが。
何かしらの予約語と被ってしまったのでしょう。
突然WiringpiのErrorになってかなり迷ってしまった。
前にも似たようなことがあったなぁ。

Traceback (most recent call last):
  File "cds.py", line 2, in <module>
    import wiringpi
  File "/usr/local/lib/python3.4/dist-packages/wiringpi.py", line 28, in <module>
    _wiringpi = swig_import_helper()
  File "/usr/local/lib/python3.4/dist-packages/wiringpi.py", line 15, in swig_import_helper
    import imp
  File "/usr/lib/python3.4/imp.py", line 26, in <module>
    import tokenize
  File "/usr/lib/python3.4/tokenize.py", line 40, in <module>
    __all__ = token.__all__ + ["COMMENT", "tokenize", "detect_encoding",
AttributeError: 'module' object has no attribute '__all__'