ESP8266-12E (NodeMCU) – Entradas y Salidas Digitales.

Salidas digitales de control ESP8266 NodeMCU

Primero se debe configurar el GPIO que se desea controlar como SALIDA. Hay que utilizar la función pinMode() de la siguiente manera:

pinMode(GPIO, OUTPUT);

Para controlar una salida digital, solo se necesita utilizar la función digitalWrite(), que acepta como argumentos, el GPIO (número int) al que se refiere y el estado, ya sea HIGH o LOW.

digitalWrite (GPIO, ESTADO);

La Guía de referencia de GPIO ESP8266 muestra los GPIO  más adecuados para usar como salidas.

ESP8266-NodeMCU-kit-12-E-pinout-gpio-pin

ESP8266 NodeMCU Leer entradas digitales

Primero, configure el GPIO que desea leer como ENTRADA, usando la función pinMode() de la siguiente manera:

pinMode(GPIO, INPUT);

Para leer una entrada digital, como un botón, hay que utilizar la función digitalRead(), que acepta como argumento el GPIO (número de entero) al que se refiere.

digitalRead(GPIO);

Ejemplo de proyecto

Para mostrar cómo usar entradas y salidas digitales, construiremos un ejemplo de proyecto simple con un botón pulsador y un LED. Leeremos el estado del pulsador y encenderemos el LED como se ilustra en la siguiente figura.

led_pushbutton
Botón ESP32 presionado o no para encender y apagar el LED

Diagrama esquemático

Antes de continuar, se debe montar un circuito con un LED y un botón pulsador. Conectaremos el LED al GPIO 5 y el pulsador al GPIO 4.

led_button_esp32_bb

Código

Copiar el siguiente código en su IDE de Arduino.

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin
const int ledPin =  5;    // the number of the LED pin

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH
  if (buttonState == HIGH) {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off
    digitalWrite(ledPin, LOW);
  }
}

Cómo funciona el código

En las siguientes dos líneas, se crea variables para asignar pines:

const int botonPin = 4;
const int ledPin = 5;

El botón está conectado a GPIO 4 y el LED está conectado a GPIO 5. Al usar Arduino IDE con ESP32, 4 corresponde a GPIO 4 y 5 corresponde a GPIO 5.

A continuación, se crea una variable para mantener el estado del botón. Por defecto, es 0 (no presionado).

int botonEstado = 0;

En setup(), se inicializa el botón como INPUT y el LED como OUTPUT. Para eso, se usa la función pinMode() que acepta el pin al que te refieres y el modo: INPUT o OUTPUT.

pinMode(botonPin, INPUT);
pinMode(ledPin, OUTPUT);

En loop() es donde lee el estado del botón y configura el LED en consecuencia.

En la siguiente línea, lee el estado del botón y lo guarda en la variable buttonState. Como hemos visto anteriormente, utiliza la función digitalRead().

buttonState = digitalRead(buttonPin);

La siguiente instrucción if verifica si el estado del botón es HIGH. Si es así, enciende el LED usando la función digitalWrite() que acepta como argumento el ledPin y el estado HIGH.

if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
}

Si el estado del botón no es HIGH, se apaga el LED. Simplemente se establece LOW como segundo argumento en la función digitalWrite().

else {
     digitalWrite(ledPin, LOW);
}

ESP8266 NodeMCU PWM con Arduino IDE – Dim LED (salida analógica)

Vamos a ver cómo generar señales PWM con ESP8266 NodeMCU usando Arduino IDE. Como ejemplo, atenuaremos el brillo del LED cambiando el ciclo de trabajo con el tiempo.

Para generar una señal PWM en los pines ESP8266 con Arduino IDE, use analogWrite(pin, valor). El valor es un número entero entre 0 y 255.

Para las versiones de ESP8266 anteriores a la 3.0, el rango predeterminado está entre 0 y 1023. El rango de PWM se puede cambiar llamando a analogWriteRange(new_range).

ESP8266 NodeMCU PWM (modulación de ancho de pulso)

Los GPIO ESP8266 se pueden configurar para generar 0 V o 3,3 V, pero no pueden generar voltajes intermedios. Sin embargo, puede generar voltajes de nivel medio «falsos» mediante la modulación de ancho de pulso (PWM), que es la forma en que producirá niveles variables de brillo LED para este proyecto.

Si alterna el voltaje de un LED entre ALTO y BAJO muy rápido, sus ojos no pueden seguir el ritmo con el que el LED se enciende y se apaga; simplemente verá algunas gradaciones en el brillo.

Básicamente, así es como funciona PWM, produciendo una salida que cambia entre ALTO y BAJO a una frecuencia muy alta.

El ciclo de trabajo es la fracción del período de tiempo en el que el LED se establece en ALTO.

Un ciclo de trabajo del 50 por ciento da como resultado un brillo del LED del 50 por ciento, un ciclo de trabajo de 0 significa que el LED está completamente apagado y un ciclo de trabajo de 100 significa que el LED está completamente encendido. Cambiar el ciclo de trabajo es la forma de producir diferentes niveles de brillo.

analogWrite()

Para producir una señal PWM en un pin dado, se utiliza la siguiente función:

analogWrite (pin, valor);

  • pin: PWM se pueden uasr los pines de 0 a 16
  • value: se debe estar en el rango de 0 a PWMRANGE, que es 255 por defecto. Cuando el valor es 0, PWM está deshabilitado en ese pin. Un valor de 255 corresponde al 100 % del ciclo de trabajo

Se puede cambiar el rango de PWM llamando al:

analogWriteRange(nuevo_rango);

De forma predeterminada, la frecuencia PWM de ESP8266 es de 1 kHz. Puede cambiar la frecuencia PWM con:

analogWriteFreq(nueva_frecuencia);

Los valores válidos son de 100 Hz a 40000 Hz.

Esquema:

Conectar un LED a su ESP8266 como se muestra en el siguiente diagrama esquemático. Estamos conectando el LED a GPIO 2, pero puede usar cualquier otro GPIO adecuado.

ESP8266_PWM_bb

Código

const int ledPin = 2; 

void setup() {
  
}

void loop() {
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle < 255; dutyCycle++){   
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(1);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle > 0; dutyCycle--){
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(1);
  }
}