IMG_6616

第5回ではBlynkを使って、スマートフォン側からRaspberry Piのシャットダウンを実行しました。第6回ではドアや窓に開閉センサーを取り付け、ドアが開いたらスマートフォンにPUSH通知で知らせるようにします。

今まではスマートフォン側のアプリの操作がトリガーとなり、Raspberry Pi上でプログラムを実行させていましたが、今回は逆に、Raspberry Pi側のセンサーがトリガーとなり、スマートフォンに通知しなくてはなりません。そこで今回はBlynkにプログラムを追加します。

Blynkのインストールやセットアップ手順については第1回第5回までの記事で解説しています。

<使用する開閉センサー>

ドアや窓が開閉したことを知るには、スイッチを使うのが簡単です。マイクロスイッチは押されているときはオン(オフ)、押されていないときはオフ(オン)になるので、開閉部に取り付けることで開閉状態がわかります。しかし取り付け位置や動く方向なども考慮しなければなりません。それよりも、もっと簡単なのがリードスイッチです。リードスイッチは磁石でオン/
オフするスイッチです。

109049234109049234_o1

磁石が近づくとオン、磁石が離れるとオフになります。これなら前後に開けるドアでも、横に開ける窓でも、どちらでも対応できます。壁側にスイッチを取り付け、動く方に磁石を取り付ければ、ドアが開いたときにスイッチがオフになるセンサーとして使用できます。


<Raspberry Piとの接続>

今回は例として GPIO 25 をリードスイッチに接続します。リードスイッチの片側をGPIO 25に接続し、もう片方をGNDに接続します。

プログラムでは、Raspberry Pi内蔵のGPIO 25のプルアップ抵抗をプルアップさせます。こうすることで、
ドアが閉まっている
 ↓
スイッチはオン(導通)
 ↓
GPIO 25はGNDと繋がっている
 ↓
GPIO 25の状態はLOW (0)
となります。
ドアが開いた場合は、
ドアが開いている
 ↓
スイッチはオフ(開放状態)
 ↓
GPIO 25はプルアップされているので…
 ↓
GPIO 25の状態はHIGH (1)
となります。

ということは、GPIO 25の状態が0から1に変わったことが検知できれば、ドアが開いたときだけ反応することができます。

<Blynkの修正>

Blynkのプログラムの修正は第3回でも行っていますので、こちらの記事も参考にしてください。blynk-library/linux/main.cpp を編集し、以下の紫色の行を追加します。

#define DOOR_GPIO 25     // スイッチのGPIOポート
#define PUSH_BETWEEN 60   // 連続して反応するまでの間隔(秒)
void door_opened(void){
  static unsigned long last_push = 0;
  if(digitalRead(DOOR_GPIO) == 1) {
    if((time(NULL) - last_push) > PUSH_BETWEEN) {
      last_push = time(NULL);
      Blynk.notify("The door is opened!");
      BLYNK_LOG("PUSH!");
      delay(200);
    }
  }
}


int main(int argc, char* argv[])
{
    const char *auth, *serv, *port;
    parse_options(argc, argv, auth, serv, port);

    Blynk.begin(auth, serv, port);

    pinMode(DOOR_GPIO, INPUT);
    pullUpDnControl(DOOR_GPIO, PUD_UP);
    wiringPiISR(DOOR_GPIO, INT_EDGE_RISING, &door_opened);

    while(true) {
        Blynk.run();
    }

    return 0;
}

pinMode()でGPIOポートの入力モードにして、pullUpDnControl()でプルアップの設定をしています。PUD_DOWNとするとプルダウンになります。wiringPiISR()はGPIOポートの割り込み処理を行う命令で、INT_EDGE_RISINGと指定した場合は値が0から1に変わったときにdoor_opened()が呼び出されます。(INT_EDGE_FALLINGにすると1→0になります)

door_opened()が呼び出されると、Blynk.notify()が実行され、ここに記載のメッセージが通知されます。ドアが頻繁に開閉したり、スイッチのチャタリングなどで大量の通知が行かないように、前回送信してから60秒以内の場合は送信しないようになっています。この秒数を変更したい場合はPUSH_BETWEENの値を修正します。(15秒以下にはできません)
また、他のGPIOポートを使用したい場合はDOOR_GPIOの値を変更してください。

※メッセージに日本語を含めたところ、文字化けしてしまいました。正常に表示されない場合は半角英数字にしてみてください。

main.cppの編集が終わったら、再コンパイルします。
$ cd ~/blynk/blynk-library/linux
$ make clean all target=raspberry
Blynkを起動します。
$ cd ~/blynk
$ sudo ./blynk --token=自分のAUTH TOKEN

<ウィジットの設定>

プログラムの準備ができたら、次はアプリ側にウィジットを配置していきましょう。
「Push Notifications」を追加します。
IMG_6610

はじめて設定する場合はBlynkによる通知を許可するか聞いてきますので許可してください。(iOSの場合)
IMG_6611

Push Notificationsウィジットは特に設定する必要はありませんが、設定画面ではPRIORITY(優先度)を設定することもできます。
IMG_6613
IMG_6614

アプリの右上の三角ボタンをタップしてRaspberry Piに接続します。マークが四角に変わったら接続完了です。
IMG_6614B


<ドアを開けてみよう>

それではドアを開けてみましょう。ドアが開いたことを検知するとRaspberry Piのターミナルに「PUSH!」と出力され、同時にスマートフォンに通知が行きます。以下はiOSでの例です。
IMG_6615IMG_6616

この通知は他のアプリを起動していたり、ロックしている状態でも受け取ることができます。どのくらいの期間この通知が受け取れるのかは未確認ですが、Blynkのアプリを閉じてしまっても受け取れるというのは便利です。


以上ここまで6回にわたってBlynkによるIoTの実験を行ってきましたが、こういった便利なサービスを使用すれば、簡単に独自のシステムを作ることができます。今回紹介したBlynk以外にも様々なIoTクラウドサービスがありますので、ぜひいろいろと挑戦してみてください。


連載 IoTサービス「Blynk」を使ってRaspberry Piをスマホからコントロールしよう