Raspberry Piで動かす、CO2センサーのよみとりプログラムをPythonで作ります。
K30 CO2 センサーは電源が入っているといつでも計測しており、レジスタに入っている最新の計測値を外部から読みに行きます。
K30 CO2 センサーには、センスエアABCアルゴリズムという自己校正機能があります。これは予め設定された時間インターバル(デフォルトは180時間)中のCO2センサの最小測定値を常に内部記録し、長期ドリフトを緩やかに補正する機能です。屋内アプリケーションを想定しており、デフォルトではこの機能はオンになっています。当方のように長期間同じ条件で計測したい場合は、オフとすべきと考えます。
サンプルプログラムががこちらにありますが、センスエアABCアルゴリズムを無効にすることを含め、 Modbusプロトコル仕様 Document TDE2336 にしたがって、あらたに作りました。
CO2sensor.py をコメント番号にしたがって説明します。
(1) UARTを読めるようにserialをinclude
(2) /dev/ttyAMA0 にUARTの設定
Baud rate = 9600
timeout=0.5
(3) ABCアルゴリズムを無効にする
Document TDE2336 によると、ABCアルゴリズムの周期をゼロにすることにより無効にできます。そのためセンサーに次の8バイトを送ります。
<>はhexadecimal
<FE> <06> <00> <1F> <00> <00> <AC>
<03>
ここで<FE> :Any address <06> :Write Single Register <00> <1F> :レジスタ・アドレス<00> <1F>にゼロ<00> <00>を書き込む <AC> <03>:CRCコード
(4) データの読み取りコマンド
データの読み取りの前にセンサーに次のコマンドを送ります。
<FE> <04> <00> <03> <00> <01> <D5>
<C5>
ここで<FE> :Any address <04>: Read input registers <00> <03>:レジスタ・アドレス <00> <01>:Quantity of registers <D5> <C5>:CRCコード
(5) 8バイトのreturn valueを読んでresultに代入
3バイト目と4バイト目にCO2濃度(ppm)が入る。CRCコードはドントケア
(6) 出力データは時刻、濃度
(7) ファイル出力
CO2data.txtというCSV形式のファイルができる。たとえば
2019/07/23 14:51:19,437
(8) 1分に一度よみとる
|