Buenos días/tardes. Me he encontrado con el caso del código de encender y apagar un led con un botón, este principio fue utilizado para realizar una tarea más compleja, pero en esencia es apagar y encender un led al presionar el botón.
Me gustaría que mediante condiciones la variable "estado" sea igual a 0 sin necesidad de presionar el botón, sino con una condición por ejemplo que al contar 5 pulsos de encendido ( para ello necesito presionarlo 9 veces porque el primer pulso enciende y el segundo pulso apaga) encienda el led solo 5 segundos(en lugar de que se quede encendido hasta presionar el botón de nuevo), éste se apague y estado sea igual a 0. Quedando el sketch a la espera de un nuevo pulso y así seguir con el programa de pulsarlo 9 veces (por ejemplo).
Espero que me haya dado a entender bien, de antemano muchas gracias.
Sketch base:
// Práctica encender LED con botón pulsador y luego apagar LED con el mismo
//boton pulsador
int LED =13;
int BOTON = 7;
int val = 0; //val se emplea para almacenar el estado del boton
int estado = 0; // 0 LED apagado, mientras que 1 encendido
int valAntiguo = 0; // almacena el antiguo valor de val
void setup(){
pinMode(LED,OUTPUT);
pinMode(BOTON,INPUT);
}
void loop() {
val= digitalRead(BOTON); // lee el estado del Boton
if ((val == HIGH) && (valAntiguo == LOW)){
estado = 1-estado;
delay(10);
}
valAntiguo = val; // valor del antiguo estado
if (estado==1){
digitalWrite(LED, HIGH);
}
else{
digitalWrite(LED,LOW);
}
}
Lo logré, me gustaría que pudieran aconsejarme para depurar el programa o hacerlo más eficiente, muchas gracias.
// Práctica encender LED con botón pulsador y luego apagar LED con el mismo
//boton pulsador
int LED =13;
int BOTON = 7;
int val = 0; //val se emplea para almacenar el estado del boton
int estado = 0; // 0 LED apagado, mientras que 1 encendido
int valAntiguo = 0; // almacena el antiguo valor de val
int contador;
void setup(){
pinMode(LED,OUTPUT);
pinMode(BOTON,INPUT);
}
void loop() {
val= digitalRead(BOTON); // lee el estado del Boton
if( (estado==1) &&(contador==9)){
digitalWrite(LED, HIGH);
val= HIGH;//////// para que "sense un pulso recibido"
contador=0;
delay (5000);
digitalWrite(LED, LOW);
if ((val == HIGH) && (valAntiguo == LOW)){
estado = 1-estado;
delay(10);
contador++;
}
}
else if ((val == HIGH) && (valAntiguo == LOW)){
estado = 1-estado;
delay(10);
contador ++;
if (contador>8)
{
digitalWrite(LED, LOW);
delay(1000);
val=HIGH;
digitalWrite(LED, HIGH);
delay (5000);
estado=0;
contador=0;
}
}
valAntiguo = val; // valor del antiguo estado
if( (estado==1)&&(contador==9)){
digitalWrite(LED, HIGH);
delay (500);
val=HIGH;
}
else if ((estado==1)&&(contador<9)){
digitalWrite(LED,HIGH);
}
else {
digitalWrite(LED,LOW);
}
}
// Práctica encender LED con botón pulsador y luego apagar LED con el mismo
//boton pulsador
int LED =13;
int BOTON = 7;
int val = 0; //val se emplea para almacenar el estado del boton
int estado = 0; // 0 LED apagado, mientras que 1 encendido
int valAntiguo = 0; // almacena el antiguo valor de val
int contador;
void setup(){
pinMode(LED,OUTPUT);
pinMode(BOTON,INPUT);
}
void loop() {
val= digitalRead(BOTON); // lee el estado del Boton
if ((val == HIGH) && (valAntiguo == LOW))
{
estado = 1-estado;
delay(10);
contador ++;
}
////////PARTE IMPORTANTE////////////// Y EN ESTE ORDEN
if (contador>8)
{
digitalWrite(LED, LOW);
delay(1000);
val=HIGH;
digitalWrite(LED, HIGH);
delay (5000);
estado=0;
contador=0;
}
////////////////////////////////////
valAntiguo = val; // valor del antiguo estado
if ((estado==1)){
digitalWrite(LED,HIGH);
}
else {
digitalWrite(LED,LOW);
}
}
Dos comentarios.
Yo definiría "estado" como bool, entonces
estado = !estado;
Se comprende mejor al leerlo que
estado = 1 - estado;
donde hay que interpretar qué estás haciendo.
Además bool usa 1 byte de memoria e integer usa 2.
La otra, no me gustan esos dos delay() largos, menos aún el.de 5 segundos, en una parte del código que remarcas como importante.
Ten en cuenta que cuando contador es mayor a 8 solo va a apagar el LED 1 segundo y luego encenderlo por otros 5 segundos pero como los delay() paran la ejecución el micro no puede hacer absolutamente nada mas, tal vez ahora no importa pero si posteriormente se te ocurre hacer algo mas en ese tiempo "muerto" vas a estar atado de manos.
Te conviene ir viendo como adaptarlo para usar millis() en lugar de delay().