Consulta acerca del (INT) PCF8574

B. Días y Felicidades para todos

Por culpa de no terminar de comprender (en qué casos usar el Interrupt) de CI creo que tengo mi problema ahí.

Hice un circuito para leer el teclado matricial 4x4 y mostrarlo en un Display LCD16x2 y todo anduvo muy bien.

Pero cuando agregué un Control Remoto 315MHz de 4 canales a un Segundo PCF8574 y entonces comenzó mi problema.

El LCD y el Teclado siguen andando bien; pero no consigo leer el Control Remoto. (Solo me muestra la letra A) al conectar el circuito.

¿Qué es lo que sé hasta ahora?
Que las direcciones de cada dispositivo están bien (Controlé con el Scan de Arduino).
Que mis conexiones están bien (porque funciona “parcialmente” y se reconoce a c/u).
Que en todos los casos que he visto en la Web de los dos PCF8574 solo uno va conectado el (INT) con una Resistencia a 5Vcc. (pero no logro comprender porqué).

¿Qué dudo?
En los rebotes que hace el C. Remoto cuando presiono una tecla; (pero no me genera problemas con el Teclado 4x4).

Intenté de varias maneras “sin resultado” en asignar los puertos (pero en los anteriores todo anda bien).

Por todo lo dicho es que sigo pensando que el no saber entender el (INT) es lo que me está trayendo el problema.

¿Podrías explicarme con palabras muy tontas para que yo comprenda. Que es y para qué sirve el (INT) del PCF8574?

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,16,2);

#include <Keypad_I2C.h>
#include <Keypad.h>

const byte ROWS = 4; // empat rows
const byte COLS = 4; // empat columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowsInp[ROWS] = {0, 1, 2, 3}; 
byte colsInp[COLS] = {4, 5, 6, 7};
int i2caddress = 0x21; // A1, A2, A3 >> 0, 0, 0
Keypad_I2C Teclado = Keypad_I2C( makeKeymap(keys), rowsInp, colsInp, ROWS, COLS, i2caddress );

// *******************************************************************************************
const byte FILA = 4;
const byte COLM = 4;
char botn[FILA][COLM] = {
  {'0','B','C','D'},
  {'1','B','C','D'},
  {'2','B','C','D'},
  {'3','B','C','D'}
};
byte filaEnt[FILA] = {8, 9, 10, 11};
byte colmEnt[COLM] = {8, 9, 10, 11};
int direccxI2C = 0x20; // A1, A2, A3 >> 1, 0, 0
Keypad_I2C Control = Keypad_I2C( makeKeymap(botn), filaEnt, colmEnt, FILA, COLM, direccxI2C );
// *******************************************************************************************

int x=0;

void setup(){
     Serial.begin(9600);
     Teclado.begin();
  
     lcd.init(); // inicializar el LCD 
     lcd.backlight();
     lcd.clear();
     lcd.home();

     lcd.setCursor(0,0); // Ubicación(X,Y)
     lcd.print("Hola Mundo");
}
  
void loop(){
     char Tecla = Teclado.getKey();
     char Boton = Control.getKey();
     if (Tecla){
        Serial.println(Tecla);
        if (x>=16){x=0; lcd.setCursor(0,1);lcd.print("                ");}
        lcd.setCursor(x,1); lcd.print(Tecla);
        x++;
     }
     if (Boton){
        Serial.println(Boton);
        lcd.setCursor(11,0); lcd.print(Boton);
     }

Porque tienes dos veces la definición del keyboard 4x4 ?

Manda más información del control remoto, link, diagrama como esta conectado, quizás una foto.

Hola Español

Este es el Control Remoto

Tengo repetido el Keyboard porque uno corresponde al lector del teclado y el otro al Receptor del Control remoto

Los pines 0 a 7 del PCF7584 (1)
Los pines 8 a 11 del PCF7584 (2)

No tengo diagramas nada para agregar ya que la placa la hice agregando un PCF7584 + conectándolo al A4 y A5.

Bueno creo que encontré “LA PUNTA DE LA MADEJA”.

#include <Wire.h>
 
const int pcfAddress = 0x20;
int Anterior = 0; 

void setup(){
   Wire.begin(pcfAddress);
   Serial.begin(9600);
}
 
void loop(){
   short channel = 1;
   byte value = 0;
 
   // Leer dato de canal 'channel'
   Wire.requestFrom(pcfAddress, 1 << channel);
   if (Wire.available()) {
      value = Wire.read();
   }
   Wire.endTransmission();
 
   // Mostrar el valor por puerto serie
   if (value >0 && Anterior!=value){
      Serial.print("* ");
      Serial.println(value);
      Anterior = value;
   }
}

Con este programa finalmente he logrado VER; solo VER la presión de las 4 teclas del Control Remoto.

En cambio si uso el mismo programa con el Teclado 4x4 no ocurre lo mismo.

Como conclusión saco que es un problema de LIBRERÍAS.

La Keypad.h pareciera que sirve para el Teclado Matricial y no para el C.Remoto; pero en cambio la Wire.h me sirve para leer el C.Remoto.

Lo que concluyo es que “probablemente” cuando uso el “constructor” entraría en conflicto con la librería.

A partir de acá deberé escoger la librería que me acepte los dos componentes o usar Keypad.h para uno y la Wire.h para otro.

En cuanto estudie bien como trabajar con la wire (para distinguir la lecturas) volveré y comentaré los resultados.

No es la primera vez que las librerías nos dan estos sustos! haciéndonos dudar de nuestros trabajos ¿no? Felicidades para TODOS!

Bueno al fin; Español !!!

Esta resueltooooo. Era eso. Un problema de conflicto con la librería.

Con la Wire.h logré identificar las Teclas del Control Remoto.

Con la LiquidCrystal_I2C.h trabajo con el Display LCD 16x2.

Con la Keypad.h me sirve para leer el Teclado 4x4.

La comunicación del I2C anda espectacular trabajando los tres muy bien. Con respecto al PCF8574 Fantástico.

Para este receptor no hace falta wire.h
Los pines del receptor conectas directamente a las entradas del Arduino y lo lees con digitalRead
No tiene mucho secreto.

ElEspanol:
Para este receptor no hace falta wire.h
Los pines del receptor conectas directamente a las entradas del Arduino y lo lees con digitalRead
No tiene mucho secreto.

Perdoname; creí que habías comprendido el espíritu del proyecto. Seguramente yo no me he sabido explicar.

Claro que no hace falta Wire.h
Claro que solo con digitalRead() leemos cada uno de sus cuatro pines.
Claro que no buscaba descubrir ningún secreto.

A ver si logro explicarme mejor. Buscaba (y por suerte lo encontré). Es por medio del PCF8574 comunicar con solo dos cables (tres) dispositivos de distinta naturaleza sin saturar los pines I/O digitales del Arduino NANO.

Dicho de otro modo aquí te dejo el video del proyecto terminado.

Para el pfc8574 existe una biblioteca que te hace más fácil la vida. Personalmente prefiero el mcp23008 o mcp23016, porqué pueden suministrar 5V en las salidas.

Hi,
Yo estoy de acuerdo con ElEspanol en el uso del mcp23008 o mcp23016, Yo uso el mcp27017 que es I2c y es facil de programar. Este tiene 16 salidas o entradas de acuerdo como las programs.

Uno vive en España y el otro en USA, los que vivimos en algunos lugares distantes como Argentina y más si lo haces en el interior del país como el caso de @Humberto02 (Entre Rios si mal recuerdo) o el mío, no siempre conseguimos lo que queremos.

Si el tiene a mano un PCF8574 que tiene de malo usarlo?

El título dice Consulta acerca del (INT) PCF8574 tal vez para la próxima siga sus consejos y consiga los mcp23008 o mcp23016, solo para que vean de qué hablo dejo unos links que explica cuan disparatadas pueden ser las cosas de la oferta en Argentina

MCP23008 a 1500 pesos o sea 23 USD
Y otra publicación lo vende a MCP23008 a 350 pesos o sea 5.55 USD

por otro lado y como pasa siempre acá
https://articulo.mercadolibre.com.ar/MLA-685335564-d6-ic-io-expander-i2c-mcp23016-23016-_JM?quantity=1#position=1&type=item&tracking_id=b65029a4-9580-4575-afe1-6165caf828aa a 2.31 USD

Por cierto solo de envio tiene 5 USD.

Bueno @Humberto02 para la próxima considéralo.