Как получить значение PPM из MQ-3?

Я попытался создать проект для обнаружения алкоголя с помощью Arduino Uno и датчика алкоголя MQ-3.

У меня уже есть значение R0, но здесь я столкнулся с проблемой: я не знаю, как преобразовать его в PPM или BAC. Я уже пробовал некоторый код из учебника для преобразования его в BAC, но когда я дал датчику alcohol, код выдает мне значение 0.00, и я не знаю почему.

Вот код для поиска значения R0:

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;
    RS = (5.0-sensor_volt)/sensor_volt; //
    R0 = RS/60.0; // 60 находится с помощью интерполяции
    Serial.print("R0 = ");
    Serial.println(R0);
    delay(1000);
}

Вот код для определения BAC:

float R0= 0.28;
void setup() {
  Serial.begin(9600);
}

void loop() {
  float sensor_volt;
    float RS_gas; // Получить значение RS в ГАЗЕ
    float ratio; // Получаем коэффициент RS_GAS/RS_air
    float BAC;
    int sensorValue = analogRead(A0);
    sensor_volt=(float)sensorValue/1024*5.0;
    RS_gas = (5.0-sensor_volt)/sensor_volt; // опустить *RL

   /*-Replace the name "R0" with the value of R0 in the demo of First Test -*/
    ratio = RS_gas/R0;  // соотношение = RS/R0
    float a = pow(ratio, 2);   
    float b = ratio/10;
    BAC = (0.1896*a) - (8.6178*b) + 1.0792 ;  // BAC в мг/л
    Serial.print("BAC = ");
    Serial.println(BAC*0.0001);  //преобразовать в g / dL
    Serial.print("\n\n");
    delay(1000);
}

Я хотел бы знать, что не так с кодом, и если вы знаете, как преобразовать значения R0 в PPM, пожалуйста, скажите мне.

, 👍1

Обсуждение

на рисунке 5 в таблице данных показано соотношение между выходным напряжением и значением PPM .... https://cdn.sparkfun.com/datasheets/Sensors/Biometric/MQ-3%20ver1.3%20-%20Manual.pdf ........... вы должны использовать таблицу подстановки для преобразования значения, @jsotola


1 ответ


4

Серия операторов if() и некоторое простое разделение должны быть в состоянии предоставить вам ваши результаты PPM.

Из спецификации, датчик алкогольного газа (модель: MQ-3), на рисунке 5 показана кривая чувствительности:

Sensitivity curve

Это можно увидеть здесь

Sensitivity curve - three regions

что существует три области, на которые кривая может быть разбита:

  1. Соотношение линейно пропорционально между 2,25 В и 3,25 В
  2. Между 3,25 В и 3,8 В имеется кривая
  3. Соотношение линейно пропорционально между 3,8 В и 4,25 В

Наклон участков прямой линии, описанный в точках 1 и 3, может быть представлен использованием константы, а значение PPM - простым делением напряжения на константу.

Кривая из второй части может быть следующей:

  • аппроксимируется прямой линией (таким образом, опять же, с использованием константы), для простоты, или;
  • точнее, с помощью таблицы подстановки.

Используя аппроксимацию кривой прямой линией (показана ярко-зеленым цветом), график приобретает вид:

Straight line approximation

Чтобы определить константу для трех линий, просто возьмите две точки на каждой линии и используйте:

(y2 - y1) / (x2 - x1)

Таким образом, для первой области, предполагая (по приближению, 3 В соответствует 100 промилле, а 2,5 В соответствует 85 промилле (здесь мое зрение может быть немного сбито), наклон равен

(3 - 2.5)/(100-80) = 0.5/20 = 0.025

Вы можете вычислить константы для областей два и три аналогичным образом (если используете аппроксимацию прямой линией для области два).

Следовательно, код будет состоять из строк

const double kRegionOne = 0.025;   // константа первой области
const double kRegionTwo = ???;     // константа второй области
const double kRegionThree = ???;   // константа третьей области

int ppm;                           // результат ppm

/*
 * your code here
 * ...
 */

if ((sensor_volt < 3.25) && (sensor_volt >= 2.25)) {
  ppm = sensor_volt/kRegionOne;    // мы находимся в регионе 1
} else if ((sensor_volt < 3.8) && (sensor_volt >= 3.25)) {
  ppm = sensor_volt/kRegionTwo;    // мы находимся в регионе 2
} else if (sensor_volt >= 3.8) {
  ppm = sensor_volt/kRegionThree;  // мы находимся в регионе 3
}

Если вы хотите быть более точным, то используйте таблицу поиска для второго региона, как указано в jsotola в их комментарии.

,