MQ-3 Alcohol Gas Sensor вывод показаний

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Купил такой датчик: http://www.ebay.com/itm/310540259827

Даташит: http://nootropicdesign.com/projectlab/downloads/mq-3.pdf

Пишется об аналоговом выходе (у меня есть два DO и AO) - цифр. и аналог

Говорят, что данноый датчик способен измерять в диапазоне 0.05mg/L—10mg/L В переводе на промилле, я так понимаю 0,1‰ - 20‰ (может что-то неправильно рассчитал, но вроде как 0,1‰ - 0,045мг/л.). Также пишется о том, что при первом запуске датчика необходимо дать ему прогреться около 48 часов.

Я пока не экспериментировал с датчиком (лежит, греется), но хотелось бы видеть данные не 0 - 1023, а нечно приближенное к промиллям (вообще, возможно ли это?). Посему хотел спросить у уважаемого сообщества, а кто-нибудь щупал данный датчик? Может кто-то писал уже скетчи для него?

Для себя вижу скетч в таком (примерно) виде:

01const int MQ3PIN = 0;
02 
03int _baseline = 0;
04 
05void setup() {
06  Serial.begin(9600);
07  pinMode(MQ3PIN, INPUT);
08   
09  // Берем 20 проб воздуха прежде чем приступить к работе
10  Serial.println("Calibrating...");
11  autoCalibrate(20);
12   
13  Serial.print("Baseline is:");
14  Serial.println(_baseline);
15}
16 
17void loop()
18{
19  int val = getReading();
20  Serial.print("VAL = ");
21  Serial.println(val);
22     
23  // Изменяет значения от 0,05 мг./л (0,1‰) до 10 мг/л. (20‰)
24  float val1 = map(val, _baseline, 1023, 0, 200); 
25  Serial.print("VAL_mapping = ");
26  Serial.print(val1);
27  Serial.println("‰ / 10");
28     
29  // Находим кол-во аналог инпут в 0,1‰
30  float prom_0_1 = 1024/200; // делим максимум аналог инпут на максимум - 20 промилле (умноженное на 10)
31  float prom = 0.1 * val / prom_0_1;
32  Serial.print("VAL_BEZ_mapping = ");
33  Serial.print(prom);
34  Serial.println("‰ (without baseline)");
35 
36  delay(1000);
37}
38 
39// Автокалибровка
40void autoCalibrate(int samples)
41{
42  int val, i, lastnum;
43  boolean firstcal = true;
44  for(i = 0; i < samples; i++)
45  {
46    val = analogRead(MQ3PIN);
47    if(firstcal)
48    {
49      !firstcal;
50      lastnum = val;
51    }
52    else
53      lastnum = (lastnum + val) / 2;
54       
55    delay(100);
56  }
57  _baseline = lastnum + 20;
58}
59 
60// Чтение показаний с поправками после автокалибровки
61int getReading()
62{
63  int val = analogRead(MQ3PIN);
64  val -= _baseline;
65  if(val > 0)
66    return val;
67  return 0;
68}

P.S. В интернете ничего внятного не нашёл. Все как правило читают AnalogRead и на этом все заканчивается.

И ещё один вопрос - я так понимаю, резистор посдстроечник на плате для изменения digital-сигнала (LOW, HIGH)? Или что-то недочитал в даташите?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

Ro: sensor resistance at 0.4mg/L of Alcohol in air at 33%RH and 20 ℃ 

В мануале ясно что зависимость линейная. Поэтому вам нужно снять 2 паказания с заведомо известными параметрами - расположенными в середине рабочего диапазона с достаточным различием. А дальше всего лишь математика.

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

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Я понимаю, что датчик аналоговый.

Я спросил совета, потому как не представляю, как его откалибровать. Поэтому и подумал, может есть какая-то другая "математика", пусть даже в попугаях ))))

Araris
Offline
Зарегистрирован: 09.11.2012

Калибровать ? Боюсь, Вы хотите невозможного от простейшего датчика стоимостью около доллара.

Посмотрите в даташите "Fig.3 is shows the typical sensitivity characteristics of the MQ-3 for several gases.", а также "Fig.4 is shows the typical dependence of the MQ-3 on temperature and humidity.". Датчик откликается на множество газов, температурные и влажностные зависимости, все это в совокупности ОЧЕНЬ усложняет калибровку.

Я немного занимался с датчиками серии MQ, на мой взгляд, показания их имеют смысл разве что для некой приблизительной оценки качества воздуха. Что-то типа " if (CurAirLevel > MaxAirLevel) { RelayAlarmState = true; } "

NeiroN пишет:

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

leshak
Offline
Зарегистрирован: 29.09.2011

CityCat пишет:

Я понимаю, что датчик аналоговый.

Я спросил совета, потому как не представляю, как его откалибровать. Поэтому и подумал, может есть какая-то другая "математика", пусть даже в попугаях ))))

Открыть учебник школы. Где-то 6-7-мой класс :)

Вообщем смотрите. Датчик это у нас какая-то линейная функция (в идеале). То есть функция вида:

y(x)=K*x+B, где y - это "загрязнения воздуха" (в попугаях, промялих и т.п.), а x - это то что возвращает analogRead()

"откалибровать", означает узнать вот эти коэфициенты K и B. Когда мы будем их знать, предположим K=2, B=3, то мы сможем пересчитать любое значение analogRead() в "попугаи"

1float getParrots(){
2   return 2*analogRead(A0)+3;
3}

Все. Эта функция у нас будет возвращать показания датчика "в попугаях".

Но эти цифры 2 и 3 - я взял "с потолка". А нужно "настоящие" - то есть откалибровать. Как?  Вспоминаем, из школы, что для того что-бы однозначно провести прямую нам нужно знать как минимум две точки. То есть для калибровки датчика нужно где-то на стороне получить две пары соотвествующих друг другу значений Попугаи1=Значение1 и Попугаи2=Значение2

Где вы возмете эти две "известные точки" - зависит уже от вашей фантазии. Либо сами намеряете, скажем загоните датчик в атмосферу чистого кислорода, а потом чистого метана и помереяте analogRead , либо отдолжите где-то лабораторный измеритель замеряете им и сопоставите с показаниями analogRead, либо.... в даташите на датчик найдете эту информацию - вообщем тут уже от вас зависит.

Когда у вас есть эти две известные точки (любую функцию можно представить себе как "график"), скажем вы "намеряли/выяснили" такие две точки  (145,0.5) и (200, 0.8)  , первые цифры это "analogRead", а вторые это "попугаии". Подставляем эти две точки в нашу функцию и получаю систему двух линейных уравнений с двумя неизвестынми

0.5=K*145+B
0.8=K*200+B

Решаем эту систему: K = 3/550 ~~ 0.0054545 и B = -16/55 ~~ -0.29091

Апдейтим нашу "попугайную функцию":

1float getParrots(){
2   return  0.0054545*analogRead(A0)-0.29091 ;
3}

И все. Мы получили функцию откалиброванную по двум точкам (145,0.5) и (200, 0.8)

leshak
Offline
Зарегистрирован: 29.09.2011

Мы сняли несколько показаний датчика. Получили несколько точек. То есть получили "дискретную" (табличную) функцию. Но, так как нам нужно получать значения это функции не только в точках которые намеряли, но и между ними. Нам нужно подобрать "аналоговую функцию" (которую не трудно расчитывать) проходящую через эти же точки. И в дальнейшем пользоватся уже ей. Вот этот "подбор функции проходящей через известные точки" и называется "апроксимация".

В простейшем случае - это линейная функция. Вида f(x)=K*x+b, для ее подбора достаточно знать две точки. Но если датчик "плохой" и его карактеристики не линейны (проверить это можно подобрав функцию по двум точкам, потом померять еще третью, контрольную и посмотреть "попала" она в нее или нет), то прийдется подбирать какие-то более "хитрые функции". С загибонами :)  (полиномами, тригонометрическими и т.д.) Но там уже, для приемлимой точности потребуется иметь больше "калибровочных точек" (чем больше - тем точнее :) 

sair74@mail.ru
Offline
Зарегистрирован: 24.08.2016

Дорогие друзья. Я по поводу калибровки датчика MQ3. Есть замечательная книжка товарища Г. Виглеба называется "Датчики". 1989 года. Издательство "Мир". Там датчик MQ3  и ему подобные из современной серии MQ описан как изделие японской фирмы FLP. Очень полезный материал. Подробнейшим образом даны описанеия, характеристики, схемы включения. Кое какие практические схемки. В том числе и методика калибровки датчика MQ3.

negavoid
Offline
Зарегистрирован: 09.07.2016

У меня тоже есть такой датчик, однажды поигрался с ним да и забросил из-за отсутствия смысла привязки к промилле и дикого жора спирали нагрева (но порт +5 на ардуине выдержал). Вот показания AnalogRead( MQ3 ):

stand by, трезвое дыхание - 130-140

литр пива 4.5% ~ 240

два литра - 290

три с половиной литра - 429

ну а дальше мне уже стало пофигу на датчик :) но как какой-то показометр за бакс - использовать можно :)

Logik
Offline
Зарегистрирован: 05.08.2014

//ну а дальше мне уже стало пофигу на датчик

а зря. после 7 литров он практически линейный ;)

sair74@mail.ru
Offline
Зарегистрирован: 24.08.2016

Вот, ребята, мой датчик:

На свежем воздухе - выход 0,05 вольта.

Дальше, кунаю спичку в спирт и мажу язык - дышу - 0,95 вольта.

Потом - накрываю пробкой, смоченной спиртом - 2,6 вольта. (питание датчика - 4,6 в)

По той книжке я еще не пробовал калибровать. Самому недавно в руки попала. Там смысл в чем... Берется человек массой 75 килограмм, перед ним ставятся 8 рюмок водки 40%. В каждую наливают по 20 грамм. На тощак жертва выпивает первую рюмку. Ждем 15 минут. Потом еще 20 грамм - ждем 15 минут и дуем на датчик. Алкотестер в этом состоянии должен показать 0,2 промилле. после 8-й дозы показания должны быть 1,0 промилле. Ну как привязать выход датчика к шкале алкотестера, я думаю никому объяснять не надо. Да, пацаны, это не шутка. Это реальная методика калибровки.