hí im havin a problem with 4x4 keypad

#include <Keypad.h>
#define Rele 13

const byte ROWS = 4; //cuatro fials
const byte COLS = 4; //cuatro columnas
char keys [ROWS][COLS] ={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {7, 6, 5, 4}; //pines filas
byte colPins[COLS] = {3, 2, 1, 0}; //pines columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
Serial.begin(9600);
pinMode(Rele, OUTPUT);
}

void loop()
{ char key = keypad.getKey();
if (key != NO_KEY){
Serial.println(key);

while (key == '1'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(1000); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(1000);
}

while (key == '2'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(850); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(850);
}

while (key == '3'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(650); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(650);
}

while (key == '4'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(450); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(450);
}

while (key == '5'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(50); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(250);
}

while (key == '6'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(250); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(50);
}

while (key == '7'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(150); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(150);
}

while (key == '8'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(50); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(50);
}

while (key == '9'){
digitalWrite(Rele, HIGH); // enciende el rele
delay(30); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(20);
}

while (key == '0'){
digitalWrite(Rele, LOW); // apaga el rele
}
}
}

este es mi codigo y necesito controlar la frencuencia pwm de un rele con un teclado 4x4 con las teclas del 1 al 9 y el 0 apaga el problema es que funciona cada tecla con su frecuencia pero solo una vez y luego en monitor serie no aparecen mas la teclas que toco y queda fija en esa frecuencia y para cambiar de frecuencia necesito resetear la placa alguna ayuda??

At the very least, your "while" statements' bodies do not change the value of key, therefor you will execute that section of code over and over forever if you match a character.

Perhaps "if" would make more sense.

Check the difference between "while" and "if" statements in C/C++.

HTH

a7

The keypress is just an event that would drive the selection of a HIGH and LOW duration, possibly from an array. Then, outside the keypress handling, you need to build a small state machine and use millis() to handle the blinking (see blink without delay and other post about this)

PS/ this is the English forum and please use code tags.

hi! i alredy modify my code but it doesnt work too here is the code modified , now the value change in the serial monitor but it doesnt change the while for example i put 1 the program go into while 1 and then i press 7 and the serial monitor displays 7 but while 1 continue so now i have to know how to exit the while 1may be ihave to use break or continue buti can please help

#include <Keypad.h>
#define Rele 13

const byte ROWS = 4; //cuatro fials
const byte COLS = 4; //cuatro columnas
char keys [ROWS][COLS] ={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {7, 6, 5, 4}; //pines filas
byte colPins[COLS] = {3, 2, 1, 0}; //pines columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
Serial.begin(9600);
pinMode(Rele, OUTPUT);
}

void loop()
{ char key = keypad.getKey();
if (key != NO_KEY){
Serial.println(key);

while (key == '1'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(1000); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(1000);

}

while (key == '2'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(850); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(850);
}

//PRINCIPAL
while (key == '3'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(650); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(650);
}

//PRINCIPAL
while (key == '4'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(450); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(450);
}

//PRINCIPAL
while (key == '5'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(50); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(250);
}

//PRINCIPAL
while (key == '6'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(250); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(50);
}

//PRINCIPAL
while (key == '7'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(150); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(150);
}

//PRINCIPAL
while (key == '8'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(50); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(50);
}

//PRINCIPAL
while (key == '9'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, HIGH); // enciende el rele
delay(30); // retardo en milisegundos
digitalWrite(Rele, LOW); // apaga el rele
delay(20);
}

//PRINCIPAL
while (key == '0'){
char key = keypad.getKey();
Serial.println(key);
digitalWrite(Rele, LOW); // apaga el rele
}
}
}

Again use code tags

You are now in the Spanish forum, so probably best to write in Spanish...
Ahora estás en el foro en español, así que probablemente sea mejor escribir en español ...

**Moderador:**Por si no has comprendido en inglés te lo digo con claridad en español.

  1. No escribas nada en español si usas el foro en inglés o serás derivado inmediatamente a este foro.

  2. Los códigos van con etiquetas. Tienes dos advertencias Post#2 y #4 y no has hecho caso.
    Ahora te lo pido yo. Todos los códigos van con etiquetas </>.
    Ve a More luego modify y estras en modo Edición. Seleccionas todo el código y presionas </> y quedará con etiquetas de código. Lo haces con el post inicial y con el post #3

  3. En este foro no hables en inglés. Solo español.

  4. Lee las Normas del foro

disculpas por el idioma, aun no puedo con las etiquetas podes ayudarme? enviandome un ejemplo al menos o si me lo modificas me sirve gracias

agregue etiquetas de código:
[code]`` [color=blue]// your code is here[/color] ``[/code].

Debe tener un aspecto como este:// your code is here