🐕

M5Stack用の波形ライブラリを作って自作の環境モニタに組み込んでみた

2024/03/01に公開

環境モニタを作ろうと思ったきっかけ

2020年頃からコロナ禍の影響で在宅勤務の比率が高まり、急ごしらえで仕事部屋を確保したものの仕事部屋がそんなに広いわけではないので空気がこもり、CO2濃度が上がって集中力が低下するのを感じることがありました。

1時間に1回は換気する などで解決しそうではありますが、その反面、冬場は冷気が侵入、春先は花粉が侵入 と換気することが必ずしもベストなソリューションであるとは限らず、いかに換気タイミングを見極め、最小限の換気時間で快適な作業空間を取り戻すかがポイントなのではと考えるに至りました。

そこでCO2濃度、温湿度ぐらいはモニタリングしたいと思い、せっかくなので市販品を買うのではなくM5Stackでの自作に挑戦しました。

環境モニタ概要

以下の指標を5sごとに計測し表示します。

  • CO2濃度
  • 不快指数
  • 温度
  • 湿度

画面をタップすると表示モードが切り替わります。

表示モード

インジケータモード

現在の計測値を表示します。
Indicator Mode

リアルタイム波形モード

CO2濃度のみを5分間の範囲で時系列データとして波形表示します。
これにより換気によるCO2濃度の低下を監視でき、あとどれくらい換気すれば外気との平衡状態の濃度に到達するかをある程度予測できるようになります。

Real-Time Wavechart Mode

デバイス構成

  • M5Stack Core2: 動作制御、表示用。
  • EnvⅡ: SHT3X搭載。温湿度計測用。
  • MH-Z19C: CO2計測用。M5Stack Core2との接続部分は自作しました。

ソフトウェア開発環境

VSCode上で動作するPlatformIOを使用しました。

ソースコード等はこちらに公開しています。
https://github.com/gkmaro634/AmbientLogger

こだわりポイント

見慣れた数値表現

開発当初はM5.Lcd.printf("Temp: %f[C]", measuredValue); などと無骨な感じで表示していましたが、せっかくなので少し見た目もこだわりたいと思い、7セグ風のフォントでの表示を採用しました。同じ情報を表示しているにも関わらず、デジタル時計などで見慣れた7セグフォントは格段に視認性が良いと感じました。

選択可能なフォントはこちらの記事が参考になるかと思います。
https://karakuri-musha.com/inside-technology/arduino-m5stack-display-01/

波形表示機能のライブラリ化

コーディングを進めていくうちにmain.cが肥大化していき、二度とメンテできなくなりそうな危険性を感じたため、特に複雑な波形描画処理をライブラリとして分離することにしました。また描画更新時のちらつきを抑えるため、Spriteを活用して表示内容を保持する仕組みを取り入れるなど、細やかな工夫を施しています。

ライブラリのリポジトリはこちらです。
https://github.com/gkmaro634/M5Waveform

またPlatform.IOでもライブラリを公開しており、M5Waveformで検索すると見つかります。
M5Waveform

開発過程のスクラップ記事はこちら。
https://zenn.dev/gotoooo/scraps/3949488115254e
https://zenn.dev/gotoooo/scraps/95021092931dc2

今後の展望

今回開発した波形ライブラリは筆者自作の環境モニタに組み込む想定で仕様検討を進めました。
実装する機能を最小限にとどめたため、1週間程度の開発期間で必要十分な機能を備えるものが完成しました。
他の用途にも汎用的に使えるよう、下記のような機能拡充を図っていきたいと思います。

  • フォントサイズ設定
  • 目盛りの数値表示切り替え
  • 複数系列表示、凡例表示

また、性能面のパフォーマンスが未評価であるため、サンプリングレート、表示領域サイズなどのパラメータを振って正常動作する範囲を明確にしていきたいと思います。

Discussion