M5Stack に BME280 のグラフと、ニュース、天気予報を表示させ、Ambient へデータ送信させてみた

M5Stack

こんばんは。

ようやく2018/07/10 時点の最新版 Arduino – ESP32 が従来と同様に正常に動くようになりました。

Wi-Fi アクセスポイントやWiFiClientSecure関連の再接続ができるようになりました。
そして、Wi-Fi 使用の省電力化に欠かせない WIFI_OFF が06/24以前と同様に使えるようになりました。

ここ2週間くらい、その原因追及をひたすらやっていた時間は何だったのか・・・、と思ってしまいました。
こういうオープンソースの最新版を使って不具合が出ても、慌てたり、深く追求したりしない方が賢明ですね。
改めて学習しました・・・。

ということで、本題に戻りまして、今回は BOSCH (ボッシュ)製、温度・湿度・気圧センサー BME280 を使って、M5Stack のTFT LCD ディスプレイにグラフを表示させて見ました。

スポンサーリンク

前回記事で述べたように、最新版 Arduino – ESP32 の I2C ( Wireライブラリ )のトラブルが解消されたので、Wi-Fi マルチタスク環境下でも、BME280 センサー値が精度良く安定して取得できるようになりました。

そして、そのセンサー値グラフをオシロスコープっぽく、最大値最小値のボタンによる変更や、計測時間間隔もボタンで変更できるようにしました。

更に、ただ単にグラフ表示するだけでは面白くないので、今までやってきたスクロール時計表示、Yahoo! Japan RSS ニュース電光掲示板表示、天気予報表示も同時にやってみました。
M5Stack ( ESP32 ) のマルチタスクをできるだけフル活用してみました。

そして、さらにさらに!!!

このセンサーデータを、Ambient というクラウドサービスへリアルタイム送信して、スマホやパソコンでグラフが見られるようにしました。
これは、なかなかスゴイですよ!!!

何はともあれ、以下の動画をご覧ください。
Ambient のグラフは動画の最後の方にあります。

いかがでしょうか。
何も、センサーのグラフ表示にニュースを表示させなくても・・・、
と思われるでしょうが、ただ単に自分が表示させたかっただけのお遊びです。
センサー値取得間隔が最小の3秒設定の場合、グラフ再表示が頻繁で、ニュース記事スクロールがカクカクしてしまうところは仕方ないのでご容赦ください。

まず、苦労した点として、センサー値を点描ではなく、折れ線グラフにすることが意外と難しかったです。

そして、最大値、最小値や計測時間間隔も変更出来て、それに合わせてグラフ表示も変化させるというのは、かなり難しかったです。
中高年の枯れた頭をフル活動させて、何とか仕上げました。
M5Stack のディスプレイにここまで表示させることができれば、我ながら満足です。
デジタルオシロスコープなどのようにグラフ表示させるプログラムを作る事って、本当に難しいんだなぁと、つくづく思いました。

それと、ディスプレイ上部にある、接続状態を表示するメッセージウィンドウのプログラミングが難しいです。
WiFiアクセスとLCD表示をマルチタスクで分けているので、接続状態ステータス値取得と、メッセージ表示タイミングが微妙にズレて難しかったのです。

また、このグラフは、M5Stack の電源を切るとデータは消えてしまいます。
でも、今回の我ながらスゴイところは、Ambient送信ボタンでセットすれば、クラウドのAmbient へ保存されるようにしたところです。
micro SD カードに保存するより使い勝手がメチャメチャ良いです。
何で今までこれを使わなかったんだろうと後悔しました。
これは、ホント素晴らしいサービスだと思いました。

ということで、前置きはこれくらいにして、これの作り方を説明してみたいと思います。

因みに、何度も申し上げておりますが、私はアマチュア素人です。
間違いや勘違い等あるかもしれません。
スケッチやプログラム等の動作保証はしません。
もし、不具合等があれば、コメント投稿等でご連絡いただけると助かります。

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

 

Ambient について

先にも述べましたが、今回、私は初めて Ambient というクラウドサービスを使ってみました。

https://ambidata.io/

これは、スイッチサイエンスさんの以下の記事でも紹介されています。

AmbientでIoTをはじめよう

最初は、グラフを扱えるものとして、こちらの記事で紹介している Blynk を使おうと思いました。
でも、もっと簡単にサクッと、しかもスマホだけでなくパソコンでもグラフが見られるものを探していたら、Ambient が簡単そうという情報が得られたので使ってみたというわけです。

そうしたら、やっぱりホントに簡単で、超使いやすかったです。
ハッキリ言って、超お勧めです!!!
Ambient サービスはメールアドレスがあれば簡単に無料登録ができるし、スケッチも簡単だし、ESP32 や M5Stack から送信するとブラウザで即グラフを見ることができました。

こんな簡単だったら、もっと早くから使えば良かったと思いました。

先にも述べましたが、センサーデータは micro SD カードに保存するよりは、クラウドに投げた方が圧倒的に使いやすいです。
micro SD カードは、書込みできる回数が意外と少なく、マイコンであまり多量に書き込みを繰り返してしまうと、すぐに寿命が来てしまいます。

それよりも、クラウドならば、圧倒的に使い勝手が良いし、書込み回数を気にしなくて無みますし、しかも、すぐスマホやパソコンで確認できます。
これからの時代は、センサーデータはクラウドに投げることが標準と考えた方が良いと思いました。
IoT でクラウドにデータを投げるという使い方は、これからは当たり前になると思います。

しかし、これを使って改めて思いましたが、ユーザーが簡単にサクッと使えることはホントに大事だなと思いました。
自分のライブラリ作成の参考にさせていただこうと思います。

Ambient を登録し、チャンネルID とwriteキーを発行しておく

Ambient サービスに無料登録し、チャンネル ID と write キーを発行しておいてください。
以下のリンクのチュートリアルに使い方があります。

https://ambidata.io/docs/gettingstarted/

使うもの

M5Stack

Espressif Systems社のESP32 を搭載した、技適取得済み Wi-Fi & Bluetooth マイコンモジュールです。
TFT LCD ディスプレイ、micro SD カードスロット、ボタンスイッチ、バッテリー、スピーカー、Groveコネクタ等を搭載した、全部入りモデルです。
Arduino IDE で開発ができます。

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

BME280搭載 温湿度・気圧センサモジュール(スイッチサイエンス製)

スイッチサイエンス製のものを使いました。
プルアップ抵抗はハンダ付けされていません。
その方が使い勝手が良いです。
M5Stack の I2C 端子には、3.2kΩ程度のプルアップ抵抗が接続されているようです。
ピンヘッダがハンダ付けされているものとそうでないものとがありますので、購入する時は注意してください。

スイッチサイエンス BME280温度/湿度/気圧センサモジュール SSCI-022361
スイッチサイエンス
¥2,844(2024/03/19 13:09時点)

現在Amazonで販売されていないようなので、以下のスイッチサイエンスさんの公式サイトをご参照ください。
https://www.switch-science.com/products/2236?_pos=3&_sid=373c89d96&_ss=r

2.54mmピッチ、ピンソケット

BME280モジュール用に使います。

2.54mmピッチ ピンソケット

2.54mm ピッチ 小型ユニバーサル基板

BME280モジュール用にカットして使います。

サンハヤト 小型ユニバーサル基板 ICB-288G
サンハヤト
¥221(2024/03/18 23:10時点)

ジャンパーワイヤー

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

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

micro SDHC カード

できるだけ大手メーカー製の micro SDHC カードを使用してください。
2MB以下の micro SDカードや、micro SDXC カードはトラブルが起きる可能性があるので、あまりお勧めしません。
当方で動作確認が取れているものは以下のカードです。

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

では、次の項では、組み立てや、ライブラリ等のインストール方法を説明します。

コメント

  1. H.W より:

    mgo−tecさん、
    1週間ほど福岡の方に行ってまして、ご無沙汰しておりました。
    その間に、またさらに素晴しい秀作スケッチが出来上がっており、遅ればせながら模写させて頂きました。

    当初、必要なライブラリー類を更新した後、試しに現状のままのArduino core for ESP32でインストールしてみたら、やはりコンパイルエラーが出たので、この機会に最新版に更新しました。
    その後は、一発Noエラーでコンパイルは完了しました。

    寧ろ意外な所でハマってしまったのが、Ambientの初期登録で、認証メールがgmailのフィルタに引っかかり迷惑メールフォルダに入っていたのに当初気づかなかったことと、ライトキーに誤ってユーザーキーを書き込んでいたこと位ですかね…
    しかし、確かにこのAmbientクラウドは非常に便利で他にも色々と活用ができそうですね?

    本題のスケッチの方ですが、接続状況がWifiとAmbientが追加されてさらに細かく表示がされ、下半分にグラフが表示される様になったので、Yahooニュースのスクロール文字が小さくなって老眼の身にはちょっと辛くはなりましたが、必要十分な情報が盛り沢山でとてもいいですね。。。
    (将来的にグラフのオン/オフ切り替えもできたらベターですね?)

    当方のBME280基板は、目下ブレッドボードで外付けにしていますが、この半分位の大きさの安価なI2C専用基板がある様なので、手に入れたらPROTO基板の空いたスペースに実装してみようと思っています。
    (M5stackの内部環境モニターとなってしまいますが…)

    尚、数時間ほど連続動作させてみましたが、特に接続エラーを起こすことも無く、センサのデータ取得も途切れることはありませんでした。
    また、消費電流は5.14Vで130mA位でしたので、増強したLipo電池で半日位は持ちそうです。。。

    • mgo-tec mgo-tec より:

      H.Wさん

      いつも試していただいて、ありがとうございます。
      m(_ _)m
      今回は、かなり力をいれてプログラミングをしてみました。
      自分なりに納得できる仕上がりになりました。

      でも、おっしゃる通り、私も老眼でニュースや時刻を読み取るのは少々辛いです。
      そうすると、もっと大きいディスプレイが欲しくなりますね。
      とりあえず、ディスプレイに全部盛り込んでみたかっただけのお遊びです。

      Ambient設定については私も迷惑フォルダに入っていました。
      これ、皆さん悩んでいる方も多いかもしれませんね。
      Twitter でツイートしておきます。

      最新版 Arduino – ESP32 は、消費電力も前よりも少なくなり、安定感が増しましたね。
      ますます進化していて有難い限りです。

      なんとか台風の季節前に M5Stack とセンサ連携が形になりました。
      これからは威力を発揮しそうです。

  2. H.W より:

    H.Wです。
    その後の状況ですが、Webゲットが一度出来なくなると所定時間(ディフォルトで3分)経っても再接続ができない状態が継続します…
    (但し、リセットすると直ぐに正常接続します。)
    尚、該当箇所を適宜Wifimultiに変更してみましたが、シリアルモニターでも「…..」が継続表示されて接続できない状態となりました…?

    ところで、7/25発売のInterface9月号ではESP32が特集されますね? 既にAmazonで予約済ですが、
    事前の目次情報を見るとInterfaceなので当然と言えば当然ですが、かなり突っ込んだ解説がされているようで今から楽しみです。

    >第1部 新定番IoTマイコンESP32登場
    >第2部 大人気のIoTプロトタイピング・デバイスM5Stack
    >第3部 IoTマイコンESP32徹底研究
    >第4部 ESP32 IoT実験室

    M5stackについても詳細な事例が取り上げられているようなので期待してます。
    (mgo-techさんも何か記事を投稿されているのでしょうか?)

    • mgo-tec mgo-tec より:

      H.Wさん

      いつもご報告ありがとうございます。

      実は、私も同じ症状が出ました。
      以前に比べれば、最新版の Web get できなくなることは少なくなりましたが、やはり一度接続できなくなると、二度と繋がらなくなりますね。
      これは謎です。
      WiFi_OFF にしていることに何か原因があると思います。
      電力食ってもよければ、
      WiFi.mode(WIFI_OFF);
      などを外して、常時接続してみてください。
      それでも再接続できなければ、原因は私には分かりません。
      Arduino-ESP32 が更新されるのを待つしか無いと思います。

      Interface のESP32特集については存じております。
      私も買おうと思っています。

      因みに、Interfaceさんからは私のような素人にはお呼びがかからないと思います。
      ですから投稿していません。
      でも、内容は楽しみですね。
      期待しちゃいます。

  3. kuro より:

    「ArduinoIDE」超初心者です、以下について教えてください。

    1.「M5Stack」用にスケッチを検証・コンパイルすると、既定のライブラリが探せないためコンパイルできません。(探せるものもあるようです)
    尚、ファイルは既定の場所にあり壊れてはいないようです。
    何処かに、「path」の設定などが有るのでしょうか。

    2.同名のホルダー及びライブラリが複数存在しますが、何処かにまとめた方がいいのでしょうか、
    また空のホルダーもありますが、削除した方がいいのでしょうか。

    よろしくお願いいたします。

    • mgo-tec mgo-tec より:

      kuroさん

      記事をご覧いただき、ありがとうございます。

      まず、Arduino core for the ESP32 は、2018/07/25くらいから、Stable版というものができました。
      それは、ボードマネージャでインストールします。
      以下の記事をご覧ください。
      Arduino core for the ESP32 のインストール方法

      もし、古い Arduino – ESP32 と、Stable版が二重インストールされているとうまく動作しないかも知れませんので、古いものは esp32 フォルダごと削除してください。
      私は、現在、Stable版を使っています。

      次に、私の自作ライブラリは、古いものはフォルダごと削除してください。
      念のため、バックアップ取っておいた方が良いと思います。
      名前が重複しているものは古い方を削除してください。
      私の自作ライブラリは頻繁にアップデートしていますので、新しいものを使う場合は、古いものを必ず削除してから、再インストールしてください。
      ただし、私のスケッチの古いものは、古いライブラリでないと動作しないものもあります。
      そういうものがありましたら、ご連絡いただければ、対処方法をお教えします。

      とりあえず、それでも動かない場合、エラーメッセージを貼り付けてコメント頂ければと思います。
      宜しくお願いします。

      • kuro より:

        mgo-tecさん、回答ありがとうございました。
        全てのファイルを削除し、再インストールしましたが次のエラーが出るので取りあえずリネームして行いました。(どのようにすればいいのか分からないので)
         ・「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
        その後も、下記のようなエラーが出ます。
        どうすればいいのか分かりません、対処方法をご教授願います。(長くてすいません)

        「エラー内容」
        Arduino:1.8.6 (Windows), ボード:”M5Stack-Core-ESP32, QIO, 80MHz, Default, 115200, None”
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x1c): undefined reference to `bme280_init’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x20): undefined reference to `bme280_set_sensor_settings’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x24): undefined reference to `bme280_set_sensor_mode’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c7getDataEv+0x8): undefined reference to `bme280_get_sensor_data’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::initBme280Force(int, int, unsigned int)’:
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_init’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_settings’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::getData()’:
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_get_sensor_data’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
        collect2.exe: error: ld returned 1 exit status
        exit status 1
        ボードM5Stack-Core-ESP32に対するコンパイル時にエラーが発生しました。
        「ファイル」メニューの「環境設定」から「より詳細な情報を表示する:コンパイル」を有効にするとより詳しい情報が表示されます。

        • mgo-tec mgo-tec より:

          kuroさん

          エラーメッセージ送って頂きありがとうございます。

          まず、基本的にライブラリ名のリネームはしなくても良いです。
          「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
          というメッセージが出る場合は、ライブラリが正しくインストールされていないか、プログラムの誤りが原因です。
          正しくインストールされていれば、このエラーは出なくなります。
          ただ、Arduino標準ライブラリや、Arduino-ESP32ライブラリ以外で、同じ名前のライブラリがあれば、その場合はエラーが出るかもしれません。
          Arduino標準ライブラリと、Arduino core for the ESP32 のライブラリに限っては、同じライブラリ名があっても、正しくインストールされていればエラーは出ないようになっています。

          このエラーメッセージを見る限り、BOSCH純正ドライバライブラリがインストールされていないように見受けられます。
          まず、BOSCH純正ドライバライブラリが正しくインストールされているか、ご確認ください。
          この記事の2ページ目のところに、
          「BOSCH製 BME280 ドライバを Arduino IDE にインストールしておく」
          という項目があります。
          インストールしたら、必ず FLOAT を有効にしてください。

          これでもうまく動作しない場合は、またご連絡ください。

          • kuro より:

            mgo-tecさん、回答ありがとうございました。
            再インスト後のスケッチは、「M5Stack と BME680 でガス報知器(アラーム)および気圧・温湿度グラフで「熱中症」警告表示器を作ってみた」の記事のセンサー部分を「BME680 ⇒ BME280」に変更しただけだったので対応していなかったようです。
            次の部分をコメントアウトしたら無事に検証できました。
             ・75行目:bme_disp.initBme680Force( sda, scl, 100000, 28 ); //I2C周波数100kHz,
             ・95行目:bme_disp.getData();
            お手数をおかけしました。
            ありがとうございました。

          • mgo-tec mgo-tec より:

            kuroさん

            とりあえず、動いて良かったのですが、私は BME680 用のスケッチを BME280 で動くようには設計しておりません。
            BOSCH純正ドライバライブラリの BME680 用と BME280 用では構造が全く異なりますので、どこかしら不具合があると思われます。
            その辺はご理解のほどよろしくお願いいたします。。

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