Сегодня расскажу об одном необычном и очень популярном среди любителей датчике углекислого газа MH-Z19B. А также, что можно с ним сделать, как использовать в домашних условиях и насколько он точен, в сравнении с поверенным прибором. А в довесок еще и протестировать датчик температуры, влажности и атмосферного давления BME/BMP280.
Собирать всю электронику будем на контроллере Arduino Nano. Проверять будем моим любимым Testo 435 с зондом качества воздуха.
Я далеко не профессионал и даже не любитель-микроэлектронщик, но мне это интересно, а с таким огромным багажом знаний других людей в интернете можно и горы свернуть.
Вот и я давно слежу за каналом AlexGyver в Ютюбе, а также частенько посещаю его сайт для пополнения своих знаний в этом направлении. Очень советую посмотреть его некоторые видео, крайне весело, познавательно и всегда хочется повторить какой-нибудь проект. И детям советую, мои, так по несколько раз пересматривают.
А точкой начала моего проекта послужило как раз такое видео о крутой метеостанции. Решено, делаем. На алиэкспрессе было заказано всё что необходимо, и даже чуть больше, и в двойном или в тройном количестве (т.к. ошибки пайки, подключения и коротыши при прозвонке в дальнейшем никто не отменял).
За точку отсчета была взята схема AlexGyver, которая являлась основой для экспериментов. По ней полностью повторяем проект метеостанции, только без корпуса, на монтажной плате.
В конечном итоге мы должны получить работающий дисплей, на котором отображается информация о температуре, влажности, уровне СО2, атмосферном давлении. В прошивке проекта было ещё и отображение времени, даты и вероятности осадков. А по нажатию тач кнопки еще и выводились графики по каждому параметру.
Размещаем на монтажной плате Arduino Nano.
Размещаем датчик BME/BMP280.
Тач кнопка для выхода в подменю.
Подключаем все, согласно схеме.
Заливаем прошивку от AlexGyver.
И смотрим на результат.
Всё на первый взгляд легко. На деле, просто писец. Если вы это делаете впервые, можно просто утонуть в море информации по библиотекам, подключению, программе в которой шьётся Arduino. Постоянно будет что-то не получаться, постоянно будет не функционировать либо датчики, либо подключения, либо ещё что-то. Если вы впервые занимаетесь контроллерами Arduino лучше попробовать самые простые схемы для начинающих, иначе желание заниматься этим вопросом может пройти и не вернуться.
Что касается моего варианта, тут было немного проще. У нас часто используются для инженерных систем свободно программируемые контроллеры с написанием своих программ и алгоритмов, а также с полной отрисовкой мнемосхем. Поэтому все сложности в осуществлении данного проекта свелись лишь к нахождению либо плохого соединения на монтажной схеме, либо связаны с библиотеками для датчиков.
Почему я на этом остановил внимание. Да просто, даже если вы шаг за шагом повторяете чей-либо проект, не факт что он заработает с первого раза. И это очень хорошо, потому что можно понять на каком этапе появились ошибки и получить дополнительные знания в будущих проектах.
Ну, а когда всё начинает работать как задумано программистом, то это просто кайф. Когда все функции заложенные программой работают и всё отображается на дисплее, вот тогда действительно испытываешь огромное удовлетворение и появляется жажда сделать ещё что-то.
И я продолжил усовершенствовать данный проект.
Мне не очень нравятся дисплеи LCD 20×4, т.к. на них сплошь и рядом базируются все шкафы для систем вентиляции. Контроллеры могут быть разными, но в большинстве случаев дисплеи именно такие. Синие или зелёные. Синие не люблю вообще. При долгом просмотре информации на таком дисплее глаза сильно устают. Мои глаза. Возможно, ваши не так воспринимают синий цвет как мои и вам этот дисплей подойдёт. Пробуйте.
Как не играй с контрастностью, всё равно от синего глаза устают. Зелёные лучше, для меня на порядок лучше. Глаза могут дольше взаимодействовать с таким цветом. Но все эти дисплеи слишком простые, с крупными пикселями, немного топорные для домашнего использования. Не знаю, можно ли данные дисплеи использовать в инвертированном состоянии, когда весь фон черный, а цифры и буквы зеленые, возможно это решило бы проблему восприятия информации, но кажется мне, что их так использовать нельзя.
Поэтому для снижения нагрузки на глаза у AlexGyver есть возможность использовать схему с подключением фоторезистора. Когда яркость в помещении падает, включается режим пониженной примерно на 50% яркости дисплея. Схема ниже.
И эта схема хорошо работает. Ночью дисплей без фоторезистора практически работал как светильник. С фоторезистором лишь освещал небольшой участок комнаты. Хорошее решение, на котором я советую вам остановиться при реализации данного проекта.
Продолжив удовлетворять свою жажду сделать что-то большее из этого проекта, я решил параллельно проверить точность датчика СО2, а также сравнить температуру, влажность и атмосферное давление датчика BME/BMP280. Для чего, как нельзя кстати, пригодился зонд качества к прибору Testo 435.
Для начала описания методики замеров скажу, что датчик BME/BMP280 намного быстрее реагирует на изменение температуры, влажности или давления, чем зонд качества от Testo. Датчик MH-Z19B, напротив, изменяет показания чуть медленнее зонда качества воздуха. Но вот быстрый старт у него проходит быстрее. То есть, при включении Testo 435 с подключенным зондом качества воздуха в режиме измерения углекислого газа, показания сразу выводятся на экран и начинают расти по мере прогрева. Потом достигают определённого значения и уже отклоняются на небольшую величину вверх или вниз. Датчик MH-Z19B после включения показывает одно и то же показание, пока не прогреется. После прогрева начинает показывать истинные показания, выводя на дисплей изменения вверх или вниз, по мере его опроса платой Arduino. В прошивке от AlexGyver диапазон измерения показаний углекислого газа можно менять от 0 до 2000 или от 0 до 5000 ppm. По формуле из описания производителя (оставлю в конце статьи) рассчитываются показания датчика. Очень сложная к восприятию информация, лучше просто повторить скетч для прошивки не меняя ничего.
Поэтому для сравнения показаний температуры, влажности, давления и уровня СО2, конкретно для каждой фотографии ниже применительно сравнивать только указанный параметр. То есть, если я сравниваю температуру, то на другие данные на дисплее и приборе просьба не обращать внимание.
Итак, начнём с влажности. Влажность при любых вариантах измерения не выходит за пределы 5%. Это очень хороший показатель, учитывая, что погрешность самого зонда качества ±2% в диапазоне измерений 2-98%. Кто бы что бы не говорил, но если влажность двух приборов отличается не более чем на 5% (не процентов, а именно показаний), считаю это точным. Поэтому ставлю зачёт датчику влажности.
Дальше разберемся с температурой. Погрешность зонда ±0,3С. Показания датчика не выходили за ±1С от зонда Testo. В некоторых моментах показания BME/BMP280 были выше чем у зонда, в некоторых ниже, но опять же не выходя за пределы градуса. Это вполне может быть связано с самим замером (условия не всегда идеальные), а также с временем реагирования на изменения температуры. В итоге также ставлю зачёт датчику температуры.
Теперь рассмотрим датчик атмосферного давления. С ним всё просто. Сразу зачёт. Даже отклонений нет. Только не забудьте перевести мм. рт. столба в Па. Примерно на 133 умножив показания мм.рт.ст.
Ну, а напоследок датчик углекислого газа. Тут всё очень интересно, с учётом погрешности датчика ±50 ppm и погрешности зонда ±75 ppm. С измерением уровня СО2 разность показаний между ними может быть максимум ±125 ppm. Но это не говорит ни о чём, т.к. истинное показание уровня СО2 будет только приближенно к реальному обоими приборами. Сомневаюсь, что и реальные показания можно измерить. Только в идеальном замкнутом помещении и только с идеальными счетчиками СО2. В любых других случаях считаю, что оперировать данными по уровню СО2 нужно диапазонами. То есть, если норма 500 ppm, то показания в диапазоне от 400 до 600 ppm будут подходить к норме. На измерениях СО2 мы проводили огромное количество опытов на объектах и в каждом из них не находили конечного установившегося значения, отвечающего нормам и стандартам. Только диапазон в 100-200 ppm долго остающийся в приближенных значениях к норме считался показательным и учитывался в статистических данных. Поэтому, если значение зонда качества и прибора отличались бы больше чем на ±200 ppm, можно было бы говорить о не точном соответствии датчика MH-Z19B к поверенному зонду прибора Testo 435 и утверждать что датчик CO2 врёт. Почему датчика, а не зонда, тут всё просто. Зонд периодически проходит поверку, поэтому его можно считать начальной точкой сравнения.
В любом случае, буковки и циферки написанные выше не дают ничего, пока сами не увидите показания на фото. А они не выходят за ±200 ppm. Ещё раз скажу, что на фото выше уровни СО2 не измерялись, поэтому не обращайте внимание, что на дисплее 1669 ppm, а на приборе 895 ppm. Фото сделаны при режимах измерений конкретных параметров. Поэтому считаю, что датчик СО2 MH-Z19B также отлично показал себя в деле и может смело применяться в ваших проектах. Но только с одним небольшим НО, показаниям ниже 400 ppm верить не стоит. Это его особенность. В конечном итоге датчик не зря стоит своих денег и является самым дорогим элементом в проекте, а также обеспечивает приличную точность показаний.
А куда же делся дисплей LCD 20×4, спросите вы? Правильно, жажда улучшений толкает нас к новым знаниям, поэтому и я решил применить в проекте маленький OLED дисплей 1306 разрешением 128х64 пиксел. Вернее сказать, я изначально планировал сделать проект именно на нём. Так как корпуса метеостанции не было, да ещё и под большой дисплей, я хотел сделать маленький гаджет в корпусе из дерева.
А поскольку подключение дисплеев одинаковое на I2C (четырьмя проводками), то пришлось немного изменить прошивку. Вернее, сначала немного, а в последствии совсем полностью. Я отказался от графиков показаний в прошивке, а также от тач кнопки. Время и дата мне тоже стали не нужны. В итоге решил остановиться только на температуре, влажности и уровне СО2.
Первоначально показания выводились на дисплей сразу все. Без графики.
Немного покумекав в прошивкой и размещением информации на дисплее я решил, что нужно оставить именно так.
Спустя несколько дней решил проверить показания с прибором Testo 435.
По температуре всё осталось очень схожим, за исключением самого фото измерений. Цикл из нескольких фотографий оказался настолько смазанным по резкости, что пришлось оставить только первое фото при включении метеостанции и Testo 435. Можете мне поверить, но показания в дальнейшем не выходили за разницу ±1С. Переделывать фото времени не было, т.к. в этот же день всё собиралось в корпус.
По влажности показания зафиксировались даже лучше, чем были.
Я долго размышлял над корпусом и его дизайном, о том, как разместить элементы внутри, но особо не продвинулся. Было около трёх вариантов корпусов, которые бились между собой в моей голове. И я решил, что пока идёт внутренняя борьба за дизайн, временно размещу все элементы в корпусе из конструктора Лего. Самым честным путём был использован детский труд для создания временного убежища для метеостанции. Детям самим предоставился выбор сделать корпус из своих запчастей от Лего и они блестяще справились с задачей. Дизайн кубика он ведь тоже дизайн. 🙂
Надо отдать должное производителям электронных компонентов, а также производителям конструктора Лего. Ваши элементы настолько идеально подходят друг к другу, что есть подозрение о сговоре и использовании одинаковых размеров для взаимного размещения.
Вы только посмотрите, как датчик BME/BMP280 встал в своё окошечко. 🙂
Я ничего в корпусах и блоках конструктора не пилил, не подтачивал. Просто дал задание детям найти элементы Лего под размеры датчиков. А посмотрите, как встал на место датчик MH-Z19B. Просто как влитой.
В прозрачном окошке я сделал отверстие под зарядку, а под дисплей совсем чуток подточил лобовое стекло от бывшего грузовичка. Сам дисплей зафиксировал на горячий клей в уголках, да и то, на всякий случай, т.к. всё держалось очень плотно. Изумительно. 🙂
Вся внутрянка вместе с платой Arduino Nano осталась внутри, снизу корпус не закрыт и свободно продувается, т.к. с боков есть отверстия в корпусе. Мне настолько понравился этот вариант с корпусом, что внутренняя война за дизайн исчезла сама собой. Только Лего, только хардкор!
Но дизайна требовала и информация на дисплее. Зная капризность OLED дисплеев с выгоранием пикселей, решено было исправить отображаемую информацию. Я решил, что самым оптимальным было информирование на дисплее показаний температуры, влажности и уровня СО2 по кругу, каждые три секунды. Было нарисовано несколько вариантов термометра, капелек влажности и отображения уровня СО2 (как отобразить то, чего не видно, тот ещё квест). В итоге меню вышло таким, как на гифке ниже.
А заодно надо было визуально привлечь внимание к превышению уровня СО2. За предел в прошивке я выбрал 1000 ppm, а уж потом начал по полной отрываться в дизайне иконок. Сначала была иконка ветерка, потом окошка, но в конечном итоге оставил то, что на гифке ниже. Важно, что пока уровень СО2 не упадёт ниже 1000 ppm, эта привлекательная картинка будет крутиться по кругу. Ни температура, ни влажность не важна при таких уровнях СО2. Срочно открывать окна!
В итоге даже дети видя, что на дисплее маячит противогаз, сами приоткрывают окно для проветривания. И весело и полезно.
Подводя итог всему вышесказанному скажу, что проект удался. За полгода подготовки, проверки, программирования, улучшения сделанного я остался с этим корпусом, с этой прошивкой и ничего не хочу улучшать. Считаю, что, если визуально информация доносится и воспринимается, даже с таким маленьким дисплеем, да ещё и в обычном корпусе из под Лего, значит задача выполнена. А сравнив точность датчиков метеостанции с поверенным зондом качества воздуха от Testo, могу сказать, что ничего из купленного вами при постановке задачи измерения параметров воздуха не сравнится с тем, что сделано своими руками. А также может быть изменено в любое время по вашему желанию. И это был действительно отличный проект для пополнения в копилку знаний нескольких вопросов по Arduino. Пробуйте и получайте удовольствие. 🙂
Для тех, кто желает повторить проект AlexGyver есть ссылка в начале статьи на его страницу с метеостанцией. Там же можно найти всех продавцов электронных компонентов для проекта.
Описание (datasheet) для датчика СО2 можно скачать тут.
Мой скетч для OLED 1306 128×64 можно скачать тут. Скетч в .pdf формате, не забудьте скопировать все и вставить в новый проект Arduino IDE. Файл для прошивки должен иметь расширение .ino.
Надеюсь, что текст не вышел слишком грузным для восприятия и кому-то пригодится для своих проектов.
Андрей Л.
P.S. Мы не занимаемся продажей датчиков СО2, других датчиков, плат Arduino и прочей микроэлектроники. Всё, что мы реализуем есть в нашем каталоге.
Здравствуйте. Схему подключения можете опубликовать?
Александр, схема на третьей картинке, только дисплей другой. Остальное подключение без изменения.
Мне тоже жутко не понравился LCD дисплей в варианте у AlexGyver, а еще датчик MH-Z19B весьма далек от совершенства. Есть более крутой аналог — Senseair S8. Он подороже, но и срок службы 15 лет, а не 5 как у MH-Z19B и точность показаний выше. Рад что встретил единомышленника. Очень хотелось бы с вами пообщаться обсудить проект.
Андрей, мне тоже датчик MH-Z19B не нравится. По прошествии года он всегда показывает одно значение 144 ppm. Если на него как следует подуть, начинает реагировать. Корпус ему не мешает обдуваться, уже и по новой пропаяли, программу перезалили. Всё равно, через какое-то время останавливается на одном значении. Как сделать калибровку пока не решил, нужно помещать в замкнутое пространство.
Предлагаю если не против пообщаться по вотсапу и обсудить проект. Мой email для связи info@it-st.ru. Тем более тезки 🙂
Андрей, пишите, пообщаемся. На почту скиньте ваш телефон или напишите.
Подскажите пожалуйста, собрал по схеме с oled дисплеем,показывает только температуру, влажность и CO2 показывает 0
Макс, добрый день. Попробуйте подключить только датчик СО2. И залейте в Ардуино скетч для датчика СО2 со своей библиотекой. Если в тесте будут идти цифры по СО2, датчик исправен. Тогда можно искать косяк в скетче с метеостанцией.
Может кто поможет пенсионеру чайнику с программой , с этим датчиком?
Андрей, добрый день. Программы пишутся под каждый вариант сборки, поэтому для работы чисто с датчиком нужно писать самому. На данный момент этот датчик мне не нравится, т.к. всегда показывает одно и то же значение, расшевелить его можно, только долго дуя на него, но потом значение всё равно возвращается в исходную. Причину пока не нашли.