Tutorial sobre conmutadores para Arduino, ESP8266 y ESP32

En este tutorial aprenderás sobre los diferentes tipos de interruptores. También sabrás en qué consiste el problema de desbordamiento y cómo solucionarlo.

Hay dos tipos diferentes de interruptores:

  • Botones que pierden la conexión cuando se sueltan. Los botones alimentan un dispositivo mientras el botón esté pulsado.
  • Interruptores que mantienen el estado cuando se pulsa el interruptor para mantener la conexión mientras se vuelve a pulsar el interruptor.

Los botones y los interruptores pueden tener un problema de rebote, que puede llevar a errores funcionales en su programa. En este artículo te muestro cómo arreglar este problema con una solución de software y otra de hardware.

Cambiar miniatura

6. Febrero de 202111. Agosto de 2019 por cdaviddav

Tutorial sobre conmutadores para Arduino, ESP8266 y ESP32

Hay dos tipos diferentes de interruptores:

  • Botones que pierden la conexión cuando se sueltan. Los botones proporcionan energía a un dispositivo siempre que se presione el botón.
  • Interruptores que mantienen el estado cuando se presiona el interruptor para mantener la conexión mientras se presiona el interruptor nuevamente.

Los botones e interruptores pueden tener un problema de rebote, lo que puede causar errores funcionales en su programa. En este artículo, le muestro cómo solucionar este problema con una solución de software y hardware.

Cambiar miniatura
Publicidad

¿Cómo funcionan los interruptores?

Quizás se pregunte por qué el interruptor de cuatro pines tiene 4 patas. ¿Cómo conectamos el interruptor a otros componentes?

Si el interruptor de cuatro pines no está presionado, los pines A y C están conectados, así como los pines B y D. Si el interruptor está presionado, la conexión de los pines cambia y todos los pines están conectados entre sí. Por lo tanto, no hay diferencia si conecta el componente que desea encender al pin B o al pin D en el otro lado del botón.

Cambiar

La siguiente tabla le brinda una descripción general de todos los componentes y partes que utilicé para este tutorial. Recibo comisiones por compras realizadas a través de los enlaces de esta tabla.

Arduino NanoAmazonAliExpress
Arduino Pro MiniAmazonAliExpress
Arduino UnoAmazonAliExpress
Arduino MegaAmazonAliExpress
ESP32 ESP-WROOM-32AmazonAliExpress
ESP8266 NodeMCUAmazonAliExpress
ESP8266 WeMos D1 MiniAmazonAliExpress
Resistencia y LED en el paqueteAmazonAliexpress
Kit de botonesAmazonAliexpress
Kit de condensadoresAmazonAliexpress

Diferencia entre circuitos de resistencia pull-down y pull-up

Si desea conectar uno o más interruptores a su microcontrolador Arduino, ESP8266 o ESP32, debe usar un pin de E / S digital para leer el estado actual del interruptor o botón. Ahora la pregunta es ¿cómo conectar el segundo pin del interruptor? ¿Debería conectar el segundo pin a la alimentación oa tierra?

La respuesta a esta pregunta depende de su objetivo y también debe agregar una resistencia en el circuito. De lo contrario, cuando el interruptor está abierto, el pin digital no está conectado a GND o 5V y el estado del pin no estaría definido.

Hay dos configuraciones diferentes sobre cómo se agrega la resistencia al circuito y cómo se conecta el segundo pin del interruptor.

  • Agregue una resistencia desplegable cuando la señal debería ser BAJA si el interruptor está abierto
  • Agregue una resistencia pull-up si la señal debe ser ALTA si el interruptor está abierto.

La siguiente sección describe la diferencia entre resistencia pull-down y pull-up resistor y muestra cómo conectar todos los componentes con diferentes placas de microcontroladores Arduino, ESP8266 y ESP32.

Si crea un programa, ese programa es independiente de la diferencia en el circuito si usa una resistencia pull-down o pull-up.

Configurar un circuito desplegable con una resistencia

El siguiente circuito muestra el cableado de desenrollado entre un Arduino Uno, la resistencia y un botón. El botón está conectado a la fuente de alimentación y al pin digital. La resistencia está conectada al mismo pin digital y a la misma tierra.

Circuito de resistencia pull-down

Arduino Nano

Cableado Arduino Nano de resistencia de extracción

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.

Arduino Pro Mini

Cableado de resistencia Arduino Pro Mini Pull Down

Arduino Uno

Cableado de resistencia abatible Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.

Arduino Mega

Cableado Mega Arduino de resistencia abatible

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.

ESP32 ESP-WROOM-32

Cableado de la resistencia de tracción ESP32 ESP-WROOM-32

ESP8266 NodeMCU

Resistencia de extracción ESP8266 cableado NodeMCU

ESP8266 WeMos D1 Mini

Resistencia de cableado hacia abajo ESP8266 WeMos D1 Mini

Cuando no se presiona el botón, la resistencia desplegable permite que fluya una pequeña corriente entre el pin digital y GND. Por lo tanto, la entrada digital se reduce a LOW. Si se presiona el botón, el pin digital se conecta a la fuente de alimentación de 5V del Arduino Uno y por lo tanto la entrada digital es ALTA.

Configuración de un circuito de tracción con una resistencia.

En el caso de un circuito de resistencia pull-up, la resistencia pull-up conecta el pin digital y 5V. Por lo tanto, la entrada digital se eleva a 5V. Solo si el interruptor está cerrado, el pin digital está conectado a GND.

Las siguientes imágenes muestran el diagrama de circuito del Arduino Uno con la resistencia pull-up y el cableado para varias placas de microcontroladores Arduino, ESP8266 y ESP32.

Tire hacia arriba de la resistencia

Arduino Nano

Cableado de la resistencia de tracción Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.

Arduino Pro Mini

Cableado del Arduino Pro Mini Pull Resistor

Arduino Uno

Cableado de la resistencia de tracción Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.

Arduino Mega

Cableado de resistencia Arduino Mega Pull

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.

ESP32 ESP-WROOM-32

Cableado de la resistencia pull-up ESP32 ESP-WROOM-32

ESP8266 NodeMCU

Pull Up Resistor ESP8266 NodeMCU cableado

ESP8266 WeMos D1 Mini

Cableado de resistencia de pull-up ESP8266 WeMos D1 Mini

Controla un LED con una resistencia desplegable y un botón

En el siguiente ejemplo, queremos controlar un LED, que está conectado con un botón y una resistencia desplegable. El propósito del boceto es que el LED esté apagado, cuando no se presiona el botón, y el LED está encendido mientras se presiona el botón. Por supuesto, puede insertar el LED en el circuito del botón para obtener esta funcionalidad, pero en este artículo queremos leer el estado del botón para controlar el LED.

Las siguientes imágenes muestran el cableado entre todos los componentes en diferentes placas de microcontroladores Arduino, ESP8266 y ESP32 para el circuito de resistencia desplegable.

Arduino Nano

Cableado LED Arduino Nano Pull Down Resistor

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.

Arduino Pro Mini

Cableado de resistencia abatible LED Arduino Pro Mini

Arduino Uno

Alambrado Resistencia LED Arduino Uno hacia abajo

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.

Arduino Mega

Cableado Pull Down Resistor LED Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.

ESP32 ESP-WROOM-32

Resistor de cableado Pull Down LED ESP32 ESP-WROOM-32

ESP8266 NodeMCU

Cableado LED de resistencia de extracción ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Resistencia de cableado Pull Down LED ESP8266 WeMos D1 Mini

Después del cableado, podemos sumergirnos en el código del programa Arduino, que es muy fácil de entender y se presenta en el siguiente cuadro.

// for Arduino microcontroller
int button_pin = 7;
int LED_pin = 4;

// for Arduino microcontroller
//int button_pin = D6;
//int LED_pin = D7;

// for Arduino microcontroller
//int button_pin = 4;
//int LED_pin = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LED_pin, OUTPUT);
  pinMode(button_pin, INPUT);
}

void loop() {
  int switchStatus = digitalRead(button_pin); 
  digitalWrite(LED_pin, switchStatus); 
}

En la primera parte del código del programa tenemos que definir los pines conectados del microcontrolador. En este ejemplo tenemos el interruptor y el LED que están conectados al microcontrolador Arduino, ESP8266 o ESP32. Dado que el script se puede usar para placas de microcontroladores Arduino, ESP8266 y ESP32, debe seleccionar cada tercera sección del código del programa y comentar las otras dos secciones, como hice para el ESP8266 y el ESP32, o eliminar las secciones.

En la función de configuración establecemos la velocidad en baudios de la conexión USB serial a su PC a 9600 que debería ser la misma en el monitor serial de su Arduino IDE. También necesitamos declarar el pin del botón como entrada y el pin LED como pines de salida.

En la función de bucle, leemos el estado actual del botón en el circuito desplegable, es decir, ALTO si el botón está abajo y BAJO si el botón no está abajo y escribimos exactamente el mismo estado en el LED. Por lo tanto, si se presiona el botón, el estado del LED cambia de BAJO a ALTO y el LED se enciende.

El siguiente video muestra que el LED se enciende cuando presiono el botón.

Cambiar la funcionalidad del botón a un interruptor

Es posible modificar el boceto que el botón utilizado tiene la funcionalidad de un interruptor. El LED solo se enciende y apaga si se presiona el botón y mantiene su estado. Por lo tanto, los estados del LED y el interruptor deben almacenarse en variables para comparar el último estado con las entradas actuales. Si el botón se presiona continuamente, los estados no deben cambiarse.

El cableado no se cambia, pero las siguientes secciones muestran el código de programa que se cambia.

// for Arduino microcontroller
int switch_pin = 7;
int LED_pin = 4;

// for Arduino microcontroller
//int switch_pin = D6;
//int LED_pin = D7;

// for Arduino microcontroller
//int switch_pin = 4;
//int LED_pin = 0;

int switchStatusLast = LOW;  // last status switch
int LEDStatus = LOW;         // current status LED

void setup() {
  Serial.begin(9600);
  pinMode(LED_pin, OUTPUT);
  pinMode(switch_pin, INPUT);
}

void loop() {
  int switchStatus = digitalRead(switch_pin);   // read status of switch
  if (switchStatus != switchStatusLast)  // if status of button has changed
      {
        // if switch is pressed than change the LED status
        if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus;
        digitalWrite(LED_pin, LEDStatus);  // turn the LED on or off
        switchStatus = switchStatusLast;
      }
}

La primera parte sigue siendo la misma, pero tenemos que definir dos nuevas variables con el estado inicial BAS que almacena el último estado del interruptor y el LED.

En la función de bucle, leemos el estado actual del botón. Si este estado es diferente al anterior, por ejemplo, se presiona el botón (señal digital de LOW a HIGH) o se suelta (señal digital de HIGH a LOW), ingresamos un segundo if request que solo es cierto si el botón está presionado (el último estado es BAJO y el estado actual es ALTO). En este caso, cambiamos el estado del LED. Si el LED estaba apagado (LOW), el estado del LED cambia a HIGH y si el LED estaba encendido (HIGH), cambiamos el estado a LOW. Este estado cambiado se escribe en la función digitalWrite para controlar el LED. El último paso es guardar el estado actual del conmutador como último estado antes de iniciar la función de bucle desde el principio.

El siguiente video muestra la función del interruptor en acción. En el video, también puede ver el problema común de eliminación de rebotes que resolvemos en los siguientes capítulos de este artículo.

Controle un LED con una resistencia pull-up y un botón

Con la resistencia pull-up queremos que el LED esté encendido cuando no se presiona el botón y si presionamos el botón el LED debe apagarse. Básicamente, la funcionalidad es la opuesta al circuito desplegable y tiene la ventaja de que usted sabe directamente que puede haber un cable roto en el circuito si el LED está apagado y no presiona el botón. En un circuito de desplazamiento, sabes que hay un problema dentro del circuito solo hasta que presionas el botón. Si tiene circuitos críticos, debería preferir la resistencia pull-up.

La siguiente imagen muestra el cableado de la resistencia pull-up y el botón, así como el LED en combinación con diferentes placas de microcontroladores Arduino, ESP8266 y ESP32.

Arduino Nano

Cableado LED Arduino Nano Pull Up Resistor

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.

Arduino Pro Mini

Cableado de resistencia LED Arduino Pro Mini Pull Up

Arduino Uno

Cableado LED Arduino Uno Pull Up Resistor

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.

Arduino Mega

Cableado Mega Arduino LED de resistencia de extracción

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.

ESP32 ESP-WROOM-32

Tire hacia arriba de la resistencia de cableado LED ESP32 ESP-WROOM-32

ESP8266 NodeMCU

Cableado de LED de resistencia de tracción ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Cableado Pull Up Resistor LED ESP8266 WeMos D1 Mini

El código del programa no depende de su circuito y de si está utilizando una configuración desplegable o pull-up con su resistencia. Por lo tanto, estamos usando el mismo código de programa que se usó para la configuración desplegable.

// for Arduino microcontroller
int button_pin = 7;
int LED_pin = 4;

// for Arduino microcontroller
//int button_pin = D6;
//int LED_pin = D7;

// for Arduino microcontroller
//int button_pin = 4;
//int LED_pin = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LED_pin, OUTPUT);
  pinMode(button_pin, INPUT);
}

void loop() {
  int switchStatus = digitalRead(button_pin); 
  digitalWrite(LED_pin, switchStatus); 
}

El siguiente video muestra la configuración de dominadas con la resistencia. Verá que si no presiono el botón, el LED se enciende y si presiono el botón, el LED se apaga.

Explicación del problema de rebote con los botones.

Cuando se presiona un interruptor o botón, los contactos de metal en los puntos de contacto pueden hacer que los puntos de contacto se toquen entre sí varias veces. Por lo tanto, el contacto rebota antes de hacer contacto permanente. Es posible que se pregunte qué problema podría surgir debido al rebote de los contactos. El problema es que la velocidad del reloj de Arduino es de 16 MHz, lo que resulta en 16 millones de operaciones por segundo. Por lo tanto, Arduino reconocerá que los contactos que rebotan han cerrado y abierto los contactos varias veces seguidas. La siguiente imagen muestra este comportamiento en el osciloscopio cuando presiona un botón.

Problema con el botón anti-rebote
Problema con el botón anti-rebote

En la primera imagen, puede ver claramente que cuando se presiona el botón, el voltaje solo alcanza alrededor de 1.8V en lugar de 5V. Este comportamiento da como resultado un LED que no responde cuando se presiona el interruptor o botón. Solo cuando se presiona el botón por segunda vez, los contactos internos se conectan y se alcanza la tensión de funcionamiento de 5 V y el LED permanece encendido.

Se puede mostrar el mismo comportamiento cuando intento apagar el LED en el segundo cuadro. El voltaje de trabajo es de 5V y presiono el botón. El voltaje cae dos veces a alrededor de 4V y vuelve a rebotar a 5V. La tercera vez, el voltaje cae a alrededor de 1 V pero también vuelve a bajar a 5 V. Solo cuando presiono el botón por cuarta vez, se suelta el interruptor y se apaga el LED.

Este comportamiento es un gran problema en la vida real porque desea presionar varias veces en un para encender o apagar una luz en su cocina? No creo.

Es bueno saber que hay dos soluciones de software y una solución de hardware para resolver este problema llamado problema de eliminación de rebotes.

Dos soluciones de software contra el problema del rebote

Hasta donde yo sé, hay dos soluciones de software contra el efecto antirrebote. En las siguientes secciones, explico ambas soluciones antes de mostrarte también una solución de hardware.

Agregar retraso al leer el estado del botón

La primera solución de software es bastante simple e inicia un retraso y luego lee el estado nuevamente. El tiempo entre las dos lecturas de entrada se define mediante un retraso. Si la demora es demasiado corta, el cambio aún se puede limitar.

// for Arduino microcontroller
int switch_pin = 7;
int LED_pin = 4;

// for Arduino microcontroller
//int switch_pin = D6;
//int LED_pin = D7;

// for Arduino microcontroller
//int switch_pin = 4;
//int LED_pin = 0;

int switchStatusLast = LOW;  // last status switch
int LEDStatus = LOW;         // current status LED

void setup() {
  Serial.begin(9600);
  pinMode(LED_pin, OUTPUT);
  pinMode(switch_pin, INPUT);
}

void loop() {
  int switchStatus = digitalRead(switch_pin);   // read status of switch
  if (switchStatus != switchStatusLast)  // if status of button has changed
      {
        delay(50);     // debounce time of 50 ms
        switchStatus = digitalRead(switch_pin);   // read the status of the switchPIN again
        if (switchStatus != switchStatusLast) // if the status of the button has changed again
        {
          // if switch is pressed than change the LED status
          if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus;
          digitalWrite(LED_pin, LEDStatus);  // turn the LED on or off
          switchStatus = switchStatusLast;
        }
      }
}

Puede ver en las siguientes imágenes del osciloscopio que la presión y el voltaje de liberación son más suaves que sin una solución de software. Esto da como resultado el comportamiento de que cuando se presiona el botón una vez, la luz indicadora se enciende o apaga. El siguiente video también muestra el resultado de la solución de software contra la eliminación de rebotes.

apurarse

Solución de software para resolución de problemas

Salida

Solución de software para resolución de problemas

Estados del botón Guardar: no recomendado

Una segunda solución de software posible contra la eliminación de rebotes es continuar demorando hasta que no haya más cambios en el estado del interruptor al final del tiempo de eliminación de rebotes. Por lo tanto, el estado del interruptor debe almacenarse en tres momentos diferentes:

  • Estado antes de la activación del interruptor (switchStatusLast)
  • Estado durante el tiempo de antirrebote (switchStatusDebounce)
  • Estado de la última pulsación del interruptor (switchStatus)

Si el estado ha cambiado y está presente durante más tiempo que el tiempo de antirrebote preestablecido, se puede cambiar el estado del LED. Para comparar el tiempo de supresión de rebotes con la última vez que se presionó el interruptor, debemos establecer la hora en que se presionó por última vez como sin firmar. variable porque el número entero tiene un límite superior de (2 ^ 15-1) ms o 33 segundos. El valor máximo largo sin signo es (2 ^ 32-1) ms o 50 días.

Pero también hay una solución mucho mejor que guardar el estado del interruptor 3 veces porque también es posible resolver el problema con el interruptor antirrebote con una solución de condensador de hardware.

Soluciones de hardware al problema del rebote

La posible solución de hardware para resolver el problema de antirrebote es utilizar un condensador en el interruptor. Mientras no se presione el interruptor, el capacitor se carga. Cuando se presiona el interruptor, el condensador se descarga mientras la señal del interruptor al Arduino es ALTA. Durante el rebote, la energía del condensador mantiene la señal de conmutación ALTA. Una combinación de resistencia-condensador recomendada es una resistencia pull-up de 10 kΩ y un condensador de 10 µF.
La velocidad a la que el capacitor se carga y descarga depende de la resistencia R y la capacitancia C. La ecuación del voltaje del capacitor después de t segundos

  • la carga es V (1- ^ e (-t / RC)) y
  • la descarga es V (e (-t / RC))

Por lo tanto, cuanto mayor sea el valor de RC, mayor será el tiempo de eliminación de rebotes. El retardo de supresión de rebotes se puede expresar en 0,693 * RC segundos. Con una combinación de una resistencia pull-down de 10 kΩ y un capacitor de 10 µF, el retardo antirrebote es de 69 ms. Aunque la combinación de resistencia y condensador es de libre elección, se debe usar una resistencia grande para minimizar la corriente a través de la resistencia.

Las siguientes imágenes muestran el cableado de varias placas de microcontroladores Arduino, ESP8266 y ESP32.

Arduino Nano

Cableado Resistencia LED Condensador Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.

Arduino Pro Mini

Cableado Condensador LED Resistencia Desplegable Arduino Pro Mini

Arduino Uno

Cableado Pull Down Resistor Condensador LED Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.

Arduino Mega

Cableado Resistencia LED Condensador Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.

ESP32 ESP-WROOM-32

Cableado LED Condensador Pull Down Resistor ESP32 ESP-WROOM-32

ESP8266 NodeMCU

Cableado Resistencia LED Condensador ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Cableado LED Condensador Pull Down Resistor ESP8266 WeMos D1 Mini

Debido a que no estamos agregando ninguna solución de software para el problema de la eliminación de rebotes, podemos usar el script de cambio estándar de Arduino que creamos en el capítulo anterior.

// for Arduino microcontroller
int switch_pin = 7;
int LED_pin = 4;

// for Arduino microcontroller
//int switch_pin = D6;
//int LED_pin = D7;

// for Arduino microcontroller
//int switch_pin = 4;
//int LED_pin = 0;

int switchStatusLast = LOW;  // last status switch
int LEDStatus = LOW;         // current status LED

void setup() {
  Serial.begin(9600);
  pinMode(LED_pin, OUTPUT);
  pinMode(switch_pin, INPUT);
}

void loop() {
  int switchStatus = digitalRead(switch_pin);   // read status of switch
  if (switchStatus != switchStatusLast)  // if status of button has changed
      {
        // if switch is pressed than change the LED status
        if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus;
        digitalWrite(LED_pin, LEDStatus);  // turn the LED on or off
        switchStatus = switchStatusLast;
      }
}

Los siguientes dos videos muestran el impacto de la solución de hardware contra el antirrebote con un capacitor de 10 µF y 100 µF. En el video se puede ver que el capacitor de 100µF maneja el LED mucho más tiempo que el capacitor de 10µF si apago el LED con el botón.

Condensador = 10µF

Condensador = 100µF

En la siguiente imagen se ve el aumento de tensión cuando se presiona el botón. Es muy similar a la solución de software.

Solución de resolución de problemas de hardware

La siguiente imagen muestra la tensión durante las fases de compresión y liberación. Puede ver muy bien el impacto del condensador reduciendo el voltaje con el tiempo. La imagen muestra 4 ciclos.

Solución de resolución de problemas de hardware

Conclusión

En este artículo, aprenderá sobre los diferentes tipos de interruptores y resistencias pull-up y pull-down, cómo usarlos y las diferencias.

También aprendiste cuál es el problema con el antirrebote. Además, discutimos las soluciones de hardware y software contra el problema de supresión de rebotes.

Espero que hayas recomendado este artículo. ¿Tiene más preguntas sobre interruptores? Utilice la sección de comentarios a continuación para hacer sus preguntas.


Deja un comentario