アルコールセンサー 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]以上からアウトだそうです。
酒酔い運転
(「酒酔い」とは、「アルコールの影響により車両等の正常な運転ができない状態」をいう。)
酒気帯び運転
- 呼気中アルコール濃度0.15mg/l 以上 0.25mg/l 未満
基礎点数13点
免許停止 期間90日(※)
- 呼気中アルコール濃度0.25mg/l以上
基礎点数25点
免許取消し 欠格期間2年(※)