Робот-балансир
Кому интересно, ссылка на такого робота
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
Кому интересно, ссылка на такого робота
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
Кому интересно, ссылка на такого робота
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
Кому интересно, ссылка на такого робота
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
В последнее время увлекся программированием микроконтроллеров. Ну как программированием – я формулирую задачи, а Chat GPT их реализует. Может и неидеально, но меня устраивает. Пока программы были малеькими (датчик CO2 или термостат бойлера) проблем не было, пока они не стали большими (управление инвертором - статистика, графики, веб-интерфейс и все такое). И тут я заметил, что компиляция проекта может занимать и 10 минут даже. Да, процессор у меня слабенький по нынешним временам (i7 3770), но не настролько-же! В общем выяснилось, что в Arduino IDE есть такой себе Language Server – фоновая программа, которая обеспечивает умные функции редактирования кода (подсветку, автодополнение, подсказки и поиск ошибок «на лету»). И каждый раз после загрузки проекта он какое-то время его анализирует со 100% загрузкой процессора. И если в это время запустить компиляцию - он не останавливается, и начинает бороться с компилятором за ресурсы. Я натравил на него Chat GPT и результатом стал патч, который отключает Language Server (и включает, если нужно).
В общем - вот сам патч (сохраните его под именем Disable-Arduino-LS.ps1):
param([switch]$Restore)
$ErrorActionPreference = 'Stop'
$target = Join-Path $env:LOCALAPPDATA 'Programs\Arduino IDE\resources\app\lib\frontend\bundle.js'
$backup = "$target.before-disable-language-server.bak"
if (Get-Process -Name 'Arduino IDE' -ErrorAction SilentlyContinue) { throw 'Закройте Arduino IDE перед применением или восстановлением патча.' }
if ($Restore) {
if (!(Test-Path -LiteralPath $backup)) { throw "Резервная копия не найдена: $backup" }
Copy-Item -LiteralPath $backup -Destination $target -Force
Write-Host 'Оригинальный bundle.js восстановлен.'
exit
}
if (!(Test-Path -LiteralPath $target)) { throw "Файл не найден: $target" }
$expected = '25c44c3ae3ff0b827fa550fba7427e84c94ef686df2836f46ced9e98a9665f3d'
$actual = (Get-FileHash -LiteralPath $target -Algorithm SHA256).Hash.ToLowerInvariant()
if ($actual -ne $expected) { throw "Версия bundle.js отличается от присланной. Ничего не изменено. SHA256: $actual" }
$enc = [System.Text.Encoding]::UTF8
$contents = [System.IO.File]::ReadAllText($target, $enc)
$old = 'n&&this.startLanguageServer(n,i,t)'
$new = 'n&&void 0/* LS auto-start disabled */'
if ($contents.Split([string[]]@($old),[System.StringSplitOptions]::None).Count -ne 2) { throw 'Не найден единственный ожидаемый фрагмент. Ничего не изменено.' }
if (Test-Path -LiteralPath $backup) { throw "Резервная копия уже существует: $backup. Ничего не изменено." }
Copy-Item -LiteralPath $target -Destination $backup
$contents = $contents.Replace($old,$new)
[System.IO.File]::WriteAllText($target, $contents, (New-Object System.Text.UTF8Encoding($false)))
Write-Host 'Автоматический запуск Arduino Language Server отключён. Резервная копия сохранена.'
Инструкция по применению:
1. Полностью закройте Arduino IDE.
2. Запустите PowerShell в папке с патчем:
powershell -ExecutionPolicy Bypass -File .\Disable-Arduino-LS.ps1
3. Откройте IDE и проект. Проверьте, что не запускаются arduino-language-server.exe, clangd.exe и фоновые cc1plus.exe.
4. Нажмите Verify и убедитесь, что ручная сборка работает.
Откат:
powershell -ExecutionPolicy Bypass -File .\Disable-Arduino-LS.ps1 -Restore
Патч проверяет SHA256 оригинального bundle.js, меняет только один вызов автоматического запуска Language Server. Не модифицирует Arduino CLI и обработчик Verify/Upload. Работоспособность IDE на вашем компьютере ещё не проверена. При обновлении Arduino IDE патч может потребовать пересоздания.
Результат – компиляция проекта теперь происходит за 1 минуту без 100% загрузки процессора.
Кому интересно, ссылка на такого робота
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
Кому интересно, ссылка на такой датчик
p.s.
Сохраняйте страницу в закладки, чтобы не потерять.
Реклама: ООО "АЕР Услуги" ИНН: 7703380158
Привет всем. Осенью времени появилось побольше, опять немного занялся своим любимым хобби, нраица мне ардуины всякие помучить.
Захотелось сделать датчик протечки. Оказалось, что для этого достаточно двух гвоздиков или винтов. Хотя специализированные датчики стоят копейки, захотелось из говна и палок попробовать. Попробовал – получилось. Текст писал сам, помогал ИИ.
Общая идея датчика: вода замыкает контакты, esp32 это ловит и шлёт нам привет.
Итак, нам нужно:
2 винтика
Есп32
Батарейки
Резистор на 10кОм.
В качестве корпуса взял контейнер от еды. Можно и напечатать на 3Д. Но контейнер тоже неплох, он даже плавать если что сможет.
Закрепляем 2 винтика на расстоянии около 5-7 мм между контактами.
Схема подключения простейшая (куда что втыкать)
Винт №1 — соединяем проводом с пином GND (земля). На платах их обычно несколько, можно взять любой, например, тот, что рядом с 5V.
Винт №2 — соединяем проводом с пином GPIO4 (на многих платах он подписан как D4).
Резистор на 10 кОм — одним концом цепляем к пину 3.3V (это питание логики, не путать с 5V!). Вторым концом — к тому же пину GPIO4, куда идет провод от второго винта.
Зачем нужен резистор и как это всё работает
Дело в том, что цифровые пины микроконтроллера очень чувствительные. Если оставить пин «висеть в воздухе» (ни к чему не подключен), он начинает ловить любые помехи — от вай-фая, от проводов, от вашей руки. В итоге он будет хаотично показывать то «вода», то «сухо».
Чтобы этого не было, в электронике используют подтяжку (pull-up). Резистор на 10 кОм ставится между пином и питанием (3.3V). Он как бы «притягивает» пин к плюсу, чтобы в сухом состоянии там была стабильная единица.
Как работает вся связка:
Сухо: Винт №1 сидит на земле (GND). Винт №2 подключен к пину GPIO4, и к нему же через резистор подтянуто питание 3.3V. Цепь между винтами разорвана. Ток через резистор течь не может, поэтому на пине железно держится высокий уровень (HIGH).
Вода: Вода — это не дистиллят, в ней есть соли, так что она отлично проводит ток. Когда вода замыкает два винта, пин GPIO4 соединяется с землей напрямую (через воду). Сопротивление воды во много раз меньше нашего резистора на 10 кОм. Поэтому всё напряжение уходит в землю, а на пине резко падает уровень до низкого (LOW).
ESP32 видит, что пин «просел» до нуля — значит, пришла вода. Отправляем уведомление. Убрали воду — резистор снова вернул пин в единицу — отправили сообщение, что всё высохло.
Собираем, проверяем. Вначале замыкал контакты пальцем, не реагировал. Замкнул болтом – сработало (загорелся синий светодиод на плате). Ура. Затем протестил в тарелке с водой.
Датчик просто так бесполезен, нужна система уведомлений. Есп32 умеет в вай фай, поэтому проблем с этим нет: бот ТГ, Макс, e-mail, sms если есть модуль GSM. Я использовал сервис уведомлений на телефон. Ссылку давать не буду, а то мой прошлый пост удалили посчитав за рекламу :(
Датчик работает нормально. Скетч попозже добавлю куда нить.
DIY поделка — недельный таймер «7 Days» для автоматизации базовых домашних и дачных задач: управления поливом, вентиляцией, освещением или нагревательными приборами.
В этой и последующих статьях я принципиально рассматриваю проекты на базе ATmega328P. Это осознанный выбор в пользу предсказуемости, надёжности и концепции минимальной достаточности. Об этом я писал раннее. Кто пропустил начало - вот вам, и еще, а это бонусом.
Плата на базе ATmega328P (Arduino Nano, Pro Mini, Oledduino);
OLED-дисплей 1.3" на чипе SH1106;
Модуль RTC DS1307;
Одноканальный модуль реле на 5В для комммутации нагрузки;
Две тактовые кнопки.
Для сборки Я буду использовать свое детище, о котором писал раннее. Она монолитна, минимизирует кол-во проводов и придаёт готовый вид поделке. Но вы можете собрать все на макетке или навесным монтажом.
Шина I2C (экран и RTC): Пин SDA → A4, пин SCL → A5
Кнопки: Button 1 → A0, Button 2 → A1
Реле → D13 (по умолчанию)
Распиновка 1:1 совместима с Arduino Nano/Pro mini. Кнопки на плате для отладки и имеют пятачки для вывода на внешние кнопки.
Главный тезис интерфейса — предельный минимализм в органах управления. Для настройки и работы используются всего две кнопки. Естественно, свободные пины контроллера позволяют добавить клавиатуру 3х4 (шутка) или поставить энкодер. Но управление было унаследовано с моей прошлой поделки на Attiny, который относился к категории «настроил и забыл». Этот прибор так же настраивается один раз перед установкой и больше не требует вмешательства, за исключением редких случаев.
Главный экран. [R] символизирует активный выход; [M] нагрузка включена в ручном режиме; [A] автотический по расписанию. Поддерживается отображение часов в формате 12/24H.
Минимализм на корпусе заставил детально продумать логику интерфейса. Для этого было создано интуитивное динамическое меню, где функции кнопок автоматически адаптируются под текущий экран. Это позволило сохранить предельную компактность устройства, не потеряв в функционале.
Button 1 (коротко): Переключает формат отображения времени (12/24H).
Button 1 (долго): вход в настройки часов.
Button 2 (коротко): Принудительно включает или отключает нагрузку вручную (досрочно). Автоматика при этом сохраняется: если реле выключено досрочно, следующее включение произойдет строго по расписанию.
Button 2 (долго): Открывает меню настройки таймеров (до 2 таймеров в сутки на каждый из 7 дней недели).
Button 1 (коротко): Работает как клавиша Tab — циклично перебирает редактируемые поля параметров.
Button 2 (коротко): Изменяет значение выбранного поля.
Долгое нажатие Button 1 cохраняет настройки часов.
Долгое нажатие Button 2 cохраняет настройки таймера.
Автовыход из настроек на Главный экран через 10 секунд бездействия.
Чтобы полностью нивелировать сложность двухкнопочного управления при первичной конфигурации, заложена возможность настройки через UART. Команда ? отправленная в Монитор порта выводит в консоль полный список доступных команд и синтаксис.


Список доступных команд и синтаксис
Таймер полностью независим от внешних факторов т.к. применен RTC модуль. При аварийном отключении электричества часы не сбиваются, а настройки расписания сохраняются в памяти. Как только питание восстановится, устройство вернётся к штатному графику работы.
Готовая прошивка недельного таймера 7 Days находится в свободном доступе. Главная фишка — не нужно скачивать SDK и возиться с поиском и установкой библиотек в Arduino IDE. Все очень просто: выбрал → загрузил → пользуешься.
И вот я подхожу к заключительной части...
Когда проект отлажен и стабильно щёлкает реле по графику, перед мейкером встаёт стандартный выбор:
Вариант А. «Оставить как есть» (Макетка)
Собрать устройство навесным монтажом, уложить платы в первую попавшуюся распределительную коробку, прорезать канцелярским ножом кривое отверстие под OLED-экран и залить всё термоклеем. Прибор будет работать, но останется хрупким прототипом с кучей внутренних проводов, готовых отвалиться от любой встряски.
Вариант Б. «Эстетика монолита» (OLEDDUINO)
В этом случае плата разработки и дисплей представлены ввиде «бутерброд», полностью исключая путаницу проводов. Сверху на лицевую панель корпуса устанавливается безель задекорированный как угодно. Он маскирует швы, скрывает огрехи пропила и превращает DIY-поделку в аккуратный прибор. Философия Oledduino — это одна прошивка — одно практическое устройство без лишней суеты, хаоса проводов и эстетической боли.
Выбор варианта сборки всегда остаётся за вами. Вы можете повторить это устройство навесным монтажом или на макетке на стандартных модулях из Алика. В статье ничего не продаю, не собираю донаты. Всего лишь поделился полезным ресурсом - DIY 7 Days Weekly Timer, где имеется полное описание и функционал устройства.
Для пикабушников: отправьте в терминал pkb2026 для активации таймера.
Всех с пятницей! Всем мира и добра