Un problema habitual al trabajar con estos componentes es que requieren muchos puertos de nuestro microcontrolador; para el caso de ejemplo utilizaremos un ESP8266, un NodeMCU.
¿Cual es la trampa?
Necesitamos de otro chip que se ocupe de extender los puertos necesarios, para el caso del teclado utilizaremos un MCP23017, es lo que tengo a mano, pero estimo que puede ser cualquier chip de la familia. Requeriremos además tres resistencias de 10k, el diagrama de como conectarlo es el siguiente:
Requeriremos además instalar la librería keypad, si ya la tenemos instalada no será necesario. Para instalar desde el IDE de Arduino, debemos ir al menú Programa – Incluir Librería – Añadir desde ZIP.
Además también sera necesario arduino_keypads-master, simplemente debemos descomprimir dentro de la carpeta Libraries (en mi caso esta en C:\Users\Guillermo\Documents\Arduino\libraries ).
Luego que se hayan instalados estas librerías y construido el circuito anterior, es conveniente chequear cual es la dirección que tiene nuestro chip MCP23017 para poder comunicarnos adecuadamente con él; para ello cargaremos en el nodemcu un sketch para buscar las direcciones disponibles:
Si copia y pega el código verifique que no vayan caracteres incorrectos, tengo la mala experiencia que en oportunidades al pegar no llevar el carácter adecuado. Pueden descargar el zip si lo desean.
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
} else if (error==4) {
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Si todo esta correctamente conectado, en el monitor serie deberíamos ver un mensaje como el siguiente:
Donde 0x20 es la dirección de MCP23017.
El paso siguiente seria cargar el ejemplo para poder interactuar con el teclado:
#include <Keypad_MC17.h>
#include <Keypad.h>
#include <Wire.h>
#define I2CADDR 0x20
const byte ROWS = 4; //four rows
const byte COLS = 4; //five columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'#','0','*','D'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {3, 2, 1, 0};
Keypad_MC17 customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR);
void setup(){
// Wire.begin( );
customKeypad.begin( ); // GDY120705
Serial.begin(9600);
Serial.println("Iniciando");
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey != NO_KEY){
Serial.println(customKey);
}
}
De esta forma podemos conectar el teclado a una placa NodeMCU, también funciona con Arduino, utilizando solo dos pines.
Queda por ver si es posible utilizar los otros 8 pines restantes del MCP23017 para realizar otras operaciones y ampliar aún mas la cantidad de entradas y salidas.
Cordial Saludo, Guillermo.
Primero que todo lo felicito por compartir su conocimiento y por la importancia de esta página y los vídeos que dejo.
Quiero hacerle una pregunta referente a este mismo tema:
Tengo un proyecto que hacer con un ESP8266 NODEMCU V3.0, donde también debo conectar un keypad y un LCD haciendo que interactue con una aplicación hecha en VB a través de un WEB SERVICES. Mi pregunta es: puedo usar alguno de estos integrados a cambio del MCP23017 ?: o debe ser únicamente éste. MCP23017.
integrado: SN74HC595N o MAX7219CNG.
Le agradezco su respuesta de antemano.
Hola. Gracias por los comentarios.
No es necesario que si o si utilices el MCP23017, sumas mayor cantidad de pins, iria por el SN74HC595N; tendrías que adaptar el código para que lea las entradas del teclado. El MAX7218CNG no se si te permite configurar los pines como inputs, tendrías que chequear los datasheets. Saludos!
Buenos días, Guillermo.
Quiero hacerle una pregunta: Estoy usando una de los script de prueba que dejaste en la página, como el simple lector de dispositivos para conocer sus direcciones(Address), pero al compilar el programa, al parecer el uso de la inclusión de la libreria generar un error:
#include < ; Wire.h>
Error.
exit status 1
#include expects «FILENAME» or
Al parecer el < esta ocacionando el problema.
Le agradezco de antemano su ayuda.
Hola, revise el código del ejemplo y tenia unos espacios demás; suele ocurrir que cuando copias/pegas el código surgen algunos caracteres que no corresponden. Por las dudas agregue el link de descarga al archivo zip con el ejemplo: http://www.gsampallo.com//wp-content/uploads/2020/04/scanWire.zip saludos
Muchas Gracias Guillermo.
Todo Funcionando Ok. nuevamente le agradezco su valiosa ayuda.