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

แชร์
ฝัง
  • เผยแพร่เมื่อ 29 ส.ค. 2024
  • Скетч для PlatformIO с демонстрацией обработки кнопок с использованием прерываний. Поддерживаются короткие и длинные одновременные нажатия.
    Ссылка на код: drive.google.c...
    Вариант скетча, определяющий двойные нажатия: drive.google.c...

ความคิดเห็น • 64

  • @user-ns8do4tp8h
    @user-ns8do4tp8h 5 ปีที่แล้ว +7

    Большое спасибо. Красивый код. Особенно экономия памяти понравилась.

  • @TEENASPECT
    @TEENASPECT 4 ปีที่แล้ว +2

    Спасибо за видео и за код. Использовал в наручных часах. Так удобно стало сделать многостраничное меню с одной кнопкой уххх.

  • @ilya7zz
    @ilya7zz 4 หลายเดือนก่อน

    Большое спасибо за урок и материал!

  • @burenkoigor1984
    @burenkoigor1984 5 ปีที่แล้ว +1

    очень круто! спасибо большое за работу.

  • @SandBetweenTheTeeth
    @SandBetweenTheTeeth 5 ปีที่แล้ว +4

    Алексей, а вы не хотите сделать из этого проекта библиотеку, которую можно подключать стандартным способом?

  • @appbox8754
    @appbox8754 5 ปีที่แล้ว +1

    Рейтинг зашкаливает, значит очень востребованная тема. Спасибо Алексей, что делитесь знаниями! Вопрос. А в чем сложность реализации даблкликов...?

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว

      Сложности особой нет, просто необходимо сбросить счетчик паузы между нажатиями после окончания времени двойных кликов, а для этого уже нужно прерывание по таймеру.
      Используя только прерывания от кнопок, придется сначала детектировать простое нажатие, а только потом двойное. И хранить промежуточных данных нужно чуть больше. Добавил под ролик вариант скетча с двойными кликами.

  • @dmitriibannikovasx
    @dmitriibannikovasx 4 ปีที่แล้ว +1

    А что делать, если я не хочу ждать, пока основной цикл дойдет до проверки очереди, а обрабатывать нажатие кнопки сразу же? Тогда мне просто attachInterrupt( ) использовать?

    • @alexmorozov73
      @alexmorozov73  4 ปีที่แล้ว +2

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

  • @masterkit9517
    @masterkit9517 2 ปีที่แล้ว +1

    Подскажите как сделать тахометр на ESP8266 12, там косяки какие то с прерываниями, код который отлично идёт на ардуино уно прошивается в ESP12 но ESP12 в ком порт в окне ардуино IDE пишет отчет о ошибках и полные траблы в ком порт летят. Замучал этот ESP8266, именно на строчке attachinterrupt задейсвтовать прерывание ESP начинает тупить. А ардуино уно отлично справляется с этой же строчкой. версия ESP V3 LUA 8266, других нет, не знаю на ESP32 такая же беда с прерываниями и как их вообще настраивать если они не работают никак. Ардуино уно работает Гайверовская прошивка тахометра, и такая же прошивка зашивается в ESP8266 но из за одной там строчки про прерывания ESP не хочет делать прерывание. Это проблема ESP у всех такая? кто нибудь вообще делал тахометр на ESP? дайте рабочий код тахометра, уже сил нет с этим ESP тахометром. Тупит как валенок этот ESP

    • @alexmorozov73
      @alexmorozov73  2 ปีที่แล้ว +1

      Не должно быть никаких проблем с ESP8266 и прерываниями. А у ESP32 вообще есть аппаратный счетчик стробов.
      Вы бы хотя бы ошибки привели. Хотя правильнее у автора библиотеки спросить, я ни разу не Гайвер. :)

    • @masterkit9517
      @masterkit9517 2 ปีที่แล้ว +1

      @@alexmorozov73 плохая плата из Китая скорее всего, на ESP32 зашилось идеально та же прошивка, а на плату LUA шьется только мигание светодиодом. На LUA плате нет даже привычного ESP12 распаянного, а какая та микросхема квадратная меньше сантиметра и на этом барахле прошивается но не работает, скорее всего на нормальном ESP8266 где на плате распаяна ESP12 которую можно прочитать на корпусе там будет работать сразу. LUA недоделки не подходят даже для прерываний.

  • @user-rt5mm3ee4k
    @user-rt5mm3ee4k 5 ปีที่แล้ว +1

    Добрый день, Алексей. А этот пример для ESP32 подойдёт? Спасибо.
    Присмотрелся к ESP32 для своих часов...

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว

      Без адаптации скорее всего нет. Но там достаточно просто допилить. Как минимум на ESP32 пинов куда больше, а значит битность под хранение номера пина надо увеличивать.
      Последняя версия подобной библиотеки использовалась в ролике про MQTT баркод сканер, лучше ее брать за основу для изменения вместе с "библиотекой" очереди событий.

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73 спасибо!

  • @user-rt5mm3ee4k
    @user-rt5mm3ee4k 4 ปีที่แล้ว +1

    Добрый день! Скажите, пожалуйста, Ваш код под видео подойдёт для ESP32?
    Спасибо Вам огромное за Ваш труд!
    Я всё также собираю часы, но уже не на avr так как скорость обновления дисплея tft 240*240 очень маленькая по сравнению с ESP но в среде Arduino IDE.
    Ещё раз Вам спасибо!

    • @alexmorozov73
      @alexmorozov73  4 ปีที่แล้ว

      github.com/MoonFox2006/BtnLed_ESP_Library

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 4 ปีที่แล้ว

      Спасибо! Я правильно понимаю, что по ссылке библиотека может обрабатывать "нажатие", "длинные нажатия" и "короткие нажатия" и всё это по прерыванию?
      #define ONE_LED - если закоментировать, то четыре кн. и четыре светодиода?
      Пример не проверял ещё, на работе, он может обрабатывать только кнопки? Извините, что не попробовал Вашу ссылку, а уже с вопросами... Спасибо!

    • @alexmorozov73
      @alexmorozov73  4 ปีที่แล้ว

      Класс Button для одной кнопки, класс Buttons для нескольких (до 10, хоть все пины свободные, кроме GPIO16).
      Обрабатываются простые, двойные и долгие (более секунды) нажатия.

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 4 ปีที่แล้ว

      Спасибо большое! Попробую..."прикрутить".

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 4 ปีที่แล้ว

      ​@@alexmorozov73, извините, а отпускание кн. фиксируются?

  • @dmitriibannikovasx
    @dmitriibannikovasx 4 ปีที่แล้ว

    И ещё такой вопрос, есть ли оригинальная среда разработки для есп? Ведь ардуино иде просто обертывает оригинальные методы своими. Типа как с авр: вместо digitalWrite(13, 1) использовать PORTB |= (1

    • @alexmorozov73
      @alexmorozov73  4 ปีที่แล้ว

      Причем здесь оригинальная среда разработки?
      Также как и с AVR и другими, даташит на МК от создателей поможет напрямую взаимодействовать с железом.

  • @user-rt5mm3ee4k
    @user-rt5mm3ee4k 5 ปีที่แล้ว

    Добрый день! С праздником Вас!
    У меня вопрос: подойдет ли данная библиотека на Arduino IDE, использую мк Atmega1284p и настройку внешних прерываний int0, int1 и int2 через регистры?
    Хочу сделать настройку часов с длинным нажатием и нажатием с комбинацией кнопок для быстрого перехода в другие настройки.
    А судя из видео очень хорошо организована компактность и процедура обработки кнопок.
    Спасибо Вам за ваш труд!

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว

      Добрый день! Спасибо, и Вас с праздником!
      Под видео о прерывании от любого пина на AVR168/328 (th-cam.com/video/LMlljKmjd2s/w-d-xo.html ) есть скетч обработки кнопок для AVR, берите его за основу. Но только надо смотреть отличия для 1284 по даташиту. Скорее всего для первых пары десятков GPIO должно работать без переделки.

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73
      Спасибо. Несколько минут назад смотрел данное видео (прерывание от любого пина), Вы как всегда на высоте!
      А под этим видео библиотека не подойдет?
      P.S. уж очень понравилась.

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว

      Это полный аналог, только класс с очередью сообщений называется QueuedButtons.
      На AVR функционалов нет, поэтому лямбда-функции не получится использовать, так что как есть библиотека с ESP непереносима на AVR.

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73 Спасибо!

  • @elyakas78
    @elyakas78 3 ปีที่แล้ว

    Здравствуйте, подскажите, как сделать так, чтобы нажать кнопку и удерживать, и только в положении удержания этой кнопки нажать другую кнопку, чтобы включить светодиод. то есть мы можем включать светодиод второй кнопкой только в том случае, если нажата первая кнопка. я не прошу код, просто объясните каким образом можно реализовать?

    • @alexmorozov73
      @alexmorozov73  3 ปีที่แล้ว +1

      Заведите битовую маску для кнопок, реагируйте на событие pressed установкой нужного бита, а на события released/click/longclick сбросом соответствующего бита. И тогда при очередном событии нажатия достаточно будет проверить, выставлен ли нужный бит (нажата ли другая кнопка).

    • @elyakas78
      @elyakas78 3 ปีที่แล้ว

      @@alexmorozov73 огромное спасибо, я поняла)

  • @user-wf7bn6ch2l
    @user-wf7bn6ch2l 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 ปีที่แล้ว

      А чем вас не устраивает общий обработчик прерываний и две ветки действий в нем?

    • @user-wf7bn6ch2l
      @user-wf7bn6ch2l 3 ปีที่แล้ว

      @@alexmorozov73 не то что не устраивает, а как в нем определять какой вход был источником прерывания. Просто ифами проверять регистр статуса?

    • @alexmorozov73
      @alexmorozov73  3 ปีที่แล้ว

      Вы мой код посмотрите. Да, битовая маска по регистру статуса прерывания, если прерывание по изменению. Или прочитать GPI для значения всех пинов в текущий момент.

    • @user-wf7bn6ch2l
      @user-wf7bn6ch2l 3 ปีที่แล้ว

      @@alexmorozov73 Алексей, а если у меня отслеживается прерывание по фронту (положительному или отрицательному).В регистре статуса прерывания будет установлен бит, соответствующий входу? Тогда значение GPI можно и не читать?

    • @user-wf7bn6ch2l
      @user-wf7bn6ch2l 3 ปีที่แล้ว

      Алексей спасибо за подсказку, получилось сделать.
      А такой вопрос. Если мне для разных входов необходимо разное условие срабатывания прерывания. Ну например на одном входе - по спадающему фронту, а на втором - по нарастающему. Используя функции SDK так сделать не получится?

  • @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 ปีที่แล้ว

      Может все-таки разобраться как код работает, чем его портить, а потом удивляться, что не работает?

  • @user-dk9hr2op7p
    @user-dk9hr2op7p 2 ปีที่แล้ว

    Здравствуйте. При использовании SDK внешнее прерывание периодически самопроизвольно вызывается(без нажатия кнопки). Не подскажите в чем причина.

    • @alexmorozov73
      @alexmorozov73  2 ปีที่แล้ว

      Что значит "при использовании SDK"?
      INTR_EXCLUSIVE закоментирован или нет?
      Кнопки с внешней или внутренней подтяжкой?
      Используются ли еще библиотеки с прерываниями по изменению пинов (IRremote и т.п.)?

    • @user-dk9hr2op7p
      @user-dk9hr2op7p 2 ปีที่แล้ว

      @@alexmorozov73 Ну, собственно говоря, мой вопрос конечно не по теме, т.к. программу написал на СИ, использовал ESP8266_NONOS_SDK-2.2.1, пин подтянул програмно. Просто столкнулся вот с такой проблемой и ничего кроме, как фильтровать нажатие кнопки в отдельной функции, запускаемой прерыванием с задержкой вне прерывания не придумал. Стал просматривать просторы интернета и нарвался в этом видео на комментарий, что "...у SDK родного есть недостаток: если др. библиотеки используют прерывание...", вот и решил поинтересоваться.

    • @alexmorozov73
      @alexmorozov73  2 ปีที่แล้ว

      Я говорил не о недостатках SDK, а о том, что народ подключает кучу библиотек без понимания, что они могут конфликтовать друг с другом или с кодом основной программы, т.к. могут эксклюзивно использовать одни и те же прерывания и т.п.
      В случае же с ESP8266 народ жалуется на фантомные нажатия кнопок, обычно связанные с просадкой по питанию. Так что для надежности используйте внешнюю подтяжку кнопок резисторами, качественное питание и короткие провода до самих кнопок.

  • @vals55
    @vals55 ปีที่แล้ว

    Идея хорошая, но если для одной кнопки, то очень расточительно по памяти для экономных проектов без клавиатуры.
    Кстати, проверил - не работает CLICK как ожидалось - задаю задержку 1000 мс, клик срабатывает моментально, даже кнопку еще не отпустил. Неожиданно... Можно исправить? Или пояснить, что не так.
    Положу в библиотечку, спасибо за труды!

    • @alexmorozov73
      @alexmorozov73  ปีที่แล้ว

      Не знаю, как вы испортили код или как подключили кнопку, но проверил - по крайней мере второй вариант кода работает и на увеличенном времени нажатия кнопки. Кнопка не прижата ли внешним резистором к земле?

    • @vals55
      @vals55 ปีที่แล้ว

      @@alexmorozov73 точно, именно к земле и прижата. Код не менял, длинное нажатие регулируется хорошо - хоть секунда, хоть 5. Код смотрел, все вроде, понятно и логично, но порог короткого клика не реагирует на константы.

    • @alexmorozov73
      @alexmorozov73  ปีที่แล้ว +1

      Еще раз: в коде примера кнопки используют внутреннюю подтяжку к питанию и замыкаются на землю. Если наоборот, то надо менять параметр в функции добавления кнопки.

    • @vals55
      @vals55 ปีที่แล้ว

      @@alexmorozov73 спасибо

  • @user-rt5mm3ee4k
    @user-rt5mm3ee4k 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 лучше не трогать!

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73 спасибо Вам огромное!

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73 а как же всё таки реализовать озвучку кнопок и виброотклик? Не получится на esp?

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว

      Я не знаю. Но если вам нужны аппаратные таймеры и скорость и не нужен вайфай - то прямая дорога к STM32.

    • @user-rt5mm3ee4k
      @user-rt5mm3ee4k 5 ปีที่แล้ว

      @@alexmorozov73 спасибо!