M5stackに天気予報、スクロール時計、Yahooニュース、メッセージ表示させてみた

記事公開日:2018年6月14日
最終修正日:2018年7月3日
2018/06/28以降の Arduino-ESP32 は不具合が多いです。
この記事のプログラムを動作させて、Web記事取得失敗すると、電源を再起動しないと2度と接続できないことが分かりました。
Arduino-ESP32 は Commits on Jun 24, 2018版を使用してください。
旧バージョンのインストール方法は以下の記事を参照してください。

旧バージョン Arduino – ESP32 のインストール方法
(2018/07/03)

こんばんは。

最近、工作は一切せず、M5stack 単体だけで試行錯誤しています。
これだけで、C/C++ プログラミングのお遊びが止まらなくなってしまいました。

今回は、私のワンパターンなプログラミングですが、M5stack のディスプレイに縦横にスクロールする時計と、Yahoo! Japan RSS 天気予報、Yahoo! Japan ニューストピックスをスクロール表示させました。

ワンパターンとはいえ、今回は中身が全く別物で、全て一新したようなものです。
ものすごーーく苦労しました。

スポンサーリンク

何はともあれ、以下の動画をご覧ください。
途中で WiFi ルーター(アクセスポイント)の電源を切ったり入れたりしているので、 USB テスターの消費電流も注意して見てください。

いかがでしょう。
上部のメッセージウィンドウによって、通信の状態がハッキリ表示できて気持ちイイです。

M5stack の LCD と micro SD は共通 SPI 接続ですから、マルチタスク動作は無理だろうと思っていましたが、今回は WiFi起動とネットアクセスについては別タスクで、LCD表示と micro SD アクセスは一つのタスクにまとめるという方法を取ったところ、動画の様にほぼマルチタスクに近い動作ができるようになりました。
これで十分ですね。

そして、常時 Wi-Fiを起動していると M5stack の内部がかなり熱くなり、M5stack のケースの特性上、あまり放熱はよろしくないと思われるので、記事取得し終えたら WiFi を即OFF するようにしました。
それによって消費電力をかなり抑えることができました。
動画の USB テスターにあるように、起動時アクセスポイントに接続完了後、ESP32 のWiFi mode OFF にすると、平均約 160mA に抑えられました。
1分毎にWiFi起動して、アクセスポイントに接続する時に 200mA付近まで上がります。

でも、面白いことに、ESP32 の WiFi mode OFF なのに、WiFi ルーター(アクセスポイント)の電源をOFF にすると、勝手に 消費電流が 200mA まで跳ね上がってしまいます。
せっかく私がプログラミングで WiFi機能をOFF にしたと思ったのですが、これでは意味ないですよね。

どうやら、ESP32 にはユーザープログラムとは別のプログラムが裏で常時起動していて、アクセスポイントをチェックしているようなのです。
Arduino – ESP32 では完全 OFF にすることは私にはできませんでした。
もしかしたら、ESP-IDF だったらできるかも知れません。

因みに、再度 WiFiルーター(アクセスポイント)の電源を入れて、ESP32 ( M5stack )がルーターとコネクション完了して、私のプログラムで WiFi mode OFF にしたら、160mA に抑えられました。
以前のこちらの記事でお伝えした、
WiFi.disconnect(true)
ではダメで、
WiFi.mode(WIFI_OFF)
を使わないと抑えられませんでした。

とにかく謎が多いですが、このWiFi_OFF のおかげで、ルーターと接続できて160mA に抑えられていれば、長時間稼働しても、前面のディスプレイはある程度熱くなりますが、内部の ESP32 はほんのり暖かい程度で抑えられています。
そして、アクセスポイントに接続できないと、勝手に電力を大幅に消費してしまうということを覚えておきましょう。
これから、M5stack の内部部品やバッテリーの寿命を考えると、WiFi 不要なときはOFF にすることを原則としてプログラムを組んだ方が良いですね。
以後、それでプログラミングしていこうと思います。

それと、フォント文字について、表示速度を損なわずに拡大表示できたので、以前の SSD1331 を使ったこちらのニュース表示よりは格段に見やすいです。
ボタンで文字色を一括変換できるところも良い感じです。
ただ、天気予報は変えませんでした。
そこは手抜きです。

これは今まで自分が作ってきたことの応用で、特に目新しいことはやっていませんが、今回はプログラム内部構造をガラッと一新しました。
そして、とーっても苦労したので、次の項で説明します。

その後でこれの作り方を説明しますので、まずは苦労話から紹介させてください。

苦労した点

今回は自分の素人レベルプログラミングが、後々自分自身の作業の重荷になるということを身に染みて実感することになりましたので、聞いてやってください。

まず、今回力を入れたのが、NTP時計やニュースをGet できたかどうかを表示してくれる上部のメッセージウィンドウです。
本当はアイコンにしても良かったのですが、まずは文字フォントで表示させてみました。

以前のWeb記事取得でも、時々取得失敗していましたよね。
その結果は今まではシリアルモニターで確認していたんですが、M5stack のディスプレイが大きいので表示させてみたいと思いました。

でもこれ、実際に自分で作ってみると意外と難しいんです。

Web から記事を取得できたかどうかを判定して、ただ単に表示させるだけならそれほど難しくないのですが、複数の関数やクラスからイベントを受けて表示させる段取りや、プログラムが大きく複雑になっても応用が利くように将来性を考えてプログラムするということが難しかったんです。
なにしろ、そういうものを作る経験が無いので、どうやって構成させたらよいか分からなかったんです。

いろいろ自分なりに試行錯誤した結果、別々のライブラリクラスから Web記事取得変数を取り出して、メッセージを表示し終わったらその変数の値を変えるという方法に落ち着きました。

そして、メッセージウィンドウを作っている最中に、自分が今まで作ったライブラリや関数が多くなってきて、関数名やクラス名、変数名が衝突する恐れが出てきました。
ディスプレイのフォントの色やサイズ、スクロール速度などを任意に好きな時に変更できるようにしようとすると、更に変数や引数が多くなってしまいました。

更に、Arduino core for the ESP32 のライブラリクラスや関数、また、M5stack のライブラリクラスや関数とも今後衝突する恐れが考えられました。

そこで、プログラマの間で一般的に使われている命名規則を調べてみました。
そうすると、自分流で作っていたライブラリ関数や変数名があまりにメチャメチャだったということに気付きました。

自分だけで作って保守していれば何も問題ないんですけど、他人が使ったり修正したりする場合があるとすると、一般的な命名規則に沿ってやらないと保守や修正が大変です。

今回自分で自分のライブラリを全面修正してみたところ、
これは変数だっけ?
クラスのオブジェクト名だっけ?
これは private メンバだったっけ?
などなど、いろいろ問題点が多々ありました。
今までは趣味の電子工作だから「動けばいいや」的にしか考えてなかったけど、やっぱり偉大な先人や現職プログラマの人たちが言っていたことは正しかったんだなぁと実感しました。

ということで、Web上のいろいろなサイトや、Google の命名規則を参考にできるだけ修正してみました。
Google 命名規則については以下のサイトを参考にしました。

Google C++ スタイルガイド 日本語全訳

また、今まで自作ライブラリが散在していて、ユーザーの方々には使いにくいものでした。
スイマセン m(_ _)m

自分自身もブログ記事を書くときに
「めんどくさいなァ~」
と思っていて、何とかしたかったので、今回は思い切ってライブラリを1つのパッケージにして GitHub へアップしてみました。
要するに、Arduino – ESP32 や M5stack ライブラリみたいなもんです。

でも、これがまた難しい・・・。
どういうフォルダ階層構造にしたらいいのか、いろいろなライブラリとの名前衝突をどう避けたら良いのか、メチャメチャ悩みました。

そこで、まず、クラスや関数を名前空間( namespace ) で全て囲うことにしました。
以前、Twitter で、namespace を使った方がいいよ、いや、むしろ使うべきだ、何でみんな使わないのか?
ということを言っていた方がいらっしゃったことが頭に引っかかっていました。

いろいろ調べてみると、大規模プロジェクトでプログラムを組む時、名前衝突が起こるので、チームごとに namespace で囲って衝突を避けているということが分かりました。
ということで、早速自分のライブラリ全てに一つの namespace で囲うことにしました。

これで、名前衝突は一件落着・・・、かと思いきや、今度は include ファイル名の衝突問題が出てきました。

ファイル名衝突を避けるためには、衝突しないような長いファイル名にするという方法があります。
でも、プログラムをinclude する時に面倒だし、昔のコンパイラは8文字までしか認識できず、後は無視されるようなことを書いてあるサイトがありました。
昨今は長いファイル名でも良いようですが、いずれにしてもファイル名は短い方が良いです。
Arduino – ESP32 ライブラリや M5stack ライブラリはどうやってるんだろう? と疑問でした。
中身を見てもイマイチどうやっているのか分かりませんでした。
gcc コンパイラが参照するフォルダのパスを変更する方法も考えましたが、Arduio – ESP32 を更新する度に修正するのは現実的ではありません。

いろいろ悩んだ結果、最初に include だけをする専用のヘッダファイルを作るという方法に落ち着きました。
そのヘッダファイルの include にファイルパスも含めて include すれば良いのです。
そうすれば、M5stack ライブラリのように、メインソースに一つのファイルだけ include すれば良いということになります。
その分、不要なファイルも include されますが、趣味用途ならばそれほど大きな問題にならないということで割り切りました。
こうすることによって、ライブラリファイルを目的別や用途別に細かくフォルダ分けすることができて便利なことが分かりました。

あと、Arduino コーディングのガイドラインをいろいろ調べているうちに、Arduino ライブラリの作り方の方向性が大分見えてきました。
Arduino はビギナーやクリエーターが気軽に参入し易いように作られていますが、Arduino IDE スケッチで、かなり深いところまで C/C++ プログラミングが可能です。
ですから、ちょっと知識が増えると、ポインタを多用したり、クラス構造を凝ったりできてしまいます。

しかし、メインソースプログラムについては、ビギナーやクリエーターが参入し易い表記になっていないと、あまり使ってもらえません。
以前にも述べましたが、Arduino プログラムはポインタの概念が分からないようなライブラリ構造にした方が良いようです。

例えば、関数の引数に ‘&’ が入っていればポインタと分かりますが、ビギナーにはサッパリだと思います。
その場合、ライブラリ側で参照渡しにすれば良いことになります。
ただし、プログラマの間では参照渡しには const を付けて、値を変更できないようにするという法則が一般的みたいです。
でも、Arduino の場合はその一般規則を破ってコーディングした方が良い気がします。
ですから、職業プログラマがArduino ライブラリを見ると
「なんじゃこりゃ?」
状態になると思います。
Arduino の場合は「それでいいんだ」と割り切ってプログラムするしかないかなと思っています。

ということで、今回のライブラリではメインソースに公開する関数についてはconst 無しの参照渡しを多用しました。
ただ、それに慣れちゃうと正規の路線に戻れなくなるかも・・・。
正解は正直分かりません。
他にも言いたいことはまだまだあるのですが、いつか記事にしたいと思っているので、今回はこの辺にしておきます。

なお、ライブラリ作成する時に、Arduino IDE 上に展開させて作っていましたが、ファイルが多くなるとタブが見にくくて作業し辛くなります。
Arduino IDE に展開するとすぐに実機試験ができるので、見にくいのは仕方ないと思って諦めていましたが、あるとき、Twitter のSegmentation Faultさんに教えていただきました。

何と、Arduino IDE の「環境設定」に「外部のエディタを使用する」というチェックがあるではありませんか!

これにチェックして、Arduino IDE を起動したままにして、外部テキストエディタを使うと、編集して保存すると即 Arduino IDE に反映されます。
これは灯台下暗しで目から鱗でしたねぇ・・・。
作業効率が格段にアップしました。
Segmentation Faultさん、ありがとうございました。
m(_ _)m

ということで、何かと皆さんに助けられてこのブログが成り立っているということですね。

では、前置きが長くなりましたが、次のページでは、実際にこれの作り方を紹介します。
因みに私は素人ですので、不具合や無駄が多いと思います。
何かあればコメント投稿等でご連絡いただけると助かります。

スポンサーリンク


mgo-tec電子工作 関連コンテンツ ( 広告含む )

投稿者:

mgo-tec

Arduino , ESP32 ( ESP-WROOM-32 ) , ESP8266 ( ESP-WROOM-02 )等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。 電子回路やプログラミングの専門家ではありません。 畑違いの仕事をしていて、介護にドップリ浸かりそうな年配者です。 少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持っています。

「M5stackに天気予報、スクロール時計、Yahooニュース、メッセージ表示させてみた」への15件のフィードバック

  1. こんにちわ

    動作確認させていただきました。
    記事にもあるように仕様が簡素化されてちょっと困りました。
    LCD.Disp_Rotationが無くなってました。
    M5スタックのなんちゃってを作りましたが、LCDの向きが90度違いまして
    回転させて表示させてました。
    簡素化と高機能化は相反しますよねw

    ご活躍を応援しています。

    1. マッキーさん

      ゴメンナサイ!
      m(_ _)m

      ただ、以前の関数はそのまま名前や引数代入方法を変えただけなので、そのまま使えると思います。
      LCD.Disp_Rotation

      LCD.dispRotation(uint8_t rot);
      です。
      例えば、サインスマート販売のILI9341の場合、
      LCD.dispRotation(250);
      とすれば、正常表示されます。
      ローテーション番号は、ライブラリ関数ソースコードを見ていただいて、正しく表示される番号を試してみて下さい。
      ※必ず、LCD.ILI9341init のすぐ後に記述してください。

      【例】

        LCD.ILI9341init(sck, miso, mosi, cs, dc, rst, lcd_led_pin, 40000000, false); //microSDを使う場合、必ず false にする
        LCD.dispRotation(250);
        LCD.displayClear();
      ........
      

      また、M5stack のボタンスイッチ GPIO番号は他の ESP-WROOM-32 ボードでは使えませんので、適宜変えるか、ボタンスイッチ関数をコメントアウトして下さい。

      今回は自分のライブラリが名前重複の恐れがあった為、全面的に見直してしまいました。
      今これをやらないと、今後多くのトラブルが予想され、発展することが不可能になった為、仕方なかったのです。
      これも私が素人であるがゆえに、今頃になって分かったことで、やはり迷惑をかけてしまうことになってしまいました。
      今までの関数名は使えず、本当に申し訳ございません。

      ただ、私自身、日々学習しているため、確実にトラブルが少ないプログラミングに進んでいると思っております。
      今後多々変更があると思いますが、従来のライブラリはそのまま残しておきますので、どうかご容赦くださいませ。
      m(_ _)m

  2. mgo-techさん、H.Wです。
    新作発表に昨夜気付き、早速模写させて頂きました。
    これまでの習作(秀作)の集大成といった感じで、素晴らしい作品に改めて敬意を表します。

    新作ライブラリーの’ESP32_mgo_tec_master’を導入後、フォントファイル指定行を適宜コメントイン&アウト、yahoo天気地域コード等を変更して、問題なく動作致しました。
    (上部に各接続状況が表示されるのはいいですね…)

    但し一点、’WiFi Connecting….’が成功した後の表示が、’WiFi Conneced!’となっており、’t’が抜けていることに気付きました。
    最初、スケッチを隈なく一覧したものの、不具合の場所が見つからなかったので、新作ライブラリー内のソースを確認したところ、
    ’message_window.cpp’の#51行に該当箇所を見つけましたので、取りあえず一報致します。
    (修正コンパイル後は、正常に’WiFi Connected!’と表示されています。)

    尚、当方でも電源アダプタ経由で消費電流を測定してみましたが、5.16Vにて0.13〜0.19Aでした。やはり、WiFiコネクトの時に消費電流が一瞬上がりますね?
    (内蔵のLipo電池駆動では15分位しか持ちません…)

    因みに、ハンドスピナー缶に組込んだ、ESP32dev kit+SSD1331&1306の組合せでは、0.06〜0.09Aでしたので、約倍ぐらいの消費電流になりますね。。。

    1. H.Wさん

      いつもご報告ありがとうございます。
      早速修正しました。
      英語だとスペルミスがなかなか気づかないもんですね。
      助かりました。
      m(_ _)m

      M5stack デフォルトのバッテリー使用はそんなもんですね。
      まぁ、このプログラムはバッテリー使用は想定しておらず、CPUフル稼働ですから仕方ありません。

      SSD1331 ってそんなに消費電流少なかったでしたっけ?
      やっぱり、ILI9341 のバックライトLED が電力消費が大きいっていうことですね。
      OLED はやっぱり省電力でイイですね。
      でも、OLEDは経年劣化の耐久性に問題があるらしいので、将来的に高寿命、省電力、低価格のものが出たらM5stackに搭載してほしいですね。
      いろいろ情報ありがとうございます。

  3. こちらこそ、脱字を指摘しておきながら、ハンドルネームの最後に余計な’h’を付けてしまい誠に申し訳ありません…

    消費電流は、やはりTFT液晶のバックライトが大半なのでしょうね?
    現在、両方並べて表示させたりしていますが、消費電流の他、視野角等の課題も含めて、早くOLED版m5stackが出てくれるといいなと私も思いました。
    (そうすれば、薄くなる分、標準搭載Lipo電池の容量も増やせて好都合ではないでしょうか?)

    確かに寿命が気になる所ですが、大画面のOLEDテレビも各社からかなり出て来ており、製品寿命も十分許容範囲には入って来てるかと思います。
    (超薄型OLEDテレビを一度見てしまうと、もう液晶には戻れませんね…)

    因みに、当方では目下、860mAhのLipo電池で駆動していますが、BME280付きでも5時間半以上の連続動作ができています。

    1. お!
      ‘h’は気付きませんでした。
      おおざっぱな性格なので・・・。

      地震、大変なことになってますね。
      ご無事で何よりです。

      OLED SSD1306 はFacebook ESP8266/ESP32環境向上委員会で報告挙がっていましたが、1年くらい稼働し続けると色あせてしまったようです。
      やはり、電子工作用途の格安 OLED では寿命が短いですね。

      私のプログラムでは電力消費が激しく、地震に弱いですね。
      災害にも強い M5stack が欲しいと思いました。
      私は電子ペーパー版の M5stack が欲しいですね。
      できれば3色のものが良いです。

      860mAh で5時間はスバラシイですね。
      スマホ並みに24時間稼働できたら最高です。
      省電力で良い情報がありましたら、お知らせいただけると有難いです。
      いつもご報告感謝感謝です。
      m(_ _)m

  4. すごい。感動致しました。傑作。
    パクらせてもらって、ウオッチバンド付けて、
    会社(中小)のwifiでつなぎました。
    正確には不明ですがバッテリー4.5時間?ぐらいでした。
    若いおねーちゃん達に欲しいと言われました。(私はおじさんです)
    節電ができれば本格的なウェアラブルになるかも。

    1. tsukapsさん

      当ブログにお越しくださり、ありがとうございます。

      ワーイ (^^)/

      とーってもウレシイお声です。
      苦労して作った甲斐がありました。

      4.5時間とは、別途バッテリーオプション追加されたみたいですね。
      デフォルトバッテリーだと15分程しか持ちません。
      このプログラムではバッテリー節約は無理で、時計表示とか、ニュース表示をスクロールしなければもうちょっと長持ちするかもしれませんね。
      今後の課題とさせていただきます。

      私自身も元気を頂きましたので、感謝感謝です。
      m(_ _)m

  5. 腕時計として使う場合、常時見ているわけではないので、スマホみたいに一定の時間で消灯、ボタン押して点灯、液晶の輝度を可変してみてはどうでしょうか?あとスリープモード?というか、お願いするわけにもいかないので、休日に自分で実験してみます。ちなみに温度関係も記事期待しています。工場内では市販の温度コントローラーってPID機能が邪魔して意外と融通効かないのです。

    1. そうですね。
      そうすればバッテリー長持ちできますね。
      ただ、自分の場合は常時点灯させておきたいので、その機能はやはり読者の方々に委ねたいと思います。
      本当は電子ペーパーに表示させたいなと思っていますが、M5Stackには無いので、省電力関連は今後の私の課題とさせていただきます。
      センサーと同時表示はもうちょっとしたら記事アップする予定です。
      いろいろご意見ありがとうございます。

  6. mgo-tecさんこんばんは。
    バックライトON/OFFでウオッチバンド付属860mAhのバッテリーで
    職場の人にモニターしてもらい実用9時間でした。
    ところで、バグかも?らしきものが、
    天気◎のところ、失敗すると×になるのだけれども、
    その後、次の更新で天気◎は表示されなくなり、
    conectedのonectが残った状態になります。
    処理が飛んじゃってる感じでありました。
    電源入れなおすと元に戻ります。
    自分で調べてなくてすいません。
    とりあえずのご連絡です。

    1. tsukapsさん

      再び動作チェックありがとうございます。

      9時間はスバラシイです。
      これで、Brightness を暗くするなり、ボタンで消灯すればもっと伸びそうですね。

      さて、バグの件ですが、まず、お聞きしたいのは、Arduino-ESP32 のバージョンはいつのものでしょうか?
      Commits on Jun 27, 2018版以降の最新版は、動作不安定です。

      私は、現時点最新版、Commits on Jul 1, 2018 で試した結果は以下の通りでした。
      1).1回目アクセスポイント(AP)接続成功後、ルーターの電源をOFFにすると、AP接続失敗メッセージは正常に出る。
      2).その後、ルーターの電源をONにすると、AP接続成功し、NTP接続成功するが、天気予報接続×のまま、Newsメッセージが出ない。
      その状態が延々と続いて、2度とニュースGetできない。

      それで、Arduino-ESP32 を Commits on Jun 24, 2018版に戻しました。
      すると、今まで通り正常に接続成功しました。
      旧バージョンの Arduino-ESP32 に戻す方法は以下の記事を参照してください。
      旧バージョン Arduino – ESP32 のインストール方法

      2018/6/28~7/1版のArduino-ESP32は大幅に内容が更新され、過去のスケッチでエラーがでることが多く、動作が安定していません。
      I2Cインターフェイス等もいろいろ問題ありで、安定するまでしばらくインストールしない方が良いです。

      以上、ご確認ください。
      tsukapsさんのコメントが無ければ、Wi-Fiの不具合までは気付きませんでした。
      ありがとうございます。
      m(_ _)m

  7. そういうことでしたか。
    心当たりあります。更新したばかりでした。
    旧バージョンでやってみます。
    ありがとうございました。

  8. mgo-techさんのアドバイス通り上手くいきました。
    ちょっとだけ注意事項があるのですが。
    ライブラリを旧バージョンに戻してコンパイルしても、
    全体をリビルドさせないと戻らない事です。
    Arduino IDEが何か変更しないとコンパイル済オブジェクトの変更を省略する仕様みたい?だから
    mgo-techさんレベルでは既知ではあると思いますが一応コメントしました。

    1. tsukapsさん

      スミマセン。
      説明が足りませんでした。
      全体ビルドのことでした。
      当ブログでは、Arduino-ESP32 に関して最新版にしたり、旧バージョンに戻す場合には、Arduino-ESP32 の ZIPファイルごとダウンロードして、再インストールするように説明しているつもりです。
      ライブラリだけだとうまく更新されないためです。
      分かりにくくて申し訳ありませんでした。

      最新版のトラブル原因がようやく突き止められつつあります。
      もうしばらくしたら安定して動作しそうな気がします。

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください