アルコールセンサー MQ-3 と Arduinoで呼気中と血中アルコール濃度(BAC)測定 スケッチコード付

アルコールセンサー 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))

MQ-3 アルコール濃度両対数グラフ
MQ-3 アルコール濃度両対数グラフ

この式と先ほど求めた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年(※)