Опрос кнопок через MCP23017 для ESP8266

Поделиться
HTML-код
  • Опубликовано: 17 ноя 2024

Комментарии • 61

  • @Dialbist
    @Dialbist 6 лет назад +1

    У вас один из лучших каналов про ARDUINO и все что с ним связанно, самые информативные видео! Спасибо за большую работу! Если возможно, хотелось бы что-то на тему PID регулятора на ESP8266, в вашей манере все тщательно и детально рассказывать.

  • @Физик-г4о
    @Физик-г4о 2 года назад

    Не пойму как я пропустил этот видос, очень практично!

  • @AlexanderRibchansky
    @AlexanderRibchansky 4 года назад

    Спасибо! Интересно и понятно! Натолкнули на ряд.идей, для реализации в своих проектах! Еще раз, спасибо!

  • @user-apocalipsis
    @user-apocalipsis 6 лет назад +1

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

  • @stenzoautomatic
    @stenzoautomatic 2 года назад

    Крутяк!!!! Блин я ипользую оптопары для развязки, конфигурирую порты B на вход с подтяжкой, питание mcp 5 вольт, приложил мультиметр в режиме изм тока между "GND" и PB0 показывает 31 ма если оптрон pc817 "сработал", не многовато ли? Когда все 8 портов притянуты к земле то ток 248 ма, mcp капец греется но работает, не могу понять что делаю не так? Как вариант запитать от 3.3 вольт "нагрев" упадёт почти в два раза, но это же лечение следствия болезни а не причины?

  • @maksdav9
    @maksdav9 3 года назад

    Здравствуйте, подскажите, как можно реализовать счетчик импульсов на связке MCP23017 и микроконтроллере?

    • @alexmorozov73
      @alexmorozov73  3 года назад +1

      Так же как с кнопками. Настроить на генерацию прерывания на нужное изменение уровня, а на МК хотя бы просто при входящем прерывании увеличивать счетчик, если нужны импульсы всего с одного пина. Т.е. в этом случае можно даже не считывать сами значения, не упираясь в медленную шину типа I2C.
      Если же нужно что-то сложнее, то взять другой МК и считать на нем напрямую.

    • @maksdav9
      @maksdav9 3 года назад

      @@alexmorozov73, спасибо за ответ! Тут дело в том, что я планирую использовать её, как отдельный модуль ввода-вывода и совместно с esp32. Во втором случае на esp вешается ещё мс для ethernet, и входов практически не остаётся. Так вот дискретные входы нужно использовать ещё как счётчики импульсов с частотой до 10кГц, при том подключать на вход иногда нужно будет до 10 устройств.

    • @alexmorozov73
      @alexmorozov73  3 года назад

      Возьмите лучше Atmega 8/168/328 в зависимости от навыков компактного программирования и сделайте из нее расширитель портов на любом интерфейсе (UART, I2C, SPI или вообще свой) с функцией подсчета импульсов и чего угодно еще. 20/22 цифровые ноги. Это проще и надежнее будет в любом случае, чем использовать то, что предназначено совсем для других целей...

    • @maksdav9
      @maksdav9 3 года назад

      @@alexmorozov73 , Я просто заметил решение на микросхеме MCP23017 для модуля ввода контроллера одного из отечественных производителей (название опустим, дабы не было реклам). Микросхема по сути подключается напрямую к контроллеру (одноплатному пк) по шине i2c. И вот у них заявлен подсчет импульсов на всех 14 входах модуля. Так вот мне и стало интересно, как так реализовано, учитывая, что это решение выходит достаточно незатратным. А по поводу "взять контроллер" - да, уже думал об этом, но появляется немало волокиты с дополнительной перепрошивкой нового контроллера, в случае выхода из строя старого

    • @alexmorozov73
      @alexmorozov73  3 года назад

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

  • @pavelmavrin8835
    @pavelmavrin8835 9 месяцев назад

    Алексей, добрый день! Спасибо большое за библиотеку!
    Пытаюсь запустить пример, но вываливается ошибка в порту. Не сталкивалисиь с такой проблемой?
    Соответственно, в евенты ничего не попадает.
    Ошибка:
    E (136) gpio: esp_ipc_call_blocking failed (0x103)
    Запускаю скетч на ESP-WROOM-32, Arduino IDE 2.1.0, esp 2.0.14

    • @alexmorozov73
      @alexmorozov73  9 месяцев назад

      Код для ESP32 непригоден без изменений

    • @pavelmavrin8835
      @pavelmavrin8835 9 месяцев назад

      @@alexmorozov73 А не подскажете в какую сторону копать? Вижу, что заданы условия #ifdef ESP8266, но там только указание линий SDA, SCL. Не особый специалист, но в коде не могу найти ничего специфичного для ESP8266. Подозреваю, что прерывания как-то не так работают. Заранее спасибо!

    • @alexmorozov73
      @alexmorozov73  9 месяцев назад

      Ошибка в библиотеке FunctionalInterrupt

  • @muspel810
    @muspel810 6 лет назад +2

    Алекс, добрый вечер. Подскажите. Простой сервер на esp8266 01 постоянно зависает. Раз десять лампочкой мигнешь и все ((( тот же скеч пробовал на nodemcu, результат тот же.

    • @alexmorozov73
      @alexmorozov73  6 лет назад

      Не понял о каком простом сервере идет речь. С питанием все в порядке (особенно это касается ESP-01)?
      В любом случае, замена бутлоадера на версию из SDK, которой соответствует среда разработки, не повредит. Если используете последний пакет Arduino для ESP8266 (2.4.2), то он на версии Espressif SDK 2.2 основан, хотя в файле версии указано 2.1. Так что хотя бы бутлоадер из SDK 2.1 заливайте один раз, а потом уже скетчи.

    • @muspel810
      @muspel810 6 лет назад

      Скеч из arduino ide, WiFiWebServer (esp8266) Использовал различные источники питания. В локальной сети дольше работает. Из внешней быстрее зависает. Как заменю бутлоадер, отпишусь. Спасибо!

    • @muspel810
      @muspel810 6 лет назад

      @@alexmorozov73 Результат скеча "ESP-bootver" показал, что у меня sdk_version 2.2.1 и boot_version 31. Требуется бутлоадер переписать?

    • @alexmorozov73
      @alexmorozov73  6 лет назад

      @@muspel810 Можете ничего не делать, если хотите, чтобы ничего не изменилось.

    • @muspel810
      @muspel810 6 лет назад

      @@alexmorozov73 Огромное спасибо! Получилось все!

  • @NeObzor58
    @NeObzor58 6 лет назад +1

    Спасибо!

  • @GorodnovS
    @GorodnovS 6 лет назад +1

    У меня терминал в Platformio убежал в право. Как вернуть его в низ?

    • @alexmorozov73
      @alexmorozov73  6 лет назад +1

      Сделайте окно терминала пошире и в верхнем правом углу будет кнопка "Move to bottom".

  • @MrZandho
    @MrZandho 4 года назад

    Здравствуйте. Если можно подключить 8 таких модулей, которые будут управлять 16и битными мультиплексорами CD74HC4067. Которых можно подключить по 12 штук. То получаем ESP 8266 с 12*16*8 аналоговыми датчиками? О_о

    • @alexmorozov73
      @alexmorozov73  4 года назад

      Во-первых, не аналоговые, а цифровые, во-вторых, не датчики, а входы/выходы, в-третьих, А ЗАЧЕМ? И тем более замешивать мультиплексоры с экспандерами в каскад...
      PS: вопрос "зачем" риторический, не надо на него отвечать, я не психиатр, мне неинтересно.

    • @MrZandho
      @MrZandho 4 года назад

      @@alexmorozov73 Именно аналоговые датчики, если подключить выход всех мультиплексоров к единственному аналоговому пину ESP. Или я чего-то не понимаю? хмм..

    • @alexmorozov73
      @alexmorozov73  4 года назад

      @@MrZandho почитайте, что может аналоговый вход на ESP8266. И если его активно использовать, то прощай WiFi и здравствуй watch dog рано или поздно.

  • @zrirez3221
    @zrirez3221 5 лет назад

    Алексей, подскажите, пожалуйста, можно ли теоретически с помощью MCP23017 программно реализовать несколько I2C шин? Например для подключения 6 датчиков с интерфейсом I2C и одинаковым не сменным адресом. С расширителя выходит одна общая SCL линия и с каждого другого пина своя SDA линия к определенному датчику? И если теоретически такое возможно реализовать, то с какими камнями можно столкнуться на практике?

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Вам нужен I2C multiplexer, например на TCA9548A на 8 клиентов. Есть у китов, стоит недорого.

  • @TheForeach
    @TheForeach 5 лет назад

    Алекс, здравствуйте. А как бороться с помехами по прерываниям? Защита от дребезга почему то не спасает от помех) Использую только события клик и лонгклик (добавление в очередь остальных, отключил в библиотеке), время кликтайм увеличил до 50мсек. Я настроил порт В на вход кнопок через резисторы 1к с подтяжкой пинов 10к к +, порт А - на выход к реле через оптопару. При резком включении мощной нагрузки, даже в другой комнате (фен, лобзик, перфоратор, болгарка) прерывания живут своей жизнью :)

    • @alexmorozov73
      @alexmorozov73  5 лет назад

      Вы уверены, что проблема в прерываниях, а не в мусоре на входе ESP8266? Он очень капризный к питанию, у некоторых при включении холодильника Sonoff реле перезагружаются.
      Так что попробуйте защитить питание ESP и MCP по входу электролитами.

    • @TheForeach
      @TheForeach 5 лет назад

      @@alexmorozov73 не уверен, использую 12й порт, осциллографа к сожалению нет. Этот порт у меня тоже подключен к ITB через резистор 1к и параллельно к земле стоит керамический кондер на 330пкф. С питанием все в порядке на 99% с перезагрузками не сталкивался. Используется цепочка китайский народный БП на 12в 6а, от него питается все: лед подсветки, вентиляторы на вытяжку(корпусные от пк), нагрузка в пике 3а, еспшки 3шт. возле каждой стоит dc-dc на микросхеме MP1584EN, на выходе у него уже есть керамический кондер, и я добавил еще электролит 1000мкф. У меня 7 точек освещения которым управляет этот модуль, в качестве кнопок - сенсоры ttp223, запаяна опция A, то есть по умолчанию высокий уровень, реле - кит модули омрон на симисторах. Заметил еще такой эффект, если освещение полностью выключено длительное время(2-3 часа) и прикоснутся к одному из сенсоров, то включается несколько точек рандомно или все сразу.

    • @TheForeach
      @TheForeach 4 года назад +1

      Решение: напаял керамику 1нф параллельно кнопкам (В0-В7) и питанию +3.3

  • @pupazzamobila1006
    @pupazzamobila1006 4 года назад +1

    Не стал бы писать если бы не ваш апломб в конце. Посмотрел на код и ужаснулся. Вам, Алекс, рано в учителя.
    * очередь не реентерабельна, и поэтому непригодна для использования в isr
    * зачем в этой задаче динамический список? Разве кнопки в устройстве возникают и пропадают в процессе использования? Нет ведь! Хватило бы и массива аккуратно инкапсулированного.
    * нам дали nullptr уже лет пять как.
    * список вызывает realloc на каждый add и remove. Почему не надо так делать я отвечу отдельно если интересно
    * список весь пестрит memmove и memcopy. И при этом он обобщенный. С типами, где есть нетривиальные копирование, это работать не будет. В С++ это делается не так
    * Чтобы ваш список заработал с произвольным типом, от него нужно отнаследоваться и переопределить метод очистки. Это грубая ошибка проектирования. Очистка - обязанность деструктора Т.
    * следствие предыдущего - наследование прикладного класса от обобщенного списка. Это почти всегда плохая идея. Используйте агрегирование. Но для этого нужно исправить список
    * зачем ваши поля помещены в секцию protected? От класса предполагается наследовать? Откройте для себя private.
    Продолжать можно ещё долго.
    Очень похоже, что вы перешли с си, но не потрудились прочесть ни одной толковый книги по с++.

  • @TheForeach
    @TheForeach 4 года назад

    Здравствуйте Алекс. И с Новым Годом! :) Скажите, возможно ли к данной библиотеке прикрутить обработку дабл кликов и параллельное нажатие на две кнопки ?

    • @alexmorozov73
      @alexmorozov73  4 года назад

      Почему же невозможно? Двойное нажатие без таймера "красиво" не сделать, но если все равно, что сначала прилетит простое нажатие, а потом двойное - то без проблем. А одновременное нажатие и сейчас можно обработать, если не только на клик реагировать.

  • @ЮрийДайнеко-с7ь
    @ЮрийДайнеко-с7ь 6 лет назад

    здравствуйте Алексей. помогите пожалуйста. с ардуино работаю не давно,вроде хотел решить простую задачу но на деле оказались трудно для новичка. работа связана с кнопкой и шим выходом: при нажатие и удержание кнопки диод плавно загорается до полного розжига,но при отпускании кнопки тухнет в любой момент как при 100% так и при 10%, 30%, 70% ... и т.д.в общем зажал разгорается отпустил потух. перебрал кучу готовых програм и пытался комбинировать , не достаточно видимо ума :) заранее огромное спасибо.

    • @alexmorozov73
      @alexmorozov73  6 лет назад +2

      Для 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);
      }
      }

    • @ЮрийДайнеко-с7ь
      @ЮрийДайнеко-с7ь 6 лет назад

      Alex Morozov большое вам спасибо. работает так как я хотел.
      с моим опытом я ещё долго бы не смог такой скетч написать.
      не думал,что такая простая задача,требует таких больших
      познаний. ещё раз спасибо.

  • @TheForeach
    @TheForeach 4 года назад

    Алексей, извините за занудство) подключаю геркон и пытаюсь определить состояние после старта ESP (или ресет), код не работает если геркон замкнут, события больше не поступают, не пойму почему?

    • @alexmorozov73
      @alexmorozov73  4 года назад

      Приведите свой измененный код.

    • @TheForeach
      @TheForeach 4 года назад

      @@alexmorozov73 в данном случае код без правок, определение по низкому уровню.

    • @alexmorozov73
      @alexmorozov73  4 года назад

      Вы так и не поняли, что вешаете свою ESP подключением ноги прерывания на важную для загрузки ESP ногу? D3/D4/D8? Пример из видео на D5 прекрасно перезагружается с нажатой кнопкой.
      Я под видео добавил код с поддержкой двойного нажатия, но вам в вашем случае это не поможет.
      Если уж так важно прерывание именно на эти ноги ESP подключить, то попробуйте ресеты соединить у MCP и ESP.
      Иначе опрашивайте кнопки постоянно в цикле без прерывания.

    • @TheForeach
      @TheForeach 4 года назад

      ​@@alexmorozov73 Нет, я знаю про ноги. У меня голая ESP8266-12E подключаю I2C на ноги 0 и 2, прерывание на 13. Проверял также на стандартных 4 и 5, прерывание на 14 - аналогично не срабатывает прерывание кнопок если при старте они вкл, но при этом ESP прекрасно себя чувствует, все остальное работает.
      Еще немного потестил, выяснил, что если в методе addButton после setupInterrupt вызвать _mcp->_interrupt(); все начинает работать в любом случае, но при этом есть ложные события Pessed(после инициализации) на не нажатых кнопках, а так работает как обычно.
      Я так понимаю, нужно создать новый метод на основе mcpCallback, в нем определять состояние добавленной кнопки, и там уже добавлять событие Pessed в очередь ?

    • @TheForeach
      @TheForeach 4 года назад

      В итоге добавил в метод 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 программно возможен?

  • @alexejhripunkov5997
    @alexejhripunkov5997 6 лет назад +1

    Спасибо.

  • @Elettronica-xt7nm
    @Elettronica-xt7nm 5 лет назад

    Поздравления очень интересные. У меня есть тот же чип, который я хотел бы использовать в существующем эскизе для управления входными реле и управления реле, размещенными на выходе всегда через STM32. Не могли бы вы помочь мне? , Большое спасибо

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Вот код без FunctionalInterrupt, собирается в PlatformIO для STM32/Arduino: drive.google.com/open?id=1rfBr6t-cJpTZSQjMmFs70nsv840Wkgx2

    • @Elettronica-xt7nm
      @Elettronica-xt7nm 5 лет назад

      @@alexmorozov73 Большое вам спасибо за ответ мне. К сожалению, это мало что понято. У вас случайно есть Telegram, так что вы можете отправить мой file.ino для изменения входа, используя mcp23017 и 16 кнопок для управления моими уже запрограммированными и работающими реле. К сожалению, я не могу сделать ввод, используя mcp23017. Большое спасибо

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Переместить все фалы из src и include в один каталог. Переименовать main.cpp в .ino с именем этого каталога. Тогда скетч можно использовать в Arduino IDE.

    • @Elettronica-xt7nm
      @Elettronica-xt7nm 5 лет назад

      @@alexmorozov73 Теперь я пытаюсь выяснить, могу ли я разместить эскиз и посмотреть, что не так. Большое спасибо в то же время.

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Я не занимаюсь решением чужих задач, мне своих хватает.
      Не понимаю, зачем на STM32 с ее большим количеством GPIO еще и расширитель применять.

  • @kogram
    @kogram 6 лет назад +2

    Спасибо!