Concatenar caracteres teclado 4X4

hola, he estado siguiendo este foro por casi 3 semanas y este es mi primer post así que me presento, soy de Guatemala, estudiante de ingeniería electrónica (bueno apenas estoy en pañales).

He estado tratando de variar la intensidad de un led (ya lo logré con un potenciómetro y usando analogRead) pero ahora quiero hacerlo ingresando datos con un teclado matricial, ya leí el siguiente post donde hablan del ingreso con rfid y un keypad 4X3

pero no entiendo como logran almacenar los cuatro dígitos para luego compararlos con la clave almacenada,
Lo que quiero lograr es almacenar al menos tres caracteres y tal vez concatenarlos para luego convertir a int y poder variar la intensidad.
Multiplico por 25 porque solo me permite ingresar números de 0 a 9 y así poder diferenciar la intensidad.
este es el código que tengo hasta el momento. :~
no sé si sirve de algo pero estoy usando el arduino due

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS]={40,41,42,43};
byte colPins[COLS]={44,45,46,47};
char keys[ROWS][COLS]={
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};

Keypad teclado=Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int ledPin=10;
int b;
char tecla;
void setup() {
  
pinMode(ledPin,OUTPUT);
}

void loop() {
  tecla=teclado.getKey();
  if(tecla != NO_KEY){
  b = (tecla-48)*25;//según entiendo convierte solo un caracter a int
  analogWrite(ledPin,b);   
            
                          }  
                   }
                      }
               }

esto te puede servir

 #include <LiquidCrystal_I2C.h>
 #include <Wire.h>
 #define I2C_ADDR 0x3F
 /* Funcion de configuracion
   de pines del modulo LCD/I2C (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);

#include <Keypad.h>

const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas

byte Pins_Filas[] = {9,8,7,6};   //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = {5,4,3,2};   // Pines Arduino a los que contamos las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx

char Teclas [ Filas ][ Cols ] = 
{
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
char codigoSecreto[] = {'2','2','5','5'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array

int posicion=0; // necesaria para la clave
int cursor=5; // posicion inicial de la clave en el LCD
int clave=0; // para el LCD
int luz=0;  // para el LCD
int tiempo=0;  // para el LCD
int ledVerde=11; // pin para el LED verde
int ledRojo=12;  // pin para el LED rojo
int buzzer=10;  // pin altavoz

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

void setup(){
Serial.begin(9600) ;
Wire.begin();
lcd.begin(16,2); // inicializamos el LCD.
//lcd.noBacklight(); // apagamos LCD
lcd.setBacklightPin(3,POSITIVE);
 lcd.setBacklight(HIGH);
pinMode (ledVerde,OUTPUT);
pinMode (ledRojo, OUTPUT);
pinMode (buzzer, OUTPUT);
digitalWrite(ledRojo,HIGH);  // encendemos el LED rojo
digitalWrite(ledVerde, LOW);  // apagamos el verde

//lcd.setCursor(0,0); // situamos el cursor el la posición 2 de la linea 0.
//lcd.print("Introduzca clave"); // escribimos en LCD
//lcd.setCursor(cursor,1); // cursor en la posicion de la variable, linea 1
}

 
void loop(){
 lcd.setCursor(0,0); // situamos el cursor el la posición 2 de la linea 0.
lcd.print("Introduzca clave"); // escribimos en LCD
lcd.setCursor(cursor,1); // cursor en la posicion de la variable, linea 1

char pulsacion = Teclado1.getKey() ;  // leemos pulsacion
if (pulsacion != 0){  // Si el valor es 0 es que no se ha pulsado ninguna tecla

if (pulsacion != '#' && pulsacion != '*' && clave==0){  // descartamos almohadilla y asterisco
 
   lcd.print(pulsacion);  // imprimimos pulsacion
   cursor++;  // incrementamos el cursor
   tone(buzzer,350);  // tono de pulsacion
   delay(200);
   noTone(buzzer);
   
//--- Condicionales para comprobar la clave introducida -----------

if (pulsacion == codigoSecreto[posicion]){ // comparamos entrada con cada uno de los digitos, uno a uno
     posicion ++;  // aumentamos en uno el contador de posicion si es correcto el digito  
     }
     
if (posicion == 4){ // comprobamos que se han introducido los 4 correctamente
       
     digitalWrite (13,HIGH);  // encendemos LED
     lcd.setCursor(0,0); // situamos el cursor el la posición 0 de la linea 0.
     lcd.print("Clave correcta  "); // escribimos en LCD
     
     delay(200); // tono de clave correcta
     tone(buzzer,500);
     delay(100);
     noTone(buzzer);
     tone(buzzer,600);
     delay(100);
     noTone(buzzer);
     tone(buzzer,800);
     delay(100);
     noTone(buzzer);
     delay (500);
   
     
     lcd.setCursor(5,1); // cursor en la posicion 5, linea 1
     clave=1;  // indicamos que se ha introducido la clave
     digitalWrite(ledRojo,LOW);  // apagamos el LED rojo
     digitalWrite(ledVerde, HIGH);  // encendemos el verde 
       if (clave ==1) {
           clave = 0;
           posicion=0;
           cursor=5;
           lcd.clear();
     }
     }
//--- En el caso de que este incompleta o no hayamos acertado ----------   
   if(cursor>8){  // comprobamos que no pase de la cuarta posicion
           cursor=5;  // lo volvemos a colocar al inicio
           posicion=0; // borramos clave introducida
           lcd.setCursor(5,1);
           lcd.print("       ");  // borramos la clave de la pantalla
           lcd.setCursor(5,1);
   if(clave==0){           // comprobamos que no hemos acertado
     tone(buzzer,70,500);  // para generar
     delay(250);           // tono de error
     noTone(buzzer);
     lcd.clear();
   lcd.setCursor(0,0);
       lcd.print("Clave incorrecta  "); // escribimos en LCD
       delay(1000); 
           lcd.clear();
     }
     }
     
   
   }
   }

}

Edito: PFFFFF acabo de ver que es un post del 2014 que Bernardog ha resucitado... Si surbyte lo considera necesario aparte del imaginable cierre, elimino mi comentario.

Bernardog: esto te puede servir

[...] -> (No voy a aumentar el post con código que no está entre tags)

Bernardog, El ejercicio que pones de ayuda, con independencia que no está entre los tags de code y que provoca por ejemplo que salga un -> 8) en mitad del código, es un ejemplo de buzzer/piezo con lcd y teclado matricial. No tiene nada que ver encender led a base de concatenar las keys con lo que has puesto.

Por cierto están cogiendo el mal hábito de programar en base a los tutoriales y poner todo como variables globlales (muchas veces no necesitan las variables ni como locales)... Y como no, todo con delay();


Rivera25081, Lo primero es que no necesitas hacer que la variable de la tecla sea global ni tienes que comparar de esa forma. Hazla local, menos gasto memoria (por insignificante que sea y NO hablo de la memoria total que nos sale en el compilador de las variables y lo que "pesa" el código, no es lo mismo meter un long con un valor 1 que con el valor de millis() tras 50 días ¿Verdad?) además nos ahorramos líneas.

Si yo pongo un char en global y la uso en el setup esa variable quedará en memoria, si ese char lo declaro en el setup cuando salga de la función byebye variable.

  char tecla = keypad.getKey(); // ¿Por qué hacerla global? Definamos aquí, 


  if(tecla){
  /*Aquí tu código*/
  }

Si la duda es sólo concatenar valores, sólo tienes que revisar que la tecla (que es un char) sea de tipo numérico:

if(isDigit(tecla)){
  value += (String)tecla; //Siendo value una variable global de tipo String
}

Como los valores van de 0 a 255, (salvo que quieras introducir valores analógicos y luego modificarlos con map(); ), puedes usar constrain para evitar que se exceda de ese valor. En cualquier caso convertimos el value que es String a un entero con .toInt()

Por ejemplo:

if(value.length() == 3){ //Si el valor ya tiene 3 cifras
  analogWrite(ledPin,constrain(value.toInt(),0,255));
  value = "";    
}

Si no quieres tener que introducir 010 para hacer 10 ó 000 para hacer 0, usa una de las teclas de tipo alpha -> A.B,C,D para asignar el valor directamente y no esperar a llegar a las 3 cifras. y las puedes detectar igual añadiendo:

if(isAlpha(tecla)){
      switch(tecla){
        case 'A' : /*Opción 1*/ break; 
        case 'B' : /*Opción 2*/ break; 
        case 'C' : /*Opción 3*/ break; 
  }
}

Saludos. En realidad es muy simple. No lo doy todo hecho para que el foro no sea un copy and paste. Cualquier duda nos comentas.

Hilo cerrado por revivir código del 2014.