Общие сведения
MH-Z19C — инфракрасный (NDIR) датчик углекислого газа от Winsen. Он меряет именно CO2, а не расчётный «эквивалент» (eCO2), как датчики качества воздуха на летучих веществах. Число в ppm датчик выдаёт готовым по UART, есть и выход ШИМ. Внутри — термокомпенсация и автокалибровка нуля.
Ориентиры: на улице около 420 ppm, в проветренной комнате 600–800, с 1000 ppm пора открыть окно, при 1500–2000 и выше — духота, клонит в сон.
Раньше здесь продавался MH-Z19B, теперь приходит MH-Z19C. Команда чтения у них одна и та же, но у C нет аналогового выхода, а вместо штырей стоит разъём на 7 контактов с шагом 1,25 мм. Делитель напряжения на линиях UART больше не нужен.
Характеристики
- Газ: CO2, метод NDIR (поглощение инфракрасного света).
- Диапазон: 400–5000 ppm (указан на наклейке), шаг 1 ppm, точность ±(50 ppm + 5 % от показаний).
- Питание: 5 В (допустимо 4,5–5,5 В), ток в среднем до 40 мА, в пике 125 мА — источник нужен не слабее 150 мА.
- Выходы: UART 9600 бод, 8N1 (уровни 3,3 В, входы выдерживают 5 В) и ШИМ.
- Прогрев 1 мин, время отклика T90 — до 120 с.
- Условия работы: от −10 до +50 °C, влажность 0–95 % без конденсата.
- Размеры с разъёмом 38,8 × 19,7 × 8,6 мм, вес 5 г.
- Разъём: 7 контактов, шаг 1,25 мм (ответная часть — JST MX1.25, она же Molex PicoBlade).
Цифры — из паспорта Winsen, версия 1.2 (PDF, на английском).
Подключение к Arduino
Удобнее всего — шлейфом JST MX1.25 «Мама» – Dupont «Мама» на 7 контактов: разъём вставляется в датчик, а провода по одному надеваются на штыри платы. Нужны четыре провода:
- 4 (Vin) — к 5V;
- 3 (GND) — к GND;
- 6 (TX) — к выводу 2;
- 5 (RX) — к выводу 3.
Как считать контакты: положите датчик золотым корпусом к себе, разъёмом влево — контакт 1 нижний, 7 верхний, ближе к бумажному фильтру. Сверьтесь с рисунком до включения. Контакт 2 не подключают, 1 (HD) и 7 (PWM) — только если они нужны.

Скетч
Библиотеки не нужны: раз в 5 секунд плата отправляет датчику команду чтения и печатает ответ в монитор порта (9600 бод). Первую минуту датчик греется, цифры в это время неточные. Проверка: подышите на датчик — показания заметно вырастут.
#include <SoftwareSerial.h>
SoftwareSerial co2(2, 3); // вывод 2 — приём (к TX датчика), вывод 3 — передача (к RX датчика)
const byte ZAPROS[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // прочитать CO2
const byte ABC_OFF[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86}; // выключить автокалибровку
// Возвращает CO2 в ppm или -1, если ответа нет или он испорчен
int readCO2() {
byte otvet[9];
while (co2.available()) co2.read(); // выбрасываем старые байты
co2.write(ZAPROS, 9);
if (co2.readBytes(otvet, 9) != 9) return -1; // ждём ответ не дольше секунды
if (otvet[0] != 0xFF || otvet[1] != 0x86) return -1;
byte sum = 0;
for (byte i = 1; i < 8; i++) sum += otvet[i];
sum = 0xFF - sum + 1; // контрольная сумма по паспорту
if (otvet[8] != sum) return -1;
return otvet[2] * 256 + otvet[3];
}
void setup() {
Serial.begin(9600);
co2.begin(9600);
// co2.write(ABC_OFF, 9); // для теплицы и комнат без проветривания
}
void loop() {
int ppm = readCO2();
if (ppm < 0) {
Serial.println(F("Нет ответа: проверьте питание и не перепутаны ли TX и RX"));
} else {
Serial.print(F("CO2 = "));
Serial.print(ppm);
Serial.print(F(" ppm"));
if (millis() < 60000UL) Serial.print(F(" (прогрев, пока не верить)"));
Serial.println();
}
delay(5000);
}
Без UART концентрацию можно читать с контакта 7 (PWM): период около 1004 мс, ppm = 5000 × (tвыс − 2 мс) / (T − 4 мс), где tвыс — длительность высокого уровня, 5000 — верхняя граница диапазона.
Калибровка
Нулём датчик считает 400 ppm — уровень уличного воздуха. С завода включена автокалибровка: каждые 24 часа после включения датчик сам подстраивает ноль. Она рассчитана на квартиры и офисы, которые проветривают. В теплице, на ферме, в холодильнике её отключают командой FF 01 79 00 00 00 00 00 86 (в скетче уберите // в строке с ABC_OFF). Включает обратно FF 01 79 A0 00 00 00 00 E6.
Ручная калибровка: вынесите работающий датчик на улицу или к открытому окну на полчаса, затем замкните контакт 1 (HD) на GND на 7 секунд или дольше. Производитель советует калибровать не реже раза в полгода.
Что важно знать
- Не давите на золотой корпус — это оптическая камера. Держите датчик за плату.
- Бумажный фильтр — окно, через которое заходит воздух. Не заклеивайте его, а в корпусе прибора сделайте рядом прорези.
- Не ставьте датчик у нагревателя, на солнце и надолго в пыль.
- Питание только 5 В: от 3,3 В и от слабого источника датчик занижает показания или не работает.
- «Нет ответа» в мониторе — чаще всего перепутаны TX и RX: TX датчика идёт на вывод 2 платы.
С этим берут
- Шлейф JST MX1.25 – Dupont, 7 pin — подключить датчик к плате без пайки.
- Arduino Uno R3 — плата, под которую написан скетч.
- Четырёхразрядный индикатор LED (Trema-модуль) — показывать ppm без компьютера.
- Датчик CO2 с RS485 / Modbus — если датчик нужен в щит автоматики, на длинный кабель.
Комплектация
- Датчик углекислого газа MH-Z19C — 1 шт.























