2階建ての家に住んでいるのですが、自宅の2階に1人でいる時に1階で物音がして「あれ、誰か家に入ってきたかな?気のせいかな?」と不安になることがあります。なので家のドアが開いたかどうか簡単に知れる方法があるといいなと思っていました。
今日ちょうど知り合いの会社にいったら近接センサーの不用品があるということでもらえたので、上記の課題を解決してみることにしました。
全体像
できた物
ESP32のコード
近接スイッチもらった。こんな繊細とは思ってなかった。落としたら壊れるらしい pic.twitter.com/Prx0fONR7u
— とよし (@toyoshi) 2020年3月10日
4番ピンに近接センサーをつけて入力があればBluetoothに出力するというコードにしました。
#include <Arduino.h> #include "BluetoothSerial.h" BluetoothSerial SerialBT; //const char *pin = "0000"; int value; void setup() { //SerialBT.setPin(pin); SerialBT.begin("DOOR-CHECKER"); pinMode(4, INPUT); } void loop() { value = digitalRead(4); if(value == 0){ SerialBT.println(value); } delay(1000); }
このコードを書き込むとBluetoothデバイスとして認識され接続されます。感動。接続時に番号を要求されるときはSerialBT.setPin(pin);
を使ってできるっぽいです。今回は0000でやったら接続できて、1度ペアリングするとそのあとは要求されなくなった。この辺りの仕様はよくわからないままになっています。
Mac側のコード
io.gets
で入力を待って、入力があればAppleScriptで通知する感じです。Rubyで書きました。
serial_port = '/dev/cu.DOOR-CHECKER-ESP32SPP' io = File.open(serial_port,'r') loop{ if io.gets `osascript -e 'display notification "玄関のドアが開きました"'` end }
今後の課題
- ESP32をdeep sleepなどを使って省電力化する
- 今だとドアが開いている間は1秒毎に通知がくるので1度通知したら10分は通知しないとかにする
参考サイト
- RubyからMacの通知センターで通知する簡単な方法 (AppleScript) - Qiita https://qiita.com/zakuroishikuro/items/cfba3e7734036e389768
- IO#gets (Ruby 2.7.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/method/IO/i/gets.html
- arduino-esp32/BluetoothSerial.cpp at master · espressif/arduino-esp32 https://github.com/espressif/arduino-esp32/blob/master/libraries/BluetoothSerial/src/BluetoothSerial.cpp
- ESP32 Arduino: Serial communication over Bluetooth Hello World – techtutorialsx https://techtutorialsx.com/2018/03/09/esp32-arduino-serial-communication-over-bluetoth-hello-world/