アプリ置き場

アプリ置き場

http://www.moreread.net/

CO2-miniによる二酸化炭素濃度取得

夏場に部屋を締め切ってエアコンをがんがんかけていると、ふと二酸化炭素濃度がどうなっているのか気になった。
1000ppm(0.1%)を超えるとぼーっとしたり眠くなったり人体に影響が出始めるそうだ。
ということで比較的安いCO2計測装置CO2-miniを購入して確認した。

 
換気すれば500ppm程度、窓を閉め切っているとすぐに1000ppmに。そのまま就寝・起床後は2000ppm程度まであがった。
とりあえずしっかり動作して目的は果たし、24時間換気の重要性を改めて知るのだけど、この装置気になることがある。こいつはCO2の計測だけではなく気温も測ってくれるのだが、CO2濃度と気温を交互に表示する仕様となっている。そのため、CO2濃度を見たい!と思ったときに気温が表示されててイラッとする。切り替わるまでが案外長い。ついでに給電がUSBなのだが横からケーブルが生えるので設置したときの見た目も微妙にイケてない。
 
解決方法としてはPCのソフトがある。
Amazonのコメントに書かれていたのだが、CO2 MeterというところのOEMらしく、本家のほうのソフトウェアが動作する。USB接続で情報を取得しPC上で常に監視できる。グラフ化もできる。
 
しかしながらこのソフトがまたイマイチ……。グラフ表示がメインなので無駄に大きいし、最小化最大化ボタンがなぜか反応せず。
ということで、とにかくリアルタイムでCO2濃度を見るというだけのシンプルなガジェットがほしかったので、自分で作ることにした。
偉大な先人方がハックして情報がそろっているらしく簡単に制御できた。
 
いつも通りC#で組み始めたのだが、HidLibraryというものを使うと制御できそうなので、NuGetしてくる。USBの制御方法なんて雰囲気しか知らないがなんとかなった。
製品IDとベンダーIDでデバイスを特定し、WriteFeatureDataでキーを送ると、データを取得できるようになる。
キーとか暗号化の解除方法とかは上記のページが詳しい。
//ProductHexId = "0xA052"
//VendorHexId = "0x04D9"
HidDevice deviceList = HidDevices.Enumerate().ToArray();
HidDevice co2miniList = deviceList.Where(x =>x.Attributes.ProductHexId == "0xA052" && x.Attributes.VendorHexId =="0x04D9").ToArray();
HidDevice co2mini = co2miniList.Length > 0 ? co2miniList[0] : null;
if(co2mini != null){
co2mini.OpenDevice();
co2mini.WriteFeatureData(feature_data);
……
HidDeviceData data = co2mini.Read();
……
}
成果物。