ハイハイ店番を改造してAppleWatchに来店をLINE通知

店の奥で機械作業をしているとドアチャイムが聞こえず、お客さんを無駄に長く待たせてしまうことがあるのでこれをなんとかします。そこで来店があった際にかAppleWatchから通知が来るようにしました。ナショナル製(現Panasonic)ハイハイ店番改造します。

検知器(人感センサー) -> 本体ドアチャイム(ハイハイ店番) ->センサー出力整形 -> AVRマイコンESP-WROOM-02 -> Wifi -> LINE-> AppleWatchの流れ

※上記図ではIFFTTがApple Watchに通知するようになっています(以前の構成図です)が、2024年2月中旬からIFFTTのweb requestが有料化したのでIFFTTの利用をやめてLINE通知に切り替えました。

検知器(人感センサー)

赤丸の部分が30年前から設置されている検知器。店の奥にある事務所エリアにある本体と有線接続されています
検知器
センサーとつながっているドアチャイムユニット「ハイハイ店番」本体。右の小さい基盤は今回製作のもの
本体のカバーを外した様子。端子台から+12V、GND、センサー出力を取り出してマイコンボードに接続します

自動ドアの人感センサーは店の事務所区画に設置されているドアチャイムユニット「ハイハイ店番」に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

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秒の何とも微妙なタイムラグを経て腕時計が振動してくれます。