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, delay
es 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.