Básicos ESP32: Lectura de valor analógico

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.

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *