ESP8266 обработка кнопок с помощью прерываний
ฝัง
- เผยแพร่เมื่อ 29 ส.ค. 2024
- Скетч для PlatformIO с демонстрацией обработки кнопок с использованием прерываний. Поддерживаются короткие и длинные одновременные нажатия.
Ссылка на код: drive.google.c...
Вариант скетча, определяющий двойные нажатия: drive.google.c...
Большое спасибо. Красивый код. Особенно экономия памяти понравилась.
Спасибо за видео и за код. Использовал в наручных часах. Так удобно стало сделать многостраничное меню с одной кнопкой уххх.
Большое спасибо за урок и материал!
очень круто! спасибо большое за работу.
Алексей, а вы не хотите сделать из этого проекта библиотеку, которую можно подключать стандартным способом?
Рейтинг зашкаливает, значит очень востребованная тема. Спасибо Алексей, что делитесь знаниями! Вопрос. А в чем сложность реализации даблкликов...?
Сложности особой нет, просто необходимо сбросить счетчик паузы между нажатиями после окончания времени двойных кликов, а для этого уже нужно прерывание по таймеру.
Используя только прерывания от кнопок, придется сначала детектировать простое нажатие, а только потом двойное. И хранить промежуточных данных нужно чуть больше. Добавил под ролик вариант скетча с двойными кликами.
А что делать, если я не хочу ждать, пока основной цикл дойдет до проверки очереди, а обрабатывать нажатие кнопки сразу же? Тогда мне просто attachInterrupt( ) использовать?
В прерываниях нельзя использовать длинный код типа общения по сети и т.п., а если светодиод зажечь или подобное - то можно и в самом прерывании код выполнять.
Подскажите как сделать тахометр на ESP8266 12, там косяки какие то с прерываниями, код который отлично идёт на ардуино уно прошивается в ESP12 но ESP12 в ком порт в окне ардуино IDE пишет отчет о ошибках и полные траблы в ком порт летят. Замучал этот ESP8266, именно на строчке attachinterrupt задейсвтовать прерывание ESP начинает тупить. А ардуино уно отлично справляется с этой же строчкой. версия ESP V3 LUA 8266, других нет, не знаю на ESP32 такая же беда с прерываниями и как их вообще настраивать если они не работают никак. Ардуино уно работает Гайверовская прошивка тахометра, и такая же прошивка зашивается в ESP8266 но из за одной там строчки про прерывания ESP не хочет делать прерывание. Это проблема ESP у всех такая? кто нибудь вообще делал тахометр на ESP? дайте рабочий код тахометра, уже сил нет с этим ESP тахометром. Тупит как валенок этот ESP
Не должно быть никаких проблем с ESP8266 и прерываниями. А у ESP32 вообще есть аппаратный счетчик стробов.
Вы бы хотя бы ошибки привели. Хотя правильнее у автора библиотеки спросить, я ни разу не Гайвер. :)
@@alexmorozov73 плохая плата из Китая скорее всего, на ESP32 зашилось идеально та же прошивка, а на плату LUA шьется только мигание светодиодом. На LUA плате нет даже привычного ESP12 распаянного, а какая та микросхема квадратная меньше сантиметра и на этом барахле прошивается но не работает, скорее всего на нормальном ESP8266 где на плате распаяна ESP12 которую можно прочитать на корпусе там будет работать сразу. LUA недоделки не подходят даже для прерываний.
Добрый день, Алексей. А этот пример для ESP32 подойдёт? Спасибо.
Присмотрелся к ESP32 для своих часов...
Без адаптации скорее всего нет. Но там достаточно просто допилить. Как минимум на ESP32 пинов куда больше, а значит битность под хранение номера пина надо увеличивать.
Последняя версия подобной библиотеки использовалась в ролике про MQTT баркод сканер, лучше ее брать за основу для изменения вместе с "библиотекой" очереди событий.
@@alexmorozov73 спасибо!
Добрый день! Скажите, пожалуйста, Ваш код под видео подойдёт для ESP32?
Спасибо Вам огромное за Ваш труд!
Я всё также собираю часы, но уже не на avr так как скорость обновления дисплея tft 240*240 очень маленькая по сравнению с ESP но в среде Arduino IDE.
Ещё раз Вам спасибо!
github.com/MoonFox2006/BtnLed_ESP_Library
Спасибо! Я правильно понимаю, что по ссылке библиотека может обрабатывать "нажатие", "длинные нажатия" и "короткие нажатия" и всё это по прерыванию?
#define ONE_LED - если закоментировать, то четыре кн. и четыре светодиода?
Пример не проверял ещё, на работе, он может обрабатывать только кнопки? Извините, что не попробовал Вашу ссылку, а уже с вопросами... Спасибо!
Класс Button для одной кнопки, класс Buttons для нескольких (до 10, хоть все пины свободные, кроме GPIO16).
Обрабатываются простые, двойные и долгие (более секунды) нажатия.
Спасибо большое! Попробую..."прикрутить".
@@alexmorozov73, извините, а отпускание кн. фиксируются?
И ещё такой вопрос, есть ли оригинальная среда разработки для есп? Ведь ардуино иде просто обертывает оригинальные методы своими. Типа как с авр: вместо digitalWrite(13, 1) использовать PORTB |= (1
Причем здесь оригинальная среда разработки?
Также как и с AVR и другими, даташит на МК от создателей поможет напрямую взаимодействовать с железом.
Добрый день! С праздником Вас!
У меня вопрос: подойдет ли данная библиотека на Arduino IDE, использую мк Atmega1284p и настройку внешних прерываний int0, int1 и int2 через регистры?
Хочу сделать настройку часов с длинным нажатием и нажатием с комбинацией кнопок для быстрого перехода в другие настройки.
А судя из видео очень хорошо организована компактность и процедура обработки кнопок.
Спасибо Вам за ваш труд!
Добрый день! Спасибо, и Вас с праздником!
Под видео о прерывании от любого пина на AVR168/328 (th-cam.com/video/LMlljKmjd2s/w-d-xo.html ) есть скетч обработки кнопок для AVR, берите его за основу. Но только надо смотреть отличия для 1284 по даташиту. Скорее всего для первых пары десятков GPIO должно работать без переделки.
@@alexmorozov73
Спасибо. Несколько минут назад смотрел данное видео (прерывание от любого пина), Вы как всегда на высоте!
А под этим видео библиотека не подойдет?
P.S. уж очень понравилась.
Это полный аналог, только класс с очередью сообщений называется QueuedButtons.
На AVR функционалов нет, поэтому лямбда-функции не получится использовать, так что как есть библиотека с ESP непереносима на AVR.
@@alexmorozov73 Спасибо!
Здравствуйте, подскажите, как сделать так, чтобы нажать кнопку и удерживать, и только в положении удержания этой кнопки нажать другую кнопку, чтобы включить светодиод. то есть мы можем включать светодиод второй кнопкой только в том случае, если нажата первая кнопка. я не прошу код, просто объясните каким образом можно реализовать?
Заведите битовую маску для кнопок, реагируйте на событие pressed установкой нужного бита, а на события released/click/longclick сбросом соответствующего бита. И тогда при очередном событии нажатия достаточно будет проверить, выставлен ли нужный бит (нажата ли другая кнопка).
@@alexmorozov73 огромное спасибо, я поняла)
Алексей, добрый день! В видео Вы говорите, что если использовать для внешних прерываний функции SDK, то будет конфликт с другими библиотеками, использующими прерывания. А такой вопрос, мне необходимо реализовать прерывания по двум разным входам ESP. Я использую в среде Ардуино функцию SDK - ets_isr_attach(ETS_GPIO_INUM, GPIOs_intr_handler, NULL); и ets_isr_attach(ETS_GPIO_INUM, SENSORs_intr_handler, NULL); . И получается, что вызывается только последний обработчик. В данном случае SENSORs_intr_handler(), а ранее объявленный не работает GPIOs_intr_handler(). При этом если изменить порядок объявления обработчиков прерываний, то начинает работать другое.
А чем вас не устраивает общий обработчик прерываний и две ветки действий в нем?
@@alexmorozov73 не то что не устраивает, а как в нем определять какой вход был источником прерывания. Просто ифами проверять регистр статуса?
Вы мой код посмотрите. Да, битовая маска по регистру статуса прерывания, если прерывание по изменению. Или прочитать GPI для значения всех пинов в текущий момент.
@@alexmorozov73 Алексей, а если у меня отслеживается прерывание по фронту (положительному или отрицательному).В регистре статуса прерывания будет установлен бит, соответствующий входу? Тогда значение GPI можно и не читать?
Алексей спасибо за подсказку, получилось сделать.
А такой вопрос. Если мне для разных входов необходимо разное условие срабатывания прерывания. Ну например на одном входе - по спадающему фронту, а на втором - по нарастающему. Используя функции SDK так сделать не получится?
Здравствуйте Алексей, возможно ли в ваших библиотеках добавить определение состояния кнопки PRESS сразу же после запуска кода (инициализации) и если нажато, то генерировать это событие как обычно?
Если чуть поправить метод add и на всякий случай resume, то можно.
@@alexmorozov73 поправил, работает :) Спасибо!
@@alexmorozov73 В библиотеке для MCP23017 все не так просто... Внутри addButton вызываю метод _mcp->_interrupt();
@@alexmorozov73 Оказалось, что если подцепить больше оной кнопки то работает некорректно, есть дубли событий :(
Может все-таки разобраться как код работает, чем его портить, а потом удивляться, что не работает?
Здравствуйте. При использовании SDK внешнее прерывание периодически самопроизвольно вызывается(без нажатия кнопки). Не подскажите в чем причина.
Что значит "при использовании SDK"?
INTR_EXCLUSIVE закоментирован или нет?
Кнопки с внешней или внутренней подтяжкой?
Используются ли еще библиотеки с прерываниями по изменению пинов (IRremote и т.п.)?
@@alexmorozov73 Ну, собственно говоря, мой вопрос конечно не по теме, т.к. программу написал на СИ, использовал ESP8266_NONOS_SDK-2.2.1, пин подтянул програмно. Просто столкнулся вот с такой проблемой и ничего кроме, как фильтровать нажатие кнопки в отдельной функции, запускаемой прерыванием с задержкой вне прерывания не придумал. Стал просматривать просторы интернета и нарвался в этом видео на комментарий, что "...у SDK родного есть недостаток: если др. библиотеки используют прерывание...", вот и решил поинтересоваться.
Я говорил не о недостатках SDK, а о том, что народ подключает кучу библиотек без понимания, что они могут конфликтовать друг с другом или с кодом основной программы, т.к. могут эксклюзивно использовать одни и те же прерывания и т.п.
В случае же с ESP8266 народ жалуется на фантомные нажатия кнопок, обычно связанные с просадкой по питанию. Так что для надежности используйте внешнюю подтяжку кнопок резисторами, качественное питание и короткие провода до самих кнопок.
Идея хорошая, но если для одной кнопки, то очень расточительно по памяти для экономных проектов без клавиатуры.
Кстати, проверил - не работает CLICK как ожидалось - задаю задержку 1000 мс, клик срабатывает моментально, даже кнопку еще не отпустил. Неожиданно... Можно исправить? Или пояснить, что не так.
Положу в библиотечку, спасибо за труды!
Не знаю, как вы испортили код или как подключили кнопку, но проверил - по крайней мере второй вариант кода работает и на увеличенном времени нажатия кнопки. Кнопка не прижата ли внешним резистором к земле?
@@alexmorozov73 точно, именно к земле и прижата. Код не менял, длинное нажатие регулируется хорошо - хоть секунда, хоть 5. Код смотрел, все вроде, понятно и логично, но порог короткого клика не реагирует на константы.
Еще раз: в коде примера кнопки используют внутреннюю подтяжку к питанию и замыкаются на землю. Если наоборот, то надо менять параметр в функции добавления кнопки.
@@alexmorozov73 спасибо
Добрый день. Пробую esp8266 вместо Ардуино. Есть ли у Вас код обработки кнопок применим к часам т.е. удерживаешь кнопку и происходит инкремент или декримент значения? Очень хороший код у Вас!
Я уже спрашивал Вас, ниже комментарии, о возможности озвучки кнопок у меня получилось используя два таймера на atmega1284p. У меня вопрос по поводу обработки прерываний по таймеру на esp8266? В AVR я использовал генератор кода CVAVR и после корректировки названия вектора прерываний вставлял в Arduino IDE.
Подскажите пожалуйста за esp, вектора прерываний и настройка, сколько их, ссылку пожалуйста хотя бы.
Хочу собрать наручные часы с дисплеем st7789, а на AVR обновление дисплея тормозит. После просыпания МК обновленный дисплей отображается через 3сек. (вкл. подсветки)
Поэтому решил освоить и перенести код на esp.
Да я б мог купить наручные часы, но хотелось бы самому своять что-то своё.
Спасибо!
У ESP один таймер, причем прямое управление им сродни самоубийству. Используется софт-таймер, в частности стандартная библиотека Ticker. Но и в ней время меньше 2 мс. ставить нельзя, а то WiFi ляжет. У меня где-то раньше было видео о кнопках для ESP на тикере как раз, код под ним можно изуродовать для ваших целей.
Хотя и этот код можно использовать. Никто не мешает после получения события "нажато" и до "отпущено" раз в N мс убавлять/прибавлять значения в основном цикле программы.
PS: как и с AVR, основной достоверный источник знаний - это родные даташиты от производителя. Но еще раз говорю, аппаратный таймер ESP8266 лучше не трогать!
@@alexmorozov73 спасибо Вам огромное!
@@alexmorozov73 а как же всё таки реализовать озвучку кнопок и виброотклик? Не получится на esp?
Я не знаю. Но если вам нужны аппаратные таймеры и скорость и не нужен вайфай - то прямая дорога к STM32.
@@alexmorozov73 спасибо!