В рамках работы над одним из проектов пришлось применить расширитель портов PCF8574 и если всякие кнопки через него запустить не проблема, то прописать энкодеры не получается. Для энкодеров используется библиотека alexgyver. Может кто сталкивался с такой же проблемой ?
Ну, наверное, alexgyver и сталкивался.
Да мне без разницу какую библиотеку использовать для энкодера. Вопрос как вообще программно прописать связку энкодер+расширитель портов
Да, нам тоже без разницы, что Вы там используете, кода мы не видели, схемы подключения тоже. Характер проблемы мы тоже не знаем. Думаю, что в строке №23 ошибка.
А в чем, собственно говоря, проблема?
Берём библиотеку 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.!!!
Ног, блин, для двух энкодеров не хватает. Нужно из говна и палок приладить. С ардуиновской библиотекой? От гайвера? Ой ё…
А по делу ? Вот схема, подскажите, как бы Вы подключились к этой плате без расширителя? Нужно подключить два энкодера-4 ноги, две кнопки от энкодеров, это еще 2 ноги и еще три кнопки, еще 2 ноги. Т.е. нужно 9 свободных портов. Ну и куда их ?
а у меня ESP32-4827S043 вот туда подключить проблематично видимо