guia-de-programacion-del-esp32-en-entorno-arduino

Guía de programación del ESP32 en entorno Arduino

En este artículo vamos a ver cómo programar un *ESP32 con el entorno de Arduino, y las diferencias entre programar un ESP32 y un Arduino.

Espressif ha hecho un esfuerzo muy importante en portar el Core del ESP32 a Arduino para que sea muy similar a programar un Arduino convencional.

Sin embargo, el ESP32 tiene muchas más opciones y posibilidades que un Arduino tradicional. Así que algunas cosas son algo diferentes.

Funciones de tiempo

Millis y Delay

Las funciones de tiempo millis() y micros() funcionan igual que en Arduino.

También funcionan delay() y delayMicroseconds(). Sin embargo, delayes no bloqueante, mientras que delayMicroseconds es bloqueante.

Yielding

Al igual que nos pasaba con el ESP8266, el Yielding es una de las características mas importantes y que dan lugar a más errores y reinicios.

El ESP32 necesita realizar tareas de gestión de la conexión WiFi y la pila TCP/IP. Si no las atiende, probablemente se os va a reiniciar.

Para que todo funcione, necesitamos dejar al ESP32 “respirar”. Para eso, tenemos que llamar a la función yield, que permite al ESP32 atender a sus cositas.

Afortunadamente, la función yield se ejecuta en todo delay y al final del loop. Sin embargo, la función delaymicroseconds() no hace una llamada a yield().

Por lo que, básicamente, se traduce en que no podéis hacer procesos bloqueantes largos (>100ms) o se os va a reiniciar el ESP32.

Conexiones y hardware

Designación de los pines

El ESP32 tiene muchos más pines, modelos y placas de desarrollo que el ESP8266. Por tanto, el problema de que cada fabricante etiqueta cada pin como le da la gana es mucho peor.

Así que en el ESP32 mi consejo es que siempre llaméis a los pines sin alias, simplemente con el número de GPIO.

digitalWrite(14, LOW);  // GPIO14 

Y como siempre, en caso de duda consultar la documentación y el pinout de vuestra placa.

Salidas y entradas digitales (GPIO)

Las entradas y salidas digitales (GPIO) se programan prácticamente igual que en cualquier Arduino. Así podemos cambiar el modo de un GPIO entre entrada o salida con la función:

pinMode(pin, mode)

Donde el modo puede ser OUTPUT, INPUT o INPUT_PULLUP.

Salida digital: Igual que en Arduino, si el GPIO están en modo OUTPUT podemos emplearlo como salida asignando un valor (LOW o HIGH)

digitalWrite(pin, output)

Entrada digital: Si el GPIO está en modo INPUT en modo entrada podemos leer su valor

digitalRead(pin)

Salidas analógicas (PWM)

Las salidas analógicas (PWM) funcionan bastante diferente en el ESP32 que en un Arduino o un ESP8266. Esto es debido a que el ESP32 tiene varias formas de generar una señal PWM.

Entradas analógicas (ADC)

Las entradas analógicas del ESP32 se emplean de forma similar a Arduino, con la función:

analogRead(A0)

Sin embargo, hay algunas diferencias con un Arduino o un ESP8266. Lo vemos en esta entrada.

Interrupciones

El ESP32 tiene interrupciones en todos los pines GPIO. El uso es similar a las interrupciones por hardware en Arduino.

attachInterrupt(digitalPinToInterrupt(interruptPin), handler, FALLING);

Las opciones son RISING, FALLING, HIGH, LOW, CHANGE.

PROGMEM

Igual que en el caso del ES8266, la macro PROGMEM, funciona de forma similar a Arduino o el ESP8266. Con la diferencia de que emplear dos veces el mismo valor, guardará dos veces el literal en la memoria.

Así, por ejemplo:

string text1 = F("hello");
string text2 = F("hello");

Si queremos evitar esto, podemos usar la función FPSTR.

const char hello[] PROGMEM = "hello";
string texto1 = FSPTR(hello);
string texto2 = FSPTR(hello);

Comunicación

Puerto serie

El uso del puerto serie en el ESP32 es muy similar a su uso en Arduino y emplea todas las funciones a las que estamos acostumbrado para enviar y recibir datos (read, write, print, println…)

Pero es en el ESP32 tenemos disponibles varios UART, y funciones adicionales.

Bus I2C

El uso del I2C en el ESP32 es similar a Arduino y emplea las mismas funciones. Pero es en el ESP32 tenemos disponibles varios I2C, y funciones adicionales.

Bus SPI

Nuevamente, el SPI del ESP32 su uso es similar y emplea las mismas funciones que en un Arduino convencional. Pero es en el ESP32 tenemos disponibles varios SPI, y funciones adicionales.

Comunicación WiFI

Al igual que el ESP8266, la capacidad WiFi es uno de los puntos más importantes del ESP32. Por tanto, lo veremos de forma intensiva en el resto de los tutoriales de la serie.

Librerías de Arduino

La última pregunta ¿funcionará mi librería de Arduino en el ESP32? Pues, igual que ocurría en el caso del ESP8266, en general no os va a funcionar.

Si usáis una librería, tendrá que ser una compatible con vuestro ESP32. Es más, con vuestro modelo concreto de ESP32, porque no es lo mismo un ESP32-S2 que un ESP32-S3.