En esta segunda entrega vamos a ver cómo cambiando la función "scanAndSet", podemos conseguir que el programa se comporte como un interruptor. Es decir: pulso el botón, el LED se enciende, lo vuelvo a pulsar y el LED se apaga. Además, vamos a ver cómo puede hacerse para que de la sensación de que es muy rápido.
Si reemplazamos la función "scanAndSet" por esta:
void scanAndSet ( uint8_t inPin, uint8_t outPin, uint8_t &state )
{
if ( digitalRead ( inPin ) == HIGH )
{
switch ( state )
{
case 0:
state = 1;
digitalWrite ( outPin, HIGH );
break;
case 2:
digitalWrite ( outPin, LOW );
state = 3;
break;
default:
break;
}
}
if ( digitalRead ( inPin ) == LOW )
{
switch ( state )
{
case 1:
state = 2;
break;
case 3:
state = 0;
break;
default:
break;
}
}
}
Conseguimos el efecto que buscamos. ¿Pero cómo leñes funciona?
Para aclararnos un poco, veamos la imagen adjunta. Cuando el estado es 0, el LED asociado al pin está apagado. Si pulso el botón, cambio el estado a 1 y enciendo el LED. Si mantengo pulsado el botón, me quedo en el estado 1 la siguiente vez que lo llame (0.5s después). Si suelto el botón, estado (state) pasa a valer 2 y me mantengo en este estado hasta que alguien pulse el botón otra vez. Al pulsar el botón otra vez con estado en 2, apago el LED y mi cambio el estado a 3. Si sigo manteniendo el botón pulsado más de 0.5 segundos, me quedo como estoy, pero si lo suelto vuelvo a 0.
Ahora vamos a poner nombres útiles a 0, 1, 2, 3 y veremos lo importante que es dar un valor significativo a las variables y constantes de nuestro código:
0 - APAGADO
1 - ENCENDIDO_BOTON_PULSADO
2 - ENCENDIDO
3 - APAGADO_BOTON_PULSADO
Por ejemplo.
Si además, el delay anterior los reducimos a 100ms, el bucle se ejecutará cada 100ms, dando la percepción al usuario de que se ha encendido la luz de forma instantánea. El delay de 100ms, se puede reducir hasta 50us-100us, menos no, porque sino veríamos los efectos de los rebotes que tienen los pulsadores. Por cierto, esta es una forma muy fácil de implementar un código anti-rebotes.
Si os han parecido útiles estas entregas y os interesa, mañana podemos ver cómo crear un librería que implemente una "variable" tecla y una "variable" interruptor LED, que incluso podáis compartir con otros usuarios. Vamos, a lo C++.