Leer de teclado de membrana

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

Espera que lo consulto................................. :disappointed_relieved: nada, los espíritus hoy deben estar de huelga. :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....?

Ahí va el código.

#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:

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

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).

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: Arduino Playground - Keypad Library

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,...)?

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

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().

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);
  }
}

SIgue haciendo el mismo parpadeo. Estoy probando con un 'while' pero el led se me queda fijo. :expressionless:

Ya lo tengo! Gracias jorgepl por todo :*

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);
  }
}