
第5回ではBlynkを使って、スマートフォン側からRaspberry Piのシャットダウンを実行しました。第6回ではドアや窓に開閉センサーを取り付け、ドアが開いたらスマートフォンにPUSH通知で知らせるようにします。
今まではスマートフォン側のアプリの操作がトリガーとなり、Raspberry Pi上でプログラムを実行させていましたが、今回は逆に、Raspberry Pi側のセンサーがトリガーとなり、スマートフォンに通知しなくてはなりません。そこで今回はBlynkにプログラムを追加します。
Blynkのインストールやセットアップ手順については第1回〜第5回までの記事で解説しています。
<使用する開閉センサー>
ドアや窓が開閉したことを知るには、スイッチを使うのが簡単です。マイクロスイッチは押されているときはオン(オフ)、押されていないときはオフ(オン)になるので、開閉部に取り付けることで開閉状態がわかります。しかし取り付け位置や動く方向なども考慮しなければなりません。それよりも、もっと簡単なのがリードスイッチです。リードスイッチは磁石でオン/
オフするスイッチです。


磁石が近づくとオン、磁石が離れるとオフになります。これなら前後に開けるドアでも、横に開ける窓でも、どちらでも対応できます。壁側にスイッチを取り付け、動く方に磁石を取り付ければ、ドアが開いたときにスイッチがオフになるセンサーとして使用できます。
<Raspberry Piとの接続>
今回は例として GPIO 25 をリードスイッチに接続します。リードスイッチの片側をGPIO 25に接続し、もう片方をGNDに接続します。
プログラムでは、Raspberry Pi内蔵のGPIO 25のプルアップ抵抗をプルアップさせます。こうすることで、
ドアが開いた場合は、
ということは、GPIO 25の状態が0から1に変わったことが検知できれば、ドアが開いたときだけ反応することができます。
<Blynkの修正>
Blynkのプログラムの修正は第3回でも行っていますので、こちらの記事も参考にしてください。blynk-library/linux/main.cpp を編集し、以下の紫色の行を追加します。
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の編集が終わったら、再コンパイルします。
<ウィジットの設定>
プログラムの準備ができたら、次はアプリ側にウィジットを配置していきましょう。
「Push Notifications」を追加します。

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

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


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

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


この通知は他のアプリを起動していたり、ロックしている状態でも受け取ることができます。どのくらいの期間この通知が受け取れるのかは未確認ですが、Blynkのアプリを閉じてしまっても受け取れるというのは便利です。
以上ここまで6回にわたってBlynkによるIoTの実験を行ってきましたが、こういった便利なサービスを使用すれば、簡単に独自のシステムを作ることができます。今回紹介したBlynk以外にも様々なIoTクラウドサービスがありますので、ぜひいろいろと挑戦してみてください。
連載 IoTサービス「Blynk」を使ってRaspberry Piをスマホからコントロールしよう
<使用する開閉センサー>
ドアや窓が開閉したことを知るには、スイッチを使うのが簡単です。マイクロスイッチは押されているときはオン(オフ)、押されていないときはオフ(オン)になるので、開閉部に取り付けることで開閉状態がわかります。しかし取り付け位置や動く方向なども考慮しなければなりません。それよりも、もっと簡単なのがリードスイッチです。リードスイッチは磁石でオン/
オフするスイッチです。


磁石が近づくとオン、磁石が離れるとオフになります。これなら前後に開けるドアでも、横に開ける窓でも、どちらでも対応できます。壁側にスイッチを取り付け、動く方に磁石を取り付ければ、ドアが開いたときにスイッチがオフになるセンサーとして使用できます。
<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/linuxBlynkを起動します。
$ make clean all target=raspberry
$ cd ~/blynk
$ sudo ./blynk --token=自分のAUTH TOKEN
<ウィジットの設定>
プログラムの準備ができたら、次はアプリ側にウィジットを配置していきましょう。
「Push Notifications」を追加します。

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

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


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

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


この通知は他のアプリを起動していたり、ロックしている状態でも受け取ることができます。どのくらいの期間この通知が受け取れるのかは未確認ですが、Blynkのアプリを閉じてしまっても受け取れるというのは便利です。
以上ここまで6回にわたってBlynkによるIoTの実験を行ってきましたが、こういった便利なサービスを使用すれば、簡単に独自のシステムを作ることができます。今回紹介したBlynk以外にも様々なIoTクラウドサービスがありますので、ぜひいろいろと挑戦してみてください。
連載 IoTサービス「Blynk」を使ってRaspberry Piをスマホからコントロールしよう
- 第1回 IoTサービス「Blynk」を導入しよう
- 第2回 スマホからLチカをやってみよう
- 第3回 CPUの温度/周波数/負荷状態を見よう
- 第4回 温度センサーを接続してグラフにしよう
- 第5回 スマホからRaspberry Piをシャットダウンしよう
- 第6回 ドアが開いたらスマホにPUSH通知させよう
ありがとうございます。
mainに追記してmakeすると
エラーになってしまうのですが、
紫色の追記以外に何か必要な作業があれば、
教えて頂けないでしょうか。
宜しくお願いします。