Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Классический пинбол, как в древнем игровом автомате или в компактной игрушке: есть пружины, шарики и препятствия. В нашем варианте можно не только зарабатывать очки: чтобы пройти уровень, придется выполнить дополнительную миссию.

Пинбол Пикабу

Аркады, На ловкость, Казуальные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Esp8266 + Программирование

С этим тегом используют

Arduino Электроника Самоделки Своими руками YouTube Умный дом Ardublock IT Программист IT юмор Разработка Python Картинка с текстом Юмор Все
28 постов сначала свежее
13
dedyukhinnp
1 месяц назад

Лабы на esp32⁠⁠

Делали сегодня лабы на микроконтроллере esp32 через ESPlorer IDE.

Может кому нибудь будет интересно)

Лабы на esp32 Микроконтроллеры, Программирование, Esp32, Esp8266, IT, Разработка, Интернет вещей, Умный дом, Видео, Вертикальное видео, Короткие видео, Длиннопост

ESPlorer

В первой лабе надо было подключиться к устройству (оно создаёт точку WiFi) и через веб-интерфейса устройства зажечь светодиод

Во второй надо было подключить к устройству кнопку, подключиться опять по WiFi и в веб-интерфейсе увидеть, что при нажатии на кнопку, отображается информация, что она нажата.

В третьей надо было подключить к устройству джойстик, в веб-интерфейсе можно смотреть положение джойстика.

В четвёртой лабе подключали динамик к устройству, заходили в веб-интерфейс и включали оттуда мелодию на динамике))

И в пятой взяли два устройства. Одно запрограммировали как сервер. Другое как клиент. Сервер раздаёт WiFi. Клиент автоматически к нему подключается. На клиенте есть кнопка. Если на неё нажать, то на сервере зажигается лампочка)

Показать полностью 5
[моё] Микроконтроллеры Программирование Esp32 Esp8266 IT Разработка Интернет вещей Умный дом Видео Вертикальное видео Короткие видео Длиннопост
11
7
i.skuff
i.skuff
2 месяца назад
Инженериум DIY

Esp8266 + wifi + mqtt аудио колонка. Варианты?⁠⁠

Хочу седлать аудиоколонки для озвучивания комнат дома.

Управление по mqtt. Имеется железо esp8266 и I2S DAC (max98357)

Нашел проект MrDiy https://gitlab.com/MrDIYca/mrdiy-audio-notifier выглядит подходяще, но есть недостатки. Готовая прошивка выводит только аналоговый звук (с хрипами) и подписывается на один топик (несколько устройств будут играть один и тот же звук). Но зато эта прошивка умеет проигрывать http поток с интернет радиостанций (то что нужно).

Компиляция прошивки из исходника с включенным I2S DAC играет без хрипов, топик mqtt настраивается индивидуально, но не воспроизводит никаких потоков интернет радиостанций.

Может быть я плохо искал, есть еще варианты? прошивка tasmota приветствуется.

[моё] Esp8266 Esp Своими руками Умный дом Самый умный Электроника Программирование Самоделки Пайка Текст
9
51
LazyDeveloper
1 год назад
Умный дом

Как я автоматизировал управление отопление газовым/электрическим котлом⁠⁠

В посте постараюсь кратко рассказать про сабж, почему это не сложно, не дорого и экономически выгодно. И как из этой идеи родился новый opensource проект.

Первую статью публиковал на хабре, там есть технические детали и подробная предыстория.

Краткая предыстория

Построили дом, смонтировали радиаторную систему отопления с газовым котлом. Находясь в доме зимой, ощутил разницу температуры в доме в течение дня, потому что на котле стояла фиксированная температура, а на улице она была не фиксированная. В итоге в доме то +18, то +28, нехорошо.

Далее были поиски готовых решений управления котлом для поддержания внутри дома заданной температуры, и на тот момент был, вроде бы, только Zont, но мне он не подошел, т.к. в доме я использую Home Assistant, нормальной интеграции zont'а в Home Assistant нет до сих пор, а управлять отоплением из отдельного приложения не хотелось.

Путь диайвайщика

Собственно, за неимением других вариантов начал разрабатывать свой девайс и прошивку для котлов c OpenTherm, который занимается расчётом температуры отопления и управлением котлом в целом. Проект решил опубликовать на github и написать статью на хабре, увидел к этому интерес у людей и продолжаю развивать. В последних версиях прошивки была добавлена возможность управления контроллеров без Home Assistant, напрямую из браузера с компьютера/телефона:

Как я автоматизировал управление отопление газовым/электрическим котлом Отопление, Умный дом, Home assistant, Газовый котел, Своими руками, Esp8266, Esp32, Программирование, Длиннопост, Open Source

Скриншот страницы управления отоплением и ГВС

Про экономическую целесообразность и комфорт

Когда на котле установлена фиксированная температура, температура в помещении может сильно меняться в течение дня. Например, на улице -30 и мы ставим на котле 60 градусов, за ночь температура поднялась до -10, а температура на котле все те же 60 градусов. И котёл может перегреть дом до 28-30 градусов.

Это мало того, что это не комфортно, но и лишний расход газа, который, по моим наблюдениям, мог составить на 3-5 тыс. рублей в месяц (в зависимости от размера дома).

Именно по этой причине целесообразно использовать погодозависимое регулирование температуры. На примере моего дома при установленной температуре 22.5 градуса это теперь выглядит так:

Как я автоматизировал управление отопление газовым/электрическим котлом Отопление, Умный дом, Home assistant, Газовый котел, Своими руками, Esp8266, Esp32, Программирование, Длиннопост, Open Source

Пик до 24 град. связан с нагревом солнцем через окна

Кроме этого, экономия может быть достигнута за счёт установки более низкой температуры (12-15 градусов) на период длительного отсутствия, например, если это дом для эпизодического проживания.

Использование в квартирах. Я лично использую один девайс в квартире под сдачу с автономным отоплением. Потому что есть арендаторы, которые не умеют или боятся менять температуру на котле. И иногда греют квартиру до 30 градусов и потом удивляются счетам за газ. Установка девайса и беспроводного bluetooth датчика температуры полностью избавил меня от звонков по этому поводу :)

Почему это недорого

Для устройства используется плата ESP8266 или ESP32, цена которых на али/авито от 200 до 800 рублей.

Если умеете и любите паять, цена основной платы и компонентов для самостоятельный сборки выходит примерно в 1200 рублей без корпуса или 1500 рублей с корпусом. Платы можно заказать через pcbway/jlcpcb или вовсе собрать на макетке, а компоненты я брал в Чип и Дип. В собранном виде девайс может выглядеть вот так:

Как я автоматизировал управление отопление газовым/электрическим котлом Отопление, Умный дом, Home assistant, Газовый котел, Своими руками, Esp8266, Esp32, Программирование, Длиннопост, Open Source

Если не умеете или не любите паять, то есть готовые устройства на ozon, цена от 2500 до 4000 рублей, искать по запросу esp opentherm (не реклама, это не мои девайсы, я их вообще не собираю на продажу). Или Zont за 12-15 тысяч рублей.

Итого: от 2000 до 4000 рублей за комфорт и экономию в долгосрочной перспективе.

В заключение хочу сказать, что весь этот путь от изучения протокола OpenTherm до создания своего DIY проекта и разработка прошивки полностью себя оправдал, в доме воцарилась стабильная температура, а я получил моральное удовлетворение от процесса :)

Прошивка с открытым исходным кодом и полностью бесплатная.

  • Репозиторий проекта

  • WIKI проекта

Всем удачи!

Показать полностью 3
[моё] Отопление Умный дом Home assistant Газовый котел Своими руками Esp8266 Esp32 Программирование Длиннопост Open Source
71
Партнёрский материал Реклама
specials
specials

Сколько нужно времени, чтобы уложить теплый пол?⁠⁠

Точно не скажем, но в нашем проекте с этим можно справиться буквально за минуту одной левой!

Попробовать

Ремонт Теплый пол Текст
128
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?⁠⁠

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!

❯ Как это работает?


Думаю, для многих моих читателей реализация процесса загрузки exe-программ и dll-библиотек в память процесса оставалась эдаким чёрным ящиком, в детали реализации которого вдаваться не нужно. Отчасти это так и есть: современные ОС разруливают процесс загрузки бинарников в память сами, не требуя от программиста вообще ничего, даже понимания того, куда будет загружена его библиотека или программа.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост




Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:

1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.

2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).

3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Где по итогу:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.

И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.

А ведь чаще всего нужно просто загрузить небольшую программу, которой не нужны комплексные загрузчики: немного кода, немного данных и всё. И тут у нас есть три выхода:

  1. Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.

  2. Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.

    Проблемы реализации такого способа: иногда нужно лезть в систему сборки основной прошивки и патчить скрипт линкера так, чтобы он не трогал определенный регион памяти. В случае esp32, например, это требует патча в сам SDK и возможного «откола» от мейнлайн дистрибутива.

  3. Использовать программу с относительной адресацией, однако без сегментов .bss и .data. Самый простой в реализации способ, который к тому же очень экономичен к памяти, позволяет загружать программу в любое место и пользоваться всеми фишками динамического аллокатора и не требует вмешательств в основную прошивку, кроме примитивного загрузчика программ. Именно его я и предлагаю рассмотреть подробнее.


Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!

Однако в таком подходе есть несколько серьезных ограничений:

  • Отсутствие глобальных переменных может стать проблемой при портированиии уже существующего софта, хотя вашим программам ничего не мешает передавать в каждую функцию структуру с глобальным стейтом, который можно при необходимости изменять. Кроме того, нет ограничений на использование C++ (за исключением необходимости ручной реализации new/delete и отсутствием исключений).

  • Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).


Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!

❯ Практическая реализация


Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!

Заголовок нашего бинарника будет выглядеть вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Программа общается с основной прошивкой посредством псевдо-syscall'ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall'ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Собираем нашу программу:

xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,--section-start=.text=0x0

xtensa-esp32-elf-objcopy.exe --only-section=.text --output-target binary a.out run.bin

-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. --section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.

Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.

По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:

  1. Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.

  2. Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.


Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000

Для заливки программы можно использовать соответствующее Partition API, либо parttool.py:

parttool.py --port "COM41" write_partition --partition-name=executable --input "run.bin"

Переходим к загрузчику программы:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Прошиваем ESP32:

idf.py build

idf.py flash

idf.py monitor

И смотрим результат:

SysCall 25

SysCall 35

SysCall 15

Всё работает!

❯ Заключение


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

Пожалуй, стоит упомянуть ещё один… очень своеобразный метод, который я иногда встречаю при реализации самодельных компьютеров. Люди пишут… эмуляторы 6502/Z80 :)
И если такой подход ещё +- применим к ESP32, то в AVR просадки производительности будут слишком серьезными. Так зачем, если можно использовать все возможности ядра на максимум?

Полезный материал?
Всего голосов:
Приходилось ли загружать сторонний код в ваших устройствах?
Всего голосов:
Показать полностью 9 2
[моё] Опрос Гаджеты Программирование C++ Avr Arduino Esp32 Embedded Своими руками Самоделки Esp8266 Assembler Железо Микроконтроллеры Длиннопост
12
142
octopoly
2 года назад
TECHNO BROTHER

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов⁠⁠

Дозиметр не для Серёжи

В постоянно изменяющемся мире дозиметр является не только способом утолить любопытство и поймать на мушку хоть немного веселых Зивертов, но и способом обнаружения вполне реальных угроз. От проверки “любопытной старинной штуковины” из дедовского гаража, до отслеживания радиоактивного фона в зонах расположения АЭС, от обеспечения безопасности при вылазке в заброшки до мониторинга глобальных и локальных техногенных катастроф.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Нетленной классикой Хабра является цикл статей “Дозиметр для Серёжи”. В этом материале много истории, теории и хардовой (если не сказать “крафтовой”) сборки. Мы респектуем автору, и Сереже тоже. Но ставим перед собой другую, более практическую задачу - собрать дешёвый, функциональный и удобный дозиметр из готовых компонентов. В качестве основных элементов будут использованы Wemos D1 и модуль RadSens (ардуино-дозиметр на базе трубки Гейгера СБМ-20).


RadSensor (таково гордое имя нашего детектора) берет лучшее от прошлых проектов, а также учитывает их ошибки и расширяет функционал счетчика, в частности:

увеличено время автономной работы;

- реализован функционал аудиоотклика;

- повышена эргономичность и универсальность корпуса;

- проект в целом упрощен и избавлен от “крафта”

Не устаем повторять, что основной критерий успеха материала - наличие удачных повторов и ремейков проекта со стороны маленьких электронщиков-школьников, бесшабашных туристов-студентов, а также практичных грибников-родителей.

Перед тем как листать дальше настоятельно рекомендуем ознакомиться с легендарным материалом (https://habr.com/ru/post/471236/). Краткая история и матчасть сами себя не прочитают ;)

Ознакомились? Отлично, тогда приступим!

Персональный дозиметр своими руками

Шутейки иссякли. Далее вас ждет сухая пошаговая инструкция по сборке устройства от закупки компонентов до кода и тестирования..

План покупок (BOM)

1) Плата разработки Wemos D1, от 117 руб. на Али ()

2) Модуль дозиметра RadSens, от4550 руб. на Али/Озоне ()

3) OLED-экран 1.3” с I2C, от 161 руб на Али ()

<!--[endif]-->4) Пассивный пьезоизлучатель, от 48.5 руб. на Али (https://aliexpress.ru/item/4000785325910.html?sku_id=1000000...)

<!--[endif]-->5) Плата заряда TP4056, от 25 руб. на Али ()

<!--[endif]-->6) Аккумулятор 18650, от 210 руб. на Али (https://aliexpress.ru/item/1005004392079183.html?sku_id=1200...)

<!--[endif]-->7) Бокс одинарный для 18650 аккумулятора, от 19 руб. на Али ()

<!--[endif]-->8) Макетная плата 7*3 см, от 17 руб. на Али ()

<!--[endif]-->9) Выключатель KCD-01, от 64 руб. за 10 шт на Али ()

<!--[endif]-->10) Разъём XH-2.54 с обжатыми проводами, от 66 руб. за две пары на Али ()

<!--[endif]-->11) Резисторы номиналами 220 и 100 кОм
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->12) Винты/саморезы с диаметром резьбы 3 и 2.5 мм
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

Общая стоимость компонентов ~5500 рублей.


Цена сравнима с древними дозиметрами советской или китайской разработки. Аналогичное, но современное решение на Озоне обходится уже в 7-9 тысяч рублей.

Схема устройства

Соединения показаны ниже на схеме. Особенности сборки:


- В верхней части макетной платы располагается Wemos (2 пина от края) и OLED (2 пина от края).


- Внизу макетки установлены: зарядкаTP4056 (Type-C сдвинут максимально близко к краю платы, но не вылезает за её пределы) и пьезоизлучатель (любая удобная позиция).


- Выключатель стоит на разрыве плюсового выходного пина контроллера заряда. Если подключить его на разрыв плюсового провода батареи, то контроллер заряда будет уходить в защиту, это ведёт к некорректной работе устройства.


Для расчёта и вывода остатка заряда батареи используется АЦП (пин А0). Для его правильной работы необходимо понизить напряжение с помощью делителя нпряжения. Подробнее о нем вы можете прочитать в статье о сборке анемометра (https://habr.com/ru/post/676348/).

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

В результате должно получиться подобное устройство. Рекомендуем заизолировать контакты на лицевой стороне платы. Это одна из возможных способов собрать её, поэтому мы приветствуем критику и предложения :)

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Корпус

Мы постарались создать максимально удобный для печати, сборки и эксплуатации корпус.


На углу предусмотрена проушина диаметром 3 мм под шнурок или брелок.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Под трубкой Гейгера сделаны прорези для возможности детекции альфа-частиц, сделаны отверстия под пьезоизлучатель.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Посадочные места дозиметра адаптированы под длинную и короткую версии модуля RadSens.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост
Кнопка включения утоплена и защищена от случайных нажатий
RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

На крышке предусмотрены посадочное место для OLED-экрана для предотвращения западания, добавлены боковые стенки для увеличения жёсткости корпуса

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Модель адаптирована под 3d-печать, подобрана нормальная толщина стенки, минимизировано число поддержек

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Найти модели корпуса (stl и step-файлы) вы можете в нашем GitHub.

Код

Для проекта использован слегка доработанный код из нашей предыдущей статьи (...). В частности:

- добавлен звук приветствия при включении устройства

- добавлена индикация заряда

- реализовано предупреждение при превышении порога интенсивности излучения.

Для работы с OLED-экраном используется библиотека Алекса Гавера GyverOled.

Вы также можете найти код в примерах библиотеки RadSens на GitHub.


// Инициализируем библиотеки
#include <Wire.h>
#include <CG_RadSens.h>
#include <GyverOLED.h>
#define ADC_pin A0 // задаём значение пина АЦП
#define buz_pin 14 // Задаём значения пина для пищалки
GyverOLED<SSH1106_128x64> oled; // Инициализируем 1.3" OLED-экран
CG_RadSens radSens(RS_DEFAULT_I2C_ADDRESS); // Инициализируем RadSens
uint16_t ADC; // Переменная для значений АЦП
uint32_t timer_cnt; // Таймер для измерений дозиметра
uint32_t timer_bat; // Таймер для измерения заряда батареи
uint32_t timer_imp; // Таймер опроса импульсов для пьезоизлучателя
uint32_t pulsesPrev; // Число импульсов за предыдущую итерацию
//Функция аудиоприветствия
void hello() {
for (int i = 1; i < 5; i++) {
tone(buz_pin, i * 1000);
delay(100);
}
tone(buz_pin, 0);
delay(100);
oled.setScale(2);
oled.setCursor(10, 3);
oled.print("Radsensor");
oled.update();
delay(3000);
oled.clear();
}
//Функция, которая создаёт "трески" пьезоизлучателя при появлении импульсов
void beep() { // Функция, описывающая время и частоту пищания пьезоизлучателя
tone(buz_pin, 3500);
delay(13);
tone(buz_pin, 0);
delay(40);
}
//Функция предупреждения при превышении порога излучения
void warning() {
for (int i = 0; i < 3; i++) {
tone(buz_pin, 1500);
delay(250);
tone(buz_pin, 0);
delay(250);
}
}
void setup() {
Wire.begin();
oled.init(); // Инициализируем OLED в коде
oled.clear();
oled.update();
pinMode(ADC_pin, OUTPUT); // Инициализируем АЦП как получатель данных
hello(); // Приветствуем пищанием
oled.update(); // Обновляем экран
pulsesPrev = radSens.getNumberOfPulses(); // Записываем значение для предотвращения серии тресков на старте
}
void loop() {
// Раз в 250 мс происходит опрос счётчика импульсов для создания тресков, если число импульсов за 250 мс превысит 5, раздастся предупреждение
if (millis() - timer_imp > 250) {
timer_imp = millis();
int pulses = radSens.getNumberOfPulses();
if (pulses - pulsesPrev > 5 ) {
pulsesPrev = pulses;
warning();
}
if (pulses > pulsesPrev) {
for (int i = 0; i < (pulses - pulsesPrev); i++) {
beep();
}
pulsesPrev = pulses;
}
}
// Снимаем показания с дозиметра и выводим их на экран
if (millis() - timer_cnt > 1000) {
timer_cnt = millis();
char buf1[50];
char buf2[50];
char buf3[50];
sprintf(buf1, "%.1f мкр/ч", radSens.getRadIntensyDynamic()); // Собираем строку с показаниями динамической интенсивности
sprintf(buf2, "Стат: %.1f мкр/ч ", radSens.getRadIntensyStatic()); // Собираем строку с показаниями средней интенсивности за период работы
oled.setCursor(0, 2);
oled.setScale(2);
oled.print(buf1);
oled.setCursor(0, 6);
oled.setScale(1);
oled.print(buf2);
}
// Считываем показание с АЦП, рисуем батарею и создаём индикацию заряда, показания АЦП вы можете подстроить под своё удобство
if (millis() - timer_bat > 5000) {
timer_bat = millis();
ADC = analogRead(ADC_pin);
oled.rect(110, 0, 124, 8, OLED_STROKE);
oled.rect(125, 3, 126, 5, OLED_FILL);
if (ADC >= 350) {
oled.rect(112, 2, 114, 6, OLED_FILL);
oled.rect(116, 2, 118, 6, OLED_FILL);
oled.rect(120, 2, 122, 6, OLED_FILL);
}
if (ADC < 350 && ADC >= 335) {
oled.rect(112, 2, 114, 6, OLED_FILL);
oled.rect(116, 2, 118, 6, OLED_FILL);
}
if (ADC < 335 && ADC >= 320) {
oled.rect(112, 2, 114, 6, OLED_FILL);
}
if (ADC < 320){
oled.rect(110, 0, 124, 8, OLED_STROKE);
oled.rect(125, 3, 126, 5, OLED_FILL);
}
}
oled.update(); // Обновляем экран в конце цикла
}

Сборка

Для придания большей компактности мы свели к минимуму свободное пространство внутри корпуса. Поэтому необходимо придерживаться простого алгоритма сборки.

1) Устанавливаем бокс для 18650 с помощью винта диаметром 3х7 мм и вставляем выключатель в отверстие с торца, подпаиваем к нему провода для разрыва линии +OUT контроллера заряда.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

2) Припаиваем провода от бокса к соответствующим выходам контроллера заряда, провода от выключателя – в разрыв между +OUT и плюсовыми контактами потребителей. Затем подключаем два шлейфа для дозиметра и экрана, выводим их и закрепляем корпус на три винта 2.5х7 мм. После вставляем батарею в бокс.

<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

3) Подключаем модуль RadSens через коннектор и закрепляем его винтам 2.5х7 мм.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

4) Закрепляем экран винтами 2.5х5 мм и подключаем его.

<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

5) Закрепляем крышку винтами 3х5 мм.

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Тестирование

Как и в предыдущих статьях мы проводим тестирование на сульфате калия. Если у вас в тумбочке завалялся кусок урана - можете использовать его, но помните о мерах безопасности.

Дозиметр для DIY-щиков

В рамках материала мы описали только базу дозиметра. Проект можно и нужно развивать: создать приложуху для сбора и записи статистики на телефон, интегрировать с Народным Мониторингом, добавить функции фонарика, датчика температуры и лазерной сабли. Пожалуйста, выбирайте задачку по себе, предлагайте новые идеи и помогайте нам.


Наш же новый челендж - автономный дозиметр, работающий от солнечной батареи и передающий данные по модему на Нармон. Ждите, скоро на просторах хабра...


Также мы планируем провести в Москве несколько мастер-классов по сборке дозиметров и прочих проектов. Если DIY-электроника для Вас в новинку, но очень хочется попробовать - присоединяйтесь к сообществу ClimateGuard, ловите объявления и приходите к нам в гости на Электрозавод (МЭЛЗ).

RadSensor v1.0. Собираем портативный персональный дозиметр из готовых компонентов Программирование, Своими руками, Дозиметр, Ядерная война, Самоделки, Электроника, Arduino, Esp8266, Техника, 3D печать, Электрика, Длиннопост

Пользуясь случаем команда инженеров ClimateGuard передает благодарности и респекты:

бессменному автору Илье Радченко (@octopoly) за подготовку материала;

Алексу Гаверу (@AlexGyver) за прекрасную библиотеку GyverOLED;

магазину Амперкот за предоставленные компоненты и желание создавать крутые и полезные образовательные наборы;

сообществу, поддерживающему проекты и участвующему в нашей жизни;

...и конечно же вам, дорогие читатели, за уделенные время и интерес к статье!

Давайте сплачиваться и нести DIY в массы!

Показать полностью 15
[моё] Программирование Своими руками Дозиметр Ядерная война Самоделки Электроника Arduino Esp8266 Техника 3D печать Электрика Длиннопост
37
68
octopoly
2 года назад
TECHNO BROTHER

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками⁠⁠

Введение

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Был у нас на работе один адок из рубрики “админам жарко, а бухгалтерам дует”…

Ростелеком, только переехали в новый офис в ComCity, огромные опенспейсы и сплошные окна без форточек. Плюс стандартная болезнь открытого пространства - на большое помещение всего один вентканал с кучей выходов.


Летом, в жару включается централизованная система кондиционирования и увлажнения и начинается… Самые первые в цепочке отправляются на Северный полюс (или на Южный, к пингвинам в общем и снеговику Олафу). Последние продолжают изнывать в сухой и жаркой Африке. Катаклизма неизбежно приводит к войне за крутилку кондиционера, которую мудрые инженеры предусмотрительно отключили.


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

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


Приблизительно в таких нечеловеческих муках родилась мечта о сборке собственного arduino-анемометра. Можно, конечно, купить готовое устройство, но для айтишника это “беспонтово”. Кроме того, на умную железку можно (в теории) повесить логирование, сбор данных по расписанию, управление умным домом и запуск кота в космос. “Ардуино, и ни в чем себе не отказывай”.


С тех пор прошло 6 лет. Работодатель остался в прошлом. Бизнес-центр скорее всего также перестал высушивать и отмораживать арендаторов. Но мечта жила.

Мы продолжаем рубрику “сенсорика для самых маленьких инженеров”. И в настоящей статье представим подробную инструкцию по сборке собственного термоанемометра. Грейте паяльники, открывайте Arduino IDE, поехали!

Экскурс в матчасть


Как гласит Вики, впервые описание анемометра появилось в виде чертежа в 1540-м в трудах Леона Батиста Альберти “Математические забавы”. Позднее подобную конструкцию описал Леонардо Да Винчи.

Через три века, в 1846-м году ирландский исследователь Джон Томас Ромни Робинсон изобрёл чашечный анемометр, ставший в то время революционным. В 1994-м году геологом Андреасом Пфличем был изобретён ультразвуковой анемометр.


Если не вдаваться в оттенки, все анемометры делятся на 3 основных типа:


1) Механические (чашечные или крыльчатые). Самый старый тип анемометров. устройства подобной конструкции используются в качестве портативных устройств для локальных замеров. На метеостанциях применяют анеморумбометры. Это те же чашечные анемометры, но с “хвостом” для определения направления потока.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост
2) Термоанемометры - скорость потока воздуха на них рассчитывается исходя из зависимости теплоотдачи нагреваемого элемента, помещенного в поток, от скорости течения потока. Эти типы измерителей нашел широкое применение в автомобильной индустрии в качестве датчика массового расхода воздуха. Также они используются в портативных устройствах для оценки потока в вентканалах. На низких скоростях термоанемометры демонстрируют большую точность, чем механические собратья.
DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

3) Ультразвуковые анемометры. Принцип работы основан на измерении скорости прохождения звука, которая изменяется в зависимости от направления ветра. Ультразвуковые датчики достаточно дороги, но при этом просты в эксплуатации и способны определять направление потока. Поэтому часто применяются в бытовых и профессиональных метеостанциях.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Существуют некоторые другие разновидности, но большинство из них являются модификациями уже существующих типов, либо не имеют широкого распространения. Например Трубка Пито, которая используется в качестве измерителя скорости и высоты в авиации, а также может служить эталонным прибором

Собираем DIY термоанемометр


Скучная лекция закончилась, возвращаемся к нашему DIY.

Нам необходимо собрать железку, выполняющую три задачи:


• проводить замеры скорости потока в ручном режиме;


•рассчитывать расход воздуха в вентиляционных системах;


•обладать компактным размером для проведения замеров в вентканалах.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

План покупок (BOM)

1) Плата WEMOS D1 mini (от 100 руб. на Али)

Дешёвая и компактная плата на базе ESP8266, основа проекта.


2) Термоанемометр ClimateGuard (1720 руб. на Али)

Компактный и высокоточный модуль, работающий от 3.3 В по I2C.


3) OLED-дисплей 0.96” с I2C (от 100 руб. на Али)

Сравнительно дешёвый, но комфортный для работы дисплей с неплохой яркостью.


4) Регулятор напряжения ADP3338 на 3.3 В (от 14 руб. на Али)

Необходим для стабилизации напряжения, подаваемого на анемометр. В Китае их часто продают набором за приятные деньги.


5) Аккумулятор 18650 (от 200 руб. на Али)

Любой аккумулятор типа 18650 для автономной работы анемометра.


6) Плата для аккумулятора на базе TP4056 (от 10 руб. на Али)


7) Макетная плата 7х3 см (от 50 руб. на Али)

Плата для распайки и соединения всех компонентов.


8) Разъём XH 2.54 4pin “мама” с выводом на 90 градусов и два разъёма XH 2.54 4pin “папа” с проводами (от 90 руб. на Али)

На просторах Али нашёл готовый комплект из обжатых проводов с ответной частью. За 90 рублей получаем 10 таких комплектов.


9) Выключатель KCD-1 ( от 80 руб. на Али)

Компактный и дешёвый клавишный выключатель, под него рассчитана 3D-модель.


10) Селфи-палка (от 330 руб. на Али)


Итоговая стоимость: от 2730 руб.

Для сравнения: бюджетные версии термоанемометров Testo начинаются от 14500 руб., а популярное устройства (с сомнительной репутацией) от CEM - от 25000 руб.

Алгоритм сборки анемометра


1) Ознакомление со схемами платы, компонентов и с общей схемой

2) Соединение всех компонентов на макетной плате

3) Печать корпуса на 3D-принтере, либо создание его из подручных материалов

4) Программирование и прошивка платы

5) Тестирование устройства

Схема сборки


WEMOS D1 мало чем отличается от своих собратьев, построенных на базе ESP8266. Для подключения всех компонентов нам будут необходимы пины D2, D1 (SDA, SCL) и A0 (пин АЦП для считывания остатка заряда батареи) - см. схему ниже.
DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Анемометру требуется чистое и стабильное напряжение в 3.3 В. Для его обеспечения мы будем использовать стабилизатор напряжения ADP3338.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Популярные преобразователи LM3940 или AMS117 не подходят, так как обладают низкой точностью регулирования (около 3%). При этом отклонениz напряжения напрямую влияет на качество показаний анемометра. Поэтому выбор делается в пользу ADP3338 с точностью преобразования 0,8%. Выше приведена схема подключения LDO. Также производитель рекомендует ставить на вход и выход и выход конденсаторы номиналом 1 мкФ.


Мы собираем автономное устройство, поэтому необходим аккумулятор. Для текущего кейса была выбрана банка 18650 (под него создана 3D-модель корпуса), но в принципе можно использовать и li-ion / li-pol аккумуляторы другого форм-фактора.


Плата WEMOS имеет на борту встроенный АЦП (ADC0) для измерения выходного напряжения аккумулятора. Но так как АЦП способен измерять только до 3.3 В, а полностью заряженный аккумулятор выдаёт 4.2 В, необходим делитель напряжения. Делитель напряжения представляет собой последовательно соединенные резисторы. При подключении к средней точке мы обнаружим, что напряжение там равно напряжению, рассчитанному по формуле 2 на картинке.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

WEMOS имеет делитель напряжения с номиналом резисторов 220 кОм и 100 кОм соответственно.

После ознакомления с распиновкой WEMOS и LDO подключаем все компоненты согласно схеме.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

В результате у нас должна получиться примерно такая плата с кучей проводов и компонентов.

Мастерство пайки постигается годами, мы нисколько не хотели задеть ваши чувства.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Печатаем корпус самодельного анемометра


В процессе работы создано несколько типов корпусов для разных задач:


• “Голый” корпус. Самый простой корпус, который можно доработать под свои задачи или использовать как есть. Сверху есть отверстия для винтов М2 для крепления корпуса анемометра.
DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

• Корпус с возможностью крепления на трубки. В тыльной части имеет крепление под трубку диаметром 15 мм и пазами для стяжек.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

3D-модели корпусов как обычно доступны на GitHub.


Финальная конструкция представлена на картинке. Провода были зажгутированы для удобства работы с устройством. Чтобы убрать колхоз - можно использовать спиральную обмотку (под рукой не оказалось).

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Подключаем плату и библиотеки


Для дальнейшей работы нам необходимо подключить библиотеки

Сначала заходим в настройки Arduino IDE и добавляем дополнительные ссылки Менеджера плат следующее:

http://arduino.esp8266.com/stable/package_esp8266com_index.j...
DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Затем мы должны выбрать необходимую нам плату. Для этого переходим во вкладку “Инструменты”, выбираем раздел “Плата”, далее выбираем “Менеджер плат” и вводим в поисковую строку “esp8266”.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост
DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

После установки расширения снова заходим в “Платы” и выбираем “Generic ESP8266 Module” в подразделе с ESP8266

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Далее необходимо подключить библиотеки для анемометра и экрана. Для этого:

Arduino -> Скетч -> Подключить библиотеку -> Управлять библиотеками -> Написать “anem” в поисковой строке.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

После установки библиотеки для анемометра проделаем такую же операцию для библиотек дисплея. В поисковой строке необходимо написать “Adafruit GFX” и “Adafruit SSD1306”.

Переходим к коду.

Код


Программа реализует базовый функционал. Следуя путями DIY можете переработать её под свои хотелки. Кодик также можно найти в GitHub или в примерах библиотеки датчика CG_Anem. Для OLED используется нетленная классика - библиотека Алекса Гавера. Она одна из самых простых, интуитивно понятна и полностью закрывает поставленные задачи.

// Инициализируем библиотеки

#include <cgAnem.h>

#include <Wire.h>

#include <GyverOLED.h>

#define ADC_pin A0 // задаём значение пина АЦП

GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled; // Инициализируем OLED-экран

ClimateGuard_Anem cgAnem(ANEM_I2C_ADDR); // Инициализируем CG_Anem

uint16_t ADC; // Переменная для значений АЦП

uint32_t timer_cnt; // Таймер для измерений анемометра

uint32_t timer_bat; // Таймер для измерения заряда батареи

void setup() {

pinMode(ADC_pin, OUTPUT); // Инициализируем АЦП как получатель данных

oled.init(); // Инициализируем OLED в коде

oled.flipV(1); // Я перевернул экран для удобства

oled.flipH(1); // Для нормального отображения после переворота нужно инвертировать текст по горизонтали

oled.clear();

oled.setScale(2); // Устанавливаем размер шрифта

oled.setCursor(20, 3);

oled.print("CG_Anem");

delay(1500);

cgAnem.init();

oled.clear();

cgAnem.set_duct_area(100); // Задаём площадь поперечного сечения для расчёта расхода. Меняется программно, измеряется в см^2

for(int i = 10; i >= 0; i--){ // Функция таймера служит для предварительного нагрева анемометра перед использованием

oled.setCursor(55, 3);

oled.print(i);

delay(1000);

oled.clear();

}

delay(1000);

oled.clear();

oled.setScale(1);

}

void loop() {

if (millis() - timer_cnt > 1000) { // Снимаем показания с анемометра и выводим их на экран

timer_cnt = millis();

// Проверяем, обновляются ли данные с анемометра. Если да - выводим их, если нет - предупреждаем об ошибке

if (cgAnem.data_update()){

char buf1[50];

char buf2[50];

char buf3[50];

sprintf(buf1, "V: %.1f m/s ", cgAnem.getAirflowRate()); // Собираем строку с показаниями скорости потока

sprintf(buf2, "T: %.1f C ", cgAnem.getTemperature()); // Собираем строку с показаниями температуры

sprintf(buf3, "Cons: %.1f m^3/h ", cgAnem.calculateAirConsumption()); // Собираем строку с показаниями расхода воздуха, исходя из заданного сечения. Расход воздуха измеряется в м^3/час

oled.setCursor(0, 1);

oled.print(buf1);

oled.setCursor(0, 3);

oled.print(buf2);

oled.setCursor(0, 5);

oled.print(buf3);

}

else {

oled.setCursor(45, 3);

oled.print("ERROR");

}

}

if (millis() - timer_bat > 10000) { //

timer_bat = millis();

ADC = analogRead(ADC_pin); // Считываем показание с АЦП

oled.rect(104, 3, 124, 10, OLED_STROKE); // Рисуем иконку батарейки

oled.rect(125, 5, 127, 8, OLED_FILL);

if (ADC >= 970){

oled.rect(104, 3, 124, 10, OLED_FILL);

oled.setCursor(6, 1);

oled.setCursor(104, 2);

oled.print("100%");

}

if (ADC < 970 && ADC >= 870){

oled.rect(106, 3, 119, 10, OLED_FILL);

oled.setCursor(104, 2);

oled.print("75%");

}

if (ADC < 870 && ADC >= 770){

oled.rect(106, 3, 114, 10, OLED_FILL);

oled.setCursor(104, 2);

oled.print("50%");

}

if (ADC < 770){

oled.setCursor(104, 2);

oled.print("LOW");

}

}

}

Проверка


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


Навскидку нашлись следующие жертвы:


• окно в доме;


• вытяжка над плитой;


• кондиционеры в офисах на заводе;


• кулер 3д-принтера;


• пылесос;


• ноутбук;


• торнадо.

Домашнее окно


Кейс показывает, что устройство может ловить даже потоки от небольших сквозняков.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Вытяжка над плитой


Замер получился интересным. Вытяжка снабжена двумя секциями для установки фильтров. Слева из секции фильтр убрали, справа оставили.

Замер очень наглядно продемонстрировал, что от долгого использования фильтр забился жиром и перестал нормально пропускать воздух. Разница между секцией с фильтром и без составляет 1,3 м/с. При испытаниях ни одна вытяжка не пострадала :)

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Кондиционеры в офисах на заводе


Прошли по родному Электрозаводу (он же МЭЛЗ), где базируется офис компании.

Наш офисный 10-летний кондиционер пытается справляться с жарой.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

На остальных объектах по работе кондея очень хорошо видно - в каких помещениях сидят фотографы и ИТ-шники (кондей забирает воздух комнатной температуры), а в каких - трудятся работяги за станками (кондей выдувает горячий воздух в коридор).

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Кулер 3д-принтера


До испытаний ожидали, что улитка работает помощнее и гонит более холодный воздух. Видимо, китайский кулер отработал свое и нуждается в замене.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Пылесос


Измерить скорость всасывания пылесоса - идея сколь гениальная, столь и бесполезная. Вернуться к кейсу можно будет разве что при выборе пылесоса в торговом зале - представляете, какое будет шоу?

Внимания достоин только тот факт, что выдуваемый воздух имеет меньшее рассеивание.

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Ноутбук


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

DIY термоанемометр: собираем датчик скорости и температуры потока воздуха своими руками Программирование, Техника, Электроника, Самоделки, Технологии, Своими руками, Arduino, Esp8266, Измерения, Конструктор, Длиннопост

Торнадо


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

Послесловие


В завершении статьи отметим, что приведенные примеры использования не раскрывают потенциала собранного DIY-анемометра. В голову приходит множество кейсов. От создания системы мониторинга вытяжки с передачей данных в облако до автоматизации охлаждения майнинг-фермы или лазерного резака. От создания “анемометра для охотников” до использования решения для измерения скорости полета дрона.

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


Благодарности


Команда инженеров благодарит стажера Илью Радченко за подготовку материала, упорство и доскональное изучение возможностей анемометра, Алекса Гавера за библиотеку "GyverOLED", а также магазину Duino.ru за любезно предоставленные компоненты.

Ну и конечно крепко обнимаем сообщество Пикабу за уделенное время и интерес к электронике и DIY.

Показать полностью 25
[моё] Программирование Техника Электроника Самоделки Технологии Своими руками Arduino Esp8266 Измерения Конструктор Длиннопост
20
6
iv.dark
iv.dark
3 года назад
Лига Радиолюбителей

Прошу помощи с espeasy⁠⁠

Приветствую вас! Надеюсь кто нибудь сможет помочь. Суть проблемы, есть esp8266 с залитой на неё espeasy, требуются принять информацию в serial порт и при получении определённого значения в этом потоке щёлкнуть релюшкой и на дисплей вывести сколько раз была принята эта информация. Эту часть я смог сделать, но есть одно но. Работает это всё только когда с пк устанавливаю соединение с esp по средствам telnet. Надеюсь кто нибудь сможет мне подсказать что я сделал не так?

Esp8266 Программирование Микроконтроллеры Компьютерная помощь Текст
6
20
techmisty
techmisty
3 года назад
Arduino & Pi

Ответ Dolfst в «ESP01 не могу прошить»⁠⁠2

Уважаемый автор поста и так же все кто занимается программированием.
Хочу поделиться небольшим опытом в этой сфере. Занимаюсь программированием раций, устройств морской навигации, и как хобби - блоков Глонасс типа Ublox и Ардуино.
Всё мы знаем как важна неразрывность связи, в случае обрыва можно просто превратить дорогой аппарат в кирпич.
У устройств с входом/выходом NMEA проблема связи отсутствует, поскольку сам формат подразумевает стабильность связи в виде токовой петли, рассчитанный на передачу на большие расстояния по проводам (до 100м).
У китайских Глонасс модулей существует проблема из-за плохо подобранного питания как для самих модулей, так и для переходником USB/TTL, USB/COM.
Только опытным путем я определил, что подбирая питание на устройства, можно добиться неразрывной связи, для этого использую простой DC-DC конвертер, изменяя напряжение в диапазоне допустимых значений. Также хочу добавить, что питание с переходника (3В,5В) лучше не брать, он либо не потянет, либо зависнет.

Esp8266 ГЛОНАСС Программирование Ttl Arduino Ответ на пост Текст
12
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии