Карманная метеостанция
Да, метеостанция — это про что-то, измеряющее огромное количество параметров от направления и силы ветра до уровня солнечной радиации, но более подходящего термина не нашлось, поэтому приходится вводить в заблуждение. А вот насчет размера, все по-честному.
Устройство, пожалуй, не имеет особой коммерческой ценности, т.к. даже по сумме комплектующих, уступает множеству китайских, и не только, товаров, которые обладают схожим функционалом.
DIY его тоже сложно назвать из-за таких вещей как необходимость заказа печатных плат с последующей пайкой мелких/безвыводных компонентов, что сильно уменьшает количество желающих повторить устройство.
Сама метеостанция создавалась как нечто, хочется думать, эстетичное, компактное и способное быстро оценить температуру + влажность вокруг, а раз выбранный датчик может еще и про давление рассказать, то и это тоже. Выглядит все, примерно так (кликабельно):
В сравнении:
О железе.
В качестве датчика выбран BOSCH-евский BME280, который и выдает искомые параметры окружающей среды хоть по I2C хоть по SPI, восемь ног в безвыводном LGA корпусе размером 2.5×2.5 мм — относительно недорогой, крошечный. Изначально планировался более навороченный датчик из этой же серии BME680, который, помимо температуры, влажности и атмосферного давления, согласно datasheet, может оценивать еще и качество воздуха по, так называемому Index for Air Quality (IAQ). Вроде бы неплохо, но на деле оказалось, что IAQ можно получить только при использовании BSEC: Bosch Software Environmental Cluster, который по показаниям датчика и изменении этих показаний вычисляет IAQ. Казалось бы, можно считать показания самостоятельно и все посчитать; не совсем так. На запрос по измерению качества воздуха, датчик выдает сопротивление, в Омах. Он нагревает внутри себя небольшую чувствительную область, реагирующую проводимостью на наличие летучих органических веществ — Volatile Organic Compounds (VOC), и выдает результат т.е. сопротивление этой области. Впринципе, некоторые умельцы предлагают свои алгоритмы интерпретации этих показаний без BSEC, но, помимо прочего, кратная стоимость, по сравнению с BME280, выбора не оставила.
Дисплей состоит из двух TOS-F2101, это обычные семисегментные индикаторы зеленого цвета с общим катодом. Из примечательного, это размер и корпус для поверхностного монтажа, позволяющий разместить их нетрадиционным способом. К слову, это самые маленькие планарные индикаторы, которые удалось найти в продаже, и именно они, по большей части, задают размер всего устройства.
Управляет всем STM32F072 в 48-ми выводном QFPN корпусе. Выбран, опять же, исходя из размеров, наличия периферии и необходимого количества выводов для управления индикаторами, которые, в сдвоенном варианте, почему-то, не встречаются и выводов нужно порядочно.
Остальное — резисторы, конденсаторы, преобразователь напряжения на 3.3 В, чем меньше — тем лучше, в разумных пределах и ТТХ компонентов, конечно.
USB разъем выполнен на плате. Для уверенного контакта толщина текстолита должна быть примерно 2 мм. Если руководствоваться чертежом на USB Type-A, то там немного больше, но если учесть маску с обеих сторон, то выходит вполне сносно. Конечно, этот формат разъема оставляет больше шансов на механическое повреждение USB розетки, но, по большому счету, с этим можно справиться и при помощи обычной флешки.
Сенсорной кнопкой является круглый полигон под рисунком на плате, кнопка реагирует на короткое и долгое касание.
Также, помимо дисплея, на плате есть три светодиода, сигнализирующие о том, какое из показаний в данный момент отображается на индикаторе.
Что касается софта.
Программа написана с использованием CMSIS, частота работы 48 МГц и от внутреннего источника; есть тут такой, с ним можно даже USB задействовать без использования внешнего кварца. Для гибкости и, возможного, расширения функционала, добавлена FreeRTOS.
Обработкой сенсорной кнопки занимается Touch sensing controller (TSC). Так как на плате нет ни клавиатуры из сенсорных кнопок, ни слайдеров, когда сенсорные площадки объединены в линию, а есть один датчик, фиксирующий короткие и долгие касания, то и всеобъемлющую библиотеку от ST использовать смысла особого нет. Сам принцип работы сенсорного датчика прост, есть несколько выводов, объединенных в группы, к одному из них подключается конденсатор (Sampling capasitor) Сs, этот вывод становится образцово-показательным, остальные выводы группы можно подключать к полигонам сенсоров, которые по сути также являются конденсаторами Cx. Контроллер заряжает емкость полигона-конденсатора Cx и затем этот заряд перегоняет в образцовый Cs, операция повторяется до определенного предела напряжения на Cs. Емкость сенсора, как правило, небольшая, поэтому потребуется много таких операций и для подсчета есть отдельный регистр (TSC_IOGxCR). Если прикоснуться к сенсору, то емкость Сх станет больше и циклов для зарядки Сs понадобится меньше, это немедленно фиксируется и о касании сообщается наверх. К слову, емкость датчика начинает увеличиваться, когда непосредственного касания еще нет, поэтому датчик можно защитить от физического контакта, например маской, или же фиксировать разные степени приближения.
Для общения с BME280 используется интерфейс I2C. Реализация I2C в STM32F072 проще чем в народном STM32F103, помимо прочего, не нужно отслеживать отдельно ½/много принимаемых байт, достаточно заранее указать их количество (I2C_CR2.NBYTES[7:0]). Сама же библиотека для работы с датчиком предоставлена, и рекомендована к использованию, производителем датчика. Чтобы, с помощью библиотеки, считать показания, нужно создать две структуры — для настроек и данных. В настройки нужно внести:
- адрес датчика на шине I2C
- функции чтения/записи по I2C, а также функцию задержки
- количество считываний показаний для усреднения (Oversmpling) х1, х2, и.т.д., для каждого из параметров температура/влажность/давление
- коэффициент фильтрации для АЦП
- период снятия значений параметров
- в целом, какие из параметров считывать, к примеру, можно оставить одну температуру
- режим работы, «normal» — с периодическим снятием показаний, «forced» — снятие показаний по запросу
Впринципе все, если выбран режим «normal», то актуальные значения показаний можно получать, запуская функцию «bme280_get_sensor_data», она обратится к соответствующим регистрам датчика, считает непосредственные показания, а затем обработает их в соответствии с поправочными коэффициентами, записанными в микросхему на производстве. В результате, на выходе структура данных будет содержать значения температуры в градусах Цельсия, относительной влажности в процентах, атмосферного давления в Паскалях. При режиме «forced», все то же самое, только каждый раз перед считыванием показаний, нужно запускать преобразование «bme280_set_sensor_mode».
Общий принцип работы устройства таков: подключить к USB, либо к Power Bank в мобильном варианте. Для первоначального отображения и переключения показаний — короткое касание сенсора, для отключения — долгое касание. Сначала отображается температура в градусах Цельсия, затем относительная влажность в процентах ну и атмосферное давление в миллиметрах ртутного столба, т.к. индикаторов всего два, а показатель давления редко выходит за пределы семи сотен, то цифра семь здесь виртуальная. Если некоторое время не трогать сенсор, то индикаторы отключатся, чтобы, к примеру, не разряжать Power Bank. Среднее потребление устройства составляет ~50 мА, и главными потребителями являются как раз индикаторы, если их отключить, счет идет на микроамперы.
В итоге, общая стоимость компонентов на январь 2020 получилась около 850 руб, это без учета платы, она досталась легко, т.к. у производителя были новогодние скидки, а у меня купоны, но такое вряд ли повторится в ближайшем будущем, по крайней мере до следующего декабря. Ну, а желающие ознакомиться с исходниками, могут сделать это здесь.