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

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ต.ค. 2018
  • Класс Buttons позволяет асинхронно опрашивать кнопки, подключенные к MCP23017, формируя очередь событий. В главном цикле периодически необходимо обрабатывать очередь, чтобы она не переполнилась и не были утеряны последние события.
    Код скетча из видео: drive.google.com/file/d/1df2W...
    Новый вариант с поддержкой определения двойного нажатия: github.com/MoonFox2006/MCP230...
  • วิทยาศาสตร์และเทคโนโลยี

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Спасибо!

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

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

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

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

  • @user-dj8fg7qe9e
    @user-dj8fg7qe9e 5 ปีที่แล้ว +2

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

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

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

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

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

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

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

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

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

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

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

  • @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

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

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

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

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

  • @pavelmavrin8835
    @pavelmavrin8835 5 หลายเดือนก่อน

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

    • @alexmorozov73
      @alexmorozov73  5 หลายเดือนก่อน

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

    • @pavelmavrin8835
      @pavelmavrin8835 5 หลายเดือนก่อน

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

    • @alexmorozov73
      @alexmorozov73  5 หลายเดือนก่อน

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

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

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

    • @alexmorozov73
      @alexmorozov73  5 ปีที่แล้ว +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);
      }
      }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @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 программно возможен?

  • @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 еще и расширитель применять.

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

    Спасибо.

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

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

  • @kogram
    @kogram 5 ปีที่แล้ว +2

    Спасибо!