Метеобрелок своими руками

от автора

Мне всегда хотелось посмотреть параметры окружающей среды вдали от дома и прямо на месте. Например, какое давление в самолёте на крейсерской высоте или какая влажность на берегу моря. Отсюда и родилась идея сделать компактную метеостанцию в виде брелока, который всегда с собой и работает продолжительное время на одном заряде. Чтобы не мелочиться, решил сделать сразу мелкую серию таких брелоков.

Для первой партии устройств решил руководствоваться следующими вводными: компактный размер, датчик и дисплей отдельными модулями и максимальное время работы.

Главная задумка устройства включать питание платы по нажатию кнопки, а через отведённое время полностью обесточивать плату, таким образом максимально продлевая работоспособность на одном заряде батареи. То есть пользователь нажал кнопку, увидел данные окружающей среды и брелок сам отключится.

Контроллер взял STM32F030K6T6. Он в удобном для пайки корпусе и потребляет довольно мало в спящем режиме. Для программирования на плате выведены небольшие площадки с SWDIO и SWCLK для припаивания проводов, а в заводской версии платы эти контакты выведены вместе с питанием с шагом 2,54мм, чтобы можно было прижать к ним подпружиненные контакты без пайки.

Я уже работал с датчиком температуры влажности и давления BME280. Со своей задачей датчик справляется отлично, но требует громоздкого кода для вычисления температуры, влажности и давления из сырых данных датчика. Также в коде из даташита есть косяк с получением отрицательных температур, об этом подробнее ниже в статье.

Дисплей решил использовать I2C OLED 0,91” с разрешением 128х32 пикселя. Он продаётся готовым модулем с разными цветами экрана.

Рисунок 1. Схема брелока

Рисунок 1. Схема брелока

По схеме у контроллера сделана минимальная обвязка, а датчик и дисплей уже готовые модули со своей обвязкой. Они сидят на одной шине I2C. Устройство питается от литий-ионной батареи на 220 мАч.

Контроллер заряда литий-ионного аккумулятора взял MCP73831 в удобном корпусе SOT-23-5. На него достаточно подать 5В, и он сам разберётся с зарядом батареи. Резистор R9 задаёт максимальный ток заряда. Номинал резистора 2,2 кОм соответствует току заряда 450 мА. Во время заряда батареи светодиод HL1 будет светиться.

После батареи подключён LDO-стабилизатор на 3,3В. Пока кнопка не нажата, его управляющий контакт подтянут к земле и стабилизатор отключён. В таком состоянии всё устройство потребляет микроамперы и может храниться длительное время в готовом к работе состоянии. Как только пользователь нажмёт кнопку, на управляющий контакт стабилизатора будет подан плюс от батареи и стабилизатор подаст питание на микроконтроллер, а тот сразу выдаст высокий уровень напряжения на ножку, идущую к управляющему контакту стабилизатора, и произойдёт самоподхват. Диод VD1 служит для защиты вывода микроконтроллера от напряжения батареи выше 3,3 В, если кнопка будет нажата повторно.

Для ещё большей экономии энергии во время работы устройства все незадействованные выводы микроконтроллера переведены в режим аналогового входа. С этой же целью делитель для АЦП собран на резисторах большого номинала. Резисторы выбирал из наличия, при 4,2 В на батарее после делителя получается 1,1 В.

Теперь перейдём к программной части.

Алгоритм работы брелка простой, после включения настраивается дисплей и датчик, после чего микроконтроллер отправляется в сон. По таймеру генерируется ивент, микроконтроллер выходит из сна, считывает данные с датчика и напряжение на батарее, обрабатывает их и выводит на дисплей. А через 15 секунд устройство отключается.

Код для вычисления температуры, влажности и давления взят напрямую из даташита на датчик, но этот код не будет работать корректно при отрицательных температурах. Пришлось довольно долго искать проблему, но энтузиасты на одном из форумов уже нашли решение. Достаточно было нормально представить отрицательное число, а не переводить всего один старший бит в единицу. Остаётся лишь гадать, почему этого не сделали сразу в коде из даташита на датчик.

Вот рабочая функция вычисления температуры для датчика BME280:

int32_t BME280_ReadTemperature(void){  int32_t temper;  uint32_t temper_raw;  int32_t val1, val2;  BME280_ReadReg_BE_U24(BME280_REGISTER_TEMPDATA,&temper_raw);  temper_raw >>= 4;  val1 = ((((temper_raw>>3) - ((int32_t)CalibData.dig_T1 <<1))) *  ((int32_t)CalibData.dig_T2)) >> 11;  //Если в 20 разряде val1 появилась единица, то переделываем число до отрицательного  //Иначе отрицательная температура будет вычисляться некорректно  if (val1&(0x100000)) val1 |= 0xFFF00000;  val2 = (((((temper_raw>>4) - ((int32_t)CalibData.dig_T1)) *  ((temper_raw>>4) - ((int32_t)CalibData.dig_T1))) >> 12) *  ((int32_t)CalibData.dig_T3)) >> 14;  temper_int = val1 + val2;  temper = ((temper_int * 5 + 128) >> 8);  temper /= 10;  return temper;}

Отображение информации на дисплее происходит квадратами 8х8 пикселей. Для вывода надписей для кириллицы создал файл с собственным шрифтом. Для этого прекрасно подошёл обычный excel. В рамках квадрата 8х8 заполняешь ячейки, которые должны закраситься и сразу получаешь готовый код в 16-ричном формате для вставки в файл шрифта. Файл excel есть в архиве с кодом в конце статьи. В нём можно легко сгенерировать код любого символа и преобразовать код символа обратно в изображение.

Также у устройства есть пасхалка — если пользователь продолжит удерживать кнопку включения после истечения времени работы, то дисплей инвертируется, и вместо надписей начнёт выводиться простенькая анимация, серийный номер и данные месяца и года сборки устройства. Кадры анимации хранятся в файле Cat_animation.h.

Рисунок 2. Экран с анимацией

Рисунок 2. Экран с анимацией

Изготовление.

Сначала изготовил самодельную тестовую плату. Получилось вполне компактно и всё с лёгкостью уместилось на одном слое.

Рисунок 3. Самодельная тестовая плата

Рисунок 3. Самодельная тестовая плата

После отладки кода на самодельной плате пришло время для мелкой серии. Переделал немного плату на двухстороннюю, заодно уменьшив габариты, и заказал 10 плат. Заказывал у российской фирмы и платы вышли около 320 рублей за штуку. У китайских коллег наверняка можно заказать дешевле, но отечественного производителя тоже стоит поддерживать.

Рисунок 4. Платы заводского исполнения

Рисунок 4. Платы заводского исполнения

И началось самое сложное – изготовление корпуса. По 3D-модели платы нарисовал корпус в SolidWorks, тут никаких сложностей не возникло. А вот при печати корпуса вылезло много трудностей. Мой старенький Anycubic I3 Mega печатает такие маленькие корпуса с дефектами, то капля потемневшего пластика с сопла капнет, то слои немного не ровно ложатся. И при постобработке пришлось прикладывать много усилий, чтобы результат был приемлемый. На примере корпуса для самодельной платы — это заметно.

Рисунок 5. Самодельный брелок в сборе

Рисунок 5. Самодельный брелок в сборе

А при печати на фотополимерном принтере корпуса получались изогнуты бананом. Как только не располагал корпус и поддержки, всё равно получалось не очень. Из-за этого пришлось печатать на FDM-принтере и кропотливо обрабатывать каждый корпус. А в итоге всё дело оказалось в программном обеспечении к принтеру. Корпус для последнего брелока напечатал через современную версию Photon Workshop с автоматической расстановкой поддержек и всё сразу получилось. Видимо я вручную неправильно расставлял поддержки и настраивал их параметры.

Корпуса окрашивал акриловой краской из баллончика (кроме голубого в магазине нормальных цветов не было), а сверху покрыл лаком.

Рисунок 6. Сравнение корпусов из пластика и из смолы

Рисунок 6. Сравнение корпусов из пластика и из смолы

В итоге получилось компактное и полезное устройство с временем работы в режиме ожидания более месяца. Всегда можно посмотреть параметры окружающей среды, только нужно дать датчику пару минут на акклиматизацию, если, например, его занесли с улицы в помещение. И при измерениях не стоит подносить пальцы к отверстию датчика, так как он сразу чувствует влажность от кожи и завышает значения. Также завышает значения температуры при зарядке батареи. Хоть сам датчик расположен на своей плате, нагрев от контроллера заряда добирается и до него.

Все файлы проекта (плата в AltiumDesigner, прошивка в CubeIDE и корпуса в SolidWorks) выложены на яндекс диск. Скачать их можно по ссылкам ниже:

Архив с прошивкой

Проект Altium для заводской платы

Проект Altium для платы DIY

Корпус для заводской платы

Корпус для платы DIY

P.S. Миниатюрные датчики типа BME280 можно довольно легко перепаять с готового модуля к себе на плату, таким образом можно получить одноплатное устройство, вместо сборки модулей. В следующей версии брелока я добавил сразу три датчика прямо на плату и поставил цветной дисплей. Так что у проекта будет продолжение.

Рисунок 7. Следующая версия брелока

Рисунок 7. Следующая версия брелока

ссылка на оригинал статьи https://habr.com/ru/articles/1051128/