店の奥で機械作業をしているとドアチャイムが聞こえず、お客さんを無駄に長く待たせてしまうことがあるのでこれをなんとかします。そこで来店があった際にかAppleWatchから通知が来るようにしました。ナショナル製(現Panasonic)ハイハイ店番改造します。
※上記図ではIFFTTがApple Watchに通知するようになっています(以前の構成図です)が、2024年2月中旬からIFFTTのweb requestが有料化したのでIFFTTの利用をやめてLINE通知に切り替えました。
検知器(人感センサー)
自動ドアの人感センサーは店の事務所区画に設置されているドアチャイムユニット「ハイハイ店番」にGND、+12V、センサー出力の3本でつながっています。
センサー出力整形
検知器からの出力は無人の状態で0V、赤外線を感知すると+10Vとなっています。マイコンに入力できる信号レベルは最大で5Vなので、検知器からの出力をCMOSシュミットトリガ4584で0-12Vの矩形に整形した後に74HC4049で0-5Vの電圧にレベルシフトさせています。
電源は「ハイハイ店番」からの12Vを利用しています。マイコンとレベルシフタに使う5Vは7805ではなくDC-DCコンバータBP5293-50を使用してみました。
3端子レギュレータとくらべて部品点数が減り効率も高く発熱も低め(12V->5Vに変換しているので3端子レギュレータの発熱がすごかった)ということで非常に便利です。
AVRマイコン ESP-WROOM-02
電源はUSBからではなく基板の10番ピンに対して外部から5Vを加えることになります。
その際ハマったのは基板上のチップダイオードD1を外して短絡しないとマイコンが動作しないということでした。
秋月電子の商品Q&Aページにも記載があり、「5V0端子を使用しなければいけない場合はD1を取り外し短絡することで外部電源使用時でも正常に起動できるようになります。
外部電源とUSB-UART接続を併用する場合はD1を取り外してください」とのことで、その通りに修正を加えたらUSB電源と外部電源どちらを使用しても動作するようになりました。
Wi-fi
時刻の取得はNTPClientを使用します。
営業時間中かどうかの判断のためにgetHours()で時間を取得しています。
店の営業時間中にはドアセンサーからの電圧を監視し、ドアが開いてセンサー入力ピンが0VになったらLINEに通知します。一回ドアが開いたらその後20秒間は何も反応をしないようにしました。
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ESP_Line_Notify.h>
//日本時間
#define JST 3600*9
// 転送レート
#define SERIAL_SPEED 115200
// Wi-Fi SSID
#define WLAN_SSID "xxx"//"xxx"
// Wi-Fi パスワード
#define WLAN_PASS "xxx"
IPAddress ip(192,168, xx, xx);
IPAddress gateway(192,168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress DNS(8, 8, 8, 8);
// ポート番号
#define PORT_NUMBER 80
//Line インスタンス
LineNotifyClient line;
// どあセンサーを接続するピン
const int sensorPin = 12;
// ledを接続するピン
const int ledPin = 16;
// リセットに信号を送るピン
const int resetPin = 5;
// HTTP接続ポート番号
const int httpPort = 80;
char sendData[256] = "";
WiFiClient client;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP,"ntp.nict.jp");
void(*resetFunc)(void) = 0;
void setup() {
digitalWrite(resetPin , HIGH);
// デジタル2番ピンを入力用として設定
pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(resetPin, OUTPUT);
// パソコンとのシリアル通信のポートを開ける
Serial.begin(SERIAL_SPEED);
// Wi-Fi設定
setupWiFi();
timeClient.begin();
timeClient.setTimeOffset(JST); // タイムゾーンのオフセットを設定
timeClient.update();
// Line設定
line.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}
void setupWiFi() {
WiFi.config(ip, gateway, subnet, DNS); //static_ip
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(3000);
}
for(int i=0; i <=15; i++){
digitalWrite(ledPin,HIGH);
delay(50);
digitalWrite(ledPin,LOW);
delay(50);
}
}
void loop() {
delay(100);
// 営業時間内なら稼働
if ( timeClient.getHours() >= 9 && timeClient.getHours() <= 20 ) {
// ドアセンサーの状態を取得
int sensorState = digitalRead(sensorPin);
if (sensorState == LOW) { // ドアオープン処理開始
line.message = "自動ドアが開きました";
LineNotifySendingResult result = LineNotify.send(line);
digitalWrite(ledPin, HIGH); //LEDインジケーターON
delay(30000); //30秒待つ
timeClient.update();
digitalWrite(ledPin, LOW); //LEDインジケーターOFF
while(sensorState == LOW) //センサーOFFを待つ
{
sensorState = digitalRead(sensorPin);//センサー情報更新
delay(100);
}
}//センサー反応時処理終了
}//営業時間時処理終
}
LINE
LINE Nofifyでトークンを発行します。
ログイン後マイページから[アクセストークンの発行(開発者向け)]下にある「トークンを発行する」をクリック、通知を送信するトークルームを選択します。今回の場合自分だけに送信するので「1:1でLINE Notfiyから通知を受け取る」を選択しました。
店舗に複数人スタッフがいる場合はグループに送信できますね。
発行されたトークンは再発行できないのでしっかりクリップボードにコピーしておいてコードに埋め込みます。
Apple Watch
以降特に設定の必要はなく、LINE通知が来るようになりました。
ドアが開いてからおよそ3秒の何とも微妙なタイムラグを経て腕時計が振動してくれます。