У вас один из лучших каналов про ARDUINO и все что с ним связанно, самые информативные видео! Спасибо за большую работу! Если возможно, хотелось бы что-то на тему PID регулятора на ESP8266, в вашей манере все тщательно и детально рассказывать.
Крутяк!!!! Блин я ипользую оптопары для развязки, конфигурирую порты B на вход с подтяжкой, питание mcp 5 вольт, приложил мультиметр в режиме изм тока между "GND" и PB0 показывает 31 ма если оптрон pc817 "сработал", не многовато ли? Когда все 8 портов притянуты к земле то ток 248 ма, mcp капец греется но работает, не могу понять что делаю не так? Как вариант запитать от 3.3 вольт "нагрев" упадёт почти в два раза, но это же лечение следствия болезни а не причины?
Так же как с кнопками. Настроить на генерацию прерывания на нужное изменение уровня, а на МК хотя бы просто при входящем прерывании увеличивать счетчик, если нужны импульсы всего с одного пина. Т.е. в этом случае можно даже не считывать сами значения, не упираясь в медленную шину типа I2C. Если же нужно что-то сложнее, то взять другой МК и считать на нем напрямую.
@@alexmorozov73, спасибо за ответ! Тут дело в том, что я планирую использовать её, как отдельный модуль ввода-вывода и совместно с esp32. Во втором случае на esp вешается ещё мс для ethernet, и входов практически не остаётся. Так вот дискретные входы нужно использовать ещё как счётчики импульсов с частотой до 10кГц, при том подключать на вход иногда нужно будет до 10 устройств.
Возьмите лучше Atmega 8/168/328 в зависимости от навыков компактного программирования и сделайте из нее расширитель портов на любом интерфейсе (UART, I2C, SPI или вообще свой) с функцией подсчета импульсов и чего угодно еще. 20/22 цифровые ноги. Это проще и надежнее будет в любом случае, чем использовать то, что предназначено совсем для других целей...
@@alexmorozov73 , Я просто заметил решение на микросхеме MCP23017 для модуля ввода контроллера одного из отечественных производителей (название опустим, дабы не было реклам). Микросхема по сути подключается напрямую к контроллеру (одноплатному пк) по шине i2c. И вот у них заявлен подсчет импульсов на всех 14 входах модуля. Так вот мне и стало интересно, как так реализовано, учитывая, что это решение выходит достаточно незатратным. А по поводу "взять контроллер" - да, уже думал об этом, но появляется немало волокиты с дополнительной перепрошивкой нового контроллера, в случае выхода из строя старого
Ну попробуйте запрограммировать несколько входов расширителя на генерацию прерывания при изменении состояния, а на МК при сигнале от расширителя тут же считывать измененные состояния. Но что-то с трудом верится, что не будет пропусков... Так что ни много каналов, ни хоть сколько-нибудь высокую частоту так едва ли можно получить.
Алексей, добрый день! Спасибо большое за библиотеку! Пытаюсь запустить пример, но вываливается ошибка в порту. Не сталкивалисиь с такой проблемой? Соответственно, в евенты ничего не попадает. Ошибка: E (136) gpio: esp_ipc_call_blocking failed (0x103) Запускаю скетч на ESP-WROOM-32, Arduino IDE 2.1.0, esp 2.0.14
@@alexmorozov73 А не подскажете в какую сторону копать? Вижу, что заданы условия #ifdef ESP8266, но там только указание линий SDA, SCL. Не особый специалист, но в коде не могу найти ничего специфичного для ESP8266. Подозреваю, что прерывания как-то не так работают. Заранее спасибо!
Алекс, добрый вечер. Подскажите. Простой сервер на esp8266 01 постоянно зависает. Раз десять лампочкой мигнешь и все ((( тот же скеч пробовал на nodemcu, результат тот же.
Не понял о каком простом сервере идет речь. С питанием все в порядке (особенно это касается ESP-01)? В любом случае, замена бутлоадера на версию из SDK, которой соответствует среда разработки, не повредит. Если используете последний пакет Arduino для ESP8266 (2.4.2), то он на версии Espressif SDK 2.2 основан, хотя в файле версии указано 2.1. Так что хотя бы бутлоадер из SDK 2.1 заливайте один раз, а потом уже скетчи.
Скеч из arduino ide, WiFiWebServer (esp8266) Использовал различные источники питания. В локальной сети дольше работает. Из внешней быстрее зависает. Как заменю бутлоадер, отпишусь. Спасибо!
Здравствуйте. Если можно подключить 8 таких модулей, которые будут управлять 16и битными мультиплексорами CD74HC4067. Которых можно подключить по 12 штук. То получаем ESP 8266 с 12*16*8 аналоговыми датчиками? О_о
Во-первых, не аналоговые, а цифровые, во-вторых, не датчики, а входы/выходы, в-третьих, А ЗАЧЕМ? И тем более замешивать мультиплексоры с экспандерами в каскад... PS: вопрос "зачем" риторический, не надо на него отвечать, я не психиатр, мне неинтересно.
@@alexmorozov73 Именно аналоговые датчики, если подключить выход всех мультиплексоров к единственному аналоговому пину ESP. Или я чего-то не понимаю? хмм..
Алексей, подскажите, пожалуйста, можно ли теоретически с помощью MCP23017 программно реализовать несколько I2C шин? Например для подключения 6 датчиков с интерфейсом I2C и одинаковым не сменным адресом. С расширителя выходит одна общая SCL линия и с каждого другого пина своя SDA линия к определенному датчику? И если теоретически такое возможно реализовать, то с какими камнями можно столкнуться на практике?
Алекс, здравствуйте. А как бороться с помехами по прерываниям? Защита от дребезга почему то не спасает от помех) Использую только события клик и лонгклик (добавление в очередь остальных, отключил в библиотеке), время кликтайм увеличил до 50мсек. Я настроил порт В на вход кнопок через резисторы 1к с подтяжкой пинов 10к к +, порт А - на выход к реле через оптопару. При резком включении мощной нагрузки, даже в другой комнате (фен, лобзик, перфоратор, болгарка) прерывания живут своей жизнью :)
Вы уверены, что проблема в прерываниях, а не в мусоре на входе ESP8266? Он очень капризный к питанию, у некоторых при включении холодильника Sonoff реле перезагружаются. Так что попробуйте защитить питание ESP и MCP по входу электролитами.
@@alexmorozov73 не уверен, использую 12й порт, осциллографа к сожалению нет. Этот порт у меня тоже подключен к ITB через резистор 1к и параллельно к земле стоит керамический кондер на 330пкф. С питанием все в порядке на 99% с перезагрузками не сталкивался. Используется цепочка китайский народный БП на 12в 6а, от него питается все: лед подсветки, вентиляторы на вытяжку(корпусные от пк), нагрузка в пике 3а, еспшки 3шт. возле каждой стоит dc-dc на микросхеме MP1584EN, на выходе у него уже есть керамический кондер, и я добавил еще электролит 1000мкф. У меня 7 точек освещения которым управляет этот модуль, в качестве кнопок - сенсоры ttp223, запаяна опция A, то есть по умолчанию высокий уровень, реле - кит модули омрон на симисторах. Заметил еще такой эффект, если освещение полностью выключено длительное время(2-3 часа) и прикоснутся к одному из сенсоров, то включается несколько точек рандомно или все сразу.
Не стал бы писать если бы не ваш апломб в конце. Посмотрел на код и ужаснулся. Вам, Алекс, рано в учителя. * очередь не реентерабельна, и поэтому непригодна для использования в isr * зачем в этой задаче динамический список? Разве кнопки в устройстве возникают и пропадают в процессе использования? Нет ведь! Хватило бы и массива аккуратно инкапсулированного. * нам дали nullptr уже лет пять как. * список вызывает realloc на каждый add и remove. Почему не надо так делать я отвечу отдельно если интересно * список весь пестрит memmove и memcopy. И при этом он обобщенный. С типами, где есть нетривиальные копирование, это работать не будет. В С++ это делается не так * Чтобы ваш список заработал с произвольным типом, от него нужно отнаследоваться и переопределить метод очистки. Это грубая ошибка проектирования. Очистка - обязанность деструктора Т. * следствие предыдущего - наследование прикладного класса от обобщенного списка. Это почти всегда плохая идея. Используйте агрегирование. Но для этого нужно исправить список * зачем ваши поля помещены в секцию protected? От класса предполагается наследовать? Откройте для себя private. Продолжать можно ещё долго. Очень похоже, что вы перешли с си, но не потрудились прочесть ни одной толковый книги по с++.
Здравствуйте Алекс. И с Новым Годом! :) Скажите, возможно ли к данной библиотеке прикрутить обработку дабл кликов и параллельное нажатие на две кнопки ?
Почему же невозможно? Двойное нажатие без таймера "красиво" не сделать, но если все равно, что сначала прилетит простое нажатие, а потом двойное - то без проблем. А одновременное нажатие и сейчас можно обработать, если не только на клик реагировать.
здравствуйте Алексей. помогите пожалуйста. с ардуино работаю не давно,вроде хотел решить простую задачу но на деле оказались трудно для новичка. работа связана с кнопкой и шим выходом: при нажатие и удержание кнопки диод плавно загорается до полного розжига,но при отпускании кнопки тухнет в любой момент как при 100% так и при 10%, 30%, 70% ... и т.д.в общем зажал разгорается отпустил потух. перебрал кучу готовых програм и пытался комбинировать , не достаточно видимо ума :) заранее огромное спасибо.
Alex Morozov большое вам спасибо. работает так как я хотел. с моим опытом я ещё долго бы не смог такой скетч написать. не думал,что такая простая задача,требует таких больших познаний. ещё раз спасибо.
Алексей, извините за занудство) подключаю геркон и пытаюсь определить состояние после старта ESP (или ресет), код не работает если геркон замкнут, события больше не поступают, не пойму почему?
Вы так и не поняли, что вешаете свою ESP подключением ноги прерывания на важную для загрузки ESP ногу? D3/D4/D8? Пример из видео на D5 прекрасно перезагружается с нажатой кнопкой. Я под видео добавил код с поддержкой двойного нажатия, но вам в вашем случае это не поможет. Если уж так важно прерывание именно на эти ноги ESP подключить, то попробуйте ресеты соединить у MCP и ESP. Иначе опрашивайте кнопки постоянно в цикле без прерывания.
@@alexmorozov73 Нет, я знаю про ноги. У меня голая ESP8266-12E подключаю I2C на ноги 0 и 2, прерывание на 13. Проверял также на стандартных 4 и 5, прерывание на 14 - аналогично не срабатывает прерывание кнопок если при старте они вкл, но при этом ESP прекрасно себя чувствует, все остальное работает. Еще немного потестил, выяснил, что если в методе addButton после setupInterrupt вызвать _mcp->_interrupt(); все начинает работать в любом случае, но при этом есть ложные события Pessed(после инициализации) на не нажатых кнопках, а так работает как обычно. Я так понимаю, нужно создать новый метод на основе mcpCallback, в нем определять состояние добавленной кнопки, и там уже добавлять событие Pessed в очередь ?
В итоге добавил в метод addButton такой код if( ! level && _mcp->digitalRead(pin) ) {
_items[result].pressed = 0x0FFF;
event_t e; e.kind = BTN_PRESS; e.data = result; e.pin = pin; _events.push(&e); } Работает почти как нужно, но после програмного сброса ESP.reset() опять события приходять не в том порядке, сначала клик потом пресс. Что тут можно еще сделать? сброс модуля MCP23017 программно возможен?
Поздравления очень интересные. У меня есть тот же чип, который я хотел бы использовать в существующем эскизе для управления входными реле и управления реле, размещенными на выходе всегда через STM32. Не могли бы вы помочь мне? , Большое спасибо
@@alexmorozov73 Большое вам спасибо за ответ мне. К сожалению, это мало что понято. У вас случайно есть Telegram, так что вы можете отправить мой file.ino для изменения входа, используя mcp23017 и 16 кнопок для управления моими уже запрограммированными и работающими реле. К сожалению, я не могу сделать ввод, используя mcp23017. Большое спасибо
Переместить все фалы из src и include в один каталог. Переименовать main.cpp в .ino с именем этого каталога. Тогда скетч можно использовать в Arduino IDE.
У вас один из лучших каналов про ARDUINO и все что с ним связанно, самые информативные видео! Спасибо за большую работу! Если возможно, хотелось бы что-то на тему PID регулятора на ESP8266, в вашей манере все тщательно и детально рассказывать.
Не пойму как я пропустил этот видос, очень практично!
Спасибо! Интересно и понятно! Натолкнули на ряд.идей, для реализации в своих проектах! Еще раз, спасибо!
Алексей, здравствуйте... с возвращением, очень ждали... хотя да, предыдущий ролик не для меня (
Крутяк!!!! Блин я ипользую оптопары для развязки, конфигурирую порты B на вход с подтяжкой, питание mcp 5 вольт, приложил мультиметр в режиме изм тока между "GND" и PB0 показывает 31 ма если оптрон pc817 "сработал", не многовато ли? Когда все 8 портов притянуты к земле то ток 248 ма, mcp капец греется но работает, не могу понять что делаю не так? Как вариант запитать от 3.3 вольт "нагрев" упадёт почти в два раза, но это же лечение следствия болезни а не причины?
Здравствуйте, подскажите, как можно реализовать счетчик импульсов на связке MCP23017 и микроконтроллере?
Так же как с кнопками. Настроить на генерацию прерывания на нужное изменение уровня, а на МК хотя бы просто при входящем прерывании увеличивать счетчик, если нужны импульсы всего с одного пина. Т.е. в этом случае можно даже не считывать сами значения, не упираясь в медленную шину типа I2C.
Если же нужно что-то сложнее, то взять другой МК и считать на нем напрямую.
@@alexmorozov73, спасибо за ответ! Тут дело в том, что я планирую использовать её, как отдельный модуль ввода-вывода и совместно с esp32. Во втором случае на esp вешается ещё мс для ethernet, и входов практически не остаётся. Так вот дискретные входы нужно использовать ещё как счётчики импульсов с частотой до 10кГц, при том подключать на вход иногда нужно будет до 10 устройств.
Возьмите лучше Atmega 8/168/328 в зависимости от навыков компактного программирования и сделайте из нее расширитель портов на любом интерфейсе (UART, I2C, SPI или вообще свой) с функцией подсчета импульсов и чего угодно еще. 20/22 цифровые ноги. Это проще и надежнее будет в любом случае, чем использовать то, что предназначено совсем для других целей...
@@alexmorozov73 , Я просто заметил решение на микросхеме MCP23017 для модуля ввода контроллера одного из отечественных производителей (название опустим, дабы не было реклам). Микросхема по сути подключается напрямую к контроллеру (одноплатному пк) по шине i2c. И вот у них заявлен подсчет импульсов на всех 14 входах модуля. Так вот мне и стало интересно, как так реализовано, учитывая, что это решение выходит достаточно незатратным. А по поводу "взять контроллер" - да, уже думал об этом, но появляется немало волокиты с дополнительной перепрошивкой нового контроллера, в случае выхода из строя старого
Ну попробуйте запрограммировать несколько входов расширителя на генерацию прерывания при изменении состояния, а на МК при сигнале от расширителя тут же считывать измененные состояния. Но что-то с трудом верится, что не будет пропусков... Так что ни много каналов, ни хоть сколько-нибудь высокую частоту так едва ли можно получить.
Алексей, добрый день! Спасибо большое за библиотеку!
Пытаюсь запустить пример, но вываливается ошибка в порту. Не сталкивалисиь с такой проблемой?
Соответственно, в евенты ничего не попадает.
Ошибка:
E (136) gpio: esp_ipc_call_blocking failed (0x103)
Запускаю скетч на ESP-WROOM-32, Arduino IDE 2.1.0, esp 2.0.14
Код для ESP32 непригоден без изменений
@@alexmorozov73 А не подскажете в какую сторону копать? Вижу, что заданы условия #ifdef ESP8266, но там только указание линий SDA, SCL. Не особый специалист, но в коде не могу найти ничего специфичного для ESP8266. Подозреваю, что прерывания как-то не так работают. Заранее спасибо!
Ошибка в библиотеке FunctionalInterrupt
Алекс, добрый вечер. Подскажите. Простой сервер на esp8266 01 постоянно зависает. Раз десять лампочкой мигнешь и все ((( тот же скеч пробовал на nodemcu, результат тот же.
Не понял о каком простом сервере идет речь. С питанием все в порядке (особенно это касается ESP-01)?
В любом случае, замена бутлоадера на версию из SDK, которой соответствует среда разработки, не повредит. Если используете последний пакет Arduino для ESP8266 (2.4.2), то он на версии Espressif SDK 2.2 основан, хотя в файле версии указано 2.1. Так что хотя бы бутлоадер из SDK 2.1 заливайте один раз, а потом уже скетчи.
Скеч из arduino ide, WiFiWebServer (esp8266) Использовал различные источники питания. В локальной сети дольше работает. Из внешней быстрее зависает. Как заменю бутлоадер, отпишусь. Спасибо!
@@alexmorozov73 Результат скеча "ESP-bootver" показал, что у меня sdk_version 2.2.1 и boot_version 31. Требуется бутлоадер переписать?
@@muspel810 Можете ничего не делать, если хотите, чтобы ничего не изменилось.
@@alexmorozov73 Огромное спасибо! Получилось все!
Спасибо!
У меня терминал в Platformio убежал в право. Как вернуть его в низ?
Сделайте окно терминала пошире и в верхнем правом углу будет кнопка "Move to bottom".
Здравствуйте. Если можно подключить 8 таких модулей, которые будут управлять 16и битными мультиплексорами CD74HC4067. Которых можно подключить по 12 штук. То получаем ESP 8266 с 12*16*8 аналоговыми датчиками? О_о
Во-первых, не аналоговые, а цифровые, во-вторых, не датчики, а входы/выходы, в-третьих, А ЗАЧЕМ? И тем более замешивать мультиплексоры с экспандерами в каскад...
PS: вопрос "зачем" риторический, не надо на него отвечать, я не психиатр, мне неинтересно.
@@alexmorozov73 Именно аналоговые датчики, если подключить выход всех мультиплексоров к единственному аналоговому пину ESP. Или я чего-то не понимаю? хмм..
@@MrZandho почитайте, что может аналоговый вход на ESP8266. И если его активно использовать, то прощай WiFi и здравствуй watch dog рано или поздно.
Алексей, подскажите, пожалуйста, можно ли теоретически с помощью MCP23017 программно реализовать несколько I2C шин? Например для подключения 6 датчиков с интерфейсом I2C и одинаковым не сменным адресом. С расширителя выходит одна общая SCL линия и с каждого другого пина своя SDA линия к определенному датчику? И если теоретически такое возможно реализовать, то с какими камнями можно столкнуться на практике?
Вам нужен I2C multiplexer, например на TCA9548A на 8 клиентов. Есть у китов, стоит недорого.
Алекс, здравствуйте. А как бороться с помехами по прерываниям? Защита от дребезга почему то не спасает от помех) Использую только события клик и лонгклик (добавление в очередь остальных, отключил в библиотеке), время кликтайм увеличил до 50мсек. Я настроил порт В на вход кнопок через резисторы 1к с подтяжкой пинов 10к к +, порт А - на выход к реле через оптопару. При резком включении мощной нагрузки, даже в другой комнате (фен, лобзик, перфоратор, болгарка) прерывания живут своей жизнью :)
Вы уверены, что проблема в прерываниях, а не в мусоре на входе ESP8266? Он очень капризный к питанию, у некоторых при включении холодильника Sonoff реле перезагружаются.
Так что попробуйте защитить питание ESP и MCP по входу электролитами.
@@alexmorozov73 не уверен, использую 12й порт, осциллографа к сожалению нет. Этот порт у меня тоже подключен к ITB через резистор 1к и параллельно к земле стоит керамический кондер на 330пкф. С питанием все в порядке на 99% с перезагрузками не сталкивался. Используется цепочка китайский народный БП на 12в 6а, от него питается все: лед подсветки, вентиляторы на вытяжку(корпусные от пк), нагрузка в пике 3а, еспшки 3шт. возле каждой стоит dc-dc на микросхеме MP1584EN, на выходе у него уже есть керамический кондер, и я добавил еще электролит 1000мкф. У меня 7 точек освещения которым управляет этот модуль, в качестве кнопок - сенсоры ttp223, запаяна опция A, то есть по умолчанию высокий уровень, реле - кит модули омрон на симисторах. Заметил еще такой эффект, если освещение полностью выключено длительное время(2-3 часа) и прикоснутся к одному из сенсоров, то включается несколько точек рандомно или все сразу.
Решение: напаял керамику 1нф параллельно кнопкам (В0-В7) и питанию +3.3
Не стал бы писать если бы не ваш апломб в конце. Посмотрел на код и ужаснулся. Вам, Алекс, рано в учителя.
* очередь не реентерабельна, и поэтому непригодна для использования в isr
* зачем в этой задаче динамический список? Разве кнопки в устройстве возникают и пропадают в процессе использования? Нет ведь! Хватило бы и массива аккуратно инкапсулированного.
* нам дали nullptr уже лет пять как.
* список вызывает realloc на каждый add и remove. Почему не надо так делать я отвечу отдельно если интересно
* список весь пестрит memmove и memcopy. И при этом он обобщенный. С типами, где есть нетривиальные копирование, это работать не будет. В С++ это делается не так
* Чтобы ваш список заработал с произвольным типом, от него нужно отнаследоваться и переопределить метод очистки. Это грубая ошибка проектирования. Очистка - обязанность деструктора Т.
* следствие предыдущего - наследование прикладного класса от обобщенного списка. Это почти всегда плохая идея. Используйте агрегирование. Но для этого нужно исправить список
* зачем ваши поля помещены в секцию protected? От класса предполагается наследовать? Откройте для себя private.
Продолжать можно ещё долго.
Очень похоже, что вы перешли с си, но не потрудились прочесть ни одной толковый книги по с++.
Здравствуйте Алекс. И с Новым Годом! :) Скажите, возможно ли к данной библиотеке прикрутить обработку дабл кликов и параллельное нажатие на две кнопки ?
Почему же невозможно? Двойное нажатие без таймера "красиво" не сделать, но если все равно, что сначала прилетит простое нажатие, а потом двойное - то без проблем. А одновременное нажатие и сейчас можно обработать, если не только на клик реагировать.
здравствуйте Алексей. помогите пожалуйста. с ардуино работаю не давно,вроде хотел решить простую задачу но на деле оказались трудно для новичка. работа связана с кнопкой и шим выходом: при нажатие и удержание кнопки диод плавно загорается до полного розжига,но при отпускании кнопки тухнет в любой момент как при 100% так и при 10%, 30%, 70% ... и т.д.в общем зажал разгорается отпустил потух. перебрал кучу готовых програм и пытался комбинировать , не достаточно видимо ума :) заранее огромное спасибо.
Для AVR при прямом подключении кнопки с коммутацией на землю к D2 и светодиода через резистор к D3 код может быть примерно следующий:
#include
const uint8_t BTN_PIN = 2;
const uint8_t PWM_PIN = 3;
const bool BTN_LEVEL = LOW; // Button to GND
const uint32_t PWM_TIME = 2500; // 2.5 sec.
void setup() {
pinMode(BTN_PIN, BTN_LEVEL ? INPUT : INPUT_PULLUP);
pinMode(PWM_PIN, OUTPUT);
}
void loop() {
static uint32_t startPressed = 0;
static uint8_t lastpwm = 0;
uint8_t pwm;
if (digitalRead(BTN_PIN) == BTN_LEVEL) { // Button pressed
if (! startPressed)
startPressed = millis();
uint32_t pressedTime = millis() - startPressed;
if (pressedTime > PWM_TIME)
pwm = 255;
else
pwm = map(pressedTime, 0, PWM_TIME, 0, 255);
} else { // Button released
if (startPressed) {
startPressed = 0;
pwm = 0;
}
}
if (pwm != lastpwm) {
lastpwm = pwm;
analogWrite(PWM_PIN, pwm);
}
}
Alex Morozov большое вам спасибо. работает так как я хотел.
с моим опытом я ещё долго бы не смог такой скетч написать.
не думал,что такая простая задача,требует таких больших
познаний. ещё раз спасибо.
Алексей, извините за занудство) подключаю геркон и пытаюсь определить состояние после старта ESP (или ресет), код не работает если геркон замкнут, события больше не поступают, не пойму почему?
Приведите свой измененный код.
@@alexmorozov73 в данном случае код без правок, определение по низкому уровню.
Вы так и не поняли, что вешаете свою ESP подключением ноги прерывания на важную для загрузки ESP ногу? D3/D4/D8? Пример из видео на D5 прекрасно перезагружается с нажатой кнопкой.
Я под видео добавил код с поддержкой двойного нажатия, но вам в вашем случае это не поможет.
Если уж так важно прерывание именно на эти ноги ESP подключить, то попробуйте ресеты соединить у MCP и ESP.
Иначе опрашивайте кнопки постоянно в цикле без прерывания.
@@alexmorozov73 Нет, я знаю про ноги. У меня голая ESP8266-12E подключаю I2C на ноги 0 и 2, прерывание на 13. Проверял также на стандартных 4 и 5, прерывание на 14 - аналогично не срабатывает прерывание кнопок если при старте они вкл, но при этом ESP прекрасно себя чувствует, все остальное работает.
Еще немного потестил, выяснил, что если в методе addButton после setupInterrupt вызвать _mcp->_interrupt(); все начинает работать в любом случае, но при этом есть ложные события Pessed(после инициализации) на не нажатых кнопках, а так работает как обычно.
Я так понимаю, нужно создать новый метод на основе mcpCallback, в нем определять состояние добавленной кнопки, и там уже добавлять событие Pessed в очередь ?
В итоге добавил в метод addButton такой код
if( ! level && _mcp->digitalRead(pin) ) {
_items[result].pressed = 0x0FFF;
event_t e;
e.kind = BTN_PRESS;
e.data = result;
e.pin = pin;
_events.push(&e);
}
Работает почти как нужно, но после програмного сброса ESP.reset() опять события приходять не в том порядке, сначала клик потом пресс. Что тут можно еще сделать? сброс модуля MCP23017 программно возможен?
Спасибо.
Поздравления очень интересные. У меня есть тот же чип, который я хотел бы использовать в существующем эскизе для управления входными реле и управления реле, размещенными на выходе всегда через STM32. Не могли бы вы помочь мне? , Большое спасибо
Вот код без FunctionalInterrupt, собирается в PlatformIO для STM32/Arduino: drive.google.com/open?id=1rfBr6t-cJpTZSQjMmFs70nsv840Wkgx2
@@alexmorozov73 Большое вам спасибо за ответ мне. К сожалению, это мало что понято. У вас случайно есть Telegram, так что вы можете отправить мой file.ino для изменения входа, используя mcp23017 и 16 кнопок для управления моими уже запрограммированными и работающими реле. К сожалению, я не могу сделать ввод, используя mcp23017. Большое спасибо
Переместить все фалы из src и include в один каталог. Переименовать main.cpp в .ino с именем этого каталога. Тогда скетч можно использовать в Arduino IDE.
@@alexmorozov73 Теперь я пытаюсь выяснить, могу ли я разместить эскиз и посмотреть, что не так. Большое спасибо в то же время.
Я не занимаюсь решением чужих задач, мне своих хватает.
Не понимаю, зачем на STM32 с ее большим количеством GPIO еще и расширитель применять.
Спасибо!