Часы и погодная станция на STM32F103
Автор: TripleKill Идея Когда-то давно я заказал на алике беспроводной термометр. Датчик размещается за окном, а блок с дисплеем устанавливается в любом удобном месте квартиры, и больше не нужно бегать к окну для того, чтобы узнать, насколько снаружи жарко или холодно. Чуть позже дома появился гигрометр. За всем этим было интересно наблюдать, но были и недостатки: ночью без света показания было невозможно прочитать и, кроме того, батарейки периодически садились. Постепенно родилась идея о некоем универсальном устройстве, которое бы показывало и температуру, и влажность, и читалось бы в темноте… Конструкция Для упрощения разводки платы было принято решение по возможности использовать готовые модули. Кроме того, там и собственные ошибки разгребать не придется. В итоге состав периферии получился такой: На плату с контроллером как на ардуино надевается модуль с DS3231, модуль приемника впаивается с помощью угловой «гребенки», остальные устройства могут либо также подключаться через «гребенки» с шагом 2,54 мм, либо припаиваться проводами для удобного размещения в корпусе.
Это первая ее версия, поэтому есть «допайки», в файл платы они уже внесены. Как обычно, контроллер с обвязкой и SWD-интерфейсом выполнены в виде отдельной группы для возможности повторного использования. Электроника постоянно мельчает, вот и здесь в качестве фильтрующих конденсаторов по питанию МК применен типоразмер 0603, а на выводы кварца установлены конденсаторы 0402. Тонким жалом и пинцетом вполне паяются. Код и вывод на экран Когда речь заходит о 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-позиционного переключателя). Что в итоге оно умеет Итоговый перечень отображаемой информации таков:
Файлы: Все вопросы в Форум.
Эти статьи вам тоже могут пригодиться: |
|
||||||||||||
|
||||