3Dプリント Arduino プログラミング 工作 電子工作

ドアの鍵をかけるとLINEに通知してくれる装置をESP8266で製作

カギかけたっけ?で戻りたくない

外出してしばらくたってから「そういえばドアの鍵かけたっけ?」と不安になっていったん戻ることってありますよね。

急いでる時ほどカギを閉めたかどうか覚えていないので困ります。時間がなくて不安なまま行っちゃうときもありますよね。

若いうちは笑い話ですみますが、だんだん年取ってくると忘れ物も増えて洒落にならなくなってきます。

そこで、カギをかけたかどうかを通知してくれる装置を作りました。

ESP8266 +  LINE Notifyで通知

今回は割とすんなりできたのでとっとと紹介します。

原理は簡単で、カギの状態をマイコンESP8266で監視して、カギがかかったらLINE NotifyのAPIを使ってプッシュ通知します。

ただ、ウチの玄関にはちょうど良い位置にコンセントがないので電池駆動にする必要があります。

前回の記事でEPS8266の電池駆動時間を計りましたが、点けっぱなしだと40時間程度したもちません。

電池駆動したESP8266(ESPr Developer)の3.3vピンの電圧をHTTPSRedirectを使って1分ごとにGoogle Spread Sheetに書き込んだ話

ESP8266を電池で動かしたときに、3.3V端子が何ボルトまで下がったら止まるのか、それはだいたい何時間後なのかを知るために、3.3V端子の電圧をGoogleスプレッドシートに記録してみました。GoogleスプレッドシートへのアクセスにはHTTPSRedirectというライブラリを使用しました

続きを見る

そこで、普段はESP8266をディープスリープさせておき、カギが掛けられたときだけ起こしてLINEに通知させるようにしました。

手元の実測でLINEメッセージをWifi経由で送るときは最大70mAくらい、アイドル時でも40mAくらい使っていました。

ディープスリープにすると消費電流が数十μA程度まで落ちました。家の出入りはせいぜい一日数回ですから、かなり電池のもちは良くなりそうです。

ディープスタープからの復帰にはRESET端子をGNDに落とします。いったんGNDに落としてから離れたときがトリガーです。

ですから、RESET-GND間にマイクロスイッチを入れて、カギの出っ張りで押すようにすれば、カギをかけた瞬間にトリガーが働きます。

全体的にはこんな感じのシステムになります。

LINE Notifyはライブラリで楽勝

2020年現在で通知系のアプリを作るとすると、やはり第1候補はLINEですよね。まぁ人によってはSlackとかFB Messangerとかの人も居ると思いますが、まぁ一般人ならLINEに通知が来るのが一番便利でしょ。

私が知っているLINEのAPIにはLINE NotifyとLINE Messagingの二種類があります。

Messangingの方が高機能ですが、通知だけならNotifyの方が簡単で便利だと思います。

私は以前からデベロッパー登録をしてあったので、LINE Developersのサイトへ行って新しくNotifyのTOKENを発行しました。

LINE Notify

LINE Developers

ESP8266からLINE Notify APIを叩くのは、Githubに専用のライブラリがありました。

Line-Notify-ESP8266

試しにインストールしてみるとサンプルコード一発で動作したので、即採用決定。

このライブラリは高機能でテキストメッセージだけでなく、LINEスタンプや画像のURL、SDカードの画像を送ったりできます。

今回はテキストメッセージだけで良いのでサンプルコードから必要な部分だけを切り出して使いました。

また、前回のプロジェクトでやったように3.3V端子の電圧を測定して、メッセージと一緒に送信します。

電圧が一定値を下回ったらメッセージに警告を加えるようにもしました。

プログラムは、起動したらLINEメッセージを送って、ESP.deepSleep( 0 ); でディープスリープモードに入るというシンプルなものです。プログラムでカギの状態を監視しているわけではありません。

カギの開け閉めによってRESET端子がGNDに接続・切断すると再起動してLINEメッセージを送信します。

ソースコード。例によってwifi SSIDとパスワード、LINE TOKENを設定する必要があります。

#include "LineNotifyESP8266.h"
#include <ESP8266WiFi.h>

ADC_MODE(ADC_VCC); //to watch 3.3V pin voltage

#define WIFI_SSID ""
#define WIFI_PASSWORD ""
#define LINE_TOKEN ""


void setup()
{

  Serial.begin(115200);
  Serial.flush();
  Serial.println("connecting wifi");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(200);
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  LineNotifyHTTPClient net;
  lineNotify.init(&net, LINE_TOKEN);

  uint8_t status;
  int v3 = ESP.getVcc();//voltage of 3.3v pin
  String vcc_3v3 = String(float(ESP.getVcc()) / 1000) + "V";
  Serial.println( "3.3V:>>"  + vcc_3v3);
  String MSG = "THE DOOR IS LOCKED! " + vcc_3v3;
  if (v3 < 3300) {
    MSG = MSG + "!!! WARNING !!! BATTERY LOW !!!";
  }
  status = lineNotify.sendLineMessage(MSG);
  if (status == LineNotifyESP8266::LineStatus::SENT_COMPLETED)
  {
    Serial.println("Send text message completed");
    Serial.println("Text message limit: " + String(lineNotify.textMessageLimit()));
    Serial.println("Text message remaining: " + String(lineNotify.textMessageRemaining()));
    Serial.println("Image message limit: " + String(lineNotify.imageMessageLimit()));
    Serial.println("Image message remaining: " + String(lineNotify.imageMessageRemaining()));
  }
  else if (status == LineNotifyESP8266::LineStatus::SENT_FAILED)
    Serial.println("Send text message was failed!");
  else if (status == LineNotifyESP8266::LineStatus::CONNECTION_FAILED)
    Serial.println("Connection to LINE sevice faild!");
  else if (status == LineNotifyESP8266::LineStatus::NOT_INITIALIZED)
    Serial.println("Line notify was not initialized!");
  Serial.println();

  lineNotify.end();

  Serial.println("GO TO SLEEP.....");
  ESP.deepSleep( 0 );

  // スリープモード移行用待機処理
  delay( 1000 );
}

void loop()
{
}

はてな

LINE Notifyでの改行の仕方が分からない!

ひとつ困っているのが、LINE Notifyのメッセージで改行する方法が分からないことです。

LINEでは "\n" を入れれば改行できるはずなのですが、どうにもうまくいきません。

調べても分からないのでとりあえず放置してあります。

ケースは3Dプリンタで製作してマグネットでドアに固定

ケースというか、土台?は図のような形になっています。

スイッチの位置決めが楽で、かつ振動でずれたりしないように、監視対象のカギの外径にぴったりした枠を付けています。

マイクロスイッチはネジで固定。カギの高さに合うようにゲタを履かせています。

カギを開けるとマイクロスイッチが押されてRESET端子がGNDに繋がります。カギをかけるとRESETがGNDから離れ、ディープスリープが解除され、LINEでメッセージが送信されます。

ESPr Developerには取付穴などがないので、基盤を差し込んで固定できるブラケットも作りました。

電池ボックスとブラケットは両面テープとグルーガンで固定しています。

裏側はマグネット用の凹みを付けてあり、そこに薄型のネオジム磁石を瞬間接着剤で貼り付けています。

さすがはネオジム磁石。手で外すのにちょっと苦労するほどの力があります。

バタンと閉まるドアではないので固定力は十分です。

今は部品がむき出しですが、しばらく使って問題がなければフルカバーのケースを作ろうと思います。

ちなみに3DプリンタはPrusa i3 MK3Sを使っています。とてもいいです。今はちょっと進化してMK3S+になってるみたいです。

存在を意識しなくなってからが本番?

とりあえず今は順調にを動いています。こういうものは生活に溶け込んでからが勝負なので、とにかく使っていくことにします。

それにしても、こんな小さなマイコンでこのような事ができるなんて凄い時代になったなぁと思います。

【追記】1ヶ月半で電池がなくなりました

鍵チェッカーの電池は1ヶ月半でなくなった

以前作った鍵を掛けるとLINEに通知してくれる装置。約1ヶ月半で電池がなくなりました

続きを見る

-3Dプリント, Arduino, プログラミング, 工作, 電子工作