MQ-3 Alcohol Gas Sensor вывод показаний
- Войдите на сайт для отправки комментариев
Купил такой датчик: 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, а нечно приближенное к промиллям (вообще, возможно ли это?). Посему хотел спросить у уважаемого сообщества, а кто-нибудь щупал данный датчик? Может кто-то писал уже скетчи для него?
Для себя вижу скетч в таком (примерно) виде:
const int MQ3PIN = 0;
int _baseline = 0;
void setup() {
Serial.begin(9600);
pinMode(MQ3PIN, INPUT);
// Берем 20 проб воздуха прежде чем приступить к работе
Serial.println("Calibrating...");
autoCalibrate(20);
Serial.print("Baseline is:");
Serial.println(_baseline);
}
void loop()
{
int val = getReading();
Serial.print("VAL = ");
Serial.println(val);
// Изменяет значения от 0,05 мг./л (0,1‰) до 10 мг/л. (20‰)
float val1 = map(val, _baseline, 1023, 0, 200);
Serial.print("VAL_mapping = ");
Serial.print(val1);
Serial.println("‰ / 10");
// Находим кол-во аналог инпут в 0,1‰
float prom_0_1 = 1024/200; // делим максимум аналог инпут на максимум - 20 промилле (умноженное на 10)
float prom = 0.1 * val / prom_0_1;
Serial.print("VAL_BEZ_mapping = ");
Serial.print(prom);
Serial.println("‰ (without baseline)");
delay(1000);
}
// Автокалибровка
void autoCalibrate(int samples)
{
int val, i, lastnum;
boolean firstcal = true;
for(i = 0; i < samples; i++)
{
val = analogRead(MQ3PIN);
if(firstcal)
{
!firstcal;
lastnum = val;
}
else
lastnum = (lastnum + val) / 2;
delay(100);
}
_baseline = lastnum + 20;
}
// Чтение показаний с поправками после автокалибровки
int getReading()
{
int val = analogRead(MQ3PIN);
val -= _baseline;
if(val > 0)
return val;
return 0;
}
P.S. В интернете ничего внятного не нашёл. Все как правило читают AnalogRead и на этом все заканчивается.
И ещё один вопрос - я так понимаю, резистор посдстроечник на плате для изменения digital-сигнала (LOW, HIGH)? Или что-то недочитал в даташите?
У вас аналоговый датчик, который нужно калибровать на этих параметрах:
Ro: sensor resistance at 0.4mg/L of Alcohol in air at 33%RH and 20 ℃
В мануале ясно что зависимость линейная. Поэтому вам нужно снять 2 паказания с заведомо известными параметрами - расположенными в середине рабочего диапазона с достаточным различием. А дальше всего лишь математика.
Чтобы получать точные показания в цифровом виде нужно было брать более дорогой датчик, который проходит процедуры калибровки при производстве.
Я понимаю, что датчик аналоговый.
Я спросил совета, потому как не представляю, как его откалибровать. Поэтому и подумал, может есть какая-то другая "математика", пусть даже в попугаях ))))
Калибровать ? Боюсь, Вы хотите невозможного от простейшего датчика стоимостью около доллара.
Посмотрите в даташите "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; } "
Чтобы получать точные показания в цифровом виде нужно было брать более дорогой датчик, который проходит процедуры калибровки при производстве.
Я понимаю, что датчик аналоговый.
Я спросил совета, потому как не представляю, как его откалибровать. Поэтому и подумал, может есть какая-то другая "математика", пусть даже в попугаях ))))
Открыть учебник школы. Где-то 6-7-мой класс :)
Вообщем смотрите. Датчик это у нас какая-то линейная функция (в идеале). То есть функция вида:
y(x)=K*x+B, где y - это "загрязнения воздуха" (в попугаях, промялих и т.п.), а x - это то что возвращает analogRead()
"откалибровать", означает узнать вот эти коэфициенты K и B. Когда мы будем их знать, предположим K=2, B=3, то мы сможем пересчитать любое значение analogRead() в "попугаи"
float getParrots(){ return 2*analogRead(A0)+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
Апдейтим нашу "попугайную функцию":
float getParrots(){ return 0.0054545*analogRead(A0)-0.29091 ; }И все. Мы получили функцию откалиброванную по двум точкам (145,0.5) и (200, 0.8)
Мы сняли несколько показаний датчика. Получили несколько точек. То есть получили "дискретную" (табличную) функцию. Но, так как нам нужно получать значения это функции не только в точках которые намеряли, но и между ними. Нам нужно подобрать "аналоговую функцию" (которую не трудно расчитывать) проходящую через эти же точки. И в дальнейшем пользоватся уже ей. Вот этот "подбор функции проходящей через известные точки" и называется "апроксимация".
В простейшем случае - это линейная функция. Вида f(x)=K*x+b, для ее подбора достаточно знать две точки. Но если датчик "плохой" и его карактеристики не линейны (проверить это можно подобрав функцию по двум точкам, потом померять еще третью, контрольную и посмотреть "попала" она в нее или нет), то прийдется подбирать какие-то более "хитрые функции". С загибонами :) (полиномами, тригонометрическими и т.д.) Но там уже, для приемлимой точности потребуется иметь больше "калибровочных точек" (чем больше - тем точнее :)
Дорогие друзья. Я по поводу калибровки датчика MQ3. Есть замечательная книжка товарища Г. Виглеба называется "Датчики". 1989 года. Издательство "Мир". Там датчик MQ3 и ему подобные из современной серии MQ описан как изделие японской фирмы FLP. Очень полезный материал. Подробнейшим образом даны описанеия, характеристики, схемы включения. Кое какие практические схемки. В том числе и методика калибровки датчика MQ3.
У меня тоже есть такой датчик, однажды поигрался с ним да и забросил из-за отсутствия смысла привязки к промилле и дикого жора спирали нагрева (но порт +5 на ардуине выдержал). Вот показания AnalogRead( MQ3 ):
stand by, трезвое дыхание - 130-140
литр пива 4.5% ~ 240
два литра - 290
три с половиной литра - 429
ну а дальше мне уже стало пофигу на датчик :) но как какой-то показометр за бакс - использовать можно :)
//ну а дальше мне уже стало пофигу на датчик
а зря. после 7 литров он практически линейный ;)
Вот, ребята, мой датчик:
На свежем воздухе - выход 0,05 вольта.
Дальше, кунаю спичку в спирт и мажу язык - дышу - 0,95 вольта.
Потом - накрываю пробкой, смоченной спиртом - 2,6 вольта. (питание датчика - 4,6 в)
По той книжке я еще не пробовал калибровать. Самому недавно в руки попала. Там смысл в чем... Берется человек массой 75 килограмм, перед ним ставятся 8 рюмок водки 40%. В каждую наливают по 20 грамм. На тощак жертва выпивает первую рюмку. Ждем 15 минут. Потом еще 20 грамм - ждем 15 минут и дуем на датчик. Алкотестер в этом состоянии должен показать 0,2 промилле. после 8-й дозы показания должны быть 1,0 промилле. Ну как привязать выход датчика к шкале алкотестера, я думаю никому объяснять не надо. Да, пацаны, это не шутка. Это реальная методика калибровки.