Как подключить энкодеры через расширитель портов?

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

Ну, наверное, alexgyver и сталкивался.

1 лайк

Да мне без разницу какую библиотеку использовать для энкодера. Вопрос как вообще программно прописать связку энкодер+расширитель портов

Да, нам тоже без разницы, что Вы там используете, кода мы не видели, схемы подключения тоже. Характер проблемы мы тоже не знаем. Думаю, что в строке №23 ошибка.

2 лайка

А в чем, собственно говоря, проблема?
Берём библиотеку rotary.h

И переписываем на работу с пинами от pcf8574.
(Библиотека простейшая, не сложно переписать)

Мне это всегда нравится. Ну как же! Алекс Гайвер, ведь это должны знать все! ППЦ! А вдруг мы не знаем? И чо?
“Я маленькая девочка, я в школу не хожу,
Я Ленина не видела, и видеть не хочу.”
Только Ленин - это вождь, всё таки.

Да тут дело не в конкретной библиотеке, а в том что энкодер подключается к ESP32 через расширитель портов PCF8574 при условии, что для шины I2C используются произвольные выводы, вот схема:


(У меня в проекте нужно подключить два энкодера и пять кнопок, две из них в энкодере)
С обычными кнопками все без проблем. Вот программа подключения расширителя:
#include “PCF8574.h”
TwoWire I2Cone = TwoWire(0);
TwoWire I2two = TwoWire(1);
#define SDA_0 16
#define SCL_0 17
#define I2C_ADRESS 0x20
#define I2C_FREQ 400000
PCF8574 pcf8574(&I2Ctwo, I2C_ADRESS, SDA_0, SCL_0);

А вот как энкодер прописать, например на P0 и P1 не понимаю

Ты мое сообщение №4 видел? Или мимо пропустил?

Попробуй не “прописывать энкодеры”, а программировать алгоритм.
С++ это не декларативный язык.

Да, видел, как раз изучаю. Спасибо!

Как кнопки прописывал?

void setup(){
Serial.begin(9600);
pcf8574.pinMode(P0, INPUT); // Устанавливаем выход P0, как вход
pcf8574.pinMode(P1, INPUT); // Устанавливаем выход P1, как вход
void loop()
{
uint8_t val0 = pcf8574.digitalRead(P0); // Чтение состоянии вывода PO
uint8_t val1 = pcf8574.digitalRead(P1); // Чтение состоянии вывода P1
if (val0 == HIGH) digitalWrite(led, HIGH); // Если кнопка не нажата, светодиод не горит
else digitalWrite(led, LOW); // Если кнопка нажата, светодиод горит

Если глянуть примеры библиотеки pcf8574, то…

Библиотека: GitHub - RobTillaart/PCF8574: Arduino library for PCF8574 - I2C IO expander

Даже лисапед изобретать не надо, просто посмотреть примеры))

Но я бы лучше переписал библиотеку под pcf8574

Все, спасибо ! Проблема решена,нашел документацию к библиотеке Гувера там четко написано :

Encoder enc; // не привязан к пину (для виртуального энкодера,)
Виртуальный энкодер как раз через расширитель портов и получается.
Все заработало.

Молодец.

ESP 32. Полметра рам. 4 метра Флэша. Два ядра по 240 МГц. 32 разряда. Штук 30 gpio.!!!
Ног, блин, для двух энкодеров не хватает. Нужно из говна и палок приладить. С ардуиновской библиотекой? От гайвера? Ой ё…

2 лайка

А по делу ? Вот схема, подскажите, как бы Вы подключились к этой плате без расширителя? Нужно подключить два энкодера-4 ноги, две кнопки от энкодеров, это еще 2 ноги и еще три кнопки, еще 2 ноги. Т.е. нужно 9 свободных портов. Ну и куда их ?

а у меня ESP32-4827S043 вот туда подключить проблематично видимо