アルコールセンサー MQ-3 と Arduinoで呼気中と血中のアルコール濃度(BAC:blood alcohol concentration)測定をしてみた。
といってもDatasheetの[Rs/R0]/[mg/L]両対数グラフから近似式を手計算で算出して
変換しただけなので、実際の値とどれくらい近いのかは不明。
参考したURLのページでは、回帰分析しているんですが、いまいちな結果だったので、
今回の手計算で求めた近似式にしてみました。
なので、必ず、ご自分で確認をしてください。
ダイソーで買ってきたアルコールウェトテッシュ近づけると
値を出しましたが、近いかどうか誰か検証したら教えてね。
使用したモジュールはこちらのMQ-3モジュール
まず、キャリブレーションのためにR0値を測定する
スケッチは下記。ここで計算されるR0値はメモっておきましょう。
// キャリブレーションのためにR0を計測する // MQ-3 Pin1 VCC → Arduino 5V // MQ-3 Pin2 GND → Arduino GND // MQ-3 Pin3 DOUT:アルコール検出でHIGH出力する → 今回は不使用 // MQ-3 Pin4 AOUT:アルコールレベルのアナログ出力 → Arduino A0 // Wind Abaft Co., Ltd. void setup() { Serial.begin(9600); } void loop() { float sensor_volt; float RS; // 空気中のRS値 float R0; // アルコール中のR0値 float sensorValue; for(int i = 0 ; i < 100 ; i++) { sensorValue = sensorValue + analogRead(A0); } sensorValue = sensorValue/100.0; //平均値の算出 sensor_volt = (sensorValue/1024)*5.0; //ArduinoのPWMは10ビット1024 RS = (5.0-sensor_volt)/sensor_volt; // 省略 RL R0 = RS/60.0; // きれいな空気中のRS/R0=60 Serial.print("R0 = "); Serial.println(R0); delay(1000); }
まず呼気中のアルコール濃度を求めるのに、下記グラフから手計算で下記の近似式を作った。
検算していないので間違っているかも。
BAC(呼気中のアルコール濃度[mg/L]) = pow(10,-1*(((log10(ratio))+0.2391)/0.6008))
この式と先ほど求めたR0値をもとに呼気中アルコール濃度算出する。
一般的に,呼気中アルコール濃度[mg/L] : BAC[mg/ml] = 1:2
とのことなので、それを元に2倍してBAC[mg/ml]出した。
先ほどの測定で得た
R0値
を、下記に代入してみてください
// キャリブレーションのために測定したR0の値を利用する // MQ-3 Pin1 VCC → Arduino 5V // MQ-3 Pin2 GND → Arduino GND // MQ-3 Pin3 DOUT:アルコール検出でHIGH出力する → 今回は不使用 // MQ-3 Pin4 AOUT:アルコールレベルのアナログ出力 → Arduino A0 // Wind Abaft Co., Ltd. Fumiyoshi.Yotsugi #include <math.h> void setup() { Serial.begin(9600); } void loop() { float sensor_volt; float RS_gas; // 測定対象のガス中のRS値 double ratio; // RS_gas/RS_air 空気中のRS割合 double BAC; int sensorValue = analogRead(A0); sensor_volt=(float)sensorValue/1024*5.0; RS_gas = (5.0-sensor_volt)/sensor_volt; // 省略 *RL /*- "R0" を先ほど計測した値に置き換えてください -*/ ratio = RS_gas/R0; // ratio = RS/R0 BAC = pow(10,-1*(((log10(ratio))+0.2391)/0.6008)); // mg/L中のBAC Serial.print("呼気中BAC[mg/L] = "); Serial.println(BAC); // 呼気中のアルコール濃度[mg/L] Serial.print("\n"); Serial.print("血中BAC[mg/ml] = "); Serial.println(BAC*2); // 血液内のアルコール濃度[mg/ml]に変換(1:2) Serial.print("\n\n"); delay(1000); }
ちなみに本モジュールはアルコールに反応して(アルコール濃度が閾値をこすと)、
D3 Pin (D Out)がhighを出力して、モジュール裏面のチップLEDが点灯します。
上記の私の式だと0.01[mg/L]で、モジュール裏面のチップLEDが点灯してしまうので
敏感すぎるかなーという感じですね。
より更正していく必要がありそうです。
参考:https://www.teachmemicro.com/mq-3-alcohol-sensor/
データシート:https://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf
アルコール濃度の運転技能へ与える影響は下記だそうです。
悪影響を与える運転技能 | 血中アルコール濃度 (mg/mL) |
呼気中アルコール濃度 (mg/L) |
---|---|---|
注意の集中 | 0.05 | [0.025] |
反応時間 | 0.2 | [0.1] |
追跡技能 | 0.2 | [0.1] |
多方面への注意 | 0.2 | [0.1] |
ハンドル操作 | 0.3 | [0.15] |
視覚機能(視線の固定が困難) | 0.4 | [0.2] |
規則遵守 | 0.5 | [0.25] |
出典元:https://www.asahibeer.co.jp/csr/tekisei/drink_drive/effect.html
ちなみに法定の酒気帯び基準は下記(参照:警察庁)
呼気中アルコール濃度0.15[mg/L]以上からアウトだそうです。
酒酔い運転
(「酒酔い」とは、「アルコールの影響により車両等の正常な運転ができない状態」をいう。)
- 基礎点数35点
免許取消し 欠格期間3年(※)
酒気帯び運転
- 呼気中アルコール濃度0.15mg/l 以上 0.25mg/l 未満
基礎点数13点
免許停止 期間90日(※) - 呼気中アルコール濃度0.25mg/l以上
基礎点数25点
免許取消し 欠格期間2年(※)
興味深く拝見しました
当方個人事業のせっけん製造屋ですが、エタノールインフュージョン(浸出)と言うか、
ハーブなどを油とエタノール(油の10%などの量)の混合に漬けて成分や色を抽出し
その後エタノールをとばして(70度に加熱など)せっけんの製造工程に進む
エタノールはできるだけ揮発させておきたい。
ということをするのですが
エタノールの揮発具合を確認するためArduino、Seeed社のGrove – Alcohol Sensorに
LCD、プリンター(測定結果記録をせっけん製造ロット記録にアナログに残すため)という機器を自分で作っているところです
問題は対象のエタノール入り油をどう計測するかで、センサー部分の構造です
対象を取り分けてチャンバーにセット、といったことをせず(油なのでやっかい、汚して仕事を増やしたくない)
対象がどんな状態でも計測できるような方法を考えています
当方プログラミングは全くできませんが、
Arduinoと、ココナラなどのアウトソーシングがあってならでは自社で開発できます
アルコールセンサーというとアルコールチェッカーとなりますが
当方の場合はアルコール残存測定機をローコストで実現したいというところです
記事を面白く拝見しコメントした次第です
コメントありがとうございます!
是非その測定器が出来上がりましたら、リンク等送ってもらえるとうれしいです。