Pages: [1]   Go Down
Author Topic: Leer de teclado de membrana  (Read 1408 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola! Estoy empezando a usar teclados de membrana y para probarlo estoy usando unos leds, pues bien, me gustaría saber cómo puedo hacer para que un led se encienda mientras tengo pulsada una tecla. Lo único que he conseguido es que se me quede fijo un led.

Gracias de antemano
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Espera que lo consulto................................. smiley-sad-blue nada, los espíritus hoy deben estar de huelga. smiley-wink

¿Puedes poner el código que has hecho? ¿Puedes dar algo más de información sobre el montaje que utilizas, sobre el teclado, sobre el hardware, sobre....?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ahí va el código.

Quote
#include <Key.h>
#include <Keypad.h>

int led1 = 2;
int led2 = 3;
int led3 = 4;

char key;

const byte ROWS = 3; //four rows
const byte COLS = 3; //four columns
//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
};
byte rowPins[ROWS] = {10, 11, 12}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {13, 8, 7}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad myKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup(){
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

void loop(){
  key = ' ';
  key = myKeypad.getKey();
  if(key) {
    switch (key) {
      case '1':
        digitalWrite(led1, HIGH);
        break;
      case '4':
        digitalWrite(led2, HIGH);
        break;
      case '7':
        digitalWrite(led3, HIGH);
        break;
      default:
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
    }
  }
}

El teclado es este:
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No sé qué librerías estás utilizando (tampoco he buscado nada, la verdad), pero prueba con esta modificación:

Code:
void loop()
{
  key = ' ';
  key = myKeypad.getKey();
  if(key) {
    switch (key) {
      case '1':
        digitalWrite(led1, HIGH);
        break;
      case '4':
        digitalWrite(led2, HIGH);
        break;
      case '7':
        digitalWrite(led3, HIGH);
        break;
      default:
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
    }
  }
  else
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  }
}

Supongo que cuando sueltas la tecla myKeypad.getKey() devuelve 0, por lo que no entra en el if (y no puede apagar los leds).
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con lo que me has dicho no se encienden, de hecho hacen un miniparpadeo muy débil. La librería que estoy usando es esta: http://arduino.cc/playground/Code/Keypad
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eso es porque el teclado de membrana que utilizas puede que no permita la pulsación continua, sino que, por cada pulsación, genera un solo pulso (parpadeo del led). Comprueba esto con un polímetro y viendo si cuando pulsas se queda la pata correspondiente a fija o no.

¿Puedes dar algún detalle del teclado (referencia, datasheet, dónde lo compraste,...)?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sí permite pulsación continua, cuando estuve mirando qué pin correspondía con cada fila/columna vi que sólo marcaba cuando lo pulsaba. Del teclado no tengo nada, lo compré aquí, es el de referencia TCD. http://www.micropik.com/pag_varios_teclados.htm
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Según pone en la página de la librería, getKey solo devuelve el valor cuando se pulsa, no cuando se mantiene, para eso debes utilizar getState().

Code:
void loop()
{
  key = ' ';
  key = myKeypad.getKey();
  if(myKeypad.getState()!=IDLE) {
    switch (key) {
      case '1':
        digitalWrite(led1, HIGH);
        break;
      case '4':
        digitalWrite(led2, HIGH);
        break;
      case '7':
        digitalWrite(led3, HIGH);
        break;
      default:
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
    }
  }
  else
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SIgue haciendo el mismo parpadeo. Estoy probando con un 'while' pero el led se me queda fijo. smiley-neutral
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ya lo tengo! Gracias jorgepl por todo  smiley-kiss

Code:
void loop()
{
  key = ' ';
  key = myKeypad.getKey();
  if(myKeypad.getState()!=IDLE){
    switch (key) {
      case '1':
        digitalWrite(led1, HIGH);
        break;
      case '4':
        digitalWrite(led2, HIGH);
        break;
      case '7':
        digitalWrite(led3, HIGH);
        break;
    }
   myKeypad.getState();
  }
  else {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  }
}
Logged

Pages: [1]   Go Up
Jump to: