Comments 66
На хабре была статья «Программное обеспечение для тестирования и наладки устройств и сетей на базе MODBUS»:
https://habrahabr.ru/post/281430/
Статья, достойная Старого Хабра!
while (Serial2.available()) {
mhzBuffer[mhzBufferIndex] = Serial2.read();
mhzBufferIndex++;
}
не всегда удается прочитать все 10 байт, и оставшиеся байты приходят только спустя 1-2 секунды при повторном чтении. Так и не смог решить эту проблему, но в остальном уже около года MH-Z19 в домашней метеостанции круглосуточно мониторит СО2 в квартире. Этот датчик приучил меня проветривать комнату!Serial2.write(cmd, 9);
memset(mhzBuffer, 0, 9);
Serial2.readBytes(mhzBuffer, 9);
Хочу сделать «Calibrate zero point» но не могу понять это калибровка под 0 ppm или 400 ppm? на одном сайте пишут что это типа 0 ppm и без азота не обойтись а на другом пишут что это 400 ppm и достаточно хорошо проветрить помещение в течении 20 мин подержать датчик в нем и можно делать калибровку.
Есть еще «SPAN POINT CALIBRATION» код 0x88 где можно задать свое значение, побывал его но никакой особой ракции
понять это калибровка под 0 ppm или 400 ppmПод 0, :-(.
Я так два датчика убил (первый откалибровал ради интереса, второй – просто по ошибке, эта калибровка запускается при замыкании одного из входов на землю – а я не знал, что его корпус из проводящего метализированного пластика, и заземлённй), не повторяйте моих ошибок.
Исправить без баллона нельзя потом, я его даже в эксикаторе с щёлочью держал – не помогает.
Кислород тоже сжижается при температуре жидкого азота, но не знаю влияет ли он на датчик.
Я положил в пакет датчик, провода наружу. И несколько раз давал наполниться пакету азотом из термоса и потом выдавливал весь газ наружу. Потом запустил калибровку.
Вы, собственно, сами чуть ниже говорите, что никакого эффекта не добились.
Беда в том, что работающего измерителя концентрации CO2 я для пока найти пока не могу, :- (.
Я так думаю, что бы это было связано с напряжением, я когда с 3.7В на 5В поменял, то стало нормально.
Только пара замечаний:
1). В интернете есть PDF-файлы под названием «datasheet» к датчикам этой серии – MH-Z19, MH-Z14 и другим. Они, в отличии от настоящих даташитов, очень куцые, но часть встреченных в статье «недокументированных функций» там описаны.
Правда, минимальное значение лежит заметно ниже, чем «эталонные» 400 ppm, так что калибровка оставляет желать лучшего.Скорее всего, вы, среди прочих, подали команду сброса калибровки датчика – перекалибровали его так, что он теперь думает, что находится в воздухе с минимальной понятной ему концентрацией СО2, она как раз порядка 150 ppm.
— 0x87-ZERO POINT CALIBRATION NOTE:ZERO POINT is 400PPM, PLS MAKE SURE THE SENSOR HAD BEEN WORKED UNDER 400PPM FOR OVER 20MINUTES
получается новая ревизия имеет калибровку нуля не 0 ppm а 400 ppm
Если вы не сильно далеко от Москвы и вам вдруг нужны сенсоры MH-Z19 или MH-Z19B для дальнейших экспериментов, то с радостью отдадим на растерзание — мы их используем в своих железках и поэтому у нас их всегда много.
Rast1234
> А к датчику не нагугливалось никаких даташитов или мануалов?
Ну вот есть официальный даташит (хотел привести в статье ссылку, но забыл):
http://www.winsen-sensor.com/d/files/PDF/Infrared%20Gas%20Sensor/NDIR%20CO2%20SENSOR/MH-Z19%20CO2%20Ver1.0.pdf
Ни о каком модбусе там не говорится, да и вообще информации с гулькин нос. Я честно пытался найти статьи, где бы люди его более детально изучали — нашёл только вышеприведённую статью https://revspace.nl/MHZ19 и пост на форуме http://www.letscontrolit.com/forum/viewtopic.php?t=1785, насколько я понял, того же автора.
arcman
> Наличие Modbus это здорово.
Это да. Только меня смущает адрес датчика — 1. Небось если его подключать совместно с другими устройствами, то наверняка найдётся другое не менее «умное устройство» с таким же адресом (а если мы хотим мерять СО2 в двух и более местах — то эта вероятность становится равной единице). Хотя, быть может, удастся изменить этот адрес — вон в содержимом памяти три единицы виднеются.
legrus
> Теперь не знаю, что вкуснее, подключение к modbus без ардуино-переходника, или возможность пользоваться термометром.
Ну, по оригинальному протоколу тоже можно с компа без ардуины общаться. https://geektimes.ru/post/272090/ Или у вас готовая modbus-железка? А термометр там не очень точный, как я упомянул в статье.
@ Weles
> В моём случае датчик умирал после пайки и после подключения к 5В. Оживал всегда сам после небольшого «отдыха»
Насколько я понял, он вообще при включении «разогревается» три минуты, и в это время показывает различную чепуху. Пишут, что тепловой режим должен установиться, а после пайки он как раз нарушен.
APLe
> Я так два датчика убил
Ну почему же сразу убил? Повышение-то СО2 показывает. Ну и можно что-нибудь придумать с калибровкой. Первое, что вспоминается — получить водород электролизом воды (кислород брать я бы не стал — мало ли что окислит).
Ещё бы придумать, где брать СО2 для калибровки и как его точно измерять. Я уже попробовал соду с лимонной кислотой — в принципе получается наполнить пакет львиной долей СО2, только непонятно, насколько она львиная. Скорее всего, куплю точные весы и буду добавлять раствор соды к раствору кислоты.
> Скорее всего, вы, среди прочих, подали команду сброса калибровки датчика – перекалибровали его так, что он теперь думает, что находится в воздухе с минимальной понятной ему концентрацией СО2, она как раз порядка 150 ppm.
У меня было веселее. Он раз в сутки сам автоматически калибруется — вроде как минимальное значение принимает за 400 ппм. Так вот, он у меня так замечательно откалибровался, что стал показывать в 2 — 3 раза меньше, чем до этого, и показания обрезались на 400 ппм (то бишь сам он явно намерял меньше, но стеснялся в этом признаться). А вот по modbus он ничего не обрезает, зато минимум стал показывать даже меньше 150. Графики в следующий раз приведу.
Кстати говоря. Самая главная команда, которая упомянута на revspace — 0x79: ABC logic on/off. Взята из даташита на MH-Z19B. Я сначала не мог понять — алфавит отключает, что ли? И только после того, как я почитал даташитов на более понтовые датчики, я понял — это automatic baseline correction, то бишь таким способом можно отключать самовольную калибровку. Я считаю, это первое, что надо делать с датчиком после покупки. Хотя быть может, конечно, что со временем показания плывут, но по крайней мере так можно быть уверенным, что если сегодня показания одни, а завтра другие — это действительно что-то изменилось в среде, а не датчик решил пошутить.
SegreyBorovkov
> В крупных городах продается жидкий азот, стоит копейки.
А тара для него тоже копейки стоит? Вообще, как его покупают, чтобы дёшево и сердито?
> Я пытался калибровать азотом и замыканием контакта калибровки на землю (или на vcc, не помню). Никакого эффекта не добился.
А почему? Получается, что датчик настолько тролльский, что в условиях атмосферы сбить калибровку может, а в условиях азота калиброваться отказывается?
evgeny_boger
> Там и так на борту стоит вполне человеческий STM32F1 и пины для перепрошивки выведены наружу.
О, значит, кто-то всё-таки его уже мучал! Было бы интересно почитать вашу статью на эту тему, она наверняка будет познавательнее моей. В частности, как его вскрывать, чтобы ничего не сломать.
> с радостью отдадим на растерзание
Спасибо! Если свой убью, то с радостью приму.
Ну почему же сразу убил? Повышение-то СО2 показывает.Потому что повышение он тоже показывает очень криво, :-(.
Я так понимаю, у него теперь «0» откалиброван по атмосферной концентрации (уже чуть ниже, после калибровке в эксикаторе над щёлочью), и «400» – тоже по атмосферной концентрации. Поэтому показания жутко нелинейные и непонятно где и как завышенные. В общем, надо вручную калибровать – по рабочему, которого у меня нет.
Он раз в сутки сам автоматически калибруетсяОго, а он калибруется разве? Вот этого в даташите я не видел (или не понял, что такое «ABC logic», тоже возможно).
Если да, то это может объяснять многие странности в его поведении.
А тара для него тоже копейки стоит?Любой термос подходит. Лучше, на всякий случай, из нержавейки.
О, значит, кто-то всё-таки его уже мучал! Было бы интересно почитать вашу статью на эту тему, она наверняка будет познавательнее моей. В частности, как его вскрывать, чтобы ничего не сломать.
Да нет, мы как раз один сенсор разломали и посмотрели, что внутри :)
Я кстати немного ошибся, там стоит STM32F051
Статью думаю напишем, но я больше хотел написать про показания и автокалибровку. Мы делаем долговременные тесты, сравниваем между собой MH-Z19B и другие китайские, Fibaro CDM7160, SensAir S8 и т.д.
>> Я пытался калибровать азотом и замыканием контакта калибровки на землю (или на vcc, не помню). Никакого эффекта не добился.
>А почему? Получается, что датчик настолько тролльский, что в условиях атмосферы сбить калибровку может, а в условиях азота калиброваться отказывается?
Я допускаю, что датчик немного изменил калибровку, но существенного изменения после калибровки по свежему воздуху не последовало. Как и раньше, раз в сутки на графике видна ступенька рекалибровки датчика.
Могу сказать, что в моих условиях (аптайм — месяцы, случайное проветривание, бывает минимум за сутки и 600ppm, это не влияет!), ступенька постепенно уменьшается. Если в первую неделю после калибровки и последующего полноценного подключения, калибровка легко сдвигала показания на 200ppm, то сейчас в большинстве случаев калибровка меняет значение меньше, чем на 50 ppm.
Я вполне допускаю, что если неверно откалиброванный датчик подключить к питанию, то он через месяц начнет показывать что-то адекватное.
Записывается ли такая ежесуточная калибровка в ППЗУ датчика — не знаю.
Получается что автоматическая калибровка или не имеет ограничения на размер единовременного изменения, или оно очень большое, если за сутки может сдвинуть значение на 200… В таком случае, вероятно, имеет смысл отключать ABC и делать ее снаружи, мне (умозрительно) кажется, что было бы логично ограничить возможность разовой калибровки 50ppm и проводить ее не раз в сутки, а раз в неделю, так будет значительно ниже вероятность перекалибровки (мало ли, пару дней комнату не проветривали и при этом там тусила толпа).
Так как в сенсоре есть ABC с периодом 24 часа, то величина U, очевидно, является минимальным значением измеренного поглощения IR CO2 за сутки, в каких-то внутренних единицах измерения.
ABC фича полезная, отключать её стоит лишь в средах, где 400ppm не бывает. Калибровка раз в сутки, конечно, слишком часто, даже в жилых помещениях не всегда бывает свежий воздух.
Как вы, однако, смело записали его в покойники. А он работает и не знает, что уже труп.
> Посылать случайные команды в сенсор с доступными конфигурационными параметрами в EEPROM (или его эмуляцией во флэш) — верный способ сбить настройки.
Не думаю, что он в «родном» режиме что-то воспринимал как настройки. По крайней мере ежели бы они все слетели, он бы, скорее всего, показывал бы бред. А так показывает что-то похожее на правду, хоть и несколько смещённую.
> для калибровки нужны газы не более верхнего порога измерения
Процедуру разбавления уже запретили? Ну и по секрету скажу, что порог измерения у него теперь где-то в районе ста процентов. Про это будет в следующей статье.
> величина U, очевидно, является минимальным значением измеренного поглощения IR CO2 за сутки, в каких-то внутренних единицах измерения.
Нет. Ибо она падает совершенно в другие моменты, нежели регистрация минимальных значений.
> ABC фича полезная, отключать её стоит лишь в средах, где 400ppm не бывает.
Интересно вы рассуждаете. Немного слетела калибровка (хотя можно программно сделать поправку в случае чего) — это уже труп. А когда сам датчик самоуправством занимается (и программно это учесть либо невозможно, либо очень сложно) — это так и должно быть.
Для unsvp датчик — это откалиброванное устройство, работающее по известному алгоритму с известными, повторяемыми параметрами, и изменение этих параметров = потере старого датчика (и, возможно, приобретение нового с неизвестными параметрами).
Вы же рассматриваете его как устройство для изучения/реверса, ранее заложенный алгоритм Вам неизвестен, к тому же нет калиброванного известного датчика рядом, и вы работаете только с относительными значениями, которые похожи на абсолютные, но погрешность никто высчитать не может.
Спасибо Вам за работу =)
0x79 у меня работает на одну сессию (одно включение, надо подавать при инициализации) и позволяет смотреть изменение без ежесуточных сбоев. В долговременном плане меня смущает, конечно, засирание внутренней поверхности в условиях города с пылью/табачным дымом рядом, пока я просто вывожу недельный минимум рядом с текущим показанием. Минимум считаю скользящим окном, а не по фиксированным срокам.
Да, вы знаете, сейчас посмотрел — всё происходит (происходило..) ровно так, как вы сказали. Посыпаю голову пеплом. Сейчас в пост добавлю.
Хотя, быть может, удастся изменить этот адрес — вон в содержимом памяти три единицы виднеются.
Обычно, можно менять адрес у любых устройств. Т.е. если даже нельзя у датчика, то у другого устройства с этим адресом будет можно.
![image](https://habrastorage.org/getpro/geektimes/comment_images/8a6/e02/b3e/8a6e02b3e25e8baf45970617877e3362.jpg)
верхний график: какая то ошибка в бите. прыжки +- 256.
нижний график: неверное преобразование знаковый/беззнаковый
Про то, что нижний без знаковый знаю, но руки никак не дойдут поправить прошивку.
Коли знаете, то зачем спрашиваете?
у вас на обоих графиках "сбои" происходят одновременно. причем с нижним всё в порядке на самом деле. А вот для построения верхнего вы похоже используете байт из нижнего. В общем ищите где данные меняются местами. Или вы при вычитывании один байт не обновляете, а используете старое значение вычитанное для другой величины.
mySerial.write(cmd,9);
mySerial.readBytes(response, 9);
int responseHigh = (int) response[2];
int responseLow = (int) response[3];
tem = (unsigned int) response[4]; // Удет в комп
ppm = (256*responseHigh)+responseLow; // Уйдет в комп
вопрос: у кого есть модель MH-Z14, у вас такаие же проблемы?
Очень хочу такую, но собирать самому очень не хочется.
И так я решился сделать калибровку «Calibrate zero poin», решил не трогать ножку HD и все делать через команды UART.
Дома в одной из комнат решил сделать проветривание(окна у меня выходят на лесок, воздух должен был достаточно чистый) при температуре за бортом -15 я положил датчик возле окна а сам пошел на 30 мин в другую комнату чтобы выдыхаемый мной CO2 не портил картину.
Это была моя первая ошибка, после того как я через 30 мин отправил команду на калибровку я первый раз увидел как датчик стал выдавать 130-150 ppm, думал что уже тоже окончательно сломал датчик.
Но тут обратил внимание на то какую температура была в самом датчике (за это отвечает 4 байт в ответе TT is the temperature in degrees Celcius, plus 40. For example, when temperature is 25 deg C, then TT = 0x41) оно было +3..+5 и понял что калибровку лучше делать при постоянно не меняющейся температуре.
Во второй раз решил стабилизировать температуру, на окно поставил обогреватель чтобы воздух входящий в комнату подогревался и не остужал комнату, а датчик положил рядом на высокую тумбочку возле окна.
Через 15 мин показания температуры в датчике стабилизировались на отметке +19 и 5 байт ответа(SS is some kind of status byte, this byte always has only one bit set!) стал показывать стабильно долго одно значение «64», через 5 мин я запустил калибровку по новой, после этого обесточив датчик и включив его заново уже в другой комнате где я ожидал проветривание, датчик стал показывать с ростом ppm и остановился на отметки 850 через 10 мин что с ощущениями похоже на правду.
p.s. Вот уже несколько часов показания датчика похоже на те что были до поломки
p.s.s. ABC калибровку я отключил от греха подальше
p.s.s.s. Для контроля нужно купить еще один датчик, осталось выбрать или новую модель MH-Z19B(там не только припаяна колодка ног но и убрали микросхему) или взять MH-Z14A(меньше негатива об этом датчике)
Новый датчкик mh-z19b:
![image](https://habrastorage.org/getpro/geektimes/comment_images/737/3ab/84a/7373ab84acf59f3af9a6a64b45b8e9e8.png)
После нескольких дней непрерывной работы на момент сегодняшнего утра датчик стабильно выдавал 500-530 ппм в сухой пятилитровой бутылке (в бутылке я сделал небольшой надрез, чтобы просунуть туда датчик и после плотно заклеил скотчем). После работы в бутылке я поместил датчик на створку окна, открыл окно на проветривание. Датчик откалибровался и стал выдавать значение на 70-100 ппм больше, чем в бутылке. После чего я вернул его в бутылку и он ожидаемо стал выдавать 640 ппм (вместо 530 ранее в той же бутылке, в бутылку я не дышал=)).
Теперь самое интересное. Я открутил крышку, сделал выдох в бутылку, закрутил крышку. Датчик за несколько измерений подошел к 5000 ппм и стал стабильно показывать эту цифру. Мне показалось, что от одного выдоха концентрация до 5000 ппм скакнуть не должна была, я отключил датчик, и после включения он показывал не 5000, а всего 950!!! После очередного выдоха в бутылку датчик уже не зашкалил, но подошел вплотную к 5000. Он стабилизировался на уровне 4950-4990. Затем я вытащил датчик к окну и он стал давать показания 150-550. В бутылке с уличным воздухом показания медленно ползли вниз от 500 до 400. После отключения питания и подключения снова выдает 500 и показания продолжают медленно расти вверх.
Прошу прощения за длинный пост. В итоге совсем не могу понять почему показания плавно меняются то вверх то вниз, не стабилизируются даже в изолированной бутылке.
Кстати говоря, в выдыхаемом воздухе «по уставу» 4% СО2, сиречь 40 000 ppm. Правда, никто не говорит, при каких это условиях. У меня в зависимости от того, насколько я задерживаю дыхание, показания в полтора раза меняются.
> в бутылке я сделал небольшой надрез, чтобы просунуть туда датчик и после плотно заклеил скотчем
Ну кто так делает? Я вот просверлил в крышке отверстие, просунул провода и залил термоклеем. Теперь можно считать, что она абсолютно герметична (по крайней мере в пределах нескольких дней при атмосферном давлении).
> я отключил датчик, и после включения он показывал не 5000, а всего 950!!!
Правильно, он три минуты после включения показывает различный бред. И вообще вроде как рекомендуется его всегда включённым держать и не выключать без крайней необходимости. И резкие перепады СО2 он плохо меряет (можно сказать, вовсе не меряет).
> я поместил датчик на створку окна, открыл окно на проветривание
Интересно, а у меня он при малейшем ветерке какую-то шерсть показывает. Каким напряжением питаете? Я для своего сделал вывод, что лучше всего он работает на нижней границе диапазона, то бишь 3,6 В. Правда, чуть ниже — уже начинает глючить. И, конечно, никак не говорит, что напряжения не хватает.
Быть может, но я с Modbus первый раз встречаюсь, потому никаких программ не знаю.
> Было бы интересно найти регистр переключения протоколов. Да и адрес, скорее всего меняется в каком то регистре.
Да, это тоже попроверяю. В принципе содержимое памяти есть, можно в случае чего обратно «первоначальные» значения записать.
Суперстатья! Я как раз в свою коллекцию датчиков Xiaomi, Tuya Smart и Rubitek хочу похожий датчик для растюх купить) И в приборах биообратной связи похожий можно использовать) И по вашему совету сейчас пишу статью с практикой именно про гипокситерапевтические дыхательные упражнения для саморегуляции, чтобы подальше от теории)
Тёмная сторона MH-Z19