よくわかる!家じゅうの温度計をグラフでまるっと一括表示してみた話
はじめに
春のMakerFair Kyoto2023をきっかけに、OpenCreationLab.との出会いがあり、そこから、ミニ百葉箱のキット化、販売へと駆け抜けてまいりました。
一息ついて振り返りをしていると、買ったけど使っていないモジュールの数々、やりかけてそのままにしているプロジェクトなどが散らばっています。
そうこうしているうちに『M5Stack Japan Creativity Contest 2023』の募集が始まりました。
このコンテストには、ここ数年、内容を少しずつ進化させながら、応募しています。私にとっての「夏休みの自由研究」になっており、今年もぜひともチャレンジしたいと考えています。
今年はさらに、8月31日までの早期応募特典として参加賞Tシャツのカスタマイズをしてくださるようで、これは何としてでも、夏休み中に仕上げなければと考えています。
そのためには、目下の課題をまずはさばかねばなりません。
そこで、今回の取り組みを行いました。
昨年の今頃書いた記事
のアップデートを行いたいと思います。
なかなかうまく伝わらないのですが、実はこの装置とても重宝しています。この一年、時々リセットはするもののおおむね順調に使えており、日々の温度管理に役立っています。
一年間装置を使っていると、気に入らない点がいくつか見えてきます。
今回はそれらの課題をひとつずつ解決していきました。
作ったもの
M5Stack社製マイコンAtom Matrixを使って、家中のBLE温度計の発する電波を受信します。温度を読み取り、IoTデータの可視化サービスAmbientへ送信します。
Ambientで管理するためいつでもどこからでも家中の温度がわかり、時系列でグラフ化されるため、データの比較が簡単に行えます。
対応機種は下記のとおりです。
・SwitchBot 温湿度計
・SwitchBot 温湿度計プラス
・SwitchBot 防水温湿度計
・CYALKIT-E03データロガー
ArduinoIDEを使って、WifiルータのアドレスとAmbientのチャンネルを書き込みます。
ソースファイルをコンパイルし、AtomMatrixに焼きこみます。
準備することはこれだけです。
電源を投入後、家中のBLE温度計の電波を捕まえ始めます。ペアリングなどは必要ありません。Bluetoothでブロードキャストされている電波を捕まえ、Ambientでグラフ化できる最大の8台になるまでどんどん登録していきます。
その後、20分に一度の頻度で、ソースに書き込まれたWifiルータのアドレスとAmbientのチャンネルを使ってデータを送信します。
電源が切れたり、通信障害が発生してうまく電波が送れないときは、電源を一度切り再投入します。今まで捕まえた温度計の順番は記憶していますので、同じ順番で登録されます。
登録した温度計をリセットしたいときは、画面を5秒程度長押ししてください。再度、見つけた順で登録を行います。
準備方法や画面表示は以前の記事に書きましたので、そちらもご参照ください。
今回取り組んだこと
・温湿度計プラスに対応する。
・防水温湿度計に対応する。
・Wifi不安定対策をする。
・アドレス固定の対策をする。
です。
温湿度計プラスに対応する。
SwitchBot温湿度計の横展開製品。ミニ百葉箱には入りませんが、表示が大きく、需要はあると思います。私もテスト用として購入し、そのまま放置しておりました。今回、温湿度計プラスに対応したことで、リビングの一番目立つ場所に置きました。
技術面では、SwitchBot温湿度計とほぼ同じデータが飛んできていました。識別タイプを追加することでそのまま読めるようになりました。
防水温湿度計に対応する。
最近発売されたSwitchBot温湿度計の横展開製品。表示部をなくし、防水タイプとなりました。屋外や浴室でも置けます。ストラップがついているので、私は一つ持ち歩いています。
技術面では、SwitchBot温湿度計で行っていた方法では温度の取得はできませんでした。ServiceDataではなく、ManufacturerDataにありました。
いくつかの文献を読み合わせながら、私の得意のパターン。構造体SwitchBotManufacturerDataを作って、塊をコピーして取得しました。
構造体:
#define SWITCHBOT_MD_SIZE 14
typedef struct {
// Byte:0-1
uint16_t companyID; // 0x0969
// Byte:2-7
char mac[6]; // mac
// Byte:8-9 ?
uint8_t reserved1;
uint8_t reserved2;
// Byte:10
uint8_t decimalOfTheTemperature : 4;
uint8_t humidityAlertStatus : 2; //?
uint8_t temperatureAlertStatus : 2; //?
// Byte:11
uint8_t integerOfTheTemperature : 7;
uint8_t posiNegaTemperatureFlag : 1;
// Byte:12
uint8_t humidityValue : 7;
uint8_t temperatureScale : 1;
} SwitchBotManufacturerData;
コールバック関数内で、
// Switchbot防水温湿度計を特定する。
if (advertisedDevice.haveManufacturerData() == true
&& advertisedDevice.getManufacturerData().length() == SWITCHBOT_MD_SIZE) {
SwitchBotManufacturerData md;
memcpy(&md, advertisedDevice.getManufacturerData().data(),
advertisedDevice.getManufacturerData().length());
if (md.companyID == 0x0969) {
float temperature = ((md.posiNegaTemperatureFlag) ? 1.0 : -1.0) *
(md.decimalOfTheTemperature * 0.1 +
md.integerOfTheTemperature);
float humidity = (float)md.humidityValue;
Serial.printf("temp:%.1f\n", temperature);
Serial.printf("humi:%.1f\n", humidity);
Wifi不安定対策をする。
以前より、Atom MatrixはWifiの電波が弱くなるというウワサがありました。ただ私の装置には、それ以前に山ほどの課題があり、それらを切り分けして検証するほどの実力はありません。
ただ看過するのもどうかと思い、一通り資料に目を通しました。
ハードに関連する内容が多い中で、ソフトウェアだけで何とかする対策を見つけました。
// Wifi不安定対策:大野さんのアドバイスによる
pinMode(0, OUTPUT);
digitalWrite(0, LOW);
おまじないとして、挿入します。
調子が良くなるかどうかは分かりませんがやってみることにいたします。
アドレス固定の対策をする。
今回、すぐできるかと思いながら一番手を焼いた部分です。
長期間稼働させる装置を作るうえで、時々リセットがかかるのは仕方がないと思っていますが、少し困るのが、登録番号が変わってしまうので、グラフの色が変わってしまうのです。
最高気温に達するのは、ミニ百葉箱に入れた温度計ですが、赤色、青、ピンクと色が変わっています。
それだけならいいのですが、Ambientのデータを後で解析してみたいと思ったときに、データがよじれていると、正しい判断ができなくなります。注意深く手で書き換えることも不可能ではないですが、あまりやりたくありません。
なら、最初から、登録したい機器のMACアドレスをソースに書いておけばいいのではないか?と思うこともありました。
しかし、どうしても、アドレスの固定はしたくなかったのです。これは私のこだわりポイントです。装置を作った直後はコンパイル環境もあるし、プログラムの内容も覚えているのですが、半年後、温度計を追加したいと思ったときに、何も考えずにそのまま追加できる方が絶対便利だと思うのです。
今後の課題
WifiとAmbientの設定がハードコーディングされたままになりました。いくつかアイデアがあったのですが、実際にはそれほど需要もないため、行っていません。この記事を見て、実際にやってみたいと思われる方は、コンパイル環境も用意できるだろうし、Ambientのチャンネルも取得できる方だと思います。
今後、Wifi環境があれば、どこでも使えるようになると思いますが、簡単に工数をかけず設定を行う方法を考えていきたいと思います。
これまでの取り組み
最後になりましたが、これまでのこの装置に関する開発の歴史を簡単にご紹介いたします。
思えばここから始まりました。SwitchBot温湿度計の電波を捕まえて、温湿度計を読み取りたいという思いが形になった最初の作品です。
今はもうだいぶ抜けてきていますがBLEについて日々勉強していたことを思い出します。
最初はM5Stackを使って組んでいましたが、ある程度めどが立ったところで、Atom Matrixに変更しました。
切替当初、原因不明の接続不良に悩まされていました。
今思うと、これが例の問題だったかもしれません。
ただ、長時間使っていると安定してきて、1か月程度問題なく使えているときもありました。
上記2つの記事を整理して、まとめたのがこちらの記事になります。
THGatewayという名前を付けましたが、何をするための装置かイメージできないですね。作った本人も時間が経つと忘れてしまいます。
さいごに
今回作成したソースは下記の場所に置きました。
今回久しぶりにArduinoIDEを使って、プログラムをいじりました。
私のプログラミング能力の衰えをとても感じました。感覚でソースを書いたのち、デバッグ作業にとても時間が掛かりました。原因は私の衰えももちろんありますが、思い込みで作ることの怖さもあります。
今回追加したMACアドレスの管理部分では、あまり慣れていないString型の扱いに手を焼きましたし、初めて使ったSPIFFSのクセも強かったです。何度も途方に暮れ、一晩寝て、次のアイデアを試す日が続きました。
今回、そんな私を強くサポートしてくれたのは、半信半疑のChatGPTでした。部分的にソースコードの見てもらい、気になる箇所を指摘してもらいました。
雑な投げかけでも、それなりに回答してくれるのは、アマチュアにとってはとてもありがたい所ですね。ChatGPTのおかげで、2回ぐらい壁を乗り越えることができました。
また、記事もあちこちChatGPTを使っての校正を入れています。
特に、タイトルはあれこれ考えてもらいました。
でも、しっくりくるものがなく自分で考えました。
最後までお読みいただき、誠にありがとうございました。
#作ってみた
#夏の自由研究
#IoT
#Ambient
#モニタリング
#M5Stack
#AtomMatrix
#SwitchBot
#温度計
#BLE
#THGateway
#ハンダを使わない電子工作
#M5StackCreativityContest2023