さくらのIoTモジュールで郵便ポスト検知 〜ユー・ガット・メール〜
我が家はポストのある階とよく出入りする入り口の階が違うので郵便物や不在届を何日も放置してしまいます。。。 🙁
そこで郵便物が届くとスマホに通知がくるシステムを構築しました!構築と言ってもいつもの手作り丸出しハンドメイドで安く解決です(*´ω`*)!
目次
概要
通信にはさくらのIoTプラットフォーム(β版)を使用しました。郵便ポストが空くことで光が入るのでCdSセルで検知します。光を検知するとさくらのIoT通信モジュールでプラットフォームにデータ送信します。Node-REDでプラットフォームのデータを受信してIFTTTにスマホ通知のリクエストをしています。
↓こんな感じ
構成
マイコンでCdSセルの電圧を測り光を検知します。CdSセルは光が当たると抵抗値が小さくなり、暗くなると抵抗値が大きくなります。CdSセルと抵抗(10kohm)で電圧(1.8V)を分圧しているので、明るくなるとCdSセルの電圧が下がり、暗くなると電圧が上がります。
マイコンとさくらのIoTモジュールはI2Cで通信します。
部品
-
マイコンAdafruit Pro Trinket – 5V 16MHz
-
レベルシフタ
-
CdSセル
-
抵抗(10kohm)
-
モバイルバッテリー
ON/OFFボタンがついていて負荷がなくてもスリープしないので便利です。
-
さくらの通信モジュール(LTE)β版 & ブレイクアウトボード
さくらのIoT Platform β版
α版でも利用していたさくらの通信モジュールのβ版 を使用しました。β版でも通信料は無料でLTE通信を使用しています。
以下はさくらの通信モジュール用ブレイクアウトボードのピン配列図です。
さくらの通信モジュールβ版のロジックI/Oピンは1.8V系のためマイコンとモジュールのI2C通信線の間にはレベルシフタモジュールを挿入しています。ハイレベル(マイコン)側の電源は5V、ローレベル(さくらの通信モジュール)の側の電源はLDO_OUT(1.8V)としました。
WAKE_INピンをGNDに落とすとモジュールがスリープモードに入り省エネなのですが残念ながらβ版では機能しません。。2017/4/18の正式版サービス開始にともない、ファームウェアアップデートでスリープモードが使えるようになりました!詳細は追記で!
Arduino IDE環境の設定
さくらの通信モジュールに接続したマイコンをArduino IDEでプログラミングします。専用ライブラリはArduino IDEのライブラリマネージャからインストールできます。
IDEメニュー [スケッチ] -> [ライブラリをインクルード] -> [ライブラリを管理…] -> “sakuraio”検索 -> [インストール]
ファームウェア更新
ファームウェアを最新のバージョンにアップデートします。マイコンとIoTモジュールをつないで(I2C or SPI)、プログラム例のFirmwareUpdate.inoをマイコンに書き込んでシリアルモニタ起動で自動的に更新の有無確認とアップデート実施がなされます。
Arduino IDEプログラム
CdSセルの電圧をマイコンのアナログピン(A0)で読んで前後の値変化で光を検知してデータ送信します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <SakuraIO.h> SakuraIO_I2C sakuraio; uint32_t cds = 0, cds_old = 0; int diff = 0; void setup(){ while((sakuraio.getConnectionStatus() & 0x80) != 0x80){ delay(1000); } } void loop() { //CdSセル電圧 int meas = analogRead(A0); if(meas < 400){ cds_old = cds; cds = meas; } diff = cds_old -cds; //CdSセルの電圧変化で送信 if(diff > 20){ sakuraio.enqueueTx(0, cds); sakuraio.enqueueTx(1, cds_old); sakuraio.send(); cds = 0; cds_old = 0; delay(120000); //2分待つ } delay(100); } |
WebSocket通信設定
さくらのIoT Platformの開発者向けページでデータ取得するための設定をします。
コントロールパネルにログインして使用のモジュールを登録し、通信サービスにWedSocketを選択します。手順の詳細は以下の通りです。
https://iot.sakura.ad.jp/developer/pdf/iot_platform_manual_beta.pdf
以下は登録したWebSocketサービスの画面です。モジュールから送信されたデータを確認できます。
WebSocketのURL(wss://〜)は後ほど使用しますので控えておきます。
IFTTTの設定
IFTTTとはif this then thatの略で各種Webサービス同士を連携して自分好みのWebサービス(アプレット)を生成することができます。ここではthis(トリガ)にwebにリクエストを受信できるMaker Webhooksを使用しthat(アクション)にスマホに通知を送るNotificationsを使用しました。
Maker Webhooksのイベント名は”Post”としました。以下をリクエストすると”ユー・ガット・メール”とスマホに通知が来ます。
https://maker.ifttt.com/trigger/Post/with/key/"MakerWebhook-key"
“MakerWebhook-key”にはMakerWebhookサービス登録時に得られる認証キーを入力します。
Node-REDの設定
Node-REDとはグラフィック化されたwebサービスや機能を線でつないで自分好みのアプリケーションを作成するオープンソースソフトウェアです。私のようにweb通信などに全く精通していない人間にとっては夢のツールです!いままではこの辺の通信関連はお母ちゃんに丸投げでしたから。。。。
Node-REDの導入
以下のサイトの事前準備の節の通りです!!!ありがたい 😀
IBMが提供するクラウドサービスのBluemix内でNode-REDアプリを作成・動作させます。Bluemixは初期登録から30日間完全無料で使用できます。
アプリケーション作成
さくらの通信モジュールからのWedSocketデータを受けてIFTTTにリクエストするアプリを作成します。
以下のノードを上の図のようにつなぐだけです。めっちゃ簡単だった 😛 !
深緑色のノード(msg.payload)はデバッグ用で接続したノードのメッセージ内容を右側のデバッグウィンドウで確認できます。
- websocket inノード
URLに先程さくらのIoT WebSocketサービスで取得したwss://〜を入力します。 - Jsonノード
受信したデータをObjectに変換します。 - switchノード
さくらのWebSocketのJSONはモジュールからの送信されるchannelsメッセージの他に接続の維持を確認するため、サーバーから定期的にkeepaliveメッセージが送信されます。そこでswitchノードでchannelsメッセージだけ通過させます。 - http requestノード
URLにIFTTTで作成したアプレットのリクエストURLを記載します。
Node-RED 参考
ポストに実装!
CdSセル以外を100均で買ったケースにいれて
ポストに設置!
これでポストに郵便物がくるとスマホに通知が来ます!
課題
通信モジュールのスリープ機能が現状使用できないのでバッテリーは2日ほどしか持ちません。。。ファームやサービスのバージョンアップを待ちます 🙂
あとはBluemixの無料期間が終了する前にNode-REDを自前のラズパイサーバに導入して完全無料環境にしないと。。。お母ちゃん
追記(2017/4/18)
ついに正式版サービスが開始されました!名前も「さくらのIoT Platform β版」から、「sakura.io」へ。
月額60円で毎月10,000回通信できるポイントが付与(ポイントは追加購入可能)!!ゲロ出るほど安い 😯 !!
しかもβ版モジュールは2018年3月まで無料で さらには100万ポイン
しかもしかも正式版開始に伴いファームウェアアップデートでWAKE_INピンによるスリープモードが使えるようになってました!
WAKE_IN:Highで通常動作
WAKE_IN:LowでDeep Sleepモードに入ります。
構成修正
マイコンPro Trinketのデジタル5ピンをレベルシフタ介してWAKE_INに接続してスリープモードのON/OFFを制御します。
Arduino IDEプログラム修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <SakuraIO.h> SakuraIO_I2C sakuraio; uint32_t cds = 0, cds_old = 0; int diff = 0; void setup(){ pinMode(5, OUTPUT); //スリープモードピン digitalWrite(5, LOW); //スリープモード ON } void loop() { //CdSセル電圧 int meas = analogRead(A0); if(meas < 400){ cds_old = cds; cds = meas; } diff = cds_old -cds; //CdSセルの電圧変化で送信 if(diff > 20){ while((sakuraio.getConnectionStatus() & 0x80) != 0x80){ digitalWrite(5, HIGH); //スリープモード OFF //通信確立まで待ち } //データ送信 sakuraio.enqueueTx(0, cds); sakuraio.enqueueTx(1, cds_old); sakuraio.send(); cds = 0; cds_old = 0; digitalWrite(5, LOW); //スリープモード ON delay(120000); //2分待つ } delay(100); } |
光検知で通信モジュールのスリープを解除してサーバーとの接続後にデータ送信してスマホに通知します。その後はスリープモードに入ります。
ポスト投函で光検知からスマホ通知まで数分ほどかかりますが さほどリアルタイム性は必要でなく長期運用が重視される案件ですので今回の修正でどれほど省電力化されたか要ウォッチしたいと思います!