Offline
Newbie
Karma: 0
Posts: 9
|
 |
« on: June 20, 2012, 07:04:19 am » |
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
Full Member
Karma: 0
Posts: 191
|
 |
« Reply #1 on: June 20, 2012, 08:43:28 am » |
Espera que lo consulto.................................  nada, los espíritus hoy deben estar de huelga.  ¿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
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #2 on: June 20, 2012, 10:33:39 am » |
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: 
|
|
|
|
|
Logged
|
|
|
|
|
Spain
Offline
Full Member
Karma: 0
Posts: 191
|
 |
« Reply #3 on: June 20, 2012, 10:40:01 am » |
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).
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #4 on: June 20, 2012, 10:45:55 am » |
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
Full Member
Karma: 0
Posts: 191
|
 |
« Reply #5 on: June 20, 2012, 11:22:49 am » |
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
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #6 on: June 20, 2012, 11:39:45 am » |
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
Full Member
Karma: 0
Posts: 191
|
 |
« Reply #7 on: June 20, 2012, 12:35:44 pm » |
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); } }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #8 on: June 20, 2012, 01:03:51 pm » |
SIgue haciendo el mismo parpadeo. Estoy probando con un 'while' pero el led se me queda fijo. 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #9 on: June 20, 2012, 01:10:41 pm » |
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); } }
|
|
|
|
|
Logged
|
|
|
|
|
|