Купил такой датчик: 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, а нечно приближенное к промиллям (вообще, возможно ли это?). Посему хотел спросить у уважаемого сообщества, а кто-нибудь щупал данный датчик? Может кто-то писал уже скетчи для него?
Для себя вижу скетч в таком (примерно) виде:
07 | pinMode(MQ3PIN, INPUT); |
10 | Serial .println( "Calibrating..." ); |
13 | Serial .print( "Baseline is:" ); |
14 | Serial .println(_baseline); |
19 | int val = getReading(); |
20 | Serial .print( "VAL = " ); |
24 | float val1 = map(val, _baseline, 1023, 0, 200); |
25 | Serial .print( "VAL_mapping = " ); |
27 | Serial .println( "‰ / 10" ); |
30 | float prom_0_1 = 1024/200; |
31 | float prom = 0.1 * val / prom_0_1; |
32 | Serial .print( "VAL_BEZ_mapping = " ); |
34 | Serial .println( "‰ (without baseline)" ); |
40 | void autoCalibrate( int samples) |
43 | boolean firstcal = true ; |
44 | for (i = 0; i < samples; i++) |
46 | val = analogRead(MQ3PIN); |
53 | lastnum = (lastnum + val) / 2; |
57 | _baseline = lastnum + 20; |
63 | int val = analogRead(MQ3PIN); |
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() в "попугаи"
1
float
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
Апдейтим нашу "попугайную функцию":
1
float
getParrots(){
2
return
0.0054545*analogRead(A0)-0.29091 ;
3
}
И все. Мы получили функцию откалиброванную по двум точкам (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 промилле. Ну как привязать выход датчика к шкале алкотестера, я думаю никому объяснять не надо. Да, пацаны, это не шутка. Это реальная методика калибровки.