Google Home の声で知らせる自作 IoT ガス・温湿度報知器 ( M5Stack , BME680 使用 )

M5Stack

こんばんは。

今回は、前回記事で紹介したの@hori__hiro さん作の秀逸ライブラリ google-home-notifier を使って、先日作成した M5StackとBME680のガス報知器(検知器)をGoogle Home に警報を喋ってもらうようにしてみました。

ほんの数か月前までは、M5Stack と Google Home を連携させるのは面倒だったのですが、ESP32 用 google-home-notifier を使うと、夢の様に簡単に連携できるようになりました。
(因みに、google-home-notifier を使う場合は、Wi-Fi のローカルエリアネットワーク内にあるデバイスのみの連携限定のようです)

スポンサーリンク

BME680 センサで異常値を検知したら、Google Home に以下のメッセージを喋ってもらうようにしてみました。

●湿度65%を超えた場合
「湿度高いよ。除湿したほうがエエよ。」

●温度30℃を超え、湿度60%を超えた場合
「熱中症になるよ。エアコンいれなさい。エアコン絶対いれなさい。」

●湿度35%を下回った場合
「乾燥してるよ。加湿したほうがイイかもねー。」

●ガスセンサが過去50サンプルの平均値より 10000Ω下回った場合
「匂ってる。匂ってるよー。臭い。臭いよー。」

●ガスセンサ値が40000Ωを下回った危険ゾーンになった場合。
「ガス危険、ヤバイよヤバイよ。換気しなさい。」

これに加えて、M5Stack からアラームも発信させてみました。
因みに、以前の記事と同様、クラウドサービスの Ambient へのデータ送信もしています。

もう、こうなってくると、既製品にも負けない自作 IoT センサ報知器のようです。

まずはこちらの動画をご覧ください。

いかがでしょうか。

M5Stack のガス検知アラームと、Google Home の喋り報知が断続的に鳴っているのが分かると思います。

この処理は結構悩みました。

なぜなら、BME680 のガスセンサは、測定間隔を一定に保ち、中断させてはなりません。
ですから、アラームや WiFi接続、Google Home とのコネクションは、マルチタスクを使って、BME680タスクと別タスクにしなければなりません。
この処理方法については後で述べていますので参照してみてください。

因みに、気圧も測定していますが、気圧に関する警報は出していません。
これについてはいつか天気予報と連動させてみたいですね。

というわけで、以下これの説明をしてみたいと思います。

因みに何度も申し上げておりますが、私は素人アマチュアです。
自己満足でプログラムを組んでいますので、ソースコードは無保証です。
誤りや不具合があるかも知れませんので、もし何かお気づきの点があれば、コメント投稿等でご連絡いただけると助かります。

センサ測定、Google Home Talk、 アラーム発信の処理方法について

WiFiClientSecureを使って SSLサイトから記事を取得し、その間、WiFi.mode( WIFI_OFF )と WiFi.begin の使用を繰り返すと、heap memory が減り続け、接続できなくなる現象が出ています。
以下の記事も合わせて参照してください。
ESP32 および M5Stack で数時間後に Web 記事取得失敗する問題について
(2018/09/25時点)

 

今回一番苦労したのは、以前のこちらの記事のガス報知器に、M5Stack のアラームを使いつつ、Google Home へ警報を喋らせることです。
しかも、今回は BME680 の温度と湿度センサの異常値についても Google Home に喋ってもらいます。

すると、まず問題になるのが、M5Stack ( ESP32 ) のマルチタスクの割り振りです。
マルチタスクについては以下の記事を参照してください。

Arduino – ESP32 のマルチタスク ( Dual Core ) を試す

BME680 のガスセンサは、こちらの記事こちらの記事でも紹介したように、中断無しに一定間隔(例えば3秒毎)で計測しなければなりません。
ただ、M5Stack の ILI9341 LCD ディスプレイへの画像描画処理は比較的短い時間の為、BME680 のセンサ測定に大きな影響が無いと考えられ、BME680 処理と同じタスクに入れ込みました。

その他、アラーム、WiFiコネクション、Google Home コネクションは別タスクにまとめました。
アラームについては、ガスセンサ限定にしました。

結果、下図の様な割り振りにしました。

これで、ガスセンサと温湿度センサの異常値検知が同時でも、Google Home のガス警報トークと、温湿度警報トークは交互にすることができます。

ただ、本来は、M5Stack のアラームは途切れずに鳴り続け、Google Home を同時に喋らせたかったのですが、今回は不可能だと分かったので、アラームを5秒間鳴動させた後停止させ、その後 WiFiやGoogle Homeコネクション処理をさせるようにしました。

先に紹介した動画を見てもらえれば分かるのですが、Google Home コネクションにタイムラグがあるので、アラームと Google Home トークが同時に出力されています。
これはこれで私的にはヨシとしています。

また、センサが正常値の場合、3分毎に WiFi接続して、Ambient へデータを送信しますが、いつもならば、省電力化のためにデータ送信後すぐにWIFI_OFF にしていました。
ただ、そうすると、異常値検知で、Google Home に連続して喋らせることができないため、異常値検知の期間は常時 WiFi 起動状態にしました。
そして、WiFi接続データ送信後 30 秒経過しても異常値検知が無い場合に WIFI_OFF するという処理にしました。

これで、先に紹介した動画のように、初回の異常値検知で WiFi 接続に時間がかかりますが、その後異常検知状態が続けば WiFi が起動状態のままになります。

ということで、老いた中高年の私の頭で考えられる処理はこんなところです。

では、次の項では実際の作り方を説明していきます。

使うもの

Google Home Mini

Google Home Mini については、個人的にレビューした以下の記事を参照してください。

Google Home Mini を使ってみた

M5Stack

Espressif Systems社の ESP32 を搭載した、WiFi & Bluetooth マイコンモジュールです。
LCD ディスプレイ、micro SD カードスロット、押しボタンスイッチ、簡易バッテリー、スピーカー、Groveコネクタ等、必要な物全部入りです。
個人的にレビューした以下の記事も参照ください。

M5Stack ( ESP32 搭載 ) を分解したり電源を入れてみて、いろいろ思ったこと

(追記)
M5Stack Basicは、この記事を書いた当時より格段にバージョンアップしております。
以下のスイッチサイエンスさんの公式サイトをご参照ください。
https://www.switch-science.com/collections/%E5%85%A8%E5%95%86%E5%93%81/products/9010

※M5Stack Gray(9軸IMU搭載)現在は販売終了しております

 

M5Stack用電池モジュール(オプション)

M5Stack 純正バッテリーの場合、数十分しか駆動できませんが、このオプションのバッテリーモジュールを使うと3~4時間まで駆動可能となります。
LCD 明るさを暗くする(例えば 255から50に落とす)と、4~5時間まで駆動できたりします。
その他、ディープスリープを使えばもっと長持ちするらしいです。

(※2021年11月時点では、バッテリー容量は750 mAhになっています)
M5Stack用電池モジュール

BME680搭載 空気品質、温湿度、気圧センサモジュール ( I2C 用)

私は、スイッチサイエンスさんで販売している pimoroni製の BME680 モジュールを使いました。
I2C用です。
Amazon でもスイッチサイエンスさんでも現在品切れ状態が続いているので、要注意です。

これについては以下の記事を参照してください。

M5Stack ( ESP32 )で、ガス・気圧・温度湿度センサ BME680 を使ってみた

micro SDHC カード

フリーの日本語フォント東雲フォントや、私の自作 UTF-8 → Shift_JIS コード変換テーブルファイルを保存しておくために使います。

micro SDXC や普通の micro SDカードでは動作しない可能性があります。
micro SDHC カードを使った方が無難です。
また、極力大手メーカー製をお勧めします。

当方で動作確認が取れているカードは以下になります。

単線ジャンパーワイヤ

φ0.65mm の単線で、ブレッドボードに挿せるものを使います。

協和ハーモネット 耐熱通信機器用ビニル電線 H-PVC 0.65mm 2mX10色 茶赤橙黄緑青紫灰白黒
協和ハーモネット(Kyowa Harmonet)
¥1,448(2024/03/18 15:05時点)

WiFi環境

インターネットに接続された2.4GHz帯 Wi-Fiルーター環境が必要です。
M5Stack の ESP32 が接続できるように、事前にファイアウォールやMACアドレスフィルタリング設定を済ませておいてください。
ESP32 の MAC アドレスの確認方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) チップ・メモリ・MACアドレス情報取得方法

その他、パソコン、ハンダコテ、USBケーブル等

では、次の項ではライブラリ等のインストる方法を説明します。

コメント

  1. H.W より:

    (以下、1週間程前に送信したつもりでしたが、上手くupされてなかった様なので再送します。)

    H.Wです。 大変ご無沙汰しております。
    約3ヶ月ぶりにブログを拝見したら、秀作スケッチが10数点以上も増えており、未だ8/11、16頃展示のスケッチ模写までしか追いつけていません…
    当方もその後、プロト基盤に何とかBME280を搭載(中国製のハーフサイズ品@650を納期も大分待って入手したものの、結局品質不良?で動作せず、最終的に過去使用した実績品を何とか内蔵させました。一応、交換性も考慮して直はんだ付けはせず、高さ制限の為に結線のコネクタからコンタクト部を抜き出しそっと折り曲げ加工し、ヘッダーピンに基盤裏から挿入する形で対応。)
    尚、BME680も試してみたかったのですが、入手性が悪く価格も高くて形状も大きく、今回は内臓に拘りたかったので敢えてBME280を使い、BME680のガス検知に該当するスケッチ部分を適宜コメントアウト&修正して対処してみました。
    1)その際、折角の接続状況表示、yahoo時報、ニュース、天気もそのまま残したかったので、Ambient◎とAlarm◎とGoogle Home◎は文字数を一部省略し、表示がズレないようにオーバーラップ表示させる仕様にしてみました。同じ場所でもボタンを押せば適宜表示は切り替わるので、これでも殆ど違和感はありません。
    2)ガス検知時のアラームが鳴らないのは寂しいので、代わりに「乾燥注意」、「高湿注意」、「熱中症注意」時にAlarm音1,2を割り当てて鳴らしてみました。(音量は確かに1か2で十分ですね…)
    3)勿論、Google Homeにも繋げて、喋るセリフも多少変更してみました。(こちらは最初に音量3を指示。)
    尚、デバイス名は特に変更しませんでしたが、懸念されてた名前に漢字が入っていても全く問題なく認識しています。
    (少し抑揚が気になる所もありますが、十分使い物になりますね? これは素晴らしい。。但、G.Hは応答が多少遅いので、Alexaでも同じ事ができるといいですね?)
    4)プロト基盤に別途内臓したLipo電池(850mAh)を保たせたい為、A,B,Cのキーを短&長押しした時に表示機能に影響しない範囲で、輝度を255、100、50、1に適宜切り替わるようにしてみました。
    (例えば、Aボタン長押しはグラフ表示設定モードが予め判ってるので別に暗くてもいいと言うことで最小の1に設定。これでも暗闇では十分認識でき、消費電力をかなり抑えられるので、就寝時間中は十分保ちそうです。)
    5)スケッチ改編時のミスか、起動時にWifi
    接続表示が✕のままとなる為、ディフォルトでAmbientに繋がる仕様に初期設定を変更して一応対応しました。(データ記録忘れがなくなるので結果オーライ。)
    6)残るは「警告表示」ですが、グラフ表示のスペースにアラーム時にフラッシュ表示できればいいと考え、y座標を変える他、適宜スケッチを改編してみました。
    しかし、論理が成立するデータ変化時の初回は表示するものの、その後の表示が継続しなかったり、途中でフリーズしてしまったりと安易なスケッチ書き換えではどうも上手くいきません…?
    これさえできれば、自分の使い方的には必要十分なのですが、何か簡単に対処できるアドバイス等を頂けると幸いです。

    • mgo-tec mgo-tec より:

      H.Wさん

      いつもブログをご覧いただき、ありがとうございます。

      1週間前のこちらの記事でのコメント投稿は見当たりませんでした。
      ただ、ある別記事では事情により名前やハンドルネームを伏せてコメント返信させて頂いておりますので、お察し下さいませ。
      その節は、本当にありがとうございました。
      感謝感謝です。
      m(_ _)m

      さて、とても密度の濃いコメントありがとうございます。
      こういうコメントいただけると、とってもウレシイですね!
      (^^)

      1)そのアイデアはすばらしいです。
      オーバーラップは良いですね。

      2)なるほど。温湿度にもアラームを割り当てたとは、やっぱりそういうニーズもあるんですね。

      3)デバイス名が漢字でもOKだったんですね。
      情報ありがとうございます。
      Alexa は自発的に喋らせることはできません。
      残念ながらライブラリを作ってくれる人がおりません。

      4)なるほど。
      ボタンで明るさ調節は良いですね。
      明るさ1はやったことないので、今度試してみます。

      5)メッセージ表示は実はいろいろと面倒な処理があって、プログラムを変更するとうまく動かなくなる場合があります。
      これは、プログラムを読み解いて頂くしかありません。

      6)グラフ表示位置に警告表示は、グラフの再描画を考えると、かなり難しいですね。
      点滅表させたいのであれば、グラフ描画をストップして、グラフ上にメッセージを表示<->消灯を繰り返さねばなりません。
      すると、別途関数を作り、boolean変数などでフラグを新たに作って、閾値を超えたらその関数に入るようにします。
      そして、
      gas_msg.dispMsgWindow( 1, ” GAS警告 ” );

      gas_msg.clearMsgWindow( 1 );
      を交互に表示させることだと思います。
      ただし、delay関数を使ってしまうと、センサ計測とLCD表示が停止してしまうので、
      millis関数等を使って、表示させたらその関数をすぐ抜ける。
      また、消灯したらその関数をすぐ抜けて、センサ計測とLCD表示を継続するプログラムを組むことだと思います。
      コメントではこの程度しかアドバイスできず申し訳ございませんが、これで試してください。

  2. H.W より:

    mgo-tec さん、
    H.Wです。応答がかなり遅れて申し訳ありません。

    先ず、他の項目で頂いたご返事については既に認識しております…m(_ _)m

    また、警告表示の対処方法についてのアドバイス、有難うございます。
    結果的に、最終の希望通りには行きませんでしたが、余りスケッチを弄くりまわすのは得策ではないと考え、最小限のdelay を20〜30
    ms 程度入れることにより、各論理判定が真に変化した最初の数秒間だけですが、各々の警告表示が出力されるので、一応これでヨシとしました。。。

    (p.s)
    後日、先のGmail 宛にでもこれまで製作した関連写真等を適宜添付させて頂きたいと思います。。。

    • mgo-tec mgo-tec より:

      H.Wさん

      いえいえ、いくら遅れても全く問題ありません。
      こちらこそ、いつもありがとうございます。

      とりあえず、動作できているようでちょっと安心しました。
      あまりお役に立てず、申し訳ございません。

      写真については送って頂いてOKです。
      もし、このコメント欄に掲載してもよろしければ、おっしゃっていただければと思います。
      その際、サーバー負担軽減のため、容量によっては圧縮させていただきますのでご了承くださいませ。
      m(_ _)m

      • mgo-tec mgo-tec より:

        H.Wさん

        写真ありがとうございました。
        では、紹介させていただきます。

        以下、H.Wさんからの説明文付きです。

        photo1: Lipo電池(850mAh)及びBME280のプロト基板実装状況、電池残量モニターLED付き
        (LEDは反対側で写真には輝度調整ボリュームのみ写っています。)
        comment_hw_01.jpg

        photo2: スケッチ改変後の警告表示例
        (強制加温&加湿時。ちょっと映りが悪いですが…)
        comment_hw_02.jpg

        プロト基板からバッテリーをご自分で搭載されるところはスゴイですね。
        私は既製品を買ってしまいますが・・・。
        警告表示をアレンジするのはちょっと難しいのですが、よく改良されたと思います。
        素晴らしい!!!

        読者の皆さまにも参考になると思います。
        ありがとうございました。
        m(_ _)m

タイトルとURLをコピーしました