В продаже есть столько часов на любой вкус, а тут делать самому? Да! Ведь это не просто изобретение велосипеда, а совмещение в одном корпусе часов, метеостанции и измерителя качества воздуха. Ну и вишенка на торте - это красивый VFD дисплей с автоматическим управлением яркостью, который хорошо читаем и днем и ночью.
Да, в современных часах сейчас обычно встречаются только черно-серые LCD экраны, в лучшем случае с подсветкой по кнопке, а VFD - это удел дорогой аудио техники, потому, что в нем есть что-то теплое, ламповое... и, конечно, цена.
Итак, главный герой наших часов - это 16-символьный VFD экран Futaba 16-SD-13GINK с зеленым оттенком свечения. Это самый дорогой компонент в часах, но он того стоит. Я давно хотел что-то сделать с VFD дисплеем, но всегда отпугивала цена и то, что большинство таких дисплеев продавались вообще без всякой обвязки, а тут есть вариант с SPI и даже с UART. За магическую красоту VFD свечения приходится платить не только деньгами, потребление у такого дисплея составляет почти 200 мА, это не критично, но нужно учитывать. А еще нет никакой официальной библиотеки для работы в ардуино-среде с этим дисплеем. Пришлось разбираться и писать свою библиотеку на основе разных неофициальных и информации из даташита. Приятный момент, что в памяти самого дисплея уже "прошит" русский алфавит.
Второстепенное действующее лицо - датчик SCD40, тоже недешевый модуль и весьма интеллектуальное устройство. Он измеряет концентрацию CO2 в диапазоне 400-2000 ppm, что вполне достаточно для домашнего использования (более дорогой SCD41 в данном случае не имеет смысла). Для этого датчика есть официальная библиотека от производителя. В качестве бонуса этот датчик умеет мерить еще температуру и влажность.
Далее интересный модуль, который совмещает на одной плате AHT20 + BMP280 (термометр и барометр). Модуль AHT20 умеет измерять температуру и влажность, а BMP280 - атмосферное давление и температуру. Продавец заявляет, что вся эта конструкция работает от 5В, хотя в спецификации BMP280 заявлено 3.3В. Поэтому, по примеру индуса с ютуба, я использовал линию 3.3В для питания модуля, а логические пины не трогал, и оно пока нормально работает. Хотя, стоило бы использовать конвертер уровней для собственного спокойствия.
Ну и конечно, сами часы - модуль RTC DS1307. Он предполагает использование аккумулятора LIR2032, который можно заменить батарейкой CR2032. И что удивительно, там тоже предусмотрен датчик температуры, на плате подготовлено место под впаивание DS18B20. На модуле есть 2 набора ножек, что облегчает подключение следующего устройства на шине.
Из мелочей, датчик освещенности - делитель напряжения из фоторезистора 5506 и обычного резистора 1кОм, и стандартные кнопки 6х6х4.3 в DIP корпусе.
Поскольку все крутится вокруг достаточно громоздкого дисплея, то процесс быстро перешел от макетной платы к разработке корпуса. Благо идея уже была заранее примерно определена.
На корпусе под дисплеем предусмотрено место для датчик освещения, а сверху три большие кнопки управления. Средняя меняет режимы работы, а правая и левая для навигации в текущем режиме или изменения значений.
Не смотря на то, что все модули подключаются по I2C, научить их слаженно работать всем вместе у меня не получилось. Возможно, дело было в глючной LGT8F328P (которую в результате пришлось заменить на Arduino Nano); или в самописной библиотеке управления дисплеем (которая приводит к зависанию даже не глючной LGT8F328P при использовании I2C и Serial); или в самих модулях и их библиотеках, которые некорректно реализуют совместную работу на одной шине.
Из длительной чехарды проб и ошибок вышло вот что. Часы DS1307 работают бесконфликтно всегда. Включение любой пары других модулей приводит к зависанию. Поковыряв возможности библиотек, пришлось принять следующее: модули нужно использовать последовательно, а не просто читать показания в удобное время.
У AHT20 такой возможности нет, рейтинг Adafruit резко снизился, датчик пришлось вообще не использовать, благо его показания задублированы другими.
У BMP280 есть принудительный режим работы, в котором он измерят только по команде, а в остальное время спит. Процесс принудительного измерения блокирующий, но занимает мало времени, поэтому на отображение данных на дисплее не сказывается. С этого датчика берется температура и давление.
С SCD40 все не так просто, там тоже есть возможность принудительного блокирующего измерения, но оно занимает не менее 5 секунд, поэтому в таком режиме работать нельзя. Но у него есть команды включения и выключения режима периодических измерений, используя которые можно дождаться появления данных, выключить и перейти к другому датчику. Однако, если так делать, то теряется возможность автоматической калибровки, которая происходит примерно через 7 дней непрерывных измерений. С SCD40 считывается концентрация CO2 и влажность. У него есть возможность корректировки измерений на атмосферное давление, поэтому барометр рядом весьма кстати.
Алгоритм автоматической калибровки SCD40 предполагает, что хотя бы раз в неделю сенсор находится в чистом воздухе (концентрация CO2 ~400 ppm), что, в общем, типично для жилых помещений. К счастью, SCD40 нормально работает в режиме постоянно включенного периодического измерения, если барометр BMP280 вклинивается в режиме принудительного измерения раз в несколько секунд. Подробнее про возможности и особенности SCD40 и SCD41 можно тут и тут. На практике оказалось, что, похоже, можно прерывать процесс периодических измерений и даже выключать питание, корректировка показаний все равно происходит.
Еще из интересного, в часах есть ночной режим работы. Когда яркость достигает минимального уровня, на экране прекращается циклическая смена информации о показаниях разных датчиков, экран замирает на отображении текущего датчика, чтоб мерцанием не тревожить спящего. Невероятно, но смена содержимого на половине экрана при минимальной яркости в темноте оказалась очень заметна для глаза, а мигание точек часов и обновление одной цифры показаний - совсем нет.
Схема получилась очень простой и не вижу смысла ее описывать. Исходный код, включая библиотеку для управления VFD дисплеем доступен на моем гитхабе. 3D-модель корпуса можно скачать с моего thingiverse.
В результате у меня получилось замечательное устройство, которое не купить и которое делает все то, что мне надо. И самое главное, оно прекрасно выглядит в интерьере.
В качестве следующего этапа развития, хочется прикрутить самодельный беспроводной датчик температуры на основе ATtiny13 и DS18B20, но об этом в другой раз...