Опять про кнопки

Diminator
Offline
Зарегистрирован: 15.09.2015

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

Пересмотрел кучу всего но так нормального варианта не нашел, прошу помочь.

Так как кнопок будет много видимо правильно использовать массив данных и реагировать на события кнопок по прерыванию а так-же не использовать delay для если я правильно понял. Все кнопки стандартные на земле, подтяжка есть на аппаратном уровне, но все-же.

Логика следующая:
нажал на кнопку - светюк зажегся и горит, если держим может отработать еще один эвент. Отпустили кнопку светюк продолжает гореть событие в MQTT.
Нажали еще раз на кнопку - светюк погас, держим может отработать еще один эвент. Отпустили событие в MQTT.

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

https://github.com/VAleSh-Soft/shButton/archive/refs/heads/master.zip

Примеры работы - в архиве

Diminator
Offline
Зарегистрирован: 15.09.2015

v258 пишет:

https://github.com/VAleSh-Soft/shButton/archive/refs/heads/master.zip

Примеры работы - в архиве

Спасибо, отличные примеры!
Сразу вопрос, почему не используете прерывание для работы с кнопками?

Я нашел тут https://github.com/MoonFox2006/MCP23017_Buttons пример, где автор настаивает на работу через прерывания, моих мозгов пока не хватает для анализа кода, но мне очень понравилось идея формирования очереди. Или это только для работы с mcp?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Нет нужды, вот и не использую. Все и так работает

Diminator
Offline
Зарегистрирован: 15.09.2015

:) Не могу не согласиться. А правильно я понимаю что максимум одновременно это обработка двух кнопок?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

насколько пинов хватит, столько и подключайте

Diminator
Offline
Зарегистрирован: 15.09.2015

у меня порядка 60 на вход и 60 на выход планируется и тут вопрос, можно как-то унифицировать однотипную операцию или плодить сущности для каждой кнопки?

void loop()
{

  switch (but.getButtonState())
  {
  case BTN_ONECLICK:
    // действие по одинарному клику
    Serial.println("onClick");
    break;
  case BTN_DBLCLICK:
    // действие по двойному клику
    Serial.println("onDblClick");
    break;
  }
}

 

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Если у вас все 120 кнопок будут выполнять одно и то же действие, то, видимо, их и на один пин подключить можно. В противном случае не понимаю, что значит "однотипные операции". Если каждая кнопка выполняет свои уникальные функции, то и расписывать их нужно для каждой из них. А вообще вы, имхо, либо троллите, либо не представляете, что вам нужно. Определитесь сначала

Diminator
Offline
Зарегистрирован: 15.09.2015

я не троллю и не имею такой привычки.

кнопок 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. Или что-то подобное. Так как каждая кнопка просто включает или выключает симистор. Т.е. примитивная операция.  

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Если каждая кнопка управляет своим собственным симистором, то для каждой и нужно расписывать. Чудес не бывает. А уж как вы это все оптимизировать будете - исключительно ваше дело

b707
Offline
Зарегистрирован: 26.05.2017

Diminator пишет:

я не троллю и не имею такой привычки.

кнопок 60, эти копки должны просто инвертировать свой выход,

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

Ну а во-вторых, всегда вызывает улыбку, когда новичок, не представляющий как работать с одной кнопкой, хочет сразу начать с проекта со 120-тью выходами... Вероятность, что проект не будет реализован - процентов 90... Начните с чего-то более реального.

Diminator
Offline
Зарегистрирован: 15.09.2015

У меня был опыт программирования, но очень давно, даже боюсь сказать, тогда еще был паскаль. Основные принципы я себе представляю, синтаксис С++ да, тут я слаб но это поправимо.
Использовать буду 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. 

Я думаю в правильном направлении?

b707
Offline
Зарегистрирован: 26.05.2017

Diminator пишет:

Допустим создать таблицу соответствия:

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 да и все.

Diminator
Offline
Зарегистрирован: 15.09.2015

Потестировал все на вот этом коде https://drive.google.com/file/d/1-kQ-3VIGGkldjvquHL-JVwjRo6IiMswi/view С Wemos'ом работает идеально но понял что mcp23017 к нему прикрутить не могу, знаний катастрофически не хватает. :( Силы совсем покинули, в связи с чем прошу у гуру помощи прикрутить Adafruit_MCP23017 к коду, уж очень понравилась как работает.

nik182
Offline
Зарегистрирован: 04.05.2015

Эх. Прикрутил бы. Даже синяя изолента лежит, ждёт своего часа. Вот только МСР нету. Прикручивать нечего. 

Diminator
Offline
Зарегистрирован: 15.09.2015

Изолентой я пробовал - не работает.
Мне бы понять как объявить mcp в коде и вообще есть ли такая возможность в этом коде. А для тестирования можно и TeamViewer использовать.

nik182
Offline
Зарегистрирован: 04.05.2015

Опишите что Вам не понятно в коде https://www.bizkit.ru/2019/02/20/12466/ ?

Diminator
Offline
Зарегистрирован: 15.09.2015

В этом коде все понятно, а вот как мне MCP прописать в коде что я прислал? 

QueuedButtons btns;

void setup() {
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
  Serial.println();

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  btns.add(D4, LOW);
 // btns.add(D2, LOW);
 // btns.add(D3, LOW);
 // btns.add(D5, LOW);

 pinMode(4,OUTPUT);// включем порт светика на выход
 digitalWrite(4,HIGH);
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Если в том коде всё понятно, то пропишите точно так же. Разницы нет никакой.

Diminator
Offline
Зарегистрирован: 15.09.2015

Туплю. Я так понимаю что прописать точно также "mcp.pinMode(MCP23017_GPA0, INPUT)", это значит оторвать MCP от класса QueuedButtons и в его прелестях он уже участвовать не будет. Я же пытаюсь mcp каким-то образом к btns.add(D4, LOW); привязать. т.е. чтобы mpc обрабатывался как btns.

nik182
Offline
Зарегистрирован: 04.05.2015

Как всё запущено. У ардуины 4 и D4 это одна и та же нога. Как она может одновременно рулить диодом и кнопкой без переключения режима? Кто Вам мешает при инициализации кнопки писать не ногу ардуины, а ссылку на уже инициализированную ногу MCP? Всегда можно залезть в библиотеку и посмотреть, чем она оперирует. Да и на одной библиотеке свет клином не сошёлся. Я, например, никогда не использую библиотек для кнопок. Нет ни одной, которые бы меня полностью устраивали. Авторы в погоне за универсальностью порой накрутят такого, что жалко памяти, да и функционал они понимают по своему. Так что предпочитаю кнопки обрабатывать своей методой. Но если Вам не в моготу требуется именно эта библиотека, то надо, как минимум, посмотреть её ограничения на входные параметры.

b707
Offline
Зарегистрирован: 26.05.2017

Diminator пишет:

Я же пытаюсь mcp каким-то образом к btns.add(D4, LOW); привязать. т.е. чтобы mpc обрабатывался как btns.

не залезая внутрь класса QueuedButtons - никак вы этого не сделаете. Если класс не предназначен для работы через MCP (а скорее всего так и есть) - передавать ему ссылки на пины MCP бессмысленно, работать это не будет.

Если вы хотите использовать именно эту библиотеку - Вам придется залезть внутрь класса QueuedButtons и прописать там свои методы для работы через MCP.  На самом деле, если лезть внутрь чужого класса - имеет смысл написать свою библиотеку, как советует nik182.

Не думайте, что это так просто - подключили гирлянду расширителей - и у вас теперь ЕСП с 120 пинами. Ни с одной стандартной библиотекой ардуино эти дополнительные пины работать не будут, во все используемые библиотеки придется внедрять поддержку МСP

Diminator
Offline
Зарегистрирован: 15.09.2015

b707 пишет:

не залезая внутрь класса QueuedButtons - никак вы этого не сделаете. Если класс не предназначен для работы через MCP (а скорее всего так и есть) - передавать ему ссылки на пины MCP бессмысленно, работать это не будет.

Если вы хотите использовать именно эту библиотеку - Вам придется залезть внутрь класса QueuedButtons и прописать там свои методы для работы через MCP.  На самом деле, если лезть внутрь чужого класса - имеет смысл написать свою библиотеку, как советует nik182.

Не думайте, что это так просто - подключили гирлянду расширителей - и у вас теперь ЕСП с 120 пинами. Ни с одной стандартной библиотекой ардуино эти дополнительные пины работать не будут, во все используемые библиотеки придется внедрять поддержку МСP

Спасибо. К сожалению это именно тот ответ, который я не хотел бы услышать, но понимал что все именно так :( Мои знаний и близко не хватит на такую "модернизацию". Может быть кто-то посоветует что-то готовое для работы с MCP? Стандартные библиотеки не подходят, так как в них используются delay а это беда. Плюс я хотел отловить нажатие и длинное нажатие. Дребезг я конечно могу убрать на уровне оптронов и подтяжки физических кнопок но вот с программным кодом у меня полная беда :(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Скока тебе кнопок надо? 

Morroc
Offline
Зарегистрирован: 24.10.2016

Diminator пишет:

Стандартные библиотеки не подходят, так как в них используются delay а это беда.

Это вовсе не беда само по себе, бедой это становится, когда вы хотите получить время реакции, сопоставимое или меньшее, чем в тех delay.

Diminator пишет:

Плюс я хотел отловить нажатие и длинное нажатие. Дребезг я конечно могу убрать на уровне оптронов и подтяжки физических кнопок но вот с программным кодом у меня полная беда :(

Так что если у вас в опросе delay 20мс "от дребезга", а вам достаточно лампочки переключать с реакцией в 100-200мс от нажатия кнопки - используйте на здоровье.

Я вот не пойму как можно не запутаться в 60ти кнопках oO

b707
Offline
Зарегистрирован: 26.05.2017

Diminator пишет:

Может быть кто-то посоветует что-то готовое для работы с MCP?

посоветую - выкинуть МСР, взять вместо него Мегу и подключить к ней свои кнопки. А уже к Меге подключить ЕСП для работы с сетью и управления по веб

Альтернатива - учиться писать на СИ. В принципе. написать класс кнопки через расширитель - задачка не самая сложная, это доступно если не для "первоклашки", то для чуть продвинутого второгодника  - вполне :)

MaksVV
Offline
Зарегистрирован: 06.08.2015

посоветую поюзать титановый велосипед Клапы. Эту библиотеку поправить под MCP должно быть совсем несложно. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я так и не услышал, 

DetSimen пишет:

Скока тебе кнопок надо, нещасный? 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Я так и не услышал, 

DetSimen пишет:

Скока тебе кнопок надо, нещасный? 

см сообщение  #6

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

DetSimen пишет:

Я так и не услышал, 

DetSimen пишет:

Скока тебе кнопок надо, нещасный? 

см сообщение  #6

Хренасе.  Если найду у себя в загашнике 23017, напишу биб-ку, мне самому рашширитель портов надо.  Правда, я к 8574 привык. :)  Но у этой GPIO аж 16 штууук. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не, не нашол, видимо они дорогие были, не заказывал. Зато 8574 целая жменя. 

Diminator
Offline
Зарегистрирован: 15.09.2015

В итоге не хватает ни времени, ни знаний. Кто готов помочь за разумное вознаграждение пишите на dimiprog at inbox.ru

SLKH
Offline
Зарегистрирован: 17.08.2015

TTP229 16 сенсорных кнопок без дребезга.

Diminator
Offline
Зарегистрирован: 15.09.2015

SLKH пишет:

TTP229 16 сенсорных кнопок без дребезга.

Замечательно! Но не нужно!

MaksVV
Offline
Зарегистрирован: 06.08.2015

Все кнопки подключить к шине rs485 или CAN, необходимость дополнительных МК компенсируется серьёзным уменьшением количества проводов. 60 кнопок О_О