Queremos que al presionar un botón esto provoque que un led se encienda y quede encendido hasta que volvamos a presionar el botón, en entonces se apagará, permaneciendo apagado. Lo que estamos haciendo es simular, con un pulsador, el comportamiento de un interruptor de encendido apagado (on off). O dicho de otra forma, lo que queremos es que el pulsador se comporte como el interruptor de la luz que tenemos en una habitación.
Veamos el proyecto.
Material necesario
- Arduino UNO
- cable USB para conectar el Arduino al ordenador
- cables variados para las conexiones
- un pulsador de 4 patillas
- un led
- una resistencia de 220 ohomios para proteger el led
- una resistencia de 100 KΩ para el pull down
- el IDE de Arduino instalado en un PC
Esquema eléctrico
El botón de cuatro patillas se tiene que conectar en la posición correcta ya que girado 90º no funcionará. Las cuatro patillas están conectadas electricamente dos a dos antes de pulsar.
Código
const int LED =13;
const int BOTON = 7;
int estadoBoton = 0;
int estadoLed = 0;
int oldBoton = 0;
void setup(){
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(BOTON,INPUT);
}
void loop() {
estadoBoton= digitalRead(BOTON);
if ((estadoBoton == 1) && (oldBoton == 0)){
estadoLed=1-estadoLed;
delay(10);
}
oldBoton = estadoBoton;
digitalWrite(LED, estadoLed);
Serial.println(estadoLed);
}
En el código podemos ver porqué este proyecto se llama "Botón con memoria". Hemos tenido que crear una variable denominada oldBoton para guardar el estado anterior del botón.
Proyecto funcionando
Método 2
Una variante del proyecto está disponible en le siguiente enlace.
https://www.tinkercad.com/things/8xNexPpws9c
El código de este segundo método es el siguiente.
int BOTON = 7;
int LED=13;
int estadoLed=LOW;
void setup (){
pinMode(BOTON,INPUT);
pinMode(LED,OUTPUT);
digitalWrite(LED,LOW);
}
void loop(){
while(digitalRead(BOTON)==LOW);
estadoLed = digitalRead(LED);
digitalWrite(LED,!estadoLed);
while(digitalRead(BOTON)==HIGH);
}
En el void setup hemos añadido una línea que dice:
digitalWrite(LED,LOW);
Esta línea, en teoría no sería necesaria ya que el led inicialmente se supone que estará apagado. Con ella forzamos a que comience estando apagado.
En el void loop tenemos una primera línea que dice:
while(digitalRead(BOTON)==LOW);
Lo que hace la línea anterior es esperar mientras el botón no se pulse. El punto y coma al final cierra el bucle, que no hace nada más que repetirse continuamente hasta que se pulse el botón, en cuyo caso ya se salta a la siguiente línea.
La segunda línea del void loop nos dice lo siguiente.
estadoLed = digitalRead(LED);
Esta línea toma en la variable estadoLed si el LED está encendido (1 o HIGH) o apagado (0 o LOW). Puede resultar un tanto extraño que usemos un digitalRead con el led que hemos declarado previamente como de salida (OUTPUT). Lo que se hace con ello es conseguir leer el estado (LOW o HIGH) que previamente le hemos enviado al led por el pin digital.
La tercera línea del voice loop es la siguiente.
digitalWrite(LED,!estadoLed);
Con la línea anterior lo que hacemos es cambiar el estado del led. El símbolo de admiración (!) es una negación. Cambia 0 por 1 y 1 por 0.
En teoría el voice loop ya estaría resuelto y debería funcionar, pero en la práctica a este código le falta una línea más que solucione el problema de los rebotes. Un rebote al presionar un pulsador surge cuando el contacto que hace la parte metálica no es tan ideal como imaginamos. Al pulsar no se pasa instantáneamente del estado LOW al HIGH, o viceversa. Lo que sucede es que el contacto no es perfecto y se pueden generan ceros y unos hasta que quede bien pulsado el botón. Por ello, hemos añadido la última linea.
while(digitalRead(BOTON)==HIGH);
La línea anterior lo que hace es esperar mientras la lectura del botón continúe arrojando unos.
Esto se puede aprecia al conectar el monitor serie y ver que los ceros y unos tardan un poco en estabilizarse al presionar el pulsador. En el método 1 si se añadió el código necesario para poder ver el monitor serial. En este segundo método no lo hemos añadido pero se podría hacer de forma análoga.