Este artículo te muestra cómo leer entradas analógicas con el ESP32 usando Arduino IDE. La lectura analógica es fundamental para leer valores de resistencias variables como potenciómetros o sensores analógicos (sensores de luz, temperatura, humedad, presión y un largo etcétera).
Leer entradas analógicas con el ESP32 es tan fácil como usar la función analogRead(GPIO), que acepta como argumento el GPIO que quieres leer.
Si vienes del mundo del ESP8266 o quieres comparar, también tenemos tutoriales sobre cómo usar los pines analógicos con otras placas y lenguajes: ESP8266 ADC con Arduino IDE, MicroPython y Lua, y lecturas analógicas del ESP32 con MicroPython.
¿Qué es el ADC y cómo funciona en el ESP32?
Leer un valor analógico con el ESP32 significa medir diferentes niveles de voltaje entre 0 V y 3,3 V. El voltaje medido se mapea a un valor digital entre 0 y 4095, donde:
0 V corresponde al valor 0, y 3,3 V corresponde al valor 4095. Cualquier voltaje intermedio entre 0 V y 3,3 V recibirá un valor proporcional dentro de ese rango.
Esta conversión la realiza el ADC (Convertidor Analógico-Digital), uno de los periféricos más importantes del ESP32 para proyectos con sensores.
El ADC del ESP32 es no lineal: el detalle que debes conocer
Idealmente, cabría esperar un comportamiento perfectamente lineal al usar los pines ADC del ESP32: a más voltaje, más valor leído de forma proporcional. Sin embargo, esto no sucede en la práctica. El comportamiento real del ADC del ESP32 es notablemente no lineal, especialmente en los extremos del rango de medición.
Esto significa que tu ESP32 no puede distinguir entre 3,3 V y 3,2 V. Obtendrás el mismo valor para ambos voltajes: 4095. Lo mismo ocurre con valores de voltaje muy bajos: para 0 V y 0,1 V se obtiene el mismo valor: 0.
Debes tener esto muy en cuenta al usar los pines ADC del ESP32, sobre todo si tu proyecto requiere precisión en los extremos del rango. Si necesitas mediciones muy exactas cerca de 0 V o de 3,3 V, considera usar un ADC externo o ajustar el rango de medición con un divisor de tensión.
La función analogRead(): leer un valor analógico
Leer una entrada analógica con el ESP32 usando Arduino IDE es tan simple como usar la función analogRead(). Acepta como argumento el GPIO que quieres leer:
analogRead(GPIO);
El ESP32 admite mediciones en 18 canales diferentes (correspondientes a los pines ADC1 y ADC2). Sin embargo, solo 15 están disponibles en la placa DEVKIT V1 DOIT (versión con 30 GPIO), ya que algunos pines no están expuestos físicamente en esta placa.
Consulta el diagrama de pines de tu placa ESP32 para localizar los pines del ADC. Estos pines de entrada analógica tienen una resolución de 12 bits, lo que significa que al leer una entrada analógica su rango puede variar de 0 a 4095.
Nota crítica: Los pines de ADC2 no se pueden usar cuando se utiliza Wi-Fi, porque el driver de Wi-Fi se apropia de esa unidad. Por lo tanto, si estás usando Wi-Fi y tienes problemas para obtener el valor de un pin GPIO de ADC2, considera usar un pin GPIO de ADC1 en su lugar; esto debería solucionar el problema de inmediato.
Otras funciones útiles del ADC del ESP32
Existen otras funciones más avanzadas que se pueden utilizar con los pines del ADC y que pueden resultar útiles en proyectos más exigentes. Estas son las más importantes:
analogReadResolution(resolución) permite configurar los bits de muestra y la resolución. Puede ser un valor entre 9 bits (0 – 511) y 12 bits (0 – 4095). La resolución predeterminada es de 12 bits.
analogSetWidth(ancho) permite configurar los bits de muestra y la resolución. Igual que la anterior, acepta valores entre 9 y 12 bits. La resolución predeterminada es de 12 bits.
analogSetCycles(ciclos) establece el número de ciclos por muestra. El valor predeterminado es 8. Rango: de 1 a 255.
analogSetSamples(muestras) establece el número de muestras en el rango. El valor predeterminado es 1 muestra. Tiene el efecto de aumentar la sensibilidad de la lectura.
analogSetClockDiv(divisor) configura el divisor para el reloj del ADC. El valor predeterminado es 1. Rango: de 1 a 255.
analogSetAttenuation(atenuación) establece la atenuación de entrada para todos los pines ADC. El valor predeterminado es ADC_11db. La siguiente tabla muestra los valores aceptados (esto puede variar según el chip; consulta la documentación oficial):
| Atenuación | Factor de atenuación | Escala real | Rango lineal recomendado |
|---|---|---|---|
ADC_0db | sin atenuación | ~1,1 V | De 100 mV a 950 mV |
ADC_2_5db | 1,34x | ~1,5 V | De 100 mV a 1250 mV |
ADC_6db | 2x | ~2,2 V | De 150 mV a 1750 mV |
ADC_11db | 3,6x (predeterminado) | ~3,9 V | De 150 mV a 3100 mV |
analogSetPinAttenuation(pin, atenuación) establece la atenuación de entrada para el pin especificado. El valor predeterminado es ADC_11db. Los valores de atenuación son los mismos que en la función anterior.
adcAttachPin(pin) conecta un pin al ADC (también desactiva cualquier otro modo analógico que pudiera estar activado). Devuelve un resultado VERDADERO o FALSO.
adcStart(pin), adcBusy(pin) y adcEnd(pin) inician una conversión ADC en el bus del pin conectado, comprueban si la conversión está en curso (devuelve VERDADERO o FALSO), y obtienen el resultado de la conversión (devuelve un entero de 16 bits).
Proyecto práctico: leer un potenciómetro con el ESP32
Para ver cómo se relaciona todo, vamos a hacer un ejemplo sencillo para leer un valor analógico de un potenciómetro. Es el “hola mundo” del ADC.
Componentes necesarios
Para este ejemplo necesitas: una placa ESP32 DOIT DEVKIT V1, un potenciómetro, una protoboard y cables jumper.
Esquema de conexión
Conecta un potenciómetro a tu ESP32 de la siguiente forma: los pines laterales del potenciómetro van a 3,3 V y a GND (el orden no importa para una lectura básica), y el pin central del potenciómetro debe conectarse al GPIO 34. Este GPIO pertenece a ADC1, así que funcionará sin problemas incluso si más adelante añades Wi-Fi a tu proyecto.
Código para leer el potenciómetro
Programaremos el ESP32 usando Arduino IDE, así que asegúrate de tener instalado el soporte de placas ESP32 antes de continuar. Abre tu Arduino IDE y copia el siguiente código:
// El potenciómetro está conectado al GPIO 34 (Analog ADC1_CH6)
const int potPin = 34;
// Variable para almacenar el valor del potenciómetro
int potValue = 0;
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
// Lee el valor del potenciómetro
potValue = analogRead(potPin);
Serial.println(potValue);
delay(500);
}
Este código simplemente lee los valores del potenciómetro y los imprime en el Monitor Serie.
Cómo funciona el código paso a paso
En el código se comienza definiendo el GPIO al que está conectado el potenciómetro. En este ejemplo, el GPIO 34:
const int potPin = 34;
En setup() se inicializa la comunicación serie a una velocidad de 115200 baudios:
Serial.begin(115200);
En loop(), se usa la función analogRead() para leer la entrada analógica del potenciómetro:
potValue = analogRead(potPin);
Finalmente, se imprime el valor leído en el monitor serie:
Serial.println(potValue);
El delay(500) hace que la lectura se repita cada medio segundo, que es más que suficiente para observar los cambios al girar el potenciómetro sin saturar el monitor serie.
Subir el código y probar el ejemplo
Carga el código en tu ESP32. Asegúrate de tener seleccionada la placa y el puerto COM correctos en el menú Herramientas.
Tras cargar el código y pulsar el botón de reinicio (EN/RST) del ESP32, abre el Monitor Serie a una velocidad de 115200 baudios. Gira el potenciómetro y observa cómo cambian los valores en tiempo real.
El valor máximo que obtendrás es 4095 y el valor mínimo es 0. Verás que los valores intermedios dependen de la posición del potenciómetro, aunque recuerda la no linealidad del ADC: los extremos pueden comportarse de forma inesperada.
Conclusión: lo que has aprendido
En este artículo has aprendido cómo leer entradas analógicas usando el ESP32 con Arduino IDE. Estos son los puntos clave:
La placa ESP32 DEVKIT V1 DOIT (versión con 30 pines) tiene 15 pines ADC que puedes usar para leer entradas analógicas. Estos pines tienen una resolución de 12 bits, lo que significa que puedes obtener valores de 0 a 4095.
Para leer un valor en Arduino IDE, simplemente usa la función analogRead().
Los pines ADC del ESP32 no tienen un comportamiento lineal. Probablemente no podrás distinguir entre 0 V y 0,1 V, ni entre 3,2 V y 3,3 V. Ten esto muy en cuenta al usar los pines ADC en proyectos que requieran precisión.
Recuerda siempre: si vas a usar Wi-Fi, usa pines de ADC1 (GPIO 32, 33, 34, 35, 36 y 39). Los pines de ADC2 quedan inutilizados cuando el Wi-Fi está activo.
Con esta base ya puedes leer sensores analógicos reales: potenciómetros, LDR (sensores de luz), termistores, sensores de presión, joysticks analógicos y muchos más. El ADC del ESP32 es el puente entre el mundo digital del microcontrolador y el mundo analógico de los sensores.
Descubre más desde CIBERED
Suscríbete y recibe las últimas entradas en tu correo electrónico.
