C++」タグアーカイブ

M5StickC Plusで在宅勤務用の環境モニターを作った

先日、M5StickC Plusを使ってCO2を測りました。この記事ではその続きとして、温度、湿度、気圧も測りました。

完成形

完成形はこちらです。M5EnvMonitorと名付けました。

M5EnvMonitorの画面

ソースコードはGitHubで公開しています。

https://github.com/shoarai/M5EnvMonitor

開発過程

CO2の計測までは、以下の記事で紹介しています。

追加の部品

PlatformIOの環境構築

以前は開発環境としてArduino IDEを使っていたのですが、今回からPlatformIOとVisual Studio Code(VSCode)を使うことにしました。フォーマットの自動化やGitとの連携をしたかったのが理由です。

1. VSCodeと、PlatformIOというVSCode拡張機能をインストールする。

2. PlatformIOを開き、Home画面のNew Projectボタンから新規プロジェクトを作成する。

  • Name: プロジェクト名。ここではM5EnvMonitorとする。
  • Board:M5Stick-C(M5Stack)
  • Framework:Arduino
  • Location:任意のディレクトリ

これでプロジェクトが作成できました。この時点でGitを初期化、コミットしておきます。

Env IIの利用

Libraries画面で必要なプラグインを検索し、プロジェクトにインストールする。

ライブラリのインストールは、platform.ioファイルのlib_depsに直接記載することも可能です。また、Arduinoライブラリとして公開されていなくても、GitHubで公開されているライブラリをインストールすることもできます。以下の最後の行のように、GitHubのURLを記載すればOKです。

[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
lib_deps =
	m5stack/M5StickCPlus@^0.0.2
	adafruit/Adafruit Unified Sensor@^1.1.4
	adafruit/Adafruit BMP280 Library@^2.4.2
	ambientdatainc/Ambient ESP32 ESP8266 lib@^1.0.1
	https://github.com/nara256/mhz19_uart

ENV IIの利用

ENV IIのサンプルコードを使って、ENV IIの測定値を表示します。Adafruit_Sensor.hはAdafruit Unified Sensorライブラリに含まれていたので、ライブラリをインストールしました。ENVII.inoの内容をsrc/main.cppコピーしてビルド、アップロードします。

カスタマイズ

計測値の表示レイアウトを調整したり、M5StickC Plusの情報表示を追加しました。
※CO2センサーが壊れているので、繋いでいない状態です;なのでCO2は-1になってます。

M5EnvMonitorの画面

画面仕様は以下の通り。

  • 画面右上:充電状態。”Full”は満充電。”USB”は充電中。
  • 画面右上:電池の残量。
  • 画面左の色:測定値が快適かどうか。緑なら問題なし。赤は問題あり。
          ・17℃ < 温度 < 28℃なら緑、それ以外は赤
          ・40% < 湿度 < 60なら緑、それ以外は赤
  • 画面右下:Ambientへのデータ送信の結果。成功なら表示なし、失敗なら”Send NG”

使っていくうちにまたいろいろ変えるかもしれません。

C++によるベクトルと行列の計算クラス

大学の研究で運動機構のシミュレーションをしていた時に作った、ベクトルや行列の計算をするクラスを紹介します。GitHubにあるのでダウンロードしてみて下さい。
https://github.com/shoarai/arith

使い方

ベクトルの計算

ベクトルを含んだ計算を演算子のオーバーロードを使って実現することで、数式のようにスッキリと書けます。例では3次元ベクトルを計算していますが、z成分の値を0にすれば2次元ベクトルの計算も問題なくできます。

#include "arith/src/arith.h"
using namespace arith;
int main()
{
    // 初期化
    Vector vecA;              // x=0, y=0,  z=0
    Vector vecB(1, 10, 100);  // x=1, y=10, z=100
    // 要素の設定
    vecA.set(1, 2, 3);
    // 要素の取得
    double x = vecA.getx();
    double y = vecA.gety();
    double z = vecA.getz();
    Vector vecC;
    // ベクトル同士の加減算
    vecC  = vecA + vecB;
    vecC += vecA;
    vecC  = vecA - vecB;
    vecC -= vecA;
    int val = 10;
    // ベクトルとスカラの乗除算
    vecC  = vecA * val;
    vecC *= val;
    vecC  = vecA / val;
    vecC /= val;
    // 外積
    vecC = vecA * vecB;
    // 内積
    double inner = vecA % vecB;
    // ノルム
    double norm = vecA.norm();
    // 正規化
    vecC = vecA.normalize();
    return 0;
}

行列の計算

次は行列の計算!

#include "arith/src/arith.h"
using namespace arith;
int main
{
    // 初期化
    Matrix matA(3, 2);    // 3行2列行列
    Matrix matB(3, 2);    // 3行2列行列
    // 要素の設定
    matA(0, 1) = 10;
    matB(2, 1) = 20;
    // 要素の取得
    double a01 = matA(0, 1);
    double b21 = matB(2, 1);
    // 行列同士の加減算
    Matrix matC = matA + matB;
    matC += matA;
    matC  = matA - matB;
    matC -= matB;
    Matrix matD(2, 3);
    // 行列同士の乗算
    Matrix matE = matD * matA;
    int val = 10;
    // 行列とスカラの乗除算
    matA  = matB * val;
    matA *= val;
    matA  = matB / val;
    matA /= val;
    // 転置行列
    matA = matD.transpose();
    return 0;
}

正方行列の計算

次は行列の中でも、行と列の数が同じ正方行列の計算です。正方行列にのみ定義されている値を計算できます。

#include "arith/src/arith.h"
using namespace arith;
int main
{
    // 初期化
    SquareMatrix smatA(3);    // 3行3列の正方行列
    Matrix matA(2, 2);
    // 正方行列への型変換
    SquareMatrix smatB = matA;
    // 行列式
    double det = smatA.det();
    // 逆行列
    if (det != 0) {
        SquareMatrix smatC = smatA.invrs(det);
    }
    return 0;
}