Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.
Revisa si funciona
const int buzzer = 3;
const int boton = 4;
const int led = 5;
bool estbt, estbtAnt = 1;
int estado, estadoAnt = 0;
unsigned long t;
void setup() {
Serial.begin(9600);
pinMode(boton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
Serial.println("Iniciando.");
}
void loop() {
estbt = digitalRead(boton);
if (estbt && !estbtAnt){
Serial.println("Pulsado");
estado = !estado;
if (estado)
t = millis();
delay(10);
}
//if (estbt != estbtAnt ) {
// Serial.println(estbt?"Activo":"Apagado");
//}
estbtAnt = estbt;
if (estado) {
if (millis() - t > 3000UL) {
tone(buzzer, 550, 550);
Serial.println("Apagando");
estado = 0;
}
}
if (estado != estadoAnt ) {
Serial.println(estado?"Activo":"Apagado");
digitalWrite(led, estado);
}
estadoAnt = estado;
}
Esto que hice funciona siempre y cuando no haya rebote (en realidad simpre lo hay) o es tal que no afecta el control que acabo de mostrarte.
No expliqué nada porque quería que lo probaras y si funciona, ahora si te lo explico.
Lo que hice fue mira el cambio de flancos.
Observa esta instrucción
estbt = digitalRead(boton);
if (estbt && !estbtAnt){
es lo mismo que
estbt = digitalRead(boton);
if (estbt == HIGH && estbtAnt == LOW){
Aca lo que busco es que el estado del pulsador pase de LOW valor anterior almacenado en estbtAnt a HIGH cuando lees el estado actual con estbt.
Entonces cada vez que el pulsador pasa de LOW a HIGH, tu cambias una variable que llamé
estado entre 0 y 1
Siempre con !estado le estoy negando el estado que tiene almacenado.
Si tiene 0 => !0 = 1 si tiene 1 => !1 = 0
es lo mismo que decir Niego a 0 = 1 o Niego a 1 = 0 pero en terminos de algebra de booles se escribe NOT 0 = 1 o NOT 1 = 0.
Solo para que quede bien claro.
El truco entonces es que por cada variable con la que lees un botón agregas otra variable con el valor ultimo que tuvo y la llamo Anterior o Ant.
Y la actualizo luego de hacer las consultas o al final del loop. Por orden yo lo hago cuando termino todos los if o condicionales que use la variable anterior.
Y se acabó.
Pero hay algo mas. No uso delay y mira como lo escribo. Delay detiene todo código y si le pones algo como delay(3000) se quedará de brazós cruzados el arduino por 3 segundos.
Asi que millis() se encarga de eso.
Qué es milllis()? Ve a documentación y lee al respecto hay excelentes tutoriales de lo que he hecho ahi.
Pero basicamente no he detenido el flujo del loop, el mismo sigue funcionando y atento a TODO lo que hagas. Pulsaciones, cambios, etc.
Ves que si uso un delay(10) porque en la simulación no me funcionaba bien.
Prueba si puedes prescindir de el.