Esto es una máquina de estados
switch (estado) {
case 0: digitalWrite(pinPiezo, HIGH);
estado = 1;
start = millis() + TON; // tiempo que suena
break;
case 1: if (millis()>start) {
digitalWrite(pinPiezo, LOW);
estado = 2;
start = millis() + TOFF; // tiempo que suena
}
break;
case 2: if (millis()>start) {
estado = 0;
}
break;
default: break;
}
parece y luce como compleja pero no lo es.
Primero tiene una variable que la controla.. se llama estado en este caso.
Estado toma valores 0..1..2.. y vuelve a 0
Cada vez que te encuentras en un estado se ejectua solo una acción y no otra.
Entonces si miras.. comienzas con estado = 0
con estado = 0 solo se ejecuta esto
digitalWrite(pinPiezo, HIGH);
estado = 1;
start = millis() + TON; // tiempo que suena
break;
Activas el buzzer
pones la variable estado = 1 o sea que cuando vuelva a pasar no lo hará mas por esta parte.
cargas la variable start con el vallor de millis() mas TON
Eso es lo mismo que cargar una variable con el valor actual de un cronometro mas el momento que tu quieres usar para hacer algo.
Tu TON se va a mantener durante ese tiempo.
El programa se ejecuta y acabo de darme cuenta que esto
delay(1000) debe borrarse
en el siguiente ciclo el switch case pasara por case 1:
pero como no se da la condición hasta que millis() supere a start entonces seguirá varios ciclos hasta que se cumpla
Cuando se cumpla apagará el buzzer.
Ahora repite lo anterior pero para el tiempo en que quieres que se mantenga en silencio.
De nuevo le cambia el estado a 2
Espera a que se cumpla el tiempo TOFF y cuando lo haga pone estado = 0 y repite el ciclo.
Bien, repito, tengo un error que es delay(1000) al final.
aunque eso hace que tu variable t++ funcione, no debería estar.
asi que me dices si quieres corregirlo o se te ocurre como.
Usar millis() implica un cambio drástico a usar delay, pero tiene grandes ventajas. Fundamentalmente nada detiene el flujo del programa y entonces toda acción ocurre rápidamente.
millis() es un cronométro que se incrementa cada milisegundo desde que Arduino se energiza.
asi que 5 seg despues millis() puede tener un valor como 5030 milisegundos
si tu quieres hacer que algo actue 10 segundos despues , lo que haces es capaturar el valor de millis() y sumar lo que quieres.
Veamos para TOFF.
capturamos en start = millis() + TOFF = 5030 + 10000 = 15030 o sea
cuando el if (millis()>start) o sea cuando millis() valgoa 15031 > 15030 entonces hara la instrucción if.
y la acción que corresponda.