Приветствую! Если вам надоело собирать или видеть банальные термометры на Arduino с монохромным экранчиком 1602, то эта статья — для вас.
Я решил заложить в проект максимум возможностей: от отслеживания радиационного фона, влажности, температуры и атмосферного давления, а также получения прогноза погоды из интернета, до ПИД-управления внешним нагревателем и связи с ПК по Wi-Fi. В реальном времени на экране отрисовываются графики, отслеживаются максимальные и минимальные значения за последние 12 часов, а также присутствует полноценная калибровка всех сенсоров с сохранением настроек во внутреннюю память.
Поехали смотреть, что под капотом!
Сердцем системы выступает мощный микроконтроллер STM32F411. Почему не классическая Arduino? Потому что здесь нужен быстрый вывод графики на цветной дисплей 2.4 дюйма. Для плавной отрисовки и моментальной реакции на вращение энкодера я использовал прямой доступ к памяти (DMA). Никаких «фризов» интерфейса!
Чтобы устройство стало умным, я добавил Wi-Fi модуль ESP-01 (на базе ESP8266). Он работает как сетевой сопроцессор:
- В фоновом режиме синхронизирует точное время через NTP.
- Подтягивает погоду с улицы, используя API OpenWeatherMap.
- Поднимает TCP-сервер, который отдает телеметрию на компьютер — да, у станции есть своя десктопная программа-клиент!
Десктопный софт: Менеджер Климата и Радиации. Чтобы полностью раскрыть потенциал устройства, я задействовал Wi-Fi модуль ESP-01 не только для парсинга погоды (OpenWeatherMap) и синхронизации времени по NTP, но и для поднятия полноценного TCP-сервера. В дополнении к самому устройству, я написал легковесную десктопную программу-клиент для ПК под Windows на чистом C! Она подключается к станции по локальной IP-сети, в реальном времени считывает данные со всех датчиков, параметры ПИД-регулятора и дублирует построение графиков прямо на мониторе вашего компьютера.
В качестве сенсоров я не стал брать готовые решения вроде BME280 ( иногда попадаются бракованные), в итоге я собрал суровый, но очень точный набор:
- Температура и влажность: Цифровой I2C сенсор SHT20. Отличный и надежный датчик.
- Атмосферное давление: Связка из тензодатчика MPS20N0040D и 24-битного АЦП HX710. Настоящий хардкор, который после программной калибровки дает высочайшую точность.
- Радиационный фон: Вишенка на торте — интегрированный модуль RadSens с трубкой Гейгера-Мюллер. Станция в реальном времени мониторит радиационный фон и умеет предупреждать об опасности, меняя цвет показателей на экране, а также индицировать вспышками улов каждой «горячей» частицы. Программный медианный фильтр на 120 точек надежно защищает показания от ложных скачков и шума.
Питание устройства осуществляется от блока питания через порт USB Type-C. Для получения нужного напряжения используется PD-триггер на 20 вольт (китайский ODM/OEM).
Преобразование и распределения питания разведены следующим образом:
- 20 вольт используются напрямую для контура внешнего нагревателя.
- 12 вольт формирует линейный стабилизатор L7812 (в корпусе TO-220) — они нужны для надежного управления затвором полевого транзистора IRFZ44N.
- 5 вольт формирует DC-DC преобразователь SKMW30F-05 (с гальванической развязкой). От него питается микроконтроллер STM32F411 и следующий каскад понижения напряжения.
- 3,3 вольта формирует стабилизатор AMS1117-3.3. От него питаются самые чувствительные узлы: модуль RadSens (с трубкой Гейгера-Мюллера) и АЦП датчика давления HX710.
Остальные датчики и дисплей питаются от собственного стабилизатора 3.3В, встроенного на плату STM32F411.
Умный ПИД-регулятор: станция, которая умеет управлять!
Обычно метеостанции способны только показывать цифры, но моя — умеет управлять процессами! В прошивку встроен полноценный ПИД-регулятор напряжением нагревателя с помощью программного ШИМ .Температура считывается с помощью платинового термистора (Pt50).
Разумеется, я реализовал алгоритм «софт-старта» (Soft Start), который защищает блок питания от резких скачков тока при включении.
Присутствует встроенная функция автотюнинга. Станция сама раскачивает систему релейным методом и подбирает идеальные коэффициенты P, I, D под подключенный нагреватель.
Поддерживаются термопрофили: можно настроить устройство на удержание определенной температуры в течение заданного времени.
Актуально для поддержания температуры в аквариуме или подогрева кружки на столе и т.д. Я использую этот функционал для подогрева раствора для травления плат.
Прошивка и интерфейс
Прошивка написана на чистом С. Всё управление устройством логично завязано на одном поворотном энкодере (с кнопкой). Интерфейс разбит на несколько экранов:Главный экран с цветовой индикацией зон комфорта (зеленый — норма, желтый или красный — нужно обратить внимание).
Графики и статистика. Система накапливает историю, строя графики давления, температуры и радиации с адаптивным масштабом. Отслеживаются абсолютные минимумы и максимумы за последние 12 часов с фиксацией точного времени.
Меню настроек. Здесь можно задавать смещения для калибровки температуры и влажности, целевое давление и даже калибровать "дрейф" RTC-часов. Все настройки надежно сохраняются в выделенный сектор Flash-памяти контроллера и не сбиваются при отключении питания из розетки.
В заключение
Проект потребовал немало времени и бессонных ночей: от разводки платы в Altium Designer и 3D-моделирования корпуса до суровой математики в коде (медианные фильтры, асинхронный протокол обмена между STM32 и ESP8266, алгоритмы ПИДа).
Но результат того стоил! Теперь на столе стоит не просто китайский градусник, а настоящий измерительно-управляющий испытательный комбайн, спроектированный с нуля.
А как вам схема с таким каскадным распределением питания? Стали бы вы заморачиваться с ПИД-регулятором и добавлять дозиметр радиации в свои самоделки? Пишите свое мнение в комментарии, буду рад любой конструктивной критике и с удовольствием отвечу на вопросы по коду или железу!
Данное устройство является выпускной работой по курсу "Профессия: Программист микроконтроллеров" от компании Skillbox: https://l.skbx.pro/TmEXnb Другие домашние задания можно посмотреть тут: https://dzen.ru/suite/9b315fff-ce2e-4536-81ff-b320caf59092
И еще немного кадров процесса сборки и изготовления платы
На этом точно всё, всем спасибо за внимание!