われがわログ

最適化アルゴリズムとかプログラミングについて書きたい

CO2Mini用C++ライブラリを作った

今年はリモートワークの機会が多かったのだが、どうもパフォーマンスが上がらず困っていた。そこで、CO2MiniOEM元はこれ)を購入して室内環境の改善を図った。

www.monotaro.com

CO2MiniをPCに接続するとHIDデバイスとして認識され、暗号化を解けば温度・CO2濃度が取得できる。先人によって様々な言語に対してライブラリがつくられているので(Python実装JS実装C実装など)、手軽にCO2濃度を計測できるのだ*1。さて、私のマイブーム言語はC++であり、なぜかC++にはCO2Miniのライブラリがなかったので自分で作ってみた。ライブラリといっても250行程度の簡単なものである。 WindowsLinuxで動作を確認している。

github.com

READMEにも書いてある通り、以下のような感じで使うことができる。

#include <chrono>
#include <iostream>
#include <stdexcept>

#include "co2mon.hpp"

int main(int argc, char* argv[]) {
    using namespace std::literals::chrono_literals;

    co2meter::Co2meter dev;
    try {
        dev.Open();
    }
    catch (std::exception& e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    // non-blocking monitoring
    dev.StartMonitoring(4s); // pass monitoring cycle
    while(true){
        std::this_thread::sleep_for(30s);
        auto temp = dev.GetTemp();
        auto co2 = dev.GetCo2();
        if (temp) std::cout << "TMP: " << temp.value().value << std::endl;
        if (co2)  std::cout << "CO2: " <<  co2.value().value << std::endl;
    }
    dev.StopMonitoring();
    co2meter::Co2meter::Exit();
}

StartMonitoring()に与えるデータ取得周期を長くしすぎると、何故か応答性が悪くなるので注意。内部でバッファリングされているのかもしれない。

私は、以下のリポジトリのソフトウェアをRaspberry Pi 4 (Ubuntu 20.10)上で運用している。

github.com

CO2Mini本体のディスプレイは温度とCO2を交互に表示しており少し見づらいため、ブラウザから両者を一度に見られるインジケータをVue.js + Bulmaで作った。 換気をするときにはこの表示を見ている。 https://raw.githubusercontent.com/estshorter/co2logger/images/display.png

グラフはAmbientから見られるようにした。 cpp-httplibでhttp通信をしている。 https://raw.githubusercontent.com/estshorter/co2logger/images/ambient.png

で、在宅環境はどうなったかというと、CO2濃度に気を付け始めて以来すこぶる調子が良い。ただ、DELL製32インチモニタ(U3219Q)に買い替えた影響が大きいかもしれない。金は正義。。。

*1:最近のファームウェア暗号化しないようだが、2020/11に購入した私のものは暗号化されていた。