Комментарии 70
Насколько этот датчик врёт? Есть какой-то другой прибор для измерения что бы сравнить?
В комментариях на Али пишут: I compared the results with EXTECH-CO250 and MH-Z19 seems to be very accurate.
Статья, где его сравнивают с другим похожим датчиком: http://foogadgets.blogspot.com/2016/02/new-co2-sensor-support-for-wms-mk3.html
Я заказал более "взрослое" устройство для измерения CO2, но пока не получил. Попробую с ним сравнить тогда.
Ночью в комнате спит 1 человек, закрыта дверь, окно на микропроветривании. Днем соответственно окно открыто, комната открыта.
В принципе, показания похожи на правду. Сравнить с чем-либо еще нет возможности.
Датчик подключен к ESP8266 по serial интерфейсу, прошивка написана в Arduino IDE. Работает больше 2-х месяцев непрерывно.
На влажность и температуру не обращайте внимания, стоит дешевый DHT11, температура еще на что-то похожа, а по влажности скорее всего врёт.
https://thingspeak.com/channels/98389
Как выглядит
Благодаря ему нашли проблемы с вентиляцией.
Сейчас уже используем MH-Z19, датчик работает стабильно, но на мой взгляд слегка занижает показания CO2 (при открытом окне через полчаса после завершения рабочего дня выдаёт 400 ppm, при том что уровень CO2 в атмосфере уже слегка превышает эту отметку), либо у нас в городе (Ярославская область) очень чистый воздух.
https://habrastorage.org/files/dd6/f94/c3d/dd6f94c3d4ca44888d2d287074a660b7.jpg
Вроде как из видимых отличий — только наличие DAC-выхода у MH-Z14 и более высокая скорость реакции (не очень актуально для измерения CO2, его концентрация нарастает очень плавно).
Скорее всего оптимизировали производство, сократили себестоимость и таким образом продвигают новый продукт.
Для нас MH-Z19 оказался наилучшим вариантом, т.к. имеет гораздо меньшие габариты, два окна воздухозабора и потребляет почти в 3 раза меньше энергии.
1) подключить к GPIO малины и написать bash/perl/… скрипт
2) подключить к PL2303 и написать bash/perl/… скрипт для того чтобы можно было подключать к роутерам (MR3020, etc), компьютерам и прочему без привязки к платформе
Т.е. чтобы было что-то типа
```~# ./getco2.sh
785
Возможно, сразу предусмотреть обнаруженные вами проблемы, скажем с ключом --check выводить предупреждения, если значение является заведомо ошибочным (скажем ниже 300) или скачет (например, запрашивая дважды с интервалом в 10-15 сек, если значения разнятся (учитывая ваши примеры ошибок)).
В конфиге ядра должен быть ключ: CONFIG_USB_SERIAL_FTDI_SIO=m
При подключении девайса в dmesg появится что-то типа:
ftdi_sio 2-1.7:1.0: FTDI USB Serial Device converter detectedПолучить название порта можно командой: ls /dev/ttyUSB*
usb 2-1.7: FTDI USB Serial Device converter now attached to ttyUSB0
Чтобы номер не скакал, его можно намертво прибить с помощью udev.
Для работы perl-скрипту нужна библиотека Device::SerialPort, легко ставится через cpan или вручную.
#!/usr/bin/perl
use strict;
use Device::SerialPort qw( :PARAM :STAT 0.07 );
# ls -al /dev/ttyUSB* or set manualy
my $port_id = `ls /dev/ttyUSB*`;
chomp $port_id;
$port_id =~s/\s+.+//;
print "Using port: $port_id\n";
my $ob = new Device::SerialPort($port_id, 1) || die "Can't open $port_id: $!\n";
$ob->baudrate(9600);
$ob->parity('none');
$ob->databits(8);
$ob->stopbits(1);
$ob->handshake('none');
$ob->write_settings();
$ob->write("\xFF\x01\x86\x00\x00\x00\x00\x00\x79");
sleep 1;
my $c = $ob->input || die "Read fail";
my @data = map {ord($_)} split('', $c);
my $crc = 0;
$crc+=$data[$_] for (1..7);
$crc = (($crc & 255) ^ 255) + 1;
die "CRC error: $crc / $data[8]" if ($crc ne $data[8]);
my $co2 = $data[2] * 256 + $data[3];
print "OK: $co2\n";
$ob->close();
Это черновик, хотя и рабочий. Вместо ожидания девяти байт ответа, я поставил просто sleep 1 — датчик за такое время гарантированно успеет ответить (или с ним что-то не в порядке). Ждать три минуты не имеет смысла — датчик готов к работе через три минуты после физического подключения, а не через три минуты после установления связи, так что если он постоянно воткнут в USB, то всегда готов к работе. Но вы, конечно же, можете смотреть время подключения по dmesg.
Опрашивать датчик можно хоть сразу, но с холодного старта он будет выдавать ошибочные значения. Однако есть тонкость — если вы датчик просто перезапустили, то ждать не надо.
Насчет контрольной суммы — она у меня сходится, даже в статье пример взят с реальных данных. Если у вас не сошлась, то предположу, что проблема или в unsigned, или в том, что вы не ограничили ее одним байтом. Попробуйте вручную посчитать — там всего-то 8 операций.
Что сделать с датчиком?
Добавить индикатор, таким образом получить полнофункциональное устройство аналогичное:
но ВДВОЕ дешевле. Датчики температуры и влажности по вкусу.
Даджетовский сейчас, судя по сайту, стоит 4950 — дороже в полтора раза.Вполне адекватная цена, у меня как раз такой — отличная вещь.
Но далеко не все считают эту цену приемлемой.
В 2500 вписаться легко можно: датчик, attiny2313 (удобный UART, ножек в достатке, кварц не нужен на таких скоростях), индикатор на выбор ЖК или цифровой-LED и по-мелочи — пара конденсаторов.
Пожалуй и на температурный датчик останется )
Если уж считаем копейки, то ардуино здесь лишнее.
MH-Z19 — 26$
Arduini Mini Pro — $1
ESP8266 — 1.5$
LCD 16x2 — 1.5$
DHT22 — 2.5$
BMP180 — 1.5$
Итог: 34$
Плюс расходы на изготовление платы, корпуса и разная мелочь.
Напряжение питания должно быть больше 3.6В, если оно будет ниже, то датчик начинает сильно завышать показания.
Потребление тока у датчика импульсное, при напряжении 5В большую часть времени ток 4 мА, но каждые 6 сек потребление возрастает до 100 мА, длительность импульса меньше секунды.
То есть датчик производит измерения раз в 6 секунд, и нет смысла опрашивать его чаще.
Ранее написал маленькую программу — построитель графика CO2 для этого датчика, может, кому нибудь пригодится.
Сложилось ощущение, что датчик начинает работать точней, проработав хотя бы полдня.
Сейчас делаю автономный прибор для измерения CO2, с возможностью строить графики и передавать данные на компьютер при помощи NRF24L01:

Можете дать примеры ссылок, где не рекомендуют подавать больше 3.3V?
— Т.к. датчик имеет 3-вольтовую логику, обычные Arduino лучше не использовать.
я не сразу разобрался что значит «3-х вольтовая» логика + на фотографии видно что автор подключил датчик к VCC выходу 3-х вольтовой ардуино, а судя по datasheet с нее выходит 3.3 вольта: https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide
— it’ll be either 3.3V or 5V respectively. This voltage is regulated by the voltage applied to the RAW pin. If the board is powered through the ‘RAW’ pin (or USB), this pin can be used as an output to supply other devices.

К слову АЦП там есть http://esp8266.ru/forum/threads/tochnost-adc.598/
void loop() {
long tt = millis();
int myVal = digitalRead(pwmPin);
//Если обнаружили изменение
if (myVal == HIGH) {
digitalWrite(LedPin, HIGH);
if (myVal != prevVal) {
h = tt;
tl = h - l;
prevVal = myVal;
}
} else {
digitalWrite(LedPin, LOW);
if (myVal != prevVal) {
l = tt;
th = l - h;
prevVal = myVal;
ppm = 5000 * (th - 2) / (th + tl - 4);
if (ppm < 5000 && (!last_ppm || ppm > last_ppm + 10 || ppm < last_ppm - 10)) {
last_ppm = ppm;
Serial.println("PPM = " + String(ppm));
}
}
}
}
Это не лучший вариант, правильно было бы отслеживать изменения через прерывание, но вполне рабочий.
Ваши приготовления, вероятно, были связаны с высокой точностью измерений, тогда как у Z19 точность ± (50ppm + 5% reading value).
Аналогично и с напряжением питания. Сенсор работает даже на 3.3В. Но производитель указывает в качестве напряжения питания 3.6 — 5.5В, причем отдельной строкой подчеркивает важность соблюдения этих рамок.
Приобрёл MH-Z19 и FTDI FT232RL, подключил к TP-Link TL-WR2543ND
Установил прошивку OpenWRT 15.05
https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/openwrt-15.05-ar71xx-generic-tl-wr2543-v1-squashfs-factory.bin
Активировал SSH-сервер, подключился, установил пакеты:
wget http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/packages/packages/coreutils-stty_8.23-1_ar71xx.ipk
wget http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/packages/packages/coreutils_8.23-1_ar71xx.ipk
opkg install kmod-usb-serial-ftdi
opkg install coreutils_8.23-1_ar71xx.ipk
opkg install coreutils-stty_8.23-1_ar71xx.ipk
Далее установил правильную скорость порта
stty -F /dev/ttyUSB0 raw ispeed 9600 ospeed 9600 cs8 -ignpar -cstopb eol 255 eof 255
В одном сеансе SSH выполнил
head -c 9 /dev/ttyUSB0 | hexdump -d | cut -c 19-23
В другом
echo -en '\xff\x01\x86\x00\x00\x00\x00\x00\x79' > /dev/ttyUSB0
Получил значение CO2 (ppm) в десятичном виде, например, 00787
Я не силен в bash-программировании, но полагаю, что скрипт будет выглядеть как-то так:
#!/bin/bash
RESP=`head -c 9 /dev/ttyUSB0 | hexdump -v -e '1/1 "%d" " "'`
RA=(${RESP// / })
if [ "${#RA[@]}" -lt "9" ]
then
echo "Read error"
exit 1
fi
CRC=0
for i in {1..7}
do
let CRC+=RA[$i]
done
CRC=$((256-$((CRC%256))))
CRC=$((CRC%256))
if [ "$CRC" == "${RA[8]}" ]
then
let CO2=RA[2]*256+RA[3];
echo "CO2: $CO2"
else
echo "CRC error"
fi
exit 0
Получил датчик почтой. Ваш код заработал без проблем на Arduino Micro, добавил поддержку OLED, получился такой мелкий показометр:
Думаю какой-нибудь светодиодный столбик найти, чтобы показывать не в цифрах а в виде бара.
но не стоит запрашивать данные по UART чаще раза в 10 секунд, иначе сенсор начинает выдавать что-то странное.
В моем случае странных результатов не возникало даже при запросе раз в секунду. Возможно в последних версиях сенсора научились правильно обрабатывать такие запросы.
Купил себе недавно MH-Z19, ≈1300р.
Буду собирать с двумя АКБ по 3,7в,
Низкошумящем линейным стабилизатором от телефона на 3.3В, дисплеем лёд(микро от электронной сигареты) данные сдать по блютуз.
Кто знает что там сзади за разъём шлейфа, его распиновка и тип(как найти ответную часть) за ранее благодарен если кто откликается и от пишется на root@roon-art.ru.
С уважением.
Кордубин С.С.
Забавно получилось. Довольно давно использую датчик с NodeMCU (Lua) и MH-Z19 через uart. И вот недавно (в железе и софте ничего не менялось) после перезагрузки данные «пропали». Дебаг показал, что вместо последовательности FF 86 cc cc xx xx xx xx ss
как в этой статье и как общепринято, где где cccc = концентрация и ss = контрольная сумма, стала приходить последовательность 86 cc cc xx xx xx xx ss FF
. То есть первый байт 0xFF стал приходить последним o_O В остальном параметры корректные. Результат 100% воспроизводится после reset'ов и выключения питания. Теперь только так.
Пришлось добавить в код учёт обоих случаев.
Так что имейте в виду, если кто-то на те же грабли наступит :)
Обзор инфракрасного датчика CO2 MH-Z19