Как получить значение 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, пожалуйста, скажите мне.
@Josh Parinussa, 👍1
Обсуждение1 ответ
Серия операторов if()
и некоторое простое разделение должны быть в состоянии предоставить вам ваши результаты PPM.
Из спецификации, датчик алкогольного газа (модель: MQ-3), на рисунке 5 показана кривая чувствительности:
Это можно увидеть здесь
что существует три области, на которые кривая может быть разбита:
- Соотношение линейно пропорционально между 2,25 В и 3,25 В
- Между 3,25 В и 3,8 В имеется кривая
- Соотношение линейно пропорционально между 3,8 В и 4,25 В
Наклон участков прямой линии, описанный в точках 1 и 3, может быть представлен использованием константы, а значение PPM - простым делением напряжения на константу.
Кривая из второй части может быть следующей:
- аппроксимируется прямой линией (таким образом, опять же, с использованием константы), для простоты, или;
- точнее, с помощью таблицы подстановки.
Используя аппроксимацию кривой прямой линией (показана ярко-зеленым цветом), график приобретает вид:
Чтобы определить константу для трех линий, просто возьмите две точки на каждой линии и используйте:
(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 в их комментарии.
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- SRF04 Ультразвуковой датчик - неточные показания
на рисунке 5 в таблице данных показано соотношение между выходным напряжением и значением PPM .... https://cdn.sparkfun.com/datasheets/Sensors/Biometric/MQ-3%20ver1.3%20-%20Manual.pdf ........... вы должны использовать таблицу подстановки для преобразования значения, @jsotola