Go Down

Topic: Matriz de botones (Read 875 times) previous topic - next topic

jhonny195

Jun 30, 2020, 02:17 am Last Edit: Jul 04, 2020, 09:42 pm by surbyte Reason: Titulo Editado
Hola gente vuelvo a ustedes con una consulta dado que no eh encontrado ni fuera (Internet gral) ni dentro del foro algo relacionado.

mi necesidad: Enviar códigos por puerto serie Ej: "H01" al pulsar solo una tecla de una matriz, cada botón es un código diferente "H01", "H02", y así sucesivamente, son 45 códigos en total, todos con el mismo formato una letra y un numero de dos cifras.

y con mi bajo conocimiento no he dado con como cargar eso en el código básico de matriz con librería y me lo mande por serie

esta es ta es la matriz del ejemplo:

Code: [Select]
 {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'}
};


intente hacer esto y no funciona:

Code: [Select]
  { "H01","H02","H03","H04","H05","H06","H07","H08" },
   { "H09","H10","H11","H12","H13","H14","H15","H16" },
   { "H17","H18","H19","H20","H21","H22","H23","H24" },
   { "H25",'2','3','A','1','2','3','A' },
   { '1','2','3','A','1','2','3','A' },
   { '1','2','3','A','1','2','3','A' }
};


imprime cualquier cosa en el puerto serie al ejecutarlo y en Internet veo muchos tuto de como usar una matriz pero hacen lo básico de conexión y la carga de un ejemplo, nada relacionado con mi problema.

Los codigos no puedo modificarlos asi los interpreta el programa

desde ya saludos y muchas gracias

tauro0221

Hi,
Adjunto un link de una tutoria que explica  como leer una matrix 4x4. Tambien aconseja de usar la libreria que puedes  instalar para leer el matrix.

link:https://www.teachmemicro.com/arduino-keypad-interfacing-4x4-matrix/

jhonny195

#2
Jun 30, 2020, 07:26 pm Last Edit: Jul 04, 2020, 09:43 pm by surbyte
Gracias Tauro0221 por el link pero el Eset al seguir el link o intentar buscar en esa pagina manualmente el post en antivirus me bloquea el ingreso.

Amenaza: HTML/ScrInject.B troyano

a parte de eso, mi problema no es leer la matriz, mi problema es como crear el dato que necesito





MODERADOR:
no repitas lo que dice tu compañero.
Lee las normas del foro

tauro0221

Hi,
Okay perdona pero yo no tengo problema con el link. En cuanto a  las variables que debes de mandar de acuerdo a la tecla puedes hacer un for/loop que leea un array que compare con la localizacion de  los caracteres que tienes que enviar de acuerda a la tecla que selecciones.

Code: [Select]
[code]


String mensage[65] = {"H0", "H02", "H03", "H04", "H05", "H06" };
//**********************************************************
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
//*********************************************************
void loop() {
  // put your main code here, to run repeate
  byte key = 1; //para probar el programa cambia el numero de acuerdo a la tecla.

  for (byte cnt = 0; cnt <= 6; cnt++) {
    if (cnt = key ) //compara la tecla de la matrix con el mesaje a trasmitir.
      Serial.print("Mensaje a enviar de acuerdo al tecla de la matrix  = ");
    Serial.println(String(mensage[cnt])) ;
  }
  delay(1000);
}
//***********************************************************
[/code]

jhonny195

Tauro probé ese pedazo de código, funcionaria, no pude conectarlo al código de la matriz este fue mi intento:

 
Code: [Select]

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 5, 4}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String mensage[65] = {"H01", "H02", "H03", "H04", "H05", "H06" };

void setup(){
  Serial.begin(9600);
}
 
void loop(){
  byte key = keypad.getKey();
 
  if (key){
    for (byte cnt = 0; cnt <= 6; cnt++) {
    if (cnt = key ) //compara la tecla de la matrix con el mesaje a trasmitir.
         Serial.println(String(mensage[cnt]));
   }
  }
}


Al presionar un botón el monitor serie solo me muestra que "algo paso", osea me tira la hora del evento pero sale en blanco, presiono los números y muestra que algo quiso llegar por el serie pero llega blanco, como si el Serial.println mandara nada... creo que algo del string eh hecho mal

saludos y gracias por responder

tauro0221

#5
Jul 02, 2020, 07:36 am Last Edit: Jul 02, 2020, 02:50 pm by tauro0221
Hi,
Perdona pero encontre dos problemas. Trata tu sketch adjunto para ver como te trabaja.

Code: [Select]
[code]
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'},
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 5, 4}; //connect to the column pinouts of the keypad

 Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String mensage[65] = {"H01", "H02", "H03", "H04", "H05", "H06" };

void setup(){
  Serial.begin(9600);
}
 
void loop(){
 
  byte key = keypad.getKey();
 delay(1000);
  if (key){
    for (byte cnt = 0; cnt <= 6; cnt++) {
    if (cnt == key ) //compara la tecla de la matrix con el mesaje a trasmitir.
         Serial.println(String(mensage[cnt]));
   }
  }
}
[/code]
 


surbyte

No es mas fácil asi?

Code: [Select]
void loop(){
  byte key = keypad.getKey();
 
  if (key) {
      sprintf(buffer, "H0%c ", key);
      Serial.print(buffer);
  }
}



Yo no veo números mayores a 9 de modo que mantengo el H0 si hay mayores pongo un if(key>9) una cosa sino otra, lo explico como para llegar a 45.

jhonny195

Hola surbyte, claro eso lo puedo concatenar, sigo con el problema de poner dos cifras en la matriz:

(esto es como ejemplo, por eso pongo esta de 4x3)

Code: [Select]
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};


pero si yo a esto: '1' le pongo '45' no me funciona y no se que modificar para que funcione.

busco, leo y trato de interpretar funciones y variables, las entiendo bien, pero se me complica relacionarlas.

lo que me respondio tauro lo probe pero el serial hace el salto de renglon pero no imprime nada


surbyte

Tu error esta en como ingresas los datos.
Deberías hacer algo como esto

Ingresar un dato o dos y luego cerrar dicho ingreso pulsando una tecla como # o *.

Entonces lees que ingresaste '1' y si no recibes  # o * sigues acumulando.

Mira este ejemplo de una calculadora hecha con un teclado 4x4 y un Arduino. Es similar a lo que quieres hacer en el sentido de como cargar los datos.
Solo presta atención a esa parte.


jhonny195

Disculpen el espacio de tiempo, con la pandemia tuve que irme a trabajar al campo para mantener mis ingresos, ahora volví unos días.

Surbyte, no me sirve cargar-almacenar un código y enviarlo por serial, si fuera asi los 48 botones que tengo que configura lo soluciono con una matriz de 3x4.

Lo que estoy armando es para un tablero de  simulador, seria poco tedioso y menos realista que por ejemplo: para ampliar el zoom del GPS 4 veces tenga que escribir 4 veces "C"+"5"+"1"+"#(enter)"


por eso después de mis pruebas y no llegar a nada decidí consultar acá si hay manera de que en cada botón su valor sea una cadena de 3 caracteres

surbyte

#10
Sep 11, 2020, 09:20 pm Last Edit: Sep 11, 2020, 10:24 pm by surbyte
Quote
Lo que estoy armando es para un tablero de  simulador, seria poco tedioso y menos realista que por ejemplo: para ampliar el zoom del GPS 4 veces tenga que escribir 4 veces "C"+"5"+"1"+"#(enter)"
Al menos yo no entiendo que quieres decir con esto.
Entiendo que tu problema es este

Quote
Enviar códigos por puerto serie Ej: "H01" al pulsar solo una tecla de una matriz, cada botón es un código diferente "H01", "H02", y así sucesivamente, son 45 códigos en total, todos con el mismo formato una letra y un numero de dos cifras.
Te respondo que lo mejor es usar algo estilo calculadora donde los números se forma simplemente del mismo modo que los ingresamos en la calculadora.
Número decena primero y unidad después seguido de un caracter del teclado que indica fin.
La H o la C como mencionas no se de donde salen. Supuse que eran códigos fijos y hablaste de "H" por lo que usar "C" es lo mismo pero para cambiar de C a H entonces requieres de algo que lo haga.

En este punto me he perdido.


Tal vez sea esto lo que buscas

Code: [Select]
byte value=0;

void loop() {
  char buffer[20];
  char key = kpd.getKey();
 if (key != NO_KEY)   {
    if ( (key >= '0') && (key<= '9') )  { // si son digitos entonces los acumulo.
       value = value *10;
       value = value + key -'0';
    }
    if ( key == '#' )  {  // si presionas # termina la operacion.
      sprintf(buffer, "H02%d ", value); // solo espero 2 valores si pones mas falla esto.
      Serial.print(buffer);

      Serial.println(value);   // aca deberías usar el sprintf que te sugerí antes con value
      value=0;  // Ponego a 0 para proximo ingreso.
   }
 }
}

jhonny195

Surbyte justamente:

Quote
Lo que estoy armando es para un tablero de  simulador, seria poco tedioso y menos realista que por ejemplo: para ampliar el zoom del GPS 4 veces tenga que escribir 4 veces "C"+"5"+"1"+"#(enter)
te lo traduzco
pulsar C (el codigo lo almacena) = C
pulsar 5 (el codigo lo almacena) = C5
pulsar 1 (el codigo lo almacena) = C51
pulsar # (el # hace las veces de enter ) = el codigo manda la cadena C51 por puerto serie

Eso de ahi es un ejemplo de como usaria lo que vos  me propones (un código que funcione almacenando una cadena de caracteres pulsados en un teclado y después se envie por serie)

eso no me sirve... es muy engorroso para el que lo use

yo necesito que cuando pulse una tecla el arduino me mande el codigo cada tecla tiene su propia cadena.

esto es el keypad normal
Code: [Select]

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}

en bruto esto es lo que yo necesito. (esto tiene un error obvio que es la variable tipo char, puse el recorte para demostrar otra vez lo que necesito, aun asi probe cambiarlo con String y no me funciona tampoco)
Code: [Select]

char keys[ROWS][COLS] = {
 { "H01","H02","H03","H04","H05","H06","H07","H08" },
   { "H09","H10","H11","H12","H13","H14","H15","H16" },
   { "H17","H18","H19","H20","H21","H22","H23","H24" },
   { "H25","H26","H03","H04","H05","H06","H07","H08" },
   { "H09","H10","H11","H12","H13","H14","H15","H16" },
   { "H17","H18","H19","H20","H21","H22","H23","H24" },

surbyte

#12
Sep 16, 2020, 09:48 pm Last Edit: Sep 17, 2020, 04:56 am by surbyte
Entonces asumo que tenes un teclado con mas filas y columas?
Ahi estas mostrando una matriz 6x8 6 filas y 8 columnas
Si fuera el caso no deberías tener problema.

Pero ojo... mira como creas la matriz, dice

char keys[ROWS][COLS]  

char es para caracter y tu pones ahí una cadena de caracteres de 3 bytes.
Una cosa no tiene que ver con la otra.
Tienes varias alternativas como por ejemplo definir un vector con tus "HXX" y que el teclado determine el ínidice de dicho vector.

O sea, tu digitas la tecla 23 y en la posicion 23 tienes "H23"

Esta es mi idea.. a ver si te sirve

Code: [Select]
#include <Keypad.h>
// include the library code:

String datos[12] = {"H01", "H02","H03","H04","H05","H06","H07","H08","H09","H10","H11","H12"};
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  { '1','2','3' },
  { '4','5','6' },
  { '7','8','9' },
  { '*','0','#' }
};
byte rowPins[ROWS] = {  A0, A1, A2, A3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {  2, 3, 4}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


void setup() {
  Serial.begin(9600);
  Serial.println("Demostración de teclado");
  for (int i; i<12; i++) {
      Serial.print(datos[i]);
      Serial.print(" ");
  }
  Serial.println();
 
}

void loop(){
  char key = keypad.getKey();
 
  if (key){
    Serial.print(key);
    Serial.print(" ");
    Serial.println(datos[key-48]);
  }
}


Esta es la salida

Quote
Empezando
H01 H02 H03 H04 H05 H06 H07 H08 H09 H10 H11 H12
1 H02
1 H02
2 H03
2 H03
3 H04
3 H04
4 H05

jhonny195

#13
Sep 17, 2020, 05:51 am Last Edit: Sep 17, 2020, 06:03 am by jhonny195 Reason: toque sin querer la tecla tab(creo)... y se publico
Exacto Surbyte ese es mi problema!!!!

La matriz botonera la voy a armar yo (son los 48 botones en un marco de madera que rodea una pantalla) eso es el menor problema, es solo respetar lineas, columnas y soldar cables

Haber si entiendo lo que me mandas:
Ahí se asocia cada botón de la matriz a una posición del vector porque la variable char es de un solo carácter, ahora siguiendo ese pensamiento como pongo mas de 10 botones si tengo 0 a 9? Cuando tenga que poner el valor 10 en la matriz para la posición 10 del vector sigo en la misma situación.. 



Aca te copio lo que me ofreció un profesor como solución pero no pude comunicarme mas con el y solo me quedo esto (a lo mejor te aporto una opcion mas) a mi no se me prendio el foco en como conectar eso al codigo de una matriz:

Code: [Select]
const char* const array2D[] [2] PROGMEM ={
  {"abc" , "def"};
  {"jkl" , "mno"}
 };

void setup() {
Serial.begin(115200);

  Serial.println(array2D [0] [1];
  Serial.println(array2D [1] [0];
  
}

void loop() {
  // put your main code here, to run repeatedly:

}


El resultado de eso en el COM fue:

Quote
def
jkl

surbyte

Es exactamente lo mismo que yo te sugiero, solo que en el caso de tu profesor usa los datos en la FLASH pero para que si son solo 45.

Go Up