Детектор из чужого гайда я поставил на кухне и неделю радовался. Потом заметил закономерность: сигналка орала каждый раз, когда с плиты поднимался пар от чайника. Чистая кухня, ноль горючих газов — а скетч видел тревогу. В чужом скетче стоял порог 300, писали его под экземпляр с покоем 90; у меня же фон был 210 — и порог висел в девяноста единицах над воздухом, куда пара долетала без труда.
Урок простой и неприятный: жёстко зашитые пороги — это чужая калибровка. Два одинаковых с виду MQ-2 с одного лотка показывают в чистом воздухе 140 и 210 — разброс между коробочками в десятки процентов. Любое число в чужом скетче подразумевало чужой сенсор, чужое питание и чужую комнату. Такой разброс — паспорт серии, а не брак конкретной коробочки.
В этом уроке наведём порядок: снимем кривую своего экземпляра через Serial Plotter, посчитаем Ro — сопротивление сенсора в чистом воздухе, разберёмся, как из аналоговых единиц получить хотя бы грубые ppm, и выведем свои пороги вместо чужих.
Кривая вместо числа
Первый инструмент — печать раз в 200 мс парами имя=значение: строка mq=187 в Serial Plotter превращается в живую кривую. Почему именно пары: плоттер держит отдельный ряд на каждое имя, и mq=187 ляжет в один аккуратный график, а голое число из println уедет в позиционную кашу. Если события длинные, добавьте в ту же строку пару t= с секундами от millis()/1000 — по ней видно, сколько длился всплеск. Про сам инструмент — урок про Serial Plotter в разделе Serial, а кривые температуры и влажности уже строились в уроке про плоттер с DHT.
Что видно на кривой сразу и чего не видно в числах: ровная полка покоя, всплеск при поднесении спирта, плато, пока ватка рядом, спад после — с хвостом на десятки секунд. Числа 187 и 190 в мониторе сливаются в одно «почти ничего», а на графике видно, что идёт медленный дрейф фона или резкий выброс — и это разные события с разными выводами. Медленный дрейф лечится усреднением, резкий выброс — повод смотреть, что происходило рядом: без причины он не бывает.
Скорость печати выбирайте по событию: 200 мс для спиртовых тестов, 500-1000 мс для фонового мониторинга. Быстрее 100 мс смысла нет — сенсор физически не успевает за реакцией, и кривая только шумит, съедая внимание. Плоттер на 9600 бод переварит и чаще, но сенсор быстрее не станет.
// Калибровка Ro: среднее за 10 секунд в чистом воздухе, потом контроль Rs/Ro const int PIN_GAS = A0;const float RL = 5000.0; // нагрузочный резистор модуля, Омfloat ro = 0; // сопротивление сенсора в чистом воздухе void setup() { Serial.begin(9600); Serial.println("Kalibrovka Ro: chistyj vozduh, 10 sekund"); float summa = 0; int n = 0; unsigned long t0 = millis(); while (millis() - t0 < 10000) { // собираем 10 секунд summa = summa + analogRead(PIN_GAS); n = n + 1; delay(100); } float srednee = summa / n; // средний уровень покоя float rs = RL * (1023.0 - srednee) / srednee; // сопротивление сенсора ro = rs / 9.8; // 9.8 — Rs/Ro чистого воздуха по даташиту MQ-2 Serial.print("pokoj="); Serial.print(srednee, 1); Serial.print(" roOm="); Serial.println(ro, 0);} void loop() { int mq = analogRead(PIN_GAS); float rs = RL * (1023.0 - mq) / mq; // текущее сопротивление сенсора Serial.print("mq="); Serial.print(mq); Serial.print(" rsRo="); Serial.println(rs / ro, 2); // отношение к воздуху — главный параметр delay(200);}Ro, ppm и почему map врёт
Сенсор MQ-2 по сути резистор, чьё сопротивление зависит от состава воздуха: в чистом оно большое, при горючих газах падает. На модуле оно стоит в делителе с нагрузочным резистором RL — на типичных платах 5 кОм, — и analogRead показывает, как делитель поделился. Пересчёт простой: Rs = RL * (1023 − mq) / mq. Поднесли спирт — mq вырос, Rs упал: в 150 единицах покоя сидит около 29 кОм, в 600 после всплеска — около 3,5 кОм. Формулу удобно проверить на симуляторе: фон 100 даёт 46 кОм, слайдер на 500 — примерно 5,2 кОм, и делитель виден как на ладони.
Ro — то же Rs, но на чистом воздухе. Его и калибруют: после прогрева усредняем показания за десять-пятнадцать секунд (усреднение глушит дрожь АЦП — приём из урока про фильтр АЦП), переводим среднее в сопротивление и делим на 9,8 — таково отношение Rs/Ro чистого воздуха в даташите MQ-2. Дальше весь разговор о концентрации ведётся в безразмерном Rs/Ro: единица — воздух, пол-единицы — ощутимый газ в воздухе. Отношение удобно тем, что часть проблем питания и делителя в нём сокращается: сдвинулся фон — сдвинулся и знаменатель.
Главное свойство Ro: он свой у каждого экземпляра. Мой фон 140 и соседний 210 — это разные сопротивления и разные Ro, и попытка подставить чужое значение даст чужую шкалу. Отсюда порядок действий из практики: прогрев, десять секунд усреднения, Ro в константу скетча — и только после этого разговоры о порогах и ppm. Заодно запишите дату калибровки: сенсор стареет, и через полгода Ro стоит переснять.
Почему линейный map здесь врёт. Функция честно растянет 0-1023 на любой диапазон: map(mq, 0, 1023, 0, 10000) вернёт для фона 140 почти 1400 ppm — на воздухе, где горючего нет вовсе. Зависимость сопротивления от концентрации не линейная, а степенная: удвоение концентрации падает на сопротивление не вдвое, а примерно в полтора раза, и вся шкала выгнута. Правильная модель — кривая ppm = A * (Rs/Ro)^B, где A и B — коэффициенты из даташита, свои для каждого газа: пропан, метан и дым идут разными ветками. На пальцах через логарифм: прологарифмируйте обе части — и степенная кривая развернётся в прямую линию в осях lg(ppm) против lg(Rs/Ro); именно так даташит рисует свои графики — линейки на логарифмической сетке. В скетче кривая умещается в одну строку через pow() и log() — главное держать в переменной Rs/Ro, а не сырой mq.
Точная ppm-арифметика для бытового датчика — роскошь: без аттестованной газовой смеси проверять её нечем. Практический минимум, которого мне хватает: печатать Rs/Ro и смотреть, во сколько раз сенсор ушёл от воздуха. Двукратное падение — «что-то есть», четырёхкратное — «выйти из кухни»; на графике те же скобки: Rs/Ro ниже половины — пора реагировать. Пороговая сигнализация в этих единицах перестаёт зависеть от разброса экземпляров — тот же принцип, что и в уроке про map с потенциометром, только там зависимость честно линейная, и map на своём месте. Граница простая: если скетч печатает ppm без калибровки — это фейкометр, а не измерение.
| Задача | Инструмент | Когда хватает |
|---|---|---|
| Жив ли сенсор | спирт или зажигалка без огня плюс кривая в плоттере | всегда, десять секунд |
| Свой порог тревоги | покой с плоттера, умноженный на 2-3; снятие на четверть ниже | сигнализация без ppm |
| Грубые ppm | Ro и степенная кривая из даташита | логгер, интеграция в умный дом |
| Тревога без скетча | винт подстроечника на DOUT | гараж или дача без Arduino |
Два теста, которые я гоняю на каждом новом MQ-2. Зажигалка без огня: порция газа вылетает секундным импульсом, и кривая делает узкий всплеск с быстрым спадом — так проверяют быстродействие. Спирт на ватке: плавный подъём, плато на десять-двадцать секунд, плавный спад — так проверяют пороги и гистерезис. Первый — стрелка, второй — ровная линейка, и нужен именно второй: от всплеска порог поймать можно, а снять — уже головная боль. Оба теста занимают меньше минуты и вместе с кривой отвечают на вопрос, жил ли сенсор до всякой калибровки. И не ждите идентичных повторов: две ватки одного и того же спирта дают разброс 10-20 единиц — это норма, а не деградация.
Про окружение честно: сенсор реагирует на влажность и температуру, а конденсат на керамике заставляет его врать, поэтому ванная и улица с туманом — не его места. Сверку с эталоном делаю так же, как для влажности в уроке про калибровку DHT по эталону: рядом — проверенный источник, снимаем разницу и запоминаем поправку. У газа роль эталона играют ватка со спиртом и терпение. Прогар 24-48 часов из предыдущего урока — тоже часть калибровки: Ro, снятый в первый час работы, уплывёт за сутки, и вся ppm-шкала поедет вместе с ним.
Финальное правило, которое живёт в каждом моём газовом скетче: порог входа = свой покой, умноженный на 2-3; порог выхода — на четверть ниже входа; после каждой калибровки — спиртовой тест. Линейный map оставьте для честно линейных задач, а газ считайте через Rs/Ro и степенную кривую. База всей цепочки — подключение MQ-2 и первые показания, а готовая сигнализация с реле и кнопкой — в уроке про порог и тревогу. Три урока вместе дают полный цикл: провода, тревога, свои числа — и каждое звено проверяется без газа, спиртом и графиком.
- 1. Что такое Ro у MQ-2?
- 2. Почему линейный map(mq, 0, 1023, 0, 10000) врёт в ppm?
- 3. Как правильно получить Ro для своего экземпляра?
- 4. Что покажет кривая при зажигалке без огня рядом с сенсором?
- 5. Почему MQ-2 врёт в сырой ванной?
- Печать раз в 200 мс парами имя=значение — и Serial Plotter превращает MQ-2 в живую кривую.
- Ro = сопротивление в чистом воздухе: усреднили 10 секунд, перевели через Rs = RL * (1023 − mq) / mq, разделили на 9,8.
- Концентрация — степенная кривая ppm = A * (Rs/Ro)^B; линейный map в нижней трети шкалы завышает в разы.
- Пороги из чужих скетчей — чужая калибровка: фон между экземплярами расходится на десятки единиц.
- Тесты: зажигалка без огня — узкий всплеск, спирт на ватке — плато; конденсат заставляет сенсор врать.
Частые вопросы по теме урока
- Что такое Ro у MQ-2?
- Ro — базовая точка калибровки: сопротивление сенсора на чистом воздухе. Отношение текущего Rs к Ro — главный безразмерный параметр. сопротивление сенсора в чистом воздухе
- Почему линейный map(mq, 0, 1023, 0, 10000) врёт в ppm?
- Кривая ppm = A * (Rs/Ro)^B выгнута: удвоение концентрации не удваивает уровень. Линейный map на нижней трети шкалы завышает в разы — на чистом воздухе насчитает тысячи ppm из ничего. зависимость сопротивления от концентрации степенная, а не линейная
- Как правильно получить Ro для своего экземпляра?
- После прогрева собираем среднее за 10-15 секунд, переводим в Rs по делителю с RL и делим на 9,8 — отношение Rs/Ro чистого воздуха из даташита. усреднить показания за десять секунд в чистом воздухе и пересчитать в сопротивление
- Что покажет кривая при зажигалке без огня рядом с сенсором?
- Порция газа вылетает секундным импульсом — кривая делает узкий пик и падает. Плавное плато даёт спирт на ватке, а не зажигалка. короткий узкий всплеск с быстрым спадом
- Почему MQ-2 врёт в сырой ванной?
- Сенсор реагирует на влажность и температуру; конденсат на керамике искажает показания. Для сырых помещений MQ-2 не предназначен. конденсат и влажность смещают показания чувствительного слоя