22.04.2023 11:38, автор DiEitch
Как-то ранее я писал, что собираю очередную метеостанцию. Конечно, я её уже собрал, но вот время для статьи смог выделить только в длинные выходные. Итак, поехали...
Главное окно с "фирменными часами".
Третья строка на экране периодически меняется, отображая разные параметры. Сейчас это СО2 и ЛОВ. Следующими идут метеопараметры: температура, влажность и атмосферное давление:
Строка меняется каждые 15 секунд, чтобы успеть рассмотреть. Каждый параметр имеет индикатор изменения: стрелка влево - уменьшается, вправо - растёт. Если стрелки нет, то параметр не изменяется в данный момент. Самая нижняя строка - моё личное "изобретение", погодная шкала с 0 посередине в процентах показывает вероятность ухудшения (влево - значок дождя) и улучшения погоды (вправо - значок солнца/луны). А теперь немного информации по конструкции.
Как всегда, сборка DIY устройств начинается с корпуса. Я точно знал, какой корпус применил Алекс, но батарейный отсек, малое пространство внутри и множество мелких доработок с этим корпусом подтолкнули меня к другому выбору (более того, там есть как белый, так и чёрный варианты, и места предостаточно внутри: справа и слева). А главное - очень доступная цена!
Изначально я планировал вот такой корпус:
но он слишком уж велик для этой начинки. А выбранный в итоге подходит на все 100% и смотрится вроде даже культурнее:
Кроме того, индикатор становится в такой корпус прекрасно и прижимается по краям шляпками четырёх винтов (см. ниже) и никаких дополнительных креплений не надо. Красиво и надёжно. Слева от дисплея приютился датчик освещённости на фоторезисторе. Снизу корпуса - подставка из пластика от полки холодильника Атлант, которая делает конструкцию устойчивой и позволяет установить наклон. Шарнир сделан из латунной части клеммной колодки на 220 Вольт (3 штуки свинчены длинным винтом).
Подставка сделана по эскизу, углы скруглены напильником.
В качестве "мозга" я выбрал Arduino Pro Mini 16MHz (как на рисунке, только чип у меня 328PA), так как соединение с компьютером мне потребуется только лишь для зашивки программы. Ниже: процесс отладки и прошивки. Т.к. мой адаптер не имеет провода DTR, ресет приходится делать вручную. Сначала у меня не получалось вовремя его нажимать, но со временем научился. Нажать ресет (на фото справа от кварца) надо на 1 секунду приблизительно в середине процесса компиляции.
Кроме того, эта платка меньше габаритами и дешевле. Напаял я только угловой разъём для подключения адаптера USB-UART (TX,RX,VCC и GND), остальные из комплекта не трогал.
К основной плате добавил "хаб" I2C (пины A4,A5 и GND), где развёл и питание, и саму шину (с резисторами 4к7, а также оставил возможность физического добавления других I2C датчиков, вдруг когда-нибудь понадобится внешний датчик температуры). Вся электроника метеостанции (как и у автора) приклеена термоклеем на плату китайского стандартного индикатора LCD2004 с синим цветом свечения (если выбрать чёрный корпус то предпочтительнее взять чёрные символы на зелёном фоне). По центру снимка видна Arduino Pro mini и хаб I2C.
А вот вид со стороны энкодера, видны разъёмы, взятые из той донорской мыши и RTC (которые позволят позже сделать будильник). Слева за энкодером приклеена кнопка на плате, а от неё два провода синий и белый на разъём справа.
Для приклеивания я выбрал не белый прозрачный термоклей, а серый с хорошей адгезией к любым материалам. Я полагаю, он приклеит и стекло, и металл.
Индикатор я выбирал без адаптера I2C (так и дешевле, и меньше места занимает), а выводов контроллера хватило при подключении по 4-битной шине. Если уже имеется индикатор с платой I2C, то не проблема в программе это перенастроить, тогда сэкономите шесть цифровых выводов контроллера.
Светодиод (снизу на фото видны его ножки) подключен к аналоговым портам A1...A3 (они могут работать и в цифровом режиме), а вот ШИМ идёт на общий катод через резистор 200 Ом (в моём случае). Справа виден датчик освещённости, с измерениями при обработке корпуса я чуть намудрил, и пришлось отверстие для него сделать овальным, а не круглым. Прозрачные окошки сделаны по технологии Gyver (прозрачный термоклей, скотч, шпатель). Получилось неплохо. Сверху виден транзистор BC337 подсветки, регулятор контрастности (подстроечный резистор на 10K), датчик eСО2 и часы реального времени на DS3231 с ионистором для сохранения хода при отключении основного питания.
Ёмкостной сенсор я не применял, вместо него энкодер от мышки с кнопкой под колесом. Почему так? Мне очень нравится концепция "колёсика" от мыши, кроме того, оно является ещё и кнопкой (а иногда и не одной), что уменьшает кол-во органов управления (а в данном случае ещё и отверстий в корпусе). Я долго искал подходящий по размерам, и нашёл его в мышке фирмы ACME.
Энкодер там механический (квадратурный) и встроен в само колесо, что экономит пространство. Если же не удастся таковой найти, то можно приспособить энкодер с колесом от любой мыши (как механический, так и оптический), и кнопку отдельно (или ёмкостной сенсор, как у Gyver).
Это колесо с родным кронштейном я закрепил на канцелярской скрепке и приклеил к боковой части корпуса (с отверстием под колесо) сначала суперклеем, а потом усилил термоклеем:
Штатный измеритель СО2 на модуле MH-Z19B в последнее время как-то сильно подорожал (в рамке на фото Гайвера).
Поэтому было решено применить датчик эквивалентного значения концентрации еСО2 на микросхеме CCS811 (MOX-технология). Датчик измеряет содержание в воздухе ЛОВ (летучих органических веществ), а затем, зная коррелляцию между содержанием в воздухе ЛОВ и СО2, вычисляет эквивалентное значение СО2. Забегая наперёд, скажу, что он измеряет довольно быстро и точно для такого класса приборов. Датчик самокалибруется. Первое включение должно быть произведено приблизительно на одни-двое суток для первичной калибровки и обкатки.
Датчик легко "отравить", поэтому, как и в случае с BME280, его при пайке надо залепить скотчем. Кстати, немного об основном датчике метеостанции:
Иногда китайцы шлют вместо BME280 датчик (только) давления BMP280 (который стоит раза в четыре дешевле), как же отличить эти два датчика не включая? По отверстию на корпусе. Вот тут подробно.
Что касается программмного обеспечения: я провел полные ревью и рефакторинг кода. Разбросал его по модулям для удобства чтения и редактирования. Добавил функцию настройки даты, времени и яркости для дисплея и светодиода, добавил также соответствующее меню (вызывается по нажатию на колесо, вращение - меняем параметр, нажатие следующий, пока не выйдет из меню, при выходе - сохранение). Текущий параметр мигает. Настройка дня недели пропущена - DS3231 высчитывает его самостоятельно.
Нижняя строка меню целиком посвящена яркости дисплея и светодиода: * - значок яркости, 10____100% шкала в процентах (шаг 12,5%), [A/P] - режим (автоматический или ручной). В ручном режиме яркость задаётся из меню от 10 до 100%. В автоматическом - меняется от 2% до значения, установленного в меню, в зависимости от внешнего освещения. Для коррекции используется Гамма-функция, аппроксимированная кубической параболой (позаимствовал у Gyver).
Добавил сохранение этих настроек в EEPROM. Ввёл также возможность добавления кода для использования будильника DS3231.
Хоть в программе все пины и определены, но лучше приведу "схему":
А здесь: файлы к проекту.
Повторяйте, совершенствуйте и вспоминайте добрым словом автора (я про настоящего автора).