РадиоКот :: Часы и погодная станция на STM32F103
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Бытовая техника >

Теги статьи: ЧасыМетеостанцияДобавить тег

Часы и погодная станция на STM32F103

Автор: TripleKill
Опубликовано 09.06.2021
Создано при помощи КотоРед.

Идея

Когда-то давно я заказал на алике беспроводной термометр. Датчик размещается за окном, а блок с дисплеем устанавливается в любом удобном месте квартиры, и больше не нужно бегать к окну для того, чтобы узнать, насколько снаружи жарко или холодно. Чуть позже дома появился гигрометр. За всем этим было интересно наблюдать, но были и недостатки: ночью без света показания было невозможно прочитать и, кроме того, батарейки периодически садились. Постепенно родилась идея о некоем универсальном устройстве, которое бы показывало и температуру, и влажность, и читалось бы в темноте…

Конструкция

Для упрощения разводки платы было принято решение по возможности использовать готовые модули. Кроме того, там и собственные ошибки разгребать не придется. В итоге состав периферии получился такой:
- модуль датчика температуры/влажности DHT22 на плате, с уже припаянным фильтрующим конденсатором и подтягивающим резистором;
- датчик давления воздуха BMP180 (завалялся);
- модуль часов на DS3231; кроме самой микросхемы там распаяны резисторы подтяжки I2C, держатель батарейки, а еще есть EEPROM;
- копеечный модуль приемника на 433 МГц – RX470;
- дисплейный модуль 1.8” с драйвером ILI9225B и разрешением 176х220.
В качестве контроллера был выбран STM32F103T8U6. У него маленький QFN-корпус, который вполне паяется феном. Выводов и интерфейсов для заявленных целей тоже хватает.

На плату с контроллером как на ардуино надевается модуль с DS3231, модуль приемника впаивается с помощью угловой «гребенки», остальные устройства могут либо также подключаться через «гребенки» с шагом 2,54 мм, либо припаиваться проводами для удобного размещения в корпусе.
На фото ниже показана получившаяся плата.

   

Это первая ее версия, поэтому есть «допайки», в файл платы они уже внесены. Как обычно, контроллер с обвязкой и SWD-интерфейсом выполнены в виде отдельной группы для возможности повторного использования. Электроника постоянно мельчает, вот и здесь в качестве фильтрующих конденсаторов по питанию МК применен типоразмер 0603, а на выводы кварца установлены конденсаторы 0402. Тонким жалом и пинцетом вполне паяются.
Помимо внешнего 5-вольтового питания предусмотрено подключение и зарядка литиевого аккумулятора. Если вдруг в доме вырубят свет, устройство продолжит функционировать. Конкретное время зависит от емкости аккумулятора. Потребление по 3,3 В получается около 120-130 мА.

Код и вывод на экран

Когда речь заходит о TFT-дисплеях и выводе на них более-менее читаемой информации, целесообразно воспользоваться каким-нибудь известным шрифтом и перевести его в массив точек, который в будущем и будет отправляться контроллеру дисплея. Возможно, я плохо искал, но так и не нашел в сети программы, которая бы могла сформировать массив точек из изображения символа на экране. Либо находились программы, в которых нужно было самому рисовать по клеткам, либо такие, которые мозголомно сжимали массив, в общем, я решил набросать свою простую программу, которая бы разглядывала изображение поточечно, выдавала ширину получившегося изображения и, собственно, массив для отрисовки.

С помощью программы было сформировано несколько массивов для разных шрифтов и размеров шрифта. Массивы содержат только необходимые для вывода символы, поэтому процедуры вывода информации для разных типов выводимой информации различаются. Время выводится крупными цифрами, а дата и все остальное – мелкими. Если вдруг кому пригодится - программа приложена к статье. Сделано в Visual Studio 2012.

Дисплейный модуль подкинул небольшой сюрприз. На алике был указан контроллер ILI9225, а на деле в дисплее был ILI9225B, пришлось потратить определенное время, чтобы это раскопать. Работа с тем и другим схожа, но определенные отличия есть.

Про взаимодействие с DHT22, DS3231 и BMP180 сказать нечего – примеров в сети полно. Для работы с BMP180 нашлась даже целая библиотека.

А вот про прием данных от беспроводного датчика температуры скажу. Особо нового ничего нет – передача нулей и единиц организована с помощью разных длительностей импульсов. Температура в той модели, что есть у меня, закодирована в инверсном коде, в десятых долях градуса цельсия, со смещением в 400 единиц. Т.е. датчик измеряет температуру до -40 °С, и это будет соответствовать нулевому коду. Модуль RX470 оснащен автоматической настройкой уровня приема, поэтому если внешний передатчик молчит, модуль выдает шум. В датчике температуры это предусмотрено, поэтому посылка начинается с байта, состоящего целиком из нулей – чтобы приемник настроился. Контроллер складывает в массив только те длительности импульсов, которые соответствуют длительности нуля или единицы с определенным допуском. Если попадается импульс с длительностью, выходящей за указанные пределы, то массив начинает заполняться с начала. Пакет считается принятым, если заполненность массива достигает определенного уровня (в моем случае 5 полных байт, т.к. всего в посылке 6, а первый частично теряется при настройке приемника). Зная длительности импульсов нуля и единицы, которые использует передатчик, общую длину посылки (реверс-инжиниринг, да, залез с осциллографом в передатчик), и опорные точки в самой посылке (бит, с которого начинается значение температуры), можно адаптировать код под любой датчик температуры.

Значения давления и влажности, из-за того, что они скачут, «заинертизированы», и вычисляются по формуле X’[i]= (X’[i-1]*(N-1)+X[i])/N, где X’- значение, выводимое на экран; N – величина, задающая усреднение. Для влажности она взята равной 5, для давления – 10.

Все настройки сводятся к установке времени и даты. В конструкции предусмотрен 5-позиционный переключатель и одна кнопка подтверждения. Нажатием на центр переключателя вызывается режим настройки, при этом корректируемое число подкрашивается красным. Влево-вправо осуществляется перемещение между числами, вверх-вниз – изменение значения. Кнопкой подтверждения – запись измененной величины в память, при выделение сдвинется на соседнее число. При переходе кнопками влево-вправо без нажатия кнопки подтверждения внесенные изменения не будут записаны в память. Итоговые изменения отобразятся при выходе из режима редактирования (по повторному нажатию на центр 5-позиционного переключателя).

Что в итоге оно умеет

Итоговый перечень отображаемой информации таков:
- время (чч:мм:сс);
- дата (дд-мм-гг + день недели);
- температура и влажность внутри помещения одной строкой;
- температура, принимаемая от беспроводного датчика (справа отображается время с момента последнего обновления);
- атмосферное давление в мм.рт.ст.;
- график изменения давления с указанием минимума и максимума (полный график – около 30 часов, один пиксель соответствует 15 минутам по времени; первый замер в начале каждых суток обозначается небольшим красным квадратом).

 


Файлы:
Проект для STM32
Программа для создания шрифтов
Печатная плата
Схема


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

26 2 0

Эти статьи вам тоже могут пригодиться: