Опять про кнопки
- Войдите на сайт для отправки комментариев
Пытаюсь собрать освещение для дома, планирую использовать esp01 с несколькими расширителями mcp23017, но пока пытаюсь отладить на LoLin'е esp12E. К сожалению, пока слаб в программировании и ищу хороший пример работы с кнопками. В итоге хочу собрать нечто унифицированное и способное к конфигурированию через web, но это будущее, сейчас бы просто сделать нормальный прототип работы с портами и регистрацией событий в MQTT.
Пересмотрел кучу всего но так нормального варианта не нашел, прошу помочь.
Так как кнопок будет много видимо правильно использовать массив данных и реагировать на события кнопок по прерыванию а так-же не использовать delay для если я правильно понял. Все кнопки стандартные на земле, подтяжка есть на аппаратном уровне, но все-же.
Логика следующая:
нажал на кнопку - светюк зажегся и горит, если держим может отработать еще один эвент. Отпустили кнопку светюк продолжает гореть событие в MQTT.
Нажали еще раз на кнопку - светюк погас, держим может отработать еще один эвент. Отпустили событие в MQTT.
Как то кусками получается но понимаю что громоздко, очень криво и можно все сделать красиво. Буду благодарен за помощь.
https://github.com/VAleSh-Soft/shButton/archive/refs/heads/master.zip
Примеры работы - в архиве
https://github.com/VAleSh-Soft/shButton/archive/refs/heads/master.zip
Примеры работы - в архиве
Спасибо, отличные примеры!
Сразу вопрос, почему не используете прерывание для работы с кнопками?
Я нашел тут https://github.com/MoonFox2006/MCP23017_Buttons пример, где автор настаивает на работу через прерывания, моих мозгов пока не хватает для анализа кода, но мне очень понравилось идея формирования очереди. Или это только для работы с mcp?
Нет нужды, вот и не использую. Все и так работает
:) Не могу не согласиться. А правильно я понимаю что максимум одновременно это обработка двух кнопок?
насколько пинов хватит, столько и подключайте
у меня порядка 60 на вход и 60 на выход планируется и тут вопрос, можно как-то унифицировать однотипную операцию или плодить сущности для каждой кнопки?
Если у вас все 120 кнопок будут выполнять одно и то же действие, то, видимо, их и на один пин подключить можно. В противном случае не понимаю, что значит "однотипные операции". Если каждая кнопка выполняет свои уникальные функции, то и расписывать их нужно для каждой из них. А вообще вы, имхо, либо троллите, либо не представляете, что вам нужно. Определитесь сначала
я не троллю и не имею такой привычки.
кнопок 60, эти копки должны просто инвертировать свой выход, что-то типа digitalWrite(4,!digitalRead(4)); и единственная уникальность это номер выхода. Я полагал тупо разделить пины массивом на две части, условно - порт IN [1,2,3,4] OUT[5,6,7,8] где btn 1 управляет out 5, 2-6, 3-7, 4-8. Или что-то подобное. Так как каждая кнопка просто включает или выключает симистор. Т.е. примитивная операция.
Если каждая кнопка управляет своим собственным симистором, то для каждой и нужно расписывать. Чудес не бывает. А уж как вы это все оптимизировать будете - исключительно ваше дело
я не троллю и не имею такой привычки.
кнопок 60, эти копки должны просто инвертировать свой выход,
начнем с того, что для 60 входов и 60 выходов нужно, по первой прикидке - 120 пинов. Вы бы для начала опделились. что это будет за мк.
Ну а во-вторых, всегда вызывает улыбку, когда новичок, не представляющий как работать с одной кнопкой, хочет сразу начать с проекта со 120-тью выходами... Вероятность, что проект не будет реализован - процентов 90... Начните с чего-то более реального.
У меня был опыт программирования, но очень давно, даже боюсь сказать, тогда еще был паскаль. Основные принципы я себе представляю, синтаксис С++ да, тут я слаб но это поправимо.
Использовать буду MCP23017, 16 портов и таких могу использовать 8 штук.
Решение нашел, считаю его идеальным, тем более под мою задачу https://drive.google.com/file/d/1-kQ-3VIGGkldjvquHL-JVwjRo6IiMswi/view. Ощущение что код промышленный. Осталось придумать как не плодить код для каждой кнопки а привязать кодом in к out. Думаю для этого надо привязать порты к переменным и в коде все собирать. Допустим создать таблицу соответствия:
IN - А1, А2, А3 и т.д. OUT А101, А102, А103 и при использовании
(evt->state == Buttons::BTN_PRESSED)
{Serial.println(F("pressed"));
digitalWrite(F+100,!digitalRead(F+100));}
Хотя у MCP pinout (если я правильно разобрался) 1-7 и 21-28 в этом случае достаточно физически разделить ее на две половины и 1-7 оставить на in а 21-28 на out.
Я думаю в правильном направлении?
Допустим создать таблицу соответствия:
IN - А1, А2, А3 и т.д. OUT А101, А102, А103 и при использовании
digitalWrite(F+100,!digitalRead(F+100));}
Хотя у MCP pinout (если я правильно разобрался) 1-7 и 21-28 в этом случае достаточно физически разделить ее на две половины и 1-7 оставить на in а 21-28 на out.
Вполне нормальная идея, но С++ учить придется
Если порты OUT будут однозначно вычисляться из IN - при таком подходе и таблица не нужна, достаточно в цикле пройтись по всем IN да и все.
Потестировал все на вот этом коде https://drive.google.com/file/d/1-kQ-3VIGGkldjvquHL-JVwjRo6IiMswi/view С Wemos'ом работает идеально но понял что mcp23017 к нему прикрутить не могу, знаний катастрофически не хватает. :( Силы совсем покинули, в связи с чем прошу у гуру помощи прикрутить Adafruit_MCP23017 к коду, уж очень понравилась как работает.
Эх. Прикрутил бы. Даже синяя изолента лежит, ждёт своего часа. Вот только МСР нету. Прикручивать нечего.
Изолентой я пробовал - не работает.
Мне бы понять как объявить mcp в коде и вообще есть ли такая возможность в этом коде. А для тестирования можно и TeamViewer использовать.
Опишите что Вам не понятно в коде https://www.bizkit.ru/2019/02/20/12466/ ?
В этом коде все понятно, а вот как мне MCP прописать в коде что я прислал?
Если в том коде всё понятно, то пропишите точно так же. Разницы нет никакой.
Туплю. Я так понимаю что прописать точно также "mcp.pinMode(MCP23017_GPA0, INPUT)", это значит оторвать MCP от класса QueuedButtons и в его прелестях он уже участвовать не будет. Я же пытаюсь mcp каким-то образом к btns.add(D4, LOW); привязать. т.е. чтобы mpc обрабатывался как btns.
Как всё запущено. У ардуины 4 и D4 это одна и та же нога. Как она может одновременно рулить диодом и кнопкой без переключения режима? Кто Вам мешает при инициализации кнопки писать не ногу ардуины, а ссылку на уже инициализированную ногу MCP? Всегда можно залезть в библиотеку и посмотреть, чем она оперирует. Да и на одной библиотеке свет клином не сошёлся. Я, например, никогда не использую библиотек для кнопок. Нет ни одной, которые бы меня полностью устраивали. Авторы в погоне за универсальностью порой накрутят такого, что жалко памяти, да и функционал они понимают по своему. Так что предпочитаю кнопки обрабатывать своей методой. Но если Вам не в моготу требуется именно эта библиотека, то надо, как минимум, посмотреть её ограничения на входные параметры.
Я же пытаюсь mcp каким-то образом к btns.add(D4, LOW); привязать. т.е. чтобы mpc обрабатывался как btns.
не залезая внутрь класса QueuedButtons - никак вы этого не сделаете. Если класс не предназначен для работы через MCP (а скорее всего так и есть) - передавать ему ссылки на пины MCP бессмысленно, работать это не будет.
Если вы хотите использовать именно эту библиотеку - Вам придется залезть внутрь класса QueuedButtons и прописать там свои методы для работы через MCP. На самом деле, если лезть внутрь чужого класса - имеет смысл написать свою библиотеку, как советует nik182.
Не думайте, что это так просто - подключили гирлянду расширителей - и у вас теперь ЕСП с 120 пинами. Ни с одной стандартной библиотекой ардуино эти дополнительные пины работать не будут, во все используемые библиотеки придется внедрять поддержку МСP
не залезая внутрь класса QueuedButtons - никак вы этого не сделаете. Если класс не предназначен для работы через MCP (а скорее всего так и есть) - передавать ему ссылки на пины MCP бессмысленно, работать это не будет.
Если вы хотите использовать именно эту библиотеку - Вам придется залезть внутрь класса QueuedButtons и прописать там свои методы для работы через MCP. На самом деле, если лезть внутрь чужого класса - имеет смысл написать свою библиотеку, как советует nik182.
Не думайте, что это так просто - подключили гирлянду расширителей - и у вас теперь ЕСП с 120 пинами. Ни с одной стандартной библиотекой ардуино эти дополнительные пины работать не будут, во все используемые библиотеки придется внедрять поддержку МСP
Спасибо. К сожалению это именно тот ответ, который я не хотел бы услышать, но понимал что все именно так :( Мои знаний и близко не хватит на такую "модернизацию". Может быть кто-то посоветует что-то готовое для работы с MCP? Стандартные библиотеки не подходят, так как в них используются delay а это беда. Плюс я хотел отловить нажатие и длинное нажатие. Дребезг я конечно могу убрать на уровне оптронов и подтяжки физических кнопок но вот с программным кодом у меня полная беда :(
Скока тебе кнопок надо?
Стандартные библиотеки не подходят, так как в них используются delay а это беда.
Это вовсе не беда само по себе, бедой это становится, когда вы хотите получить время реакции, сопоставимое или меньшее, чем в тех delay.
Плюс я хотел отловить нажатие и длинное нажатие. Дребезг я конечно могу убрать на уровне оптронов и подтяжки физических кнопок но вот с программным кодом у меня полная беда :(
Так что если у вас в опросе delay 20мс "от дребезга", а вам достаточно лампочки переключать с реакцией в 100-200мс от нажатия кнопки - используйте на здоровье.
Я вот не пойму как можно не запутаться в 60ти кнопках oO
Может быть кто-то посоветует что-то готовое для работы с MCP?
посоветую - выкинуть МСР, взять вместо него Мегу и подключить к ней свои кнопки. А уже к Меге подключить ЕСП для работы с сетью и управления по веб
Альтернатива - учиться писать на СИ. В принципе. написать класс кнопки через расширитель - задачка не самая сложная, это доступно если не для "первоклашки", то для чуть продвинутого второгодника - вполне :)
посоветую поюзать титановый велосипед Клапы. Эту библиотеку поправить под MCP должно быть совсем несложно.
Я так и не услышал,
Скока тебе кнопок надо, нещасный?
Я так и не услышал,
Скока тебе кнопок надо, нещасный?
см сообщение #6
Я так и не услышал,
Скока тебе кнопок надо, нещасный?
см сообщение #6
Хренасе. Если найду у себя в загашнике 23017, напишу биб-ку, мне самому рашширитель портов надо. Правда, я к 8574 привык. :) Но у этой GPIO аж 16 штууук.
Не, не нашол, видимо они дорогие были, не заказывал. Зато 8574 целая жменя.
В итоге не хватает ни времени, ни знаний. Кто готов помочь за разумное вознаграждение пишите на dimiprog at inbox.ru
TTP229 16 сенсорных кнопок без дребезга.
TTP229 16 сенсорных кнопок без дребезга.
Замечательно! Но не нужно!
Все кнопки подключить к шине rs485 или CAN, необходимость дополнительных МК компенсируется серьёзным уменьшением количества проводов. 60 кнопок О_О