MQ-135 часто продают как датчик качества воздуха, датчик CO₂, газовый сенсор Arduino или «детектор вредных газов». Все эти названия частично верны, но требуют важной оговорки: MQ-135 чувствует сразу несколько веществ, а его выходной сигнал не говорит напрямую, какой именно газ вызвал изменение.
Если в комнате стало больше дыма, паров спирта, аммиака или других соединений, напряжение на аналоговом выходе модуля изменится. Но по одному этому напряжению нельзя надёжно сказать: «здесь ровно 850 ppm CO₂». Для численных измерений конкретного газа нужна калибровка по эталону, контроль температуры и влажности, а иногда и другой, селективный сенсор.
Что такое MQ-135
Внутри газочувствительного элемента находится нагреватель и чувствительный слой на основе оксида олова SnO₂. Нагреватель поддерживает рабочую температуру, а поверхность SnO₂ меняет электрическое сопротивление при контакте с некоторыми газами.
У типового MQ-135 есть два электрода чувствительного элемента и встроенный нагреватель. На готовом модуле рядом с сенсором стоят:
- нагрузочный резистор
RL; - схема питания нагревателя;
- компаратор LM393 или аналогичный, если есть цифровой выход;
- потенциометр порога;
- выводы
A0,D0,VCC,GND.
Варианты плат отличаются. Одни имеют только аналоговый выход, другие добавляют цифровой компаратор. Цифровой D0 не измеряет концентрацию: он лишь сообщает, выше или ниже установленного потенциометром порога оказался сигнал.
Какие вещества обнаруживает MQ-135
Производители обычно указывают, что MQ-135 реагирует на:
- аммиак (NH₃);
- пары алкоголя;
- бензол;
- дым;
- сульфиды;
- оксиды азота;
- другие загрязнители воздуха.
В некоторых описаниях встречается также CO₂, поэтому MQ-135 часто называют сенсором углекислого газа. Но его чувствительность к CO₂ не является селективной и стабильной настолько, чтобы заменить специализированный NDIR-датчик CO₂. Для реального контроля вентиляции лучше использовать SCD30, SCD40/SCD41, Senseair или другой специализированный сенсор.
Что означает перекрёстная чувствительность
Если один датчик реагирует сразу на несколько газов, это называется перекрёстной чувствительностью. Представь, что напряжение на A0 изменилось. Это могло произойти из-за дыма, спиртовых паров, чистящего средства, аммиака, температуры, влажности или их комбинации.
Поэтому MQ-135 отвечает на вопрос:
«Изменилось ли состояние воздуха относительно калибровочной точки?»
Но плохо отвечает на вопрос:
«Какова точная концентрация конкретного газа?»
Основные характеристики
Значения зависят от производителя сенсора, ревизии платы и конкретного модуля. Перед разработкой своей платы смотри datasheet именно установленного элемента.
| Параметр | Типичное значение |
|---|---|
| Чувствительный материал | SnO₂, оксид олова |
| Питание модуля | Обычно 5 В |
| Напряжение нагревателя | Около 5 В |
| Потребление нагревателя | Порядка сотен милливатт; модуль заметно тёплый |
Нагрузочный резистор RL | Часто 10 кОм на готовом модуле; в документации MQ-135 рекомендуют около 20 кОм |
| Газовая чувствительность | NH₃, пары спирта, бензол, дым, сульфиды, NOx и другие загрязнители |
| Типичный диапазон из описаний модулей | Примерно 10–1000 ppm для отдельных газов |
| Время первичного старения | Обычно не менее 24–48 часов, иногда дольше после хранения |
| Выход | Аналоговый A0, пороговый цифровой D0 |
Не используй строку «10–1000 ppm» как универсальный диапазон для всех газов. Диапазон, график чувствительности и коэффициенты зависят от конкретного газа и условий. Производитель MQ-135 рекомендует длительное предварительное прогревание — более 24 часов; некоторые таблицы для нового или долго хранившегося сенсора указывают 48 часов и больше. [web:172][web:184]
Почему датчик нужно прогревать
Нагреватель MQ-135 поддерживает чувствительный слой в рабочем состоянии, но после производства или длительного хранения свойства поверхности постепенно стабилизируются.
Порядок действий при прогреве такой:
- Новый сенсор подключить к питанию в хорошо проветриваемом месте.
- Дать ему поработать минимум 24 часа, а для серьёзной калибровки — 48 часов или больше.
- После отключения питания перед каждым измерительным сеансом дать модулю прогреться несколько минут.
- Если сенсор долго лежал без питания, повторить длительный прогрев.
Короткое включение на 20 секунд может дать красивое число на экране, но это ещё не означает стабильное измерение. В учебном эксперименте так можно показать реакцию на дым или спирт; в системе контроля воздуха так делать нельзя.
MQ-135 нагревается. Не приклеивай его к пластику, пенополистиролу, проводам с плохой изоляцией или материалам, которые не рассчитаны на повышенную температуру.
Как работает схема измерения
Газовый элемент можно представить как переменное сопротивление Rs, включённое вместе с нагрузочным резистором RL в делитель напряжения.
Когда сопротивление сенсора меняется, меняется напряжение VRL на нагрузочном резисторе. Именно это напряжение подаётся на A0.
Для типовой схемы:
VCC ----[ Rs газового сенсора ]----+----[ RL ]---- GND
|
VRL → A0Если VCC известно, а RL указано или измерено, сопротивление сенсора можно оценить так:
Rs = RL · (VCC − VRL) / VRL
Эквивалентная форма:
Rs = RL · (VCC / VRL − 1)
Когда газа становится больше и сопротивление Rs уменьшается, напряжение на RL обычно растёт. Поэтому на распространённых модулях загрязнение воздуха часто увеличивает показание A0, но перед использованием проверь направление изменения именно своего модуля.
Распиновка готового модуля
| Вывод | Назначение |
|---|---|
VCC | Питание модуля, обычно 5 В |
GND | Общий провод |
A0 | Аналоговый выход, напряжение зависит от Rs |
D0 | Цифровой выход компаратора, порог задаётся потенциометром |
У некоторых плат подписи могут быть AO, DO, +, − или иметь другой порядок. Не подключай модуль только по расположению контактов на фотографии: проверь маркировку на текстолите.
Подключение MQ-135 к Arduino Uno/Nano
Arduino Uno и классический Nano работают с 5-вольтовой логикой, поэтому типовой модуль MQ-135 подключается напрямую.
| MQ-135 | Arduino Uno/Nano |
|---|---|
VCC | 5V |
GND | GND |
A0 | A0 |
D0 | D2, если нужен пороговый сигнал |
MQ-135 Arduino Uno / Nano
------ ------------------
VCC ---------------- 5V
GND ---------------- GND
A0 ---------------- A0
D0 ---------------- D2 [необязательно]Нагреватель может потреблять заметный ток и создавать помехи по питанию. Если показания скачут, запитай MQ-135 от отдельной стабильной линии 5 В с общей землёй и поставь рядом с модулем конденсатор, например 100 мкФ параллельно питанию. Номинал конденсатора не заменяет нормальный источник питания, но уменьшает быстрые просадки.
Подключение MQ-135 к ESP32
С ESP32 есть два разных вопроса:
- Сенсору нужен нагреватель и обычно питание 5 В.
- Аналоговый вход ESP32 рассчитан на диапазон до 3,3 В, а
A0модуля может подняться выше этого значения.
Поэтому VCC модуля обычно подключают к 5 В/VIN, а A0 заводят на ADC ESP32 через делитель напряжения.
Делитель для A0
Пример:
MQ-135 A0 ----[ 10 кОм ]----+---- GPIO34 ESP32
|
[ 20 кОм ]
|
GNDПри 5 В на A0 на входе ESP32 получится:
5 В × 20 кОм / (10 кОм + 20 кОм) ≈ 3,33 В
Лучше добавить небольшой запас и использовать, например, верхний резистор 12 кОм и нижний 20 кОм:
5 В × 20 / (12 + 20) ≈ 3,125 В
Или измерить максимальное напряжение A0 мультиметром и подобрать делитель так, чтобы даже при максимуме на ADC оставался запас ниже 3,3 В.
Подключение
| MQ-135 | ESP32 DevKit | Примечание |
|---|---|---|
VCC | 5V/VIN | Питание нагревателя и модуля |
GND | GND | Общая земля обязательна |
A0 | GPIO34 через делитель | ADC-вход, без прямых 5 В |
D0 | GPIO27 через согласование уровня | Только если нужен порог; проверить уровень D0 |
GPIO34 — пример ADC-входа на классическом ESP32. У ESP32-C3, S2, S3 и других вариантов набор ADC-пинов отличается. Также помни, что некоторые ADC ESP32 имеют ограничения при использовании Wi-Fi или зависят от attenuation и калибровки.
Не подключай
A0MQ-135 напрямую к ESP32, даже если в конкретный момент мультиметр показывает меньше 3,3 В. При изменении питания, прогреве или составе газа напряжение может стать выше.
Самый простой код для Arduino
Этот скетч не пытается назвать значение «ppm». Он только читает аналоговый уровень, считает среднее и показывает его в Serial Monitor.
constexpr int MQ135_PIN = A0;
int readAverageAdc(byte samples = 20) {
long sum = 0;
for (byte i = 0; i < samples; i++) {
sum += analogRead(MQ135_PIN);
delay(10);
}
return sum / samples;
}
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = readAverageAdc();
Serial.print("MQ-135 A0: ");
Serial.println(raw);
delay(500);
}На Arduino Uno analogRead() возвращает число примерно от 0 до 1023. Это не ppm и даже не универсальная шкала качества воздуха: это только код встроенного АЦП, пропорциональный напряжению на A0.
Код для ESP32 с делителем
В этом примере учитываем делитель 12 кОм сверху и 20 кОм снизу.
constexpr int MQ135_PIN = 34;
constexpr float ADC_MAX = 4095.0f;
constexpr float ADC_VOLTAGE = 3.3f;
// Верхний резистор: от A0 датчика к ADC.
constexpr float R_TOP = 12000.0f;
// Нижний резистор: от ADC к GND.
constexpr float R_BOTTOM = 20000.0f;
int readAverageAdc(byte samples = 32) {
uint32_t sum = 0;
for (byte i = 0; i < samples; i++) {
sum += analogRead(MQ135_PIN);
delay(5);
}
return sum / samples;
}
float adcVoltage(int raw) {
return raw * ADC_VOLTAGE / ADC_MAX;
}
float sensorVoltageFromAdc(float adcVoltageValue) {
return adcVoltageValue * (R_TOP + R_BOTTOM) / R_BOTTOM;
}
void setup() {
Serial.begin(115200);
analogReadResolution(12);
analogSetPinAttenuation(MQ135_PIN, ADC_11db);
}
void loop() {
int raw = readAverageAdc();
float adcVoltageValue = adcVoltage(raw);
float sensorVoltage = sensorVoltageFromAdc(adcVoltageValue);
Serial.printf("ADC: %d | ESP32: %.3f V | A0 MQ-135: %.3f V\n",
raw, adcVoltageValue, sensorVoltage);
delay(1000);
}ADC_11db и диапазон измерения зависят от версии Arduino core и конкретного ESP32. Не считай показания ADC идеальным вольтметром: для точности используй калибровку по известному напряжению и учитывай особенности своего чипа.
Как использовать цифровой выход D0
На модуле есть потенциометр. Он задаёт порог для компаратора LM393. Если аналоговый сигнал пересекает этот порог, D0 меняет логический уровень.
Пример для Arduino:
constexpr int MQ135_DIGITAL_PIN = 2;
constexpr int LED_PIN = LED_BUILTIN;
void setup() {
pinMode(MQ135_DIGITAL_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
}
void loop() {
int state = digitalRead(MQ135_DIGITAL_PIN);
Serial.print("D0: ");
Serial.println(state);
// У многих модулей активный уровень — LOW, но проверь свой.
digitalWrite(LED_PIN, state == LOW ? HIGH : LOW);
delay(100);
}D0 подходит для простой сигнализации: «порог превышен». Он не подходит для расчёта ppm и не даёт дополнительной точности. Перед подключением к ESP32 измерь напряжение высокого уровня D0 или используй согласователь, особенно если компаратор питается от 5 В.
Почему нельзя честно вывести CO₂ в ppm одним умножением
В интернете встречаются формулы вроде:
CO2 = 116.6020682 · (Rs / R0)^(-2.769034857)
Их можно встретить в библиотеках и учебных проектах, но нельзя воспринимать как универсальный закон MQ-135. Коэффициенты получены из аппроксимации определённой кривой чувствительности и зависят от:
- конкретного газа;
- версии сенсора;
RLи напряжения нагревателя;- температуры и влажности;
- срока прогрева;
- калибровки
R0; - качества и происхождения чувствительного элемента.
У MQ-135 есть графики отношения Rs/R0 к концентрации разных газов, а не одна универсальная прямая «напряжение → ppm». Если ты всё-таки строишь учебный оценочный индикатор, честно называй результат условным уровнем CO₂ по приближённой модели, а не точным измерением концентрации.
Что такое R0 и Rs
Rs— текущее сопротивление чувствительного слоя при текущем составе воздуха.R0— опорное сопротивление, полученное при известной эталонной концентрации газа и заданных условиях.
Расчёт Rs по напряжению
Если VCC = 5 В, RL = 20 кОм, а на A0 измерено VRL = 2 В:
Rs = 20 кОм · (5 − 2) / 2 = 30 кОм
Это сопротивление чувствительного элемента в текущих условиях. Чтобы получить отношение Rs/R0, нужно иметь корректное R0, измеренное по известной точке.
Как калибровать MQ-135
Калибровка — самая важная и самая часто пропускаемая часть проекта. Простая последовательность такая:
- Проверь, какой именно MQ-135 установлен и какой
RLнаходится на модуле. - Подай стабильное питание нагревателя.
- Проведи длительный прогрев нового сенсора минимум 24–48 часов.
- Помести сенсор в воздух с известным составом и стабильными температурой/влажностью.
- Сделай много измерений, отбрось первые нестабильные значения и усредни оставшиеся.
- Рассчитай
Rsи опорноеR0по графику datasheet для конкретного газа. - Сохрани
R0в коде или во Flash. - После калибровки проверяй сенсор по нескольким контрольным точкам, а не по одному измерению.
Обычная квартира с открытым окном не является лабораторным эталоном. В ней могут быть пары спирта от средств для уборки, дым от кухни, аэрозоли, пыль, нестабильная влажность и неизвестная концентрация CO₂. Поэтому «положили на подоконник и получили R0» — это приблизительная настройка относительного индикатора, а не метрологическая калибровка.
Пример кода для первичного расчёта Rs
Для Arduino Uno с модулем, где RL = 20 кОм, можно начать с такого измерения:
constexpr int MQ135_PIN = A0;
constexpr float VCC = 5.0f;
constexpr float RL_KOHM = 20.0f;
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(MQ135_PIN);
float vrl = raw * VCC / 1023.0f;
if (vrl < 0.01f) {
Serial.println("Слишком маленькое напряжение A0");
delay(1000);
return;
}
float rs = RL_KOHM * (VCC - vrl) / vrl;
Serial.print("Raw: ");
Serial.print(raw);
Serial.print(" | VRL: ");
Serial.print(vrl, 3);
Serial.print(" V | Rs: ");
Serial.print(rs, 2);
Serial.println(" kOhm");
delay(1000);
}Перед использованием формулы проверь реальное значение RL мультиметром. На разных модулях стоит 1 кОм, 10 кОм, 20 кОм или другой номинал, а иногда резистор имеет маркировку, которую легко неверно прочитать.
Температура и влажность
MQ-135 реагирует не только на газы. Температура и относительная влажность меняют поведение чувствительного слоя, поэтому одинаковый воздух при 20 °C и при 30 °C может дать разные показания.
Если проект должен работать дольше демонстрации на столе:
- добавь BME280, SHT31 или другой датчик температуры/влажности;
- записывай T/RH вместе с каждым показанием MQ-135;
- собирай собственную коррекционную таблицу для конкретного экземпляра сенсора;
- не переноси коэффициенты из случайной Arduino-библиотеки без проверки.
Температура самого корпуса MQ-135 не равна температуре воздуха: внутри работает нагреватель. Внешний датчик нужно поставить рядом, но не вплотную к горячему сенсору.
Как уменьшить шум показаний
MQ-135 не должен опрашиваться как кнопка с ожиданием мгновенной истины. Газовая динамика медленная, поэтому полезны фильтры:
- среднее из 16–64 измерений;
- медиана из 5–9 измерений для удаления выбросов;
- экспоненциальное сглаживание;
- отдельный порог включения и порог выключения, то есть гистерезис;
- усреднение за десятки секунд для графика;
- сохранение температуры и влажности рядом с измерением.
Простой экспоненциальный фильтр:
float filtered = 0;
void updateFilter(float value) {
constexpr float alpha = 0.05f;
if (filtered == 0) {
filtered = value;
} else {
filtered = alpha * value + (1.0f - alpha) * filtered;
}
}Малое alpha делает показания спокойнее, но замедляет реакцию. Для быстрого дымового сигнализатора нужен другой компромисс, чем для графика качества воздуха за час.
Безопасность
MQ-135 — это не сертифицированный пожарный, медицинский или промышленный газоанализатор. Не используй его как единственную защиту от:
- угарного газа CO;
- утечки бытового газа;
- взрывоопасной концентрации;
- недостатка кислорода;
- дыма в системе пожарной сигнализации;
- опасной концентрации аммиака или растворителей.
Для таких задач нужны сертифицированные датчики, правильная механика, контролируемое питание, самодиагностика и независимые каналы аварийного отключения. MQ-135 подходит для экспериментов, учебных стендов, относительного мониторинга и раннего обнаружения изменения условий, но не заменяет средство безопасности.
Не направляй на сенсор открытое пламя и не подноси неизвестные пары в закрытой комнате. Спирт, бензол и растворители пожароопасны и токсичны. При демонстрации используй малое количество безопасного вещества, хорошую вентиляцию и держи источник подальше от нагревателя.
Частые ошибки и диагностика
Показания всегда максимальные
Проверь питание, общий GND, делитель для ESP32, правильность формулы и состояние сенсора. Новый MQ-135 может долго стабилизироваться. Если на A0 реально почти 5 В, напрямую подключать его к ESP32 нельзя.
После включения показания медленно ползут
Это ожидаемо во время прогрева и стабилизации. Дай сенсору несколько минут после обычного перезапуска и десятки часов для первичного старения нового элемента.
D0 всегда LOW или HIGH
Поверни потенциометр очень медленно и смотри на светодиод модуля. Если состояние не меняется, проверь питание, полярность и направление изменения A0. У разных модулей активный уровень цифрового выхода может быть инверсным.
Показания меняются после открытия окна
Это может быть реальная смена смеси газов, влажности и температуры одновременно. MQ-135 не умеет разложить изменение на отдельные причины без дополнительных датчиков и калибровочной модели.
ESP32 перезагружается при подключении MQ-135
Нагреватель создаёт нагрузку на питание. Используй нормальный 5-вольтовый источник с запасом по току, короткие провода, общий GND и конденсатор рядом с модулем. Не запитывай нагреватель с GPIO ESP32.
Когда выбрать другой сенсор
| Что нужно измерять | Лучше рассмотреть |
|---|---|
| CO₂ для вентиляции | SCD30, SCD40/SCD41, Senseair NDIR |
| CO | Специализированный электрохимический или сертифицированный CO-сенсор |
| Летучие органические соединения | BME688, SGP30/SGP40 — с учётом их ограничений |
| Точное измерение конкретного газа | Селективный электрохимический, NDIR или промышленный сенсор |
| Относительное изменение загрязнения | MQ-135 может подойти после прогрева и калибровки |
| Дым/пламя в системе безопасности | Сертифицированный пожарный извещатель |
Практические проекты
- Индикатор относительного качества воздуха с зелёным/жёлтым/красным LED.
- График показаний MQ-135 + BME280 на ESP32 и web-панели.
- Сравнение воздуха на улице, в комнате и после проветривания.
- Учебный стенд по делителю напряжения и ADC.
- Регистратор показаний на SD-карту вместе с температурой и влажностью.
- Автоматическое включение вентилятора при превышении собственного, заранее измеренного порога.
Вентилятор нельзя подключать напрямую к GPIO. Для двигателя нужен транзистор/MOSFET, отдельное питание и защитный диод. Принцип такого ключа разобран в .
Что запомнить
- MQ-135 — широкополосный газовый сенсор на SnO₂, а не точный анализатор одного газа.
- Он реагирует на NH₃, алкоголь, бензол, дым, сульфиды, NOx и другие загрязнители; перекрёстная чувствительность не позволяет честно определить газ по одному аналоговому числу.
A0выдаёт аналоговое напряжение, аD0только сравнивает его с порогом потенциометра.- Новому сенсору нужен прогрев и старение: ориентируйся минимум на 24–48 часов перед серьёзной калибровкой.
- Для ESP32 питание модуля обычно остаётся 5 В, но
A0обязательно понижается до безопасного уровня 3,3 В через делитель. Rsможно оценить по формулеRs = RL · (VCC − VRL) / VRL, но точный ppm требует правильногоR0, графика для конкретного газа и компенсации среды.- MQ-135 подходит для учебных проектов и относительной индикации, но не заменяет сертифицированный датчик дыма, CO или опасных газов.
Проверь себя
- Почему MQ-135 нельзя считать точным датчиком CO₂ только потому, что на странице модуля написано «CO₂»?
- Что произойдёт, если подключить
A0модуля, запитанного от 5 В, напрямую к ADC ESP32? - Зачем MQ-135 нужен длительный прогрев?
- Чем отличаются
A0иD0?
Показать ответы
- MQ-135 чувствителен сразу к нескольким газам, а также к температуре и влажности. Его изменение сопротивления не является уникальным признаком CO₂. Для точного CO₂ нужен калиброванный NDIR-сенсор или другой специализированный прибор.
- На входе ESP32 может оказаться напряжение выше допустимых 3,3 В. Это способно повредить ADC или весь GPIO. Между
A0и входом ESP32 нужен делитель или согласователь уровня. - Чувствительный слой и нагреватель после производства или долгого хранения не сразу выходят на стабильный режим. Сначала показания дрейфуют, поэтому для калибровки сенсор оставляют под питанием минимум на 24–48 часов.
A0— аналоговый выход, по которому можно наблюдать изменение сигнала.D0— выход компаратора: он показывает только, пересёк ли сигнал порог, заданный потенциометром.