Большое спасибо. Красивый код. Особенно экономия памяти понравилась.
@TEENASPECT5 жыл бұрын
Спасибо за видео и за код. Использовал в наручных часах. Так удобно стало сделать многостраничное меню с одной кнопкой уххх.
@ilya7zz8 ай бұрын
Большое спасибо за урок и материал!
@burenkoigor19845 жыл бұрын
очень круто! спасибо большое за работу.
@SandBetweenTheTeeth5 жыл бұрын
Алексей, а вы не хотите сделать из этого проекта библиотеку, которую можно подключать стандартным способом?
@masterkit95172 жыл бұрын
Подскажите как сделать тахометр на ESP8266 12, там косяки какие то с прерываниями, код который отлично идёт на ардуино уно прошивается в ESP12 но ESP12 в ком порт в окне ардуино IDE пишет отчет о ошибках и полные траблы в ком порт летят. Замучал этот ESP8266, именно на строчке attachinterrupt задейсвтовать прерывание ESP начинает тупить. А ардуино уно отлично справляется с этой же строчкой. версия ESP V3 LUA 8266, других нет, не знаю на ESP32 такая же беда с прерываниями и как их вообще настраивать если они не работают никак. Ардуино уно работает Гайверовская прошивка тахометра, и такая же прошивка зашивается в ESP8266 но из за одной там строчки про прерывания ESP не хочет делать прерывание. Это проблема ESP у всех такая? кто нибудь вообще делал тахометр на ESP? дайте рабочий код тахометра, уже сил нет с этим ESP тахометром. Тупит как валенок этот ESP
@alexmorozov732 жыл бұрын
Не должно быть никаких проблем с ESP8266 и прерываниями. А у ESP32 вообще есть аппаратный счетчик стробов. Вы бы хотя бы ошибки привели. Хотя правильнее у автора библиотеки спросить, я ни разу не Гайвер. :)
@masterkit95172 жыл бұрын
@@alexmorozov73 плохая плата из Китая скорее всего, на ESP32 зашилось идеально та же прошивка, а на плату LUA шьется только мигание светодиодом. На LUA плате нет даже привычного ESP12 распаянного, а какая та микросхема квадратная меньше сантиметра и на этом барахле прошивается но не работает, скорее всего на нормальном ESP8266 где на плате распаяна ESP12 которую можно прочитать на корпусе там будет работать сразу. LUA недоделки не подходят даже для прерываний.
@appbox87546 жыл бұрын
Рейтинг зашкаливает, значит очень востребованная тема. Спасибо Алексей, что делитесь знаниями! Вопрос. А в чем сложность реализации даблкликов...?
@alexmorozov736 жыл бұрын
Сложности особой нет, просто необходимо сбросить счетчик паузы между нажатиями после окончания времени двойных кликов, а для этого уже нужно прерывание по таймеру. Используя только прерывания от кнопок, придется сначала детектировать простое нажатие, а только потом двойное. И хранить промежуточных данных нужно чуть больше. Добавил под ролик вариант скетча с двойными кликами.
@dmitriibannikovasx4 жыл бұрын
А что делать, если я не хочу ждать, пока основной цикл дойдет до проверки очереди, а обрабатывать нажатие кнопки сразу же? Тогда мне просто attachInterrupt( ) использовать?
@alexmorozov734 жыл бұрын
В прерываниях нельзя использовать длинный код типа общения по сети и т.п., а если светодиод зажечь или подобное - то можно и в самом прерывании код выполнять.
@АлександрБакуревский5 жыл бұрын
Добрый день, Алексей. А этот пример для ESP32 подойдёт? Спасибо. Присмотрелся к ESP32 для своих часов...
@alexmorozov735 жыл бұрын
Без адаптации скорее всего нет. Но там достаточно просто допилить. Как минимум на ESP32 пинов куда больше, а значит битность под хранение номера пина надо увеличивать. Последняя версия подобной библиотеки использовалась в ролике про MQTT баркод сканер, лучше ее брать за основу для изменения вместе с "библиотекой" очереди событий.
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73 спасибо!
@АндрейМельниченко-ъ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(). При этом если изменить порядок объявления обработчиков прерываний, то начинает работать другое.
@alexmorozov733 жыл бұрын
А чем вас не устраивает общий обработчик прерываний и две ветки действий в нем?
@АндрейМельниченко-ъ2щ3 жыл бұрын
@@alexmorozov73 не то что не устраивает, а как в нем определять какой вход был источником прерывания. Просто ифами проверять регистр статуса?
@alexmorozov733 жыл бұрын
Вы мой код посмотрите. Да, битовая маска по регистру статуса прерывания, если прерывание по изменению. Или прочитать GPI для значения всех пинов в текущий момент.
@АндрейМельниченко-ъ2щ3 жыл бұрын
@@alexmorozov73 Алексей, а если у меня отслеживается прерывание по фронту (положительному или отрицательному).В регистре статуса прерывания будет установлен бит, соответствующий входу? Тогда значение GPI можно и не читать?
@АндрейМельниченко-ъ2щ3 жыл бұрын
Алексей спасибо за подсказку, получилось сделать. А такой вопрос. Если мне для разных входов необходимо разное условие срабатывания прерывания. Ну например на одном входе - по спадающему фронту, а на втором - по нарастающему. Используя функции SDK так сделать не получится?
@dmitriibannikovasx4 жыл бұрын
И ещё такой вопрос, есть ли оригинальная среда разработки для есп? Ведь ардуино иде просто обертывает оригинальные методы своими. Типа как с авр: вместо digitalWrite(13, 1) использовать PORTB |= (1
@alexmorozov734 жыл бұрын
Причем здесь оригинальная среда разработки? Также как и с AVR и другими, даташит на МК от создателей поможет напрямую взаимодействовать с железом.
@elyakas784 жыл бұрын
Здравствуйте, подскажите, как сделать так, чтобы нажать кнопку и удерживать, и только в положении удержания этой кнопки нажать другую кнопку, чтобы включить светодиод. то есть мы можем включать светодиод второй кнопкой только в том случае, если нажата первая кнопка. я не прошу код, просто объясните каким образом можно реализовать?
@alexmorozov734 жыл бұрын
Заведите битовую маску для кнопок, реагируйте на событие pressed установкой нужного бита, а на события released/click/longclick сбросом соответствующего бита. И тогда при очередном событии нажатия достаточно будет проверить, выставлен ли нужный бит (нажата ли другая кнопка).
@elyakas784 жыл бұрын
@@alexmorozov73 огромное спасибо, я поняла)
@АлександрБакуревский5 жыл бұрын
Добрый день! Скажите, пожалуйста, Ваш код под видео подойдёт для ESP32? Спасибо Вам огромное за Ваш труд! Я всё также собираю часы, но уже не на avr так как скорость обновления дисплея tft 240*240 очень маленькая по сравнению с ESP но в среде Arduino IDE. Ещё раз Вам спасибо!
@alexmorozov735 жыл бұрын
github.com/MoonFox2006/BtnLed_ESP_Library
@АлександрБакуревский5 жыл бұрын
Спасибо! Я правильно понимаю, что по ссылке библиотека может обрабатывать "нажатие", "длинные нажатия" и "короткие нажатия" и всё это по прерыванию? #define ONE_LED - если закоментировать, то четыре кн. и четыре светодиода? Пример не проверял ещё, на работе, он может обрабатывать только кнопки? Извините, что не попробовал Вашу ссылку, а уже с вопросами... Спасибо!
@alexmorozov735 жыл бұрын
Класс Button для одной кнопки, класс Buttons для нескольких (до 10, хоть все пины свободные, кроме GPIO16). Обрабатываются простые, двойные и долгие (более секунды) нажатия.
@АлександрБакуревский5 жыл бұрын
Спасибо большое! Попробую..."прикрутить".
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73, извините, а отпускание кн. фиксируются?
@МаркПоликанин2 жыл бұрын
Здравствуйте. При использовании SDK внешнее прерывание периодически самопроизвольно вызывается(без нажатия кнопки). Не подскажите в чем причина.
@alexmorozov732 жыл бұрын
Что значит "при использовании SDK"? INTR_EXCLUSIVE закоментирован или нет? Кнопки с внешней или внутренней подтяжкой? Используются ли еще библиотеки с прерываниями по изменению пинов (IRremote и т.п.)?
@МаркПоликанин2 жыл бұрын
@@alexmorozov73 Ну, собственно говоря, мой вопрос конечно не по теме, т.к. программу написал на СИ, использовал ESP8266_NONOS_SDK-2.2.1, пин подтянул програмно. Просто столкнулся вот с такой проблемой и ничего кроме, как фильтровать нажатие кнопки в отдельной функции, запускаемой прерыванием с задержкой вне прерывания не придумал. Стал просматривать просторы интернета и нарвался в этом видео на комментарий, что "...у SDK родного есть недостаток: если др. библиотеки используют прерывание...", вот и решил поинтересоваться.
@alexmorozov732 жыл бұрын
Я говорил не о недостатках SDK, а о том, что народ подключает кучу библиотек без понимания, что они могут конфликтовать друг с другом или с кодом основной программы, т.к. могут эксклюзивно использовать одни и те же прерывания и т.п. В случае же с ESP8266 народ жалуется на фантомные нажатия кнопок, обычно связанные с просадкой по питанию. Так что для надежности используйте внешнюю подтяжку кнопок резисторами, качественное питание и короткие провода до самих кнопок.
@АлександрБакуревский5 жыл бұрын
Добрый день! С праздником Вас! У меня вопрос: подойдет ли данная библиотека на Arduino IDE, использую мк Atmega1284p и настройку внешних прерываний int0, int1 и int2 через регистры? Хочу сделать настройку часов с длинным нажатием и нажатием с комбинацией кнопок для быстрого перехода в другие настройки. А судя из видео очень хорошо организована компактность и процедура обработки кнопок. Спасибо Вам за ваш труд!
@alexmorozov735 жыл бұрын
Добрый день! Спасибо, и Вас с праздником! Под видео о прерывании от любого пина на AVR168/328 (kzbin.info/www/bejne/gn7PnZ2Bos-XaNU ) есть скетч обработки кнопок для AVR, берите его за основу. Но только надо смотреть отличия для 1284 по даташиту. Скорее всего для первых пары десятков GPIO должно работать без переделки.
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73 Спасибо. Несколько минут назад смотрел данное видео (прерывание от любого пина), Вы как всегда на высоте! А под этим видео библиотека не подойдет? P.S. уж очень понравилась.
@alexmorozov735 жыл бұрын
Это полный аналог, только класс с очередью сообщений называется QueuedButtons. На AVR функционалов нет, поэтому лямбда-функции не получится использовать, так что как есть библиотека с ESP непереносима на AVR.
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73 Спасибо!
@TheForeach4 жыл бұрын
Здравствуйте Алексей, возможно ли в ваших библиотеках добавить определение состояния кнопки PRESS сразу же после запуска кода (инициализации) и если нажато, то генерировать это событие как обычно?
@alexmorozov734 жыл бұрын
Если чуть поправить метод add и на всякий случай resume, то можно.
@TheForeach4 жыл бұрын
@@alexmorozov73 поправил, работает :) Спасибо!
@TheForeach4 жыл бұрын
@@alexmorozov73 В библиотеке для MCP23017 все не так просто... Внутри addButton вызываю метод _mcp->_interrupt();
@TheForeach4 жыл бұрын
@@alexmorozov73 Оказалось, что если подцепить больше оной кнопки то работает некорректно, есть дубли событий :(
@alexmorozov734 жыл бұрын
Может все-таки разобраться как код работает, чем его портить, а потом удивляться, что не работает?
@vals55 Жыл бұрын
Идея хорошая, но если для одной кнопки, то очень расточительно по памяти для экономных проектов без клавиатуры. Кстати, проверил - не работает CLICK как ожидалось - задаю задержку 1000 мс, клик срабатывает моментально, даже кнопку еще не отпустил. Неожиданно... Можно исправить? Или пояснить, что не так. Положу в библиотечку, спасибо за труды!
@alexmorozov73 Жыл бұрын
Не знаю, как вы испортили код или как подключили кнопку, но проверил - по крайней мере второй вариант кода работает и на увеличенном времени нажатия кнопки. Кнопка не прижата ли внешним резистором к земле?
@vals55 Жыл бұрын
@@alexmorozov73 точно, именно к земле и прижата. Код не менял, длинное нажатие регулируется хорошо - хоть секунда, хоть 5. Код смотрел, все вроде, понятно и логично, но порог короткого клика не реагирует на константы.
@alexmorozov73 Жыл бұрын
Еще раз: в коде примера кнопки используют внутреннюю подтяжку к питанию и замыкаются на землю. Если наоборот, то надо менять параметр в функции добавления кнопки.
@vals55 Жыл бұрын
@@alexmorozov73 спасибо
@АлександрБакуревский5 жыл бұрын
Добрый день. Пробую esp8266 вместо Ардуино. Есть ли у Вас код обработки кнопок применим к часам т.е. удерживаешь кнопку и происходит инкремент или декримент значения? Очень хороший код у Вас! Я уже спрашивал Вас, ниже комментарии, о возможности озвучки кнопок у меня получилось используя два таймера на atmega1284p. У меня вопрос по поводу обработки прерываний по таймеру на esp8266? В AVR я использовал генератор кода CVAVR и после корректировки названия вектора прерываний вставлял в Arduino IDE. Подскажите пожалуйста за esp, вектора прерываний и настройка, сколько их, ссылку пожалуйста хотя бы. Хочу собрать наручные часы с дисплеем st7789, а на AVR обновление дисплея тормозит. После просыпания МК обновленный дисплей отображается через 3сек. (вкл. подсветки) Поэтому решил освоить и перенести код на esp. Да я б мог купить наручные часы, но хотелось бы самому своять что-то своё. Спасибо!
@alexmorozov735 жыл бұрын
У ESP один таймер, причем прямое управление им сродни самоубийству. Используется софт-таймер, в частности стандартная библиотека Ticker. Но и в ней время меньше 2 мс. ставить нельзя, а то WiFi ляжет. У меня где-то раньше было видео о кнопках для ESP на тикере как раз, код под ним можно изуродовать для ваших целей. Хотя и этот код можно использовать. Никто не мешает после получения события "нажато" и до "отпущено" раз в N мс убавлять/прибавлять значения в основном цикле программы. PS: как и с AVR, основной достоверный источник знаний - это родные даташиты от производителя. Но еще раз говорю, аппаратный таймер ESP8266 лучше не трогать!
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73 спасибо Вам огромное!
@АлександрБакуревский5 жыл бұрын
@@alexmorozov73 а как же всё таки реализовать озвучку кнопок и виброотклик? Не получится на esp?
@alexmorozov735 жыл бұрын
Я не знаю. Но если вам нужны аппаратные таймеры и скорость и не нужен вайфай - то прямая дорога к STM32.