Inicio / Arduino

Placa de desarrollo Arduino UNO - Botones y LED

El montaje más básico para empezar: dos pulsadores que encienden y apagan un LED. Uno enciende, el otro apaga, y el LED mantiene su estado entre pulsaciones.

Conexiones

Con INPUT_PULLUP el cableado se simplifica mucho: cada botón necesita solo dos hilos y ninguna resistencia externa.

ComponenteConexiónNota
LED1A0 y GNDCon resistencia de 220 Ω
SWITCH1A2 y GNDEnciende
SWITCH2A3 y GNDApaga

Los pines analógicos también valen como digitales

Aunque A0, A2 y A3 se llamen «analógicos», en el Arduino UNO funcionan igual de bien como entradas y salidas digitales con pinMode, digitalRead y digitalWrite. Es útil cuando ya has ocupado los pines digitales con otros módulos.

Código del programa

Arduino / C++
// Definición de pines según el diagrama
const int LED1    = A0;
const int SWITCH1 = A2;  // Botón para encender
const int SWITCH2 = A3;  // Botón para apagar

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(SWITCH1, INPUT_PULLUP);
  pinMode(SWITCH2, INPUT_PULLUP);

  digitalWrite(LED1, LOW);   // LED apagado al inicio
}

void loop() {
  // Si se pulsa Switch 1 -> encender LED
  if (digitalRead(SWITCH1) == LOW) {
    digitalWrite(LED1, HIGH);
  }

  // Si se pulsa Switch 2 -> apagar LED
  if (digitalRead(SWITCH2) == LOW) {
    digitalWrite(LED1, LOW);
  }
}

Cómo funciona

INPUT_PULLUP activa una resistencia interna del Arduino que mantiene el pin en HIGH mientras el botón está suelto. Al pulsarlo, el pin queda conectado a GND y pasa a LOW. Por eso la condición compara contra LOW y no contra HIGH, que es lo que uno esperaría a primera vista.

Gracias a esa resistencia interna el cableado es mínimo: un terminal del botón al pin y el otro a GND, sin resistencias externas.

El LED conserva su último estado. Si pulsas SWITCH1 se queda encendido indefinidamente hasta que pulses SWITCH2, porque nada en el bucle lo apaga por su cuenta.

Por qué aquí no hace falta antirrebote

En los ejemplos del contador hay un delay(200) para frenar el rebote del pulsador. Aquí no hace falta, y la razón es que la operación es idempotente: encender un LED que ya está encendido no cambia nada. Aunque el botón rebote diez veces, las diez lo dejan en el mismo estado.

El antirrebote se vuelve necesario cuando cada pulsación modifica un valor —un contador que suma, un color que avanza—, porque ahí cada rebote cuenta como una pulsación más.

Posibles mejoras

El siguiente paso natural es usar un solo botón que alterne entre encendido y apagado. Eso ya no se puede hacer leyendo el nivel del pin: hay que detectar el flanco, es decir, el instante en que pasa de suelto a pulsado.

Arduino / C++
const int LED1    = A0;
const int SWITCH1 = A2;

bool encendido = false;
int estadoAnterior = HIGH;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(SWITCH1, INPUT_PULLUP);
}

void loop() {
  int estado = digitalRead(SWITCH1);

  // Flanco de bajada: antes suelto (HIGH), ahora pulsado (LOW)
  if (estadoAnterior == HIGH && estado == LOW) {
    encendido = !encendido;
    digitalWrite(LED1, encendido ? HIGH : LOW);
    delay(50);               // Antirrebote
  }

  estadoAnterior = estado;
}

Sin la variable estadoAnterior el LED parpadearía sin control mientras mantienes el botón pulsado, porque el bucle se ejecuta miles de veces por segundo y cada vuelta invertiría el estado.