こんにちは、プロダクトマネージャーの小林 (ニックネーム tau) です。
この記事では SORACOM Discovery 2023の「ソラコム社員による IoT プロトタイピングコーナー」で展示した私の制作物「通知付き光量測定システム」の作り方 (+ 制作の動機) を解説します。
「通知付き光量測定システム」制作の背景
ソラコムではリモートワークを主体に、各自が最も生産的に活動できる場所を選んで働くことができます。私もこの制度を活用して柔軟な働き方で業務に当たっているのですが、ときに仕事に没頭するあまり日没に気付かず、部屋が真っ暗になっても照明を点け忘れてしまうことがありました。
部屋の明るさが足りないと眼精疲労を起こしたり、文字を読むために不適切な姿勢を続けることによる上肢障害等の健康障害を起こしかねません(※1)。厚労省は、一般的な事務作業を行う場所の照度の基準を 300 ルクス以上と省令で定めています。きっと日没後の作業環境はこの基準を下回っていたでしょう。
自宅に健康で快適なリモートワーク環境を整備するために、通知付きの光量測定システムをプロトタイプしてみました。使用したのは SORACOM サービスのみ (+ 通知先として Slack) と、シンプルな構成です。エンジニアの背景を持たない人 (私自身がそう) でも、SORACOMを利用すれば簡単に IoT システムを作れることを、以降の節でお伝えできればと思っています。
パンフレット『職場における労働衛生基準が変わりました』(厚労省 2022-03-01 公布)
装置の外観
使用した機材は Grove IoT スターターキット for SORACOM (Wio LTE JP Version) と GROVE – 光センサ v1.2 です。本体は Discovery 当日の展示ではデモを容易にするため基板が見える状態でしたが、実使用では半透明の名刺ケースに格納します。公式ドキュメントによると利用されている光センサの型番は LS06-MΦ5 で、データシートからは出力値と照度 (ルクス) との対応が分かりませんでした。そのため今回は厳密な照度測定を目指す代わりに、センサを筐体内部に収納した状態で測定される光量の値を使って通知する明るさの閾値を決めていきます。
照度(LUX)を測定できるセンサ (例えば GROVE – I2C デジタル光センサ) を使用する案も検討しましたが、今回の目的に照らして費用面も考慮するとオーバースペックと考えて採用を見送りました。今回は「どうしても省令準拠の仕事環境が不可欠!」というわけでもないですし、大まかな傾向を知るには先述のセンサでも十分な性能があるためです。
電源ケーブルを外に逃がす必要から、ケースの蓋に切り欠きを入れました。
光量測定器は作業机の上に設置しました。厳密な照度が測定できるのが理想ですが、このセンサを使う限りは難しいです。このような設置場所の条件を踏まえて明るさの閾値を経験的に調整しました。
通知付き光量測定システムの作り方
下図が今回製作したシステムの構成図です。Wio LTE に接続した光センサーの値が、あらかじめ設定した閾値を下回ったとき SORACOM Lagoon から Slack へ Alert を発報します。また、閾値以上の明るさに復帰したときにも Alert を発報します。
Wio LTE に書き込むプログラムは、サンプルプログラムを微修正して作成しました。まず Wio LTE の開発環境を準備するを参考に Arduino IDE をセットアップします。次に [File] > [Examples] > [Wio LTE for Arduino] > [soracom] > [soracom-harvest] を選択し、SORACOM Harvest にデータを送信するサンプルプログラムを表示します。最後に、コードのいくつかの箇所を修正します。
GROVE – 光センサ v1.2 はアナログセンサのため、Wio LTE のアナログピン (今回は A4) にセンサを接続します。公式ドキュメント によると、A4 ピンは 12 bit の Analog to Digital Converter です。
// use analog pin to measure light #define LIGHT_SENSOR_PIN (WIO_A4)
setup()
関数に Grove コネクタへの給電と Pin Mode の定義を追加します。
// Light Sensor Pin set Wio.PowerSupplyGrove(true); pinMode(LIGHT_SENSOR_PIN, INPUT_ANALOG);
loop()
関数に Grove ピンからアナログ値を取得するコードを実装します。リファレンスを参考に、サンプルコード中の条件コンパイルのブロック #ifdef SENSOR_PIN
を次のように書き換えました。
// measure light LightSensor: int light = 0; light = analogRead(LIGHT_SENSOR_PIN); char data[100]; sprintf(data, "{\"light\": %d}", light); SerialUSB.print("data: "); SerialUSB.println(data);
SORACOM 側では SORACOM Harvest Data と SORACOM Lagoon を使用します。グループ設定で Harvest Data を有効にし、Lagoon で Alert を設定しました。今回の Alert 条件は「15 分ごとに過去 15 分間のセンサ値の平均を評価し、150 を下回ったら即座に Alert」です。この「150」は照度(LUX)と異なる値となりますが、私が自宅で過ごして「暗いな。電気点けたいな 🫥」と感じる明るさです。ここは、皆さんの環境で調整いただく値になります。
SORACOM Lagoon 3 で強化された Alert 機能の Alert rule では、上図のように 3 つの時間概念「評価範囲」「評価間隔」「Firing に変化するまでの Alert rule の継続時間」の組み合わせで柔軟なアラート条件を作成できます。なお図中に示されていませんが、Alert の設定の際には Lagoon が Harvest Data からデータを取得する間隔 (Maker プランでは 30 秒) にも注意しましょう。
Lagoon の Contact Point には、Slack の Incoming Webhook の URL を設定します。Lagoon の設定を行う前に Slack API でアプリを作成し、[Features] > [Incoming Webhooks] で Webhook URL を発行しておきましょう。
ここまで設定すると、Alert rule の定義に従って Lagoon が Alert を発報してくれます。下の画像は Discovery 2023 当日の「ソラコム社員による IoT プロトタイピングコーナー」のデモで、無事に Alert が発報されている様子です。当日も問題なく動作してくれて良かったです。
実際に IoT 機器を自作したことで、ハードウェアを触る楽しさ、ソフトウェアを組み立てる楽しさ、そして IoT の便利さをこれまで以上に実感できました。ぜひ皆さんも気軽に手を動かしてみて、エキサイティングな IoT を肌で感じてみてください!
― ソラコム 小林 (tau)