Go Down

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

jhonny195

perfecto surbite, ya vi y probe que funciona, la pregunta es:

¿Como hago cuando tengo mas de 10 teclas?

el char de aca me permite un caracter:

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


el 10 y el 11 saldran error

el for asigna un valor a la posicion del vector, osea tengo del 0 al 9 (son 10 posiciones) y después?

surbyte

Respuesta simple: necesitas un teclado de mas filas y mas columnas.

Tu teclado debe albergar la cantidad de teclas que deseas representar directamente. Tu mismo lo has puesto asi.
Quieres 45 cosas, entonces 45 teclas.

Usa la combinación que gustes, 9x5 por ejemplo. Arma un teclado con pulsadores y los dispones de froma matricial

jhonny195

me referia al codigo :

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




no puedo poner dos cifras en la matriz viejo, no funciona  { '9','10','11' } si pongo eso los botones correspondientes al 10 y 11  funcionan como el botón 0 y el botón 1 (y todo lo que ponga con dos cifras hace lo mismo, ósea solo lee la unidad del numero)


ese es el problema desde el inicio del post, en la matriz del código no se puede poner nada mayor a un carácter... osea esto ==> { '9', '10' , '11' }

 

surbyte

No se puede poner esto '10' ni nada en adelante.
Eso no es un char sino 2 char y debería ponerse asi "10"

Ahora bien, todo eso plantea una reformulación del código y no se puede usar Keypad.h como esta planteado o tal vez si, porque yo probé de otro modo y al menos compiló.


surbyte

#19
Sep 18, 2020, 04:13 pm Last Edit: Sep 18, 2020, 04:33 pm by surbyte
Mas facil sería armar el scaneo filas, columnas con un código propio y entonces ahi si podes indicarle que corresponde a cada cruce X Y.

Acá tenes algo tomado de una matriz 6x6 o sea 36 botones identificados de este modo

filas de la 2 a la 7 en el UNO
columnas d ela 8 a la 13
pero no hay limite con un MEGA por ejemplo.

En tu caso como te dije, 5x9 te da 45 teclas.


Code: [Select]
include <Arduino.h>

#define BUTTON_COUNT 36
#define KEYPAD_OUTPUT_BEGIN 2
#define KEYPAD_OUTPUT_END 7
#define KEYPAD_INPUT_BEGIN 8
#define KEYPAD_INPUT_END 13


uint8_t keypad_button_pressed[BUTTON_COUNT];
volatile uint32_t ticks;
uint32_t lastTrigger;


ISR(TIMER0_COMPA_vect, ISR_BLOCK) {
ticks++;
}

void init_systicks() {

TCCR0B = _BV(CS02) | _BV(CS00);
TCCR0A = _BV(WGM01);
TIMSK0 = _BV(OCIE0A);

// 8000000/1024/78 == 100HZ -> 10 ms
OCR0A = 77; // !!! must me set last or it will not work!
}

uint32_t math_calc_diff(uint32_t value1, uint32_t value2) {
if (value1 == value2) {
return 0;
}
if (value1 > value2) {
return (value1 - value2);
}
else {
// check for overflow
return (0xffffffff - value2 + value1);
}
}

void keypad_reset_output() {
// configure pull ups
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}

void clear_buttons() {
for(int i=0; i < BUTTON_COUNT; i++) {
keypad_button_pressed[i] = 0;
}
}

void keypad_setup() {
// initialize the digital pin as an output:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);

keypad_reset_output();

pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);

// configure pull ups
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}



// the loop() method runs over and over again,
// as long as the Arduino has power

void keypad_read_buttons() {
clear_buttons();
uint8_t y=0;
for(int i=KEYPAD_OUTPUT_BEGIN; i <= KEYPAD_OUTPUT_END; i++) {
keypad_reset_output();
digitalWrite(i, LOW);
uint8_t x=0;
for(int j=KEYPAD_INPUT_BEGIN; j <= KEYPAD_INPUT_END; j++) {
if (digitalRead(j) == LOW) {
uint8_t index = x+6*y;
keypad_button_pressed[index] = 1;
}
x++;
}
y++;
}
}

uint8_t keypad_button_is_pressed() {
for (int i=0; i < BUTTON_COUNT; i++) {
if (keypad_button_pressed[i]) {
return 1;
}
}
return 0; // no button pressed
}

// The setup() method runs once, when the sketch starts
void setup() {
init_systicks();
keypad_setup();

Serial.begin(9600);
}

void loop() {

keypad_read_buttons();

// allow button processing only every 300ms (30 systicks)
if (keypad_button_is_pressed() && (math_calc_diff(ticks, lastTrigger) > 30)) {
lastTrigger = ticks;

for(int i=0; i < BUTTON_COUNT; i++) {
if (keypad_button_pressed[i]) {
Serial.print(i);
Serial.print(' ');
}
}
Serial.println('-');
}

delay(1);
}


Este enfoque solo muestra que detectas XY teclas mas alla de lo que permite KEYPAD.h
pero luego la idea de que cada tecla se corresponde con el vector es muy fácil.

jhonny195

#20
Sep 18, 2020, 08:08 pm Last Edit: Sep 18, 2020, 10:39 pm by surbyte
MAESTRO Surbyte!!!! eso era...

Esto va a un Arduino MEGA, asi que pienso añadir una columna mas para los 42, y si necesito mas agrego mas..

probando antes de contestar encontre esto al añadir una columna:

Code: [Select]
uint8_t index = x+6*y;   <== en esta linea tengo que cambiar el numero si vario las columnas yo puse 7 en mi caso.

Surbyte muchas gracias, por ahora, disculpas por no expresar de manera correcta mi problema en primera instancia, que nos habría salvado tantos intercambios de mensajes y tiempo.

Saludos

surbyte

Quote
disculpas por no expresar de manera correcta mi problema en primera instancia, que nos habría salvado tantos intercambios de mensajes y tiempo.
Exactamente, luego de tanto tiempo en este foro me llama la atención porque a la gente le cuesta tanto ir de lleno al punto explicando que quieren hacer y como. Sin rodeos, porque supongo yo que algunos creen que lo que estan haciendo es TOP SECRET y también comprendo que otros no sepan explicarlo, de todos modos ya ves, cuando se comprende aparece la solución.

La librería esta pensada para algo mas chico y limitado.
De todos modos yo hice una prueba y toleraba otro modo de ingreso que ahora no viene al caso... daba para jugar un poco o modificarla.
Lo que te he sugerido sirve a tu necesidad asi que.

Code: [Select]
uint8_t index = x+6*y;
si claro esto te permite usar el ínidice para poder transformar la tecla en lo que quieres mostrar o sea ir al vector de String o el que te sugirió el profesor y presentar "HXX", donde XX es el índice

Go Up