アルコールチェッカー、というよりはアルコール成分の有無検出器といったレベルのものができたのだが、もう少し追求してみる。
MQ-3Bのデータシートを頑張って読み解いて、測定電圧をアルコール濃度に変換しなければならない。こちらは残念ながら、比較対象となる正確なアルコール気体がないので、ただ自分が満足するレベルを追い求める世界。一応、世の中にはエタノール蒸気の濃度が保障された気体が販売されているようだが、趣味で手が出る金額ではなかった。
ちなみに自分でアルコール濃度を出力するプログラムを作り、自身の酒酔いの呼気を吹きかけてみた数字から概算すると、60~70ppmとなる。酒気帯びのサイトを調べると、これはそもそも死んでいる値ではなかろうか?センサー(MQ-3)を使ってラズパイからアルコールを計測してみたのサイト上だと0.6ppmとなり、これはまあそんなかんじかなという値である。
しかし、上記サイトはMQ-3のモジュール化キットのデータシートであり、今回使っているMQ-3Bというセンサ単体と同じにしてよいのかという疑問があるし、元のセンサのデータシートがなぜこんば記載になっているのかという話もある。きちんと英語を読めばわかるかもしれない。
調査を進めるうち、分かったのは、ppmとmg/lの単位変換は、測定対象の分子(量)により異なるということ。さらに、測定時点の温度、湿度、気圧も変換式のパラメータに入ってくる。きちんと変換式を通してみたら、それらしき値になった。
ラズパイには気圧計をつけていないので、気圧は1013hPaで固定でよいとしても、温湿度は手元にセンサがあるので合体させてみようか。
もう一点気になるのが、アルコールなしの状態の電圧V0が安定しないことだ。長時間測定していると、数百秒単位でトレンドが変化していくので、どれがV0だかわからない。これも温湿度の影響か?
どちらのグラフも、線が突出しているのはアルコール呼気を吹きかけてみた瞬間。
MQ-3Bのデータシートをみると、このセンサは使っていなかった期間によって初期エージングの必要期間がだいぶ変わる。1週間単位でつけっぱなしにしたので、エージングとしては問題ないと思うが。。例えば朝方に急に電圧が下がっていたりして、なんとも気持ち悪い。正確なV0がわからないと、アルコール濃度の絶対値もわからない。短時間で使う相対値チェッカーとしては使えるのだけども。
というわけで、温湿度を合わせて取ることにした。もしかするとVrefの安定化も必要かも。V0が安定しない原因は調査中だが、ADコンバータのVrefもそもそもブレているかもしれないと思い、Vrefとしてラズパイ出力の3.3V系を採用してみたが、結果に変化はなかった。
【 中級コース : RaspberryPi を改造してみましょう。 】
このサイトによると、ラズパイの3.3V系はすでにスイッチングレギュレーターが入っている。ノイズは入るが、平均値は正確そうである。逆に、ラズパイの5V系はACアダプタの性能がそのままでそうな構成。
うーん、5V電源を1回昇圧して、シャントレギュレータで5Vに落としてやれば安定なVrefやV0が得られるんだろうか。アルコール検知器にそこまでやってもしょうがないか?将来的にラズピコで動かすときは、正確性より省電力が重要になるだろうしな。
と、ここで問題発生。DHT11の実行結果でたまに温度湿度が0になるときがある。
DHT側のモジュールの中身を少しいじってエラーコードを詳細に吐き出すと、ERR_MISSINGDATA とERR_CRCという種別のエラーコードがぱらぱらでていた。
エラーコードが2種類混じるということは話がややこしいが、SPI通信とGPIO操作を同時に行うことがよくないのだろうか?
コードをさらに追いかけてみたが、自分の技術力では残念ながらそれ以上の原因がわからない。ちなみに前に作成した元の温湿度計測プログラムも、ログをよくよく見ると、データが取れていない瞬間がポロポロあった。
これ以上追いかけるのはやめることにした。GPIOのデータ転送を深堀しないとダメそう。測定値がゼロになってしまう頻度は低いので、前値保持にしてしまえば、実用上はそこまで問題にはならなそうである。
