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

Магический мир

Мидкорные, Ролевые, Три в ряд

Играть

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

  • ExtremeGrower ExtremeGrower 6 постов
  • POMBOP POMBOP 9 постов
  • Lio2142 Lio2142 1 пост
Посмотреть весь топ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • WIKI проекта

Всем удачи!

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

Часы - Гаргантюа⁠⁠

Ку!
Часы названы так в честь чёрной дыры из фильма "Интерстеллар", изображение которой помещено в центр корпуса часов. Делались они для дома

Вид спереди

Вид спереди

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

Вид сверху

Вид сверху

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

Гаргантюа

Гаргантюа

В центре часов настоящая газоразрядная лампа Декатрон ОГ-4, находящаяся в центре чёрной дыры Гаргантюа и символизирующая горизонт событий.
Гаргантюа выполнена из латуни, рисунок вытравлен и залит чёрной краской.
Внутри микроконтроллер с Wi-Fi на борту ESP32.

Вид сзади

Вид сзади

Веб-интерфейс часов

Веб-интерфейс часов

Псевдогазоразрядные лампы

Псевдогазоразрядные лампы

Показать полностью 6
[моё] Часы Рукоделие без процесса Nixie clock Газоразрядные индикаторы Оргстекло Esp32 Длиннопост
22
13
enjoyrobotics
enjoyrobotics
1 год назад
Arduino & Pi

Робот Отто теперь с дистанционным и беспроводным управлением!⁠⁠

Наши основные наборы (Квадропод, Манипулятор, танцующий робот Отто, Сумоист) выполнены на базе платы ENJOY BOARD стандартной версии, которая содержит в своей основе Arduino Nano. В нее также встроен аккумулятор для автономной работы собранного устройства.


Однако Arduino Nano не обеспечена модулями беспроводной связи вроде Wi-Fi или Bluetooth. На помощь приходит наша усовершенствованная версия ENJOY BOARD с контроллером ESP32 в составе.

С ее помощью можно взаимодействовать с роботами без проводов и с помощью дистанционного пульта управления — вашего смартфона (пример работы на прикрепленном видео). Попробуйте и вы! Если у вас уже есть любой набор из вышеперечисленных, то достаточно приобрести новую плату, подключить ее и следовать нашим инструкциям в видеоуроках на YouTube канале.

Показать полностью
[моё] Arduino Робототехника Программирование Esp32 Видео YouTube
2
129
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

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

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

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


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




Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в 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, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Где по итогу:

.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 под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

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

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

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

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


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

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


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

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

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

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

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

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:

Обратите внимание, что 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"

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

Прошиваем 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
11
enjoyrobotics
enjoyrobotics
1 год назад
Arduino & Pi

Учимся простым командам по работе с Bluetooth-интерфейсом⁠⁠

С помощью платы ENJOY BOARD попробуем управлять выводом текстовой информации на символьном LCD дисплее 1602 через приложение на смартфоне.

Подключение, программирование, тесты и отладка — все эти важные этапы разработки электронного устройства подробно объясняются в прикрепленном видео. Программирование выполнено в среде разработки Enjoy Block, скачать ее можно на нашем сайте (https://enjoy-robotics.ru/) (поддерживается на macOS и Windows версий 8.1 и выше). Для Win 7 подойдет MBlock 5 (https://www.mblock.cc/en/download/).

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

Решением является разработанная нами универсальная плата ENJOY BOARD (со встроенными Wi-Fi и Bluetooth), совместимая со всеми популярными наборами: Квадропод, Манипулятор, Умный Дом и другие.

[моё] Arduino Электроника Esp32 Bluetooth Видео YouTube
0
9
enjoyrobotics
enjoyrobotics
1 год назад
Arduino & Pi

Выключатель для света со смартфона своими руками за 5 минут⁠⁠

В данном ролике расскажем замечательной аудитории Пикабу о том, как с помощью разработанной нами универсальной платы ENJOY BOARD (на базе микроконтроллера ESP32) создать простое автономное устройство для управления светом в доме с помощью смартфона.

Программный код можно написать как в Arduino IDE (если вы уже опытный разработчик), так и в среде программирования ENJOY BLOCK (если вы начинающий пользователь), которую мы уже успешно опробовали на тысячах наших учеников в лагере робототехники «Инкубатор изобретателей».

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

#enjoyrobotics

Esp32 Своими руками Умный дом Arduino Электроника Видео YouTube
17
3
Ryzh.G
Ryzh.G
1 год назад
Home Assistant

Esp Home RGB Light⁠⁠

Сподобился тут припаять к esp32 с прошивкой EspHome ёлочную гирлянду RGB. Гирлянда работает, меняет цвета и даже мигает, но хочется большего.
Отсюда вопрос, может кто-нибудь кинуть в меня внятным мануалом по созданию собственных эффектов?
Желательно на русском.

Home Assistant Esp32 Умный дом Текст
13
4
ardublock
ardublock
1 год назад
ArduBlock

ENJOY BOARD ESP 32 - Включение и отключение LED по IP⁠⁠

[моё] Ardublock Arduino Esp32 Видео YouTube
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии