Tal y como explicamos en nuestro artículo Básicos ESP32: Mapeo de pines y sensores internos, a través de los puertos GPIO se puede realizar una conversión analógico-digital, por lo tanto es posible tomar un valor de voltaje entre 0 y 3,3v y mapearlo con una resolución de 12 bits para convertirlo en un valor entre 0 y 4095.
La lectura de valores analógicos resulta muy útil en ocasiones para poder realizar la lectura de un voltaje que procede por ejemplo de un potenciometro y utilizarlo para activar determinadas salidas en función del valor que tome este regulador.
En este ejemplo vamos a proceder a la lectura y mapeado del valor de un potenciometro conectado a la salida de 3V y realizar la lectura de la conversión a digital a través del puerto 35.
Tabla de contenidos
Componentes y conexión electrónica
Como se observa en la siguiente imagen, el esquema es muy sencillo. Hemos conectado el potenciometro a +3V y a GND y la patilla central se conecta a nuestro GPIO35, el que se utilizará para realizar la conversión analógica a digital.
En nuestro caso hemos utilizado un potenciometro con una resistencia de 10K.
Código del programa
El código de nuestro programa elaborado y subido a la placa a través de Arduino IDE es el siguiente:
// Potenciometro conectado a GPIO 35 const int portPin = 35; // Almacenamiento del valor de puerto (Rango de 0-4095) int potValor = 0; void setup() { Serial.begin(115200); delay(1000); } void loop() { // Lectura del valor en cada vuelta del bucle potValor = analogRead(portPin); Serial.println(potValor); //Envío del valor al puerto serie delay(1000); }
El resultado de la lectura se envía a través del puerto serie para verificar el funcionamiento.
Funcionamiento
Como se observa en el siguiente video, nuestro sistema recoge los datos del voltaje que entrega el potenciometro y realiza la conversión A/D transformándolos en un valor entero entre 4095 y 0 según cambiamos el valor de la resistencia rotando el potenciometro.
Un ejemplo de aplicación práctica de la conversión A/D
Vamos a realizar un ejemplo simple del uso de la conversión A/D para el encendido de unos led en secuencia en función de la posición del potenciometro. Para ello utilizaremos el siguiente código, si bien es cierto que el código podría simplificarse mucho más, hemos optado por la versión extensa para que resulte lo más fácil de entender posible.
El programa que hemos grabado en nuestro ESP-32 es el siguiente:
// Potenciometro conectado a GPIO 35 const int portPin = 35; // Almacenamiento del valor de puerto (Rango de 0-4095) int portValor = 0; void setup() { Serial.begin(115200); delay(1000); pinMode(27,OUTPUT); pinMode(26,OUTPUT); pinMode(25,OUTPUT); pinMode(33,OUTPUT); pinMode(32,OUTPUT); pinMode(34,OUTPUT); } void loop() { // Lectura del valor en cada vuelta del bucle portValor = analogRead(portPin); if (portValor>=0 && portValor <=512){ digitalWrite(27,LOW); digitalWrite(26,LOW); digitalWrite(25,LOW); digitalWrite(33,LOW); digitalWrite(32,LOW); digitalWrite(34,LOW); } if (portValor>512 && portValor <=1024){ digitalWrite(27,HIGH); digitalWrite(26,LOW); digitalWrite(25,LOW); digitalWrite(33,LOW); digitalWrite(32,LOW); digitalWrite(34,LOW); } if (portValor>1024 && portValor <=1536){ digitalWrite(27,HIGH); digitalWrite(26,HIGH); digitalWrite(25,LOW); digitalWrite(33,LOW); digitalWrite(32,LOW); digitalWrite(34,LOW); } if (portValor>1536 && portValor <=2048){ digitalWrite(27,HIGH); digitalWrite(26,HIGH); digitalWrite(25,HIGH); digitalWrite(33,LOW); digitalWrite(32,LOW); digitalWrite(34,LOW); } if (portValor>2048 && portValor <=2560){ digitalWrite(27,HIGH); digitalWrite(26,HIGH); digitalWrite(25,HIGH); digitalWrite(33,HIGH); digitalWrite(32,LOW); digitalWrite(34,LOW); } if (portValor>2560 && portValor <=3072){ digitalWrite(27,HIGH); digitalWrite(26,HIGH); digitalWrite(25,HIGH); digitalWrite(33,HIGH); digitalWrite(32,HIGH); digitalWrite(34,LOW); } if (portValor>3072 && portValor <=4096){ digitalWrite(27,HIGH); digitalWrite(26,HIGH); digitalWrite(25,HIGH); digitalWrite(33,HIGH); digitalWrite(32,HIGH); digitalWrite(34,HIGH); } }
Como resultado, según rotamos el potenciometro se encienden los diferentes led en secuencia.
Este es uno de los muchos usos que se pueden dar al sistema de conversión A/D que incluyen nuestras placas ESP32.