Lectura de Entradas Analógicas con ESP32
1. Introducción
En esta clase, exploraremos la entrada analógica y su diferencia con la entrada digital. Más adelante, veremos cómo se puede simular una salida analógica utilizando una técnica especial.
1.1. Diferencia entre Señales Analógicas y Digitales
- Señales analógicas: Representan fenómenos físicos del mundo real con valores continuos. Ejemplo: temperatura, voltaje, iluminación.
- Señales digitales: Solo pueden tener dos estados (0 o 1, encendido o apagado).
Si ya conoces la diferencia, compártela en los comentarios para ayudar a otros.
2. ¿Cómo funciona una señal analógica?
Cuando trabajamos con señales analógicas, estamos midiendo variaciones de voltaje.
- Un sensor de temperatura genera un voltaje proporcional a la temperatura medida.
- Si la temperatura sube, el voltaje aumenta; si baja, el voltaje disminuye.
El ESP32 puede leer estas señales analógicas y convertirlas en valores digitales dentro de un rango de 0 a 4095 (para una resolución de 12 bits).
3. Construcción del Circuito
Para leer una señal analógica, utilizaremos un potenciómetro (trimpot) conectado a nuestra tarjeta ESP32.
3.1. Conexiones del Potenciómetro
- Pin 1 → GND (tierra).
- Pin 2 → Entrada analógica en ESP32.
- Pin 3 → 5V.
Esto crea un divisor de tensión, permitiendo que la señal varíe según la posición del trimpot.
4. Identificación de Pines en ESP32
En el ESP32, los pines compatibles con señales analógicas están marcados como ADC (Conversión Analógica-Digital).
- ESP32-CAM solo tiene ADC2, lo que significa que no puede usar Wi-Fi simultáneamente.
- Si tu tarjeta soporta ADC1, es recomendable usarlo para evitar conflictos.
5. Programación en Visual Studio Code
Hemos creado un proyecto en VS Code y realizado la primera compilación. Ahora, programaremos la lectura de la señal analógica.
5.1. Importación de Librerías
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
- FreeRTOS.h y task.h → Manejo de tareas y retardos.
- adc.h → Permite leer valores de canales analógico-digitales.
5.2. Configuración del ADC
int32_t raw_value;
adc2_config_channel_atten(ADC2_CHANNEL_6, ADC_ATTEN_DB_0);
- ADC2_CHANNEL_6 → Canal a leer.
- ADC_ATTEN_DB_0 → Sin atenuación (lectura directa del voltaje).
5.3. Lectura y Visualización de Datos
while(1) {
adc2_get_raw(ADC2_CHANNEL_6, ADC_WIDTH_BIT_12, &raw_value);
printf("adc raw: %d\n", raw_value);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
- adc2_get_raw() → Obtiene el valor del ADC en 12 bits.
- printf() → Imprime el valor en la terminal.
- vTaskDelay(1000 / portTICK_PERIOD_MS); → Agrega un retardo de 1 segundo para evitar saturar la terminal.
5.4. Código Completo
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
void app_main(void)
{
int32_t raw_value;
adc2_config_channel_atten(ADC2_CHANNEL_6, ADC_ATTEN_DB_0);
while(1) {
adc2_get_raw(ADC2_CHANNEL_6, ADC_WIDTH_BIT_12, &raw_value);
printf("adc raw: %d\n", raw_value);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
6. Compilación y Monitoreo de Datos
- Compilar el código y subirlo al ESP32.
- Activar el monitor de la terminal para visualizar los valores.
Al mover el trimpot, los valores cambiarán en la terminal:
- Sentido horario → Aumenta el valor.
- Sentido antihorario → Disminuye el valor.
Esto ocurre porque el divisor de tensión modifica el voltaje de entrada al ADC del ESP32.
7. Aplicaciones Prácticas
Este mismo código puede utilizarse con otros sensores:
- Fotoresistencias → Detectar luz.
- Termistores → Medir temperatura.
- Sensores de presión, humedad, gas, etc.
Ámbitos de aplicación
✔ Domótica → Sensores de temperatura y luz en casas inteligentes. ✔ Automatización industrial → Control de procesos en fábricas. ✔ IoT (Internet de las Cosas) → Monitoreo remoto de variables físicas.
8. Conclusión
🎉 ¡Felicidades! Ahora puedes leer señales analógicas con el ESP32.
📢 Próximos temas: ✅ Comparación entre sensores. ✅ Procesamiento avanzado de señales analógicas. ✅ Integración con módulos IoT.
🚀 ¡Nos vemos en la próxima clase! 🙌