Teclado Keypad {SOLUCIONADO]

Hola buenos dias, soy nuevo por aqui y me gustaria si es posible me echarais una mano, estoy haciendo un teclado para una maqueta de trenes que tengo de la cual maneja algo mas de 40 desvios y otros, uso Arduino uno y el teclado es un Keypad 4X4, el programa que he echo me funciona bien si introduzco dos cifras o tres pero ambas no, os adjunto el programa que actualmente funciona con dos cifras las de tres estan anulada con // porque no me funciona

Atentamente un saludo y gracias a todos

Tony Relos

#include <Keypad.h>               // importa libreria Keypad

const byte FILAS = 4;             // define numero de filas
const byte COLUMNAS = 4;          // define numero de columnas
char keys[FILAS][COLUMNAS] = {    // define la distribucion de teclas
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte pinesFilas[FILAS] = {9, 8, 7, 6};    // pines correspondientes a las filas
byte pinesColumnas[COLUMNAS] = {5, 4, 3, 2}; // pines correspondientes a las columnas

Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS);  // crea objeto

char TECLA;        // almacena la tecla presionada
char DES1[3], DES2[3], DES3[3], DES4[3], DES5[3], DES10[4]; // almacena en un array 3 digitos ingresados
byte dosdigitos = 0;   // indice del array
byte tresdigitos = 0;

void setup() {
  pinMode(13, OUTPUT); // Declaramos que utilizaremos los pins como salida
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  Serial.begin(9600);  // inicializa comunicacion serie
}

void loop() {
  TECLA = teclado.getKey();   // obtiene tecla presionada y asigna a variable
  if (TECLA)                  // comprueba que se haya presionado una tecla
  {
    DES1[dosdigitos] = TECLA;     // almacena en array la tecla presionada
    DES2[dosdigitos] = TECLA;
    DES3[dosdigitos] = TECLA;
    DES4[dosdigitos] = TECLA;
    DES5[dosdigitos] = TECLA;
    DES10[tresdigitos] = TECLA;
    dosdigitos++; // incrementa indice en uno
    tresdigitos++;  // incrementa indice en uno
    Serial.print(TECLA);      // envia a monitor serial la tecla presionada
  }
  // Desvio1
  char DES1_Desviado[3] = "1A"; // digitos a ingresar
  char DES1_Recto[3] = "1C";
  if (dosdigitos == 2)  // si ya se almacenaron los 2 digitos
  {
    if (!strcmp(DES1, DES1_Desviado))         // compara digitos ingresados con los char
      Serial.println(" Desvio 1 Desviado"); // imprime en monitor serial que es Desviado
    digitalWrite(13, HIGH);
    if (!strcmp(DES1, DES1_Recto))
      Serial.println(" Desvio 1 Recto");    // imprime en monitor serial que es Recto
    digitalWrite(13, LOW);
  }
  // Desvio 2
  char DES2_Desviado[3] = "2A"; // digitos a ingresar
  char DES2_Recto[3] = "2C";
  if (dosdigitos == 2)  // si ya se almacenaron los 2 digitos
  {
    if (!strcmp(DES2, DES2_Desviado))        // compara digitos ingresados con los char
      Serial.println(" Desvio 2 Desviado"); // imprime en monitor serial que es Desviado
    digitalWrite(12, HIGH);
    if (!strcmp(DES2, DES2_Recto))
      Serial.println(" Desvio 2 Recto"); // imprime en monitor serial que es Recto
    digitalWrite(12, LOW);
  }
  // Desvio 3
  char DES3_Desviado[3] = "3A"; // digitos a ingresar
  char DES3_Recto[3] = "3C";
  if (dosdigitos == 2)  // si ya se almacenaron los 2 digitos
  {
    if (!strcmp(DES3, DES3_Desviado))        // compara digitos ingresados con los char
      Serial.println(" Desvio 3 Desviado"); // imprime en monitor serial que es Desviado
    digitalWrite(11, HIGH);
    if (!strcmp(DES3, DES3_Recto))
      Serial.println(" Desvio 3 Recto"); // imprime en monitor serial que es Recto
    digitalWrite(11, LOW);
  }
  // Desvio 4
  char DES4_Desviado[3] = "4A"; // digitos a ingresar
  char DES4_Recto[3] = "4C";
  if (dosdigitos == 2)  // si ya se almacenaron los 2 digitos
  {
    if (!strcmp(DES4, DES4_Desviado))        // compara digitos ingresados con los char
      Serial.println(" Desvio 4 Desviado"); // imprime en monitor serial que es Desviado
    digitalWrite(10, HIGH);
    if (!strcmp(DES4, DES4_Recto))
      Serial.println(" Desvio 4 Recto"); // imprime en monitor serial que es Recto
    digitalWrite(10, LOW);
  }
  // Desvio 5
  char DES5_Desviado[3] = "5A"; // digitos a ingresar
  char DES5_Recto[3] = "5C";
  if (dosdigitos == 2)  // si ya se almacenaron los 2 digitos
  {
    if (!strcmp(DES5, DES5_Desviado))        // compara digitos ingresados con los char
      Serial.println(" Desvio 5 Desviado"); // imprime en monitor serial que es Desviado
    digitalWrite(9, HIGH);
    if (!strcmp(DES5, DES5_Recto))
      Serial.println(" Desvio 5 Recto"); // imprime en monitor serial que es Recto
    digitalWrite(9, LOW);
    dosdigitos = 0;
  }
  /* Hasta aqui todo bien pero a la hora de introducie tres digitos no Funciona*/
  // Desvio 10
  //   char DES10_Desviado[4] = "10A"; // digitos a ingresar
  //   char DES10_Recto[4] = "10C";
  // if(tresdigitos == 3)   // si ya se almacenaron los 3 digitos
  // {
  //  if(!strcmp(DES10, DES10_Desviado))         // compara digitos ingresados con los char
  //       Serial.println(" Desvio 10 Desviado"); // imprime en monitor serial que es Desviado
  //       digitalWrite(8, HIGH);
  //   if(!strcmp(DES10, DES10_Recto))
  //      Serial.println(" Desvio 10 Recto"); // imprime en monitor serial que es Recto
  //      digitalWrite(8, LOW);
  //     tresdigitos = 0;
  //  }
 DES10 [4] = Serial.read();
  switch (DES10 [4]) {
  case '1':
    Serial.println(" Desvio 10 Recto");
    break;
  case  '2':
   Serial.println(" Desvio 10 Desviado");
    break;
  
    // statements
}
}

Keypad_Desvios.ino (5.06 KB)

Sugiero introducir el concepto del caracter terminal, por ejemplo '#' podría ser el caracter terminal y cuando se lo aprieta se da por finalizado el ingreso de datos y luego evaluas el dato ingresado. Asi podrás habilitar dos, tres, cuatro y cualquier otro numero de cifras siempre y cuando se finalice con '#'.

Hola Tony y bienvenido al foro Arduino.

Te diste cuenta que estas usando dos veces los pines 8 y 9 ?

byte pinesFilas[FILAS] = {9, 8, 7, 6};       // pines correspondientes a las filas
byte pinesColumnas[COLUMNAS] = {5, 4, 3, 2}; // pines correspondientes a las columnas
...
void setup() {
	pinMode(13, OUTPUT); // Declaramos que utilizaremos los pins como salida
	pinMode(12, OUTPUT);
	pinMode(11, OUTPUT);
	pinMode(10, OUTPUT);
	pinMode(9, OUTPUT);   //Repetido***
	pinMode(8, OUTPUT);   //Repetido***
	Serial.begin(9600);  // inicializa comunicacion serie
}

Luego cuando usas IF () sin usar {} solo se ejecuta la siguiente linea (una sola).

/ si ya se almacenaron los 2 digitos
if (dosdigitos == 2){
   if (!strcmp(DES1, DES1_Desviado))         // compara digitos ingresados con los char
      Serial.println(" Desvio 1 Desviado");     // imprime en monitor serial que es Desviado
   digitalWrite(13, HIGH);
   if (!strcmp(DES1, DES1_Recto))
      Serial.println(" Desvio 1 Recto");         // imprime en monitor serial que es Recto
   digitalWrite(13, LOW);
}

Desde el IDE Arduino te recomiendo dar "Auto Formato" con Crtl+T y veras este tipo de errores.