Este es el código sugerido el cual encuentro tiene algunos errores.
const int backlights = 6;
const int pulsador = 7;
bool estadoAC = false; // Estado actual del boton
bool estadoAN = false; //Variable para guardar el estado anterior del pulsador
bool estado_led = false;
unsigned long tiempo_actual = 0;
unsigned long tiempo_anterior = 0;
int intervalo = 100;
bool inicio = 0;
void setup(){
pinMode(backlights, OUTPUT);
pinMode(pulsador, INPUT);
}
void loop(){
estadoAC = digitalRead(pulsador);
if (estadoAC && !estadoAN)
estado_led = !estado_led;
estadoAN=estadoAC;
if (estado_led == true){
tiempo_actual = millis();
if (tiempo_actual - tiempo_anterior >= intervalo){
tiempo_anterior=tiempo_actual;
inicio = ! inicio;
}
if (inicio)
digitalWrite(backlights, HIGH);
else
digitalWrite(backlights, LOW);
}
else
digitalWrite(backlights,LOW);
}
El mas importante es que el estado anterior no se actualiza dentro de la rutina al cambiar de estado, sino fuera.
No comparto el modo que se ha usado para generar el parpadeo.
Cuando usamos millis() y queremos que algo cumpla ciertos estados lógicos debemos crear una máquina de estados. Ver: máquina de estados en Documentación => Indice de temas tutoriales => Máquina de estados.
- El estado del pulsador no se actualiza dentro de la rutina al presionar, sino fuera. Debemos en todo momento saber cual es el estado anterior no cuando se presiona, sino estamos tomando un estado particular y siempre el mismo. Asi que primera falla
Acá ves el código que debería funcionar correctamente.
Hay algunos errores como definir intervalor como int. jamás cuando usamos millis() las variables sea cuales sean las definimos como otra cosa diferente de unsigned long. Hay explicaciones en Documentación al respecto.
Acá el código
const byte backlights = 6;
const byte pulsador = 7;
bool estadoAC = false; // Estado actual del boton
bool estadoAN = false; // Variable para guardar el estado anterior del pulsador
bool inicio = false;
unsigned long tiempo_anterior = 0;
unsigned long intervalo = 500;
byte estadoMaquina = 0;
void setup(){
pinMode(backlights, OUTPUT);
pinMode(pulsador, INPUT);
}
void loop(){
estadoAC = digitalRead(pulsador);
if (estadoAC && !estadoAN)
inicio = ! inicio;
if (inicio) {
switch (estadoMaquina) {
case 0: digitalWrite(backlights, HIGH);
tiempo_anterior = millis(); // pongo el LED en ON y inicio la primer pausa.
estadoMaquina = 1; // voy al paso 1
break;
case 1: if (millis() - tiempo_anterior >= intervalo) { // se ha completado la pausa?
digitalWrite(backlights, LOW); // si pausa complata => parpadeo OFF
tiempo_anterior = millis(); // ajusto variable tiempo para proxima pausa
estadoMaquina = 2; // voy al siguiente paso lógico, el 2.
}
break;
case 2: if (millis() - tiempo_anterior >= intervalo) {
estadoMaquina = 0; // vuelvo al primer estado y aseguro el parpadeo ON
}
break;
}
}
else
digitalWrite(backlights, LOW);
estadoAN = estadoAC;
}
Como verás al final se actualiza el estado anterior
estadoAN = estadoAC;
Ese es el error que mencioné antes.
En mi interpretación del enunciado original, dice algo como "se presiona el pusador y los leds deben parpadear incluso al soltarlo". No son las mismas palabras pero si la idea.
Entonces en en código inicial solo tenía sentido el parpadeo (a medias) si el pulsador estaba presionado y aún asi dudo que hiciera mucho mas que un ciclo.
En este código, solo vemos el flanco, o sea cuando el pulsado pasa de 0 a 1. En ese caso cambiamos la variable inicio sea true o false.
Si es true entonces hacemos parpadear el led en la máquina de estados y si es false mantenemos apagado el led.
Cuando lo hacemos parpadear usamos una variable que llamé estadoMaquina y definé como byte porque los estados posibles van de 0 a 2 asi que todo lo demas es un exceso de variable incluso int. Podriamos debatir esto pero no es tema de este hilo.
cuando inicio vale true, entramos en la máquina de estados con estadoMaquina valiendo 0
Entonces el switch me envia en cada caso a un case (caso). Empezamos por el 0.
Ahi dice:
digitalWrite(backlights, HIGH);
tiempo_anterior = millis(); // pongo el LED en ON y inicio la primer pausa.
estadoMaquina = 1; // voy al paso 1
Encendemos el led, cargamos con el valor de millis() a la variable tiempo_anterior que usaremos para comparar.
Y lo mas importante, finalizado el primer estado, al indicarle estadoMaquina = 1 estamos haciendo que al siguiente ciclo, pasemos al segundo case 1:
En el solo esperamos que millis() - tiempo_anterior >= intervalo
Aca habia un error y era que intervalo debe siempre ser del mismo timpo que millis() y tiempo_anterior o la cuenta no funcionará adecuadamente y tendremos comportamientos no deseados.
Cuando la diferencia supera intervalo apagamos el led.
De nuevo ajustamos el valor de tiempo_anterior con millis() y ponermos un 2 para el ultimo paso logico.
El ultimo paso lógico es muy rapido porque solo sirve para cumplir el tiempo en OFF o apagado del led y cuando eso ocurre rápidamente cambiamos estadmoMaquina a 0 para que al siguiente ciclo se reinicie la máquina de estados y el parpadeo continué.
Todo esto es imperceptible para nosotros.
Puede hacerse mejor, si, pero a los efectos de lo que se pretende es suficiente.
Si tienes dudas no dudes en consultar.