はじめに
我が家のインターホンは親機が2階にあり、1階にいると呼び出し音が聞こえず、しばしば来客に気づかないことがありました。なのでインターホンの呼び出しをLINEに通知して、確実に気づくようにしました。また、RaspberryPiPicoWなどの部品は壁の中に隠し、外側からは改造がわからないようにしました。
方針
検知方法
インターホンはアイホンJQ-1MEです。上位モデルであれば移報接点付きのものや、さらに上位のモデルであればスマートフォン連動できるものがあるのですが、このモデルにはありません。なのでRaspberryPiPicoWがどうにかしてインターホンの呼び出しを検知する必要があります。
考えられる方法はいくつかあります。
- 呼び出し音を音センサーで検知する
- 補助音響用の端子の電圧変化を検知する
- 画面の明るさを明るさセンサーで検知する
- 玄関子機と接続されている通信線の電圧変化を検知する
この中から私は玄関子機と接続されている通信線の電圧変化を検知する方法を取りました。音や明るさセンサーを外側に取り付けたくはなく、また、補助音響用の端子の電圧変化を検知する良い方法が思いつかなかったためです。
通信線は玄関子機との映像通信と玄関子機の電源を兼ねており、映像通信を行っているときに18V、そうでない場合は12Vの直流電圧がかかっています。この電圧をRaspberryPiPicoWのAD変換で検知できる電圧まで分圧器を使って1/6降下させます。
この信号線で映像を通信しているため、本当は外部に回路を繋げるべきでないのですが、分圧器の抵抗値を大きくし、なるべく影響が少なくなるようにしました。実際ノイズなどの影響は出ていないのでいいでしょう。
電源
RaspberryPiPicoWの電源はインターホンの基盤からはんだづけして無理やり引っ張ってきます。
電池やUSB給電なども考えましたが、壁の内側だけで完結させたいと思い、基盤内でAC-DC変換されたところを探し、DC18Vを取りました。RaspberryPiPicoWは電源として利用できる電圧は1.8Vから5.5Vまでなので、DC-DCコンバーターでそこまで降圧します。
構成
- インターホン(アイホンJQ-1ME)
- RaspberryPiPicoW
- 抵抗器
- 51kΩ
- 10kΩ
- DC-DC コンバーター
RaspberryPiPicoWはmicropythonを用いて動かしています。micropythonの動かし方
Line Notify でアクセストークンを取得します。
コード
以下はmicropythonのサンプルコードです
import machine
import utime
import urequests
import network
pin = machine.ADC(0) #ADCピンを定義
led = machine.Pin("LED", machine.Pin.OUT)
ssid = 'YOUR-SSID' #wifi のssid(変更する)
password = 'YOUR-PASSWORD'#wifi のpass(変更する)
def line_send():
token = 'YOUR-TOKEN' # LINE Notifyのアクセストークン(変更する)
# メッセージをURLエンコード
message = "message=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%9B%E3%83%B3%E3%81%8C%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F"#インターホンがなりました
# リクエストを送信
response = urequests.post('https://notify-api.line.me/api/notify', headers={'Authorization': f'Bearer {token}','Content-Type': 'application/x-www-form-urlencoded'}, data=message)
response.close()
def brink(i):
#i 回点滅する
counts = 0
while counts < i:
led.value(1)
utime.sleep(0.2)
led.value(0)
utime.sleep(0.2)
counts += 1
#wifi接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
print(wlan.status())
break
max_wait -= 1
print('waiting for connection...')
utime.sleep(1)
# Handle connection error
if wlan.status() != 3:
brink(5)
print('ネットワーク接続に失敗しました')
machine.reset()
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
brink(3)
#1秒ごとに取得して、False->Trueに切り替わったらline_sendをする
stm_pin_status = False #平常時(low)でFalse
threshold = 39718 #閾値 2V (2/3.3*65535)
while True:
try:
pin_status = pin.read_u16()
if pin_status > threshold:
# high
if stm_pin_status == False: #直前がlow
line_send()
brink(2)
stm_pin_status = True
else:
# low
stm_pin_status = False
print(pin_status)
utime.sleep(1)
except Exception as e:
print(f"Error: {e}")
utime.sleep(5)
machine.reset() # エラー発生時にデバイスを再起動
Wi-fi の接続を行い、pinの電圧がlowからhighになった時、line notifyに"インターホンがなりました"という通知が送られるプログラムです。
Wifi接続に成功した時3回、失敗した時5回、LINEが送られた後2回ledが点滅します。
messageは"インターホンがなりました"という文字をurlエンコードしたものです。
これをmain.pyという名前でRaspberryPiPicoWに保存すると自動で実行されるようになります。
これで無事にインターホンの呼び出しをLINEで通知することに成功しました。
まとめ
私は電子工作を始めたばかりで、今回初めて使えるレベルのものができて満足しています。まだまだ成長したいので、電子工作のことやブログの書き方などアドバイス頂けるとありがたいです。
参考文献