Go Down

Topic: [Tutorial] Teclado para principiantes (Read 90 times) previous topic - next topic

susurrosd

Hola buenas, soy un estudiante de ingeniería novato en el tema de arduino y les expongo un poco el tema.
Hace unos días que empecé con arduino y para un proyecto personal necesitaba hacer uso de un teclado 4x4 que conseguí en un kit de arduino.

Leí bastante sobre como usarlo, casi todo con librerías.
El problema surgió cuando la librería reconocía la tecla pulsada, pero la enviaba sólo una vez. Para que me entendáis necesitaba reproducir la función de un teclado normal. Quiero decir, si mantengo pulsada la tecla "a" quiero obtener "aaaaaaaaa...." y no una sola "a" como obtenía con la librería.
De manera que desarrollé el código que les dejo a continuación por si alguien novato como yo se topa con el mismo problema:
Code: [Select]

//Basciamente actualizaremos el valor de la variable "valor" entre el 1 y el 16 para un teclado 4x4, 
//devolviendo 1 cuando pulsamos el pulsador de la fila 0 y de la columna 0 y devolviendo 16 al pulsar
// el de la fila 3 y columna 3.


volatile int valor=0; //variable de control
const int columna[]={7,6,5,4}; //Definimos los pines de las filas y las columnas por orden
const int fila[]={8,9,10,11};

const int nfilas=4;
const int ncolumnas=4;

volatile int i=0; //variable utilizara para saber si el pulsador se encuentra presionado(flag)

void setup()
{
   Serial.begin(9600);
   for (byte a=0;a<4;a++)
   {
      //configuramos las filas como salidas y las columnas como entradas
      pinMode(fila[a],OUTPUT);
      pinMode(columna[a],INPUT);
   }
  
}
//Si no utilizamos valor como variable global, la podríamos devolver en la función en lugar de un void

void encontrar()
{
  for (int a=1;a<=nfilas;a++)
   {
        digitalWrite(fila[a-1],HIGH);// Ponemos una fila a nivel alto
        if (digitalRead(7)==LOW&&digitalRead(6)==LOW&&digitalRead(5)==LOW&&digitalRead(4)==LOW&&a==1)
        {
            valor=0;
            i=0;
        }
        //comprobamos que si todas están a nivel bajo, no hay ninguna pulsada y lo reflejamos con i=0
    
        else if(i==0) //si no hay ninguna pulsada recorremos las columnas leyendo para ver si encontramos alguna a nivel alto
        {
          for(int b=ncolumnas;b>0;b--)
          {
            if(digitalRead(columna[b-1])==HIGH)
            {      
                valor=b+ncolumnas*(a-1); // Algoritmo para sumar a cada fila el número correspondiente y
                                                        //obtener la salida
                i=1;                                  //Tecla pulsada
            }          
          }        
        }
        digitalWrite(fila[a-1],LOW); //volvemos a dejar a nivel bajo la fila puesta anteriormente a nivel alto,                             
                                                // de manera que podamos comprobar la siguiente fila
   }
}

void loop() {
   encontrar();
// Ahora se ha actualizado valor y aqui escribiriamos el codigo para tomar la decision en funcion de la //tecla pulsada
   Serial.println(valor);
}



Un salduo y espero que les sirva de ayuda

surbyte

#1
Jul 15, 2017, 04:28 am Last Edit: Jul 15, 2017, 04:28 am by surbyte
No repitas la misma consulta!
Esto se llama doble posteo.

Borro el otro hilo duplicado

Go Up