ESP8266 обработка кнопок с помощью прерываний

  Рет қаралды 6,883

Arduino и прочие питомцы

Arduino и прочие питомцы

Күн бұрын

Пікірлер: 64
@ПавелШиповаленко
@ПавелШиповаленко 6 жыл бұрын
Большое спасибо. Красивый код. Особенно экономия памяти понравилась.
@TEENASPECT
@TEENASPECT 5 жыл бұрын
Спасибо за видео и за код. Использовал в наручных часах. Так удобно стало сделать многостраничное меню с одной кнопкой уххх.
@ilya7zz
@ilya7zz 8 ай бұрын
Большое спасибо за урок и материал!
@burenkoigor1984
@burenkoigor1984 5 жыл бұрын
очень круто! спасибо большое за работу.
@SandBetweenTheTeeth
@SandBetweenTheTeeth 5 жыл бұрын
Алексей, а вы не хотите сделать из этого проекта библиотеку, которую можно подключать стандартным способом?
@masterkit9517
@masterkit9517 2 жыл бұрын
Подскажите как сделать тахометр на ESP8266 12, там косяки какие то с прерываниями, код который отлично идёт на ардуино уно прошивается в ESP12 но ESP12 в ком порт в окне ардуино IDE пишет отчет о ошибках и полные траблы в ком порт летят. Замучал этот ESP8266, именно на строчке attachinterrupt задейсвтовать прерывание ESP начинает тупить. А ардуино уно отлично справляется с этой же строчкой. версия ESP V3 LUA 8266, других нет, не знаю на ESP32 такая же беда с прерываниями и как их вообще настраивать если они не работают никак. Ардуино уно работает Гайверовская прошивка тахометра, и такая же прошивка зашивается в ESP8266 но из за одной там строчки про прерывания ESP не хочет делать прерывание. Это проблема ESP у всех такая? кто нибудь вообще делал тахометр на ESP? дайте рабочий код тахометра, уже сил нет с этим ESP тахометром. Тупит как валенок этот ESP
@alexmorozov73
@alexmorozov73 2 жыл бұрын
Не должно быть никаких проблем с ESP8266 и прерываниями. А у ESP32 вообще есть аппаратный счетчик стробов. Вы бы хотя бы ошибки привели. Хотя правильнее у автора библиотеки спросить, я ни разу не Гайвер. :)
@masterkit9517
@masterkit9517 2 жыл бұрын
@@alexmorozov73 плохая плата из Китая скорее всего, на ESP32 зашилось идеально та же прошивка, а на плату LUA шьется только мигание светодиодом. На LUA плате нет даже привычного ESP12 распаянного, а какая та микросхема квадратная меньше сантиметра и на этом барахле прошивается но не работает, скорее всего на нормальном ESP8266 где на плате распаяна ESP12 которую можно прочитать на корпусе там будет работать сразу. LUA недоделки не подходят даже для прерываний.
@appbox8754
@appbox8754 6 жыл бұрын
Рейтинг зашкаливает, значит очень востребованная тема. Спасибо Алексей, что делитесь знаниями! Вопрос. А в чем сложность реализации даблкликов...?
@alexmorozov73
@alexmorozov73 6 жыл бұрын
Сложности особой нет, просто необходимо сбросить счетчик паузы между нажатиями после окончания времени двойных кликов, а для этого уже нужно прерывание по таймеру. Используя только прерывания от кнопок, придется сначала детектировать простое нажатие, а только потом двойное. И хранить промежуточных данных нужно чуть больше. Добавил под ролик вариант скетча с двойными кликами.
@dmitriibannikovasx
@dmitriibannikovasx 4 жыл бұрын
А что делать, если я не хочу ждать, пока основной цикл дойдет до проверки очереди, а обрабатывать нажатие кнопки сразу же? Тогда мне просто attachInterrupt( ) использовать?
@alexmorozov73
@alexmorozov73 4 жыл бұрын
В прерываниях нельзя использовать длинный код типа общения по сети и т.п., а если светодиод зажечь или подобное - то можно и в самом прерывании код выполнять.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Добрый день, Алексей. А этот пример для ESP32 подойдёт? Спасибо. Присмотрелся к ESP32 для своих часов...
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Без адаптации скорее всего нет. Но там достаточно просто допилить. Как минимум на ESP32 пинов куда больше, а значит битность под хранение номера пина надо увеличивать. Последняя версия подобной библиотеки использовалась в ролике про MQTT баркод сканер, лучше ее брать за основу для изменения вместе с "библиотекой" очереди событий.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 спасибо!
@АндрейМельниченко-ъ2щ
@АндрейМельниченко-ъ2щ 3 жыл бұрын
Алексей, добрый день! В видео Вы говорите, что если использовать для внешних прерываний функции 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
@alexmorozov73 3 жыл бұрын
А чем вас не устраивает общий обработчик прерываний и две ветки действий в нем?
@АндрейМельниченко-ъ2щ
@АндрейМельниченко-ъ2щ 3 жыл бұрын
@@alexmorozov73 не то что не устраивает, а как в нем определять какой вход был источником прерывания. Просто ифами проверять регистр статуса?
@alexmorozov73
@alexmorozov73 3 жыл бұрын
Вы мой код посмотрите. Да, битовая маска по регистру статуса прерывания, если прерывание по изменению. Или прочитать GPI для значения всех пинов в текущий момент.
@АндрейМельниченко-ъ2щ
@АндрейМельниченко-ъ2щ 3 жыл бұрын
@@alexmorozov73 Алексей, а если у меня отслеживается прерывание по фронту (положительному или отрицательному).В регистре статуса прерывания будет установлен бит, соответствующий входу? Тогда значение GPI можно и не читать?
@АндрейМельниченко-ъ2щ
@АндрейМельниченко-ъ2щ 3 жыл бұрын
Алексей спасибо за подсказку, получилось сделать. А такой вопрос. Если мне для разных входов необходимо разное условие срабатывания прерывания. Ну например на одном входе - по спадающему фронту, а на втором - по нарастающему. Используя функции SDK так сделать не получится?
@dmitriibannikovasx
@dmitriibannikovasx 4 жыл бұрын
И ещё такой вопрос, есть ли оригинальная среда разработки для есп? Ведь ардуино иде просто обертывает оригинальные методы своими. Типа как с авр: вместо digitalWrite(13, 1) использовать PORTB |= (1
@alexmorozov73
@alexmorozov73 4 жыл бұрын
Причем здесь оригинальная среда разработки? Также как и с AVR и другими, даташит на МК от создателей поможет напрямую взаимодействовать с железом.
@elyakas78
@elyakas78 4 жыл бұрын
Здравствуйте, подскажите, как сделать так, чтобы нажать кнопку и удерживать, и только в положении удержания этой кнопки нажать другую кнопку, чтобы включить светодиод. то есть мы можем включать светодиод второй кнопкой только в том случае, если нажата первая кнопка. я не прошу код, просто объясните каким образом можно реализовать?
@alexmorozov73
@alexmorozov73 4 жыл бұрын
Заведите битовую маску для кнопок, реагируйте на событие pressed установкой нужного бита, а на события released/click/longclick сбросом соответствующего бита. И тогда при очередном событии нажатия достаточно будет проверить, выставлен ли нужный бит (нажата ли другая кнопка).
@elyakas78
@elyakas78 4 жыл бұрын
@@alexmorozov73 огромное спасибо, я поняла)
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Добрый день! Скажите, пожалуйста, Ваш код под видео подойдёт для ESP32? Спасибо Вам огромное за Ваш труд! Я всё также собираю часы, но уже не на avr так как скорость обновления дисплея tft 240*240 очень маленькая по сравнению с ESP но в среде Arduino IDE. Ещё раз Вам спасибо!
@alexmorozov73
@alexmorozov73 5 жыл бұрын
github.com/MoonFox2006/BtnLed_ESP_Library
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Спасибо! Я правильно понимаю, что по ссылке библиотека может обрабатывать "нажатие", "длинные нажатия" и "короткие нажатия" и всё это по прерыванию? #define ONE_LED - если закоментировать, то четыре кн. и четыре светодиода? Пример не проверял ещё, на работе, он может обрабатывать только кнопки? Извините, что не попробовал Вашу ссылку, а уже с вопросами... Спасибо!
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Класс Button для одной кнопки, класс Buttons для нескольких (до 10, хоть все пины свободные, кроме GPIO16). Обрабатываются простые, двойные и долгие (более секунды) нажатия.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Спасибо большое! Попробую..."прикрутить".
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
​@@alexmorozov73, извините, а отпускание кн. фиксируются?
@МаркПоликанин
@МаркПоликанин 2 жыл бұрын
Здравствуйте. При использовании SDK внешнее прерывание периодически самопроизвольно вызывается(без нажатия кнопки). Не подскажите в чем причина.
@alexmorozov73
@alexmorozov73 2 жыл бұрын
Что значит "при использовании SDK"? INTR_EXCLUSIVE закоментирован или нет? Кнопки с внешней или внутренней подтяжкой? Используются ли еще библиотеки с прерываниями по изменению пинов (IRremote и т.п.)?
@МаркПоликанин
@МаркПоликанин 2 жыл бұрын
@@alexmorozov73 Ну, собственно говоря, мой вопрос конечно не по теме, т.к. программу написал на СИ, использовал ESP8266_NONOS_SDK-2.2.1, пин подтянул програмно. Просто столкнулся вот с такой проблемой и ничего кроме, как фильтровать нажатие кнопки в отдельной функции, запускаемой прерыванием с задержкой вне прерывания не придумал. Стал просматривать просторы интернета и нарвался в этом видео на комментарий, что "...у SDK родного есть недостаток: если др. библиотеки используют прерывание...", вот и решил поинтересоваться.
@alexmorozov73
@alexmorozov73 2 жыл бұрын
Я говорил не о недостатках SDK, а о том, что народ подключает кучу библиотек без понимания, что они могут конфликтовать друг с другом или с кодом основной программы, т.к. могут эксклюзивно использовать одни и те же прерывания и т.п. В случае же с ESP8266 народ жалуется на фантомные нажатия кнопок, обычно связанные с просадкой по питанию. Так что для надежности используйте внешнюю подтяжку кнопок резисторами, качественное питание и короткие провода до самих кнопок.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Добрый день! С праздником Вас! У меня вопрос: подойдет ли данная библиотека на Arduino IDE, использую мк Atmega1284p и настройку внешних прерываний int0, int1 и int2 через регистры? Хочу сделать настройку часов с длинным нажатием и нажатием с комбинацией кнопок для быстрого перехода в другие настройки. А судя из видео очень хорошо организована компактность и процедура обработки кнопок. Спасибо Вам за ваш труд!
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Добрый день! Спасибо, и Вас с праздником! Под видео о прерывании от любого пина на AVR168/328 (kzbin.info/www/bejne/gn7PnZ2Bos-XaNU ) есть скетч обработки кнопок для AVR, берите его за основу. Но только надо смотреть отличия для 1284 по даташиту. Скорее всего для первых пары десятков GPIO должно работать без переделки.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 Спасибо. Несколько минут назад смотрел данное видео (прерывание от любого пина), Вы как всегда на высоте! А под этим видео библиотека не подойдет? P.S. уж очень понравилась.
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Это полный аналог, только класс с очередью сообщений называется QueuedButtons. На AVR функционалов нет, поэтому лямбда-функции не получится использовать, так что как есть библиотека с ESP непереносима на AVR.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 Спасибо!
@TheForeach
@TheForeach 4 жыл бұрын
Здравствуйте Алексей, возможно ли в ваших библиотеках добавить определение состояния кнопки PRESS сразу же после запуска кода (инициализации) и если нажато, то генерировать это событие как обычно?
@alexmorozov73
@alexmorozov73 4 жыл бұрын
Если чуть поправить метод add и на всякий случай resume, то можно.
@TheForeach
@TheForeach 4 жыл бұрын
@@alexmorozov73 поправил, работает :) Спасибо!
@TheForeach
@TheForeach 4 жыл бұрын
@@alexmorozov73 В библиотеке для MCP23017 все не так просто... Внутри addButton вызываю метод _mcp->_interrupt();
@TheForeach
@TheForeach 4 жыл бұрын
@@alexmorozov73 Оказалось, что если подцепить больше оной кнопки то работает некорректно, есть дубли событий :(
@alexmorozov73
@alexmorozov73 4 жыл бұрын
Может все-таки разобраться как код работает, чем его портить, а потом удивляться, что не работает?
@vals55
@vals55 Жыл бұрын
Идея хорошая, но если для одной кнопки, то очень расточительно по памяти для экономных проектов без клавиатуры. Кстати, проверил - не работает CLICK как ожидалось - задаю задержку 1000 мс, клик срабатывает моментально, даже кнопку еще не отпустил. Неожиданно... Можно исправить? Или пояснить, что не так. Положу в библиотечку, спасибо за труды!
@alexmorozov73
@alexmorozov73 Жыл бұрын
Не знаю, как вы испортили код или как подключили кнопку, но проверил - по крайней мере второй вариант кода работает и на увеличенном времени нажатия кнопки. Кнопка не прижата ли внешним резистором к земле?
@vals55
@vals55 Жыл бұрын
@@alexmorozov73 точно, именно к земле и прижата. Код не менял, длинное нажатие регулируется хорошо - хоть секунда, хоть 5. Код смотрел, все вроде, понятно и логично, но порог короткого клика не реагирует на константы.
@alexmorozov73
@alexmorozov73 Жыл бұрын
Еще раз: в коде примера кнопки используют внутреннюю подтяжку к питанию и замыкаются на землю. Если наоборот, то надо менять параметр в функции добавления кнопки.
@vals55
@vals55 Жыл бұрын
@@alexmorozov73 спасибо
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
Добрый день. Пробую esp8266 вместо Ардуино. Есть ли у Вас код обработки кнопок применим к часам т.е. удерживаешь кнопку и происходит инкремент или декримент значения? Очень хороший код у Вас! Я уже спрашивал Вас, ниже комментарии, о возможности озвучки кнопок у меня получилось используя два таймера на atmega1284p. У меня вопрос по поводу обработки прерываний по таймеру на esp8266? В AVR я использовал генератор кода CVAVR и после корректировки названия вектора прерываний вставлял в Arduino IDE. Подскажите пожалуйста за esp, вектора прерываний и настройка, сколько их, ссылку пожалуйста хотя бы. Хочу собрать наручные часы с дисплеем st7789, а на AVR обновление дисплея тормозит. После просыпания МК обновленный дисплей отображается через 3сек. (вкл. подсветки) Поэтому решил освоить и перенести код на esp. Да я б мог купить наручные часы, но хотелось бы самому своять что-то своё. Спасибо!
@alexmorozov73
@alexmorozov73 5 жыл бұрын
У ESP один таймер, причем прямое управление им сродни самоубийству. Используется софт-таймер, в частности стандартная библиотека Ticker. Но и в ней время меньше 2 мс. ставить нельзя, а то WiFi ляжет. У меня где-то раньше было видео о кнопках для ESP на тикере как раз, код под ним можно изуродовать для ваших целей. Хотя и этот код можно использовать. Никто не мешает после получения события "нажато" и до "отпущено" раз в N мс убавлять/прибавлять значения в основном цикле программы. PS: как и с AVR, основной достоверный источник знаний - это родные даташиты от производителя. Но еще раз говорю, аппаратный таймер ESP8266 лучше не трогать!
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 спасибо Вам огромное!
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 а как же всё таки реализовать озвучку кнопок и виброотклик? Не получится на esp?
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Я не знаю. Но если вам нужны аппаратные таймеры и скорость и не нужен вайфай - то прямая дорога к STM32.
@АлександрБакуревский
@АлександрБакуревский 5 жыл бұрын
@@alexmorozov73 спасибо!
DFRobot RGB LCD screen
12:46
Arduino и прочие питомцы
Рет қаралды 2,1 М.
Опрос кнопок через MCP23017 для ESP8266
17:55
Arduino и прочие питомцы
Рет қаралды 6 М.
coco在求救? #小丑 #天使 #shorts
00:29
好人小丑
Рет қаралды 120 МЛН
Mom Hack for Cooking Solo with a Little One! 🍳👶
00:15
5-Minute Crafts HOUSE
Рет қаралды 23 МЛН
It works #beatbox #tiktok
00:34
BeatboxJCOP
Рет қаралды 41 МЛН
О режимах флеш-памяти ESP8266 и GPIO9 и 10
13:44
Arduino и прочие питомцы
Рет қаралды 8 М.
ESP8266 обновление bootloader'а
32:00
Arduino и прочие питомцы
Рет қаралды 14 М.
AVR 168/328 и прерывания от любого пина
16:43
Arduino и прочие питомцы
Рет қаралды 9 М.
ESP32 [не]быстрый старт
1:23:05
Arduino и прочие питомцы
Рет қаралды 37 М.
Небольшая экономия ОЗУ с помощью шаблонов классов
15:29
Arduino и прочие питомцы
Рет қаралды 2,4 М.