惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
D
Docker
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Simon Willison's Weblog
Simon Willison's Weblog
S
Security Affairs
NISL@THU
NISL@THU
T
Tor Project blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
腾讯CDC
S
Schneier on Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
Latest news
Latest news
C
Check Point Blog
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
月光博客
月光博客
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Метеобрелок своими руками
Алексей · 2026-06-24 · via Все публикации подряд на Хабре

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

Простой

5 мин

3

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

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

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

Контроллер взял 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. Следующая версия брелока