Problema con ADC ESP32

buenas, tengo un inconveniente al momento de usar el adc del esp32 en un programa en especifico, ya probé e inclusive volví a ingresar el programa que adjuntare a continuación y el adc funciona perfectamente, me marca los valores correctos, el programa con el que pruebo el adc es el siguiente:

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(14,INPUT);
}
void loop() {
  Serial.println(analogRead(14));
  delay(1000);

}

con tal codigo, el adc me trabaja perfectamente, el problema que tengo es que cuando utilizo el adc en otro programa, me marca 0 al momento de imprimir por terminal, a pesar de que es la misma condicion y utilizo el mismo pin de conexion (recalco que cuando meto el programa anterios nuevamente al esp32 el adc funciona como debe), a continuacion anexo el codigo:

// Import required libraries
#ifdef ESP32
  #include <WiFi.h>
  #include <ESPAsyncWebServer.h>
  #include <SPIFFS.h>
#else
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <Hash.h>
  #include <ESPAsyncTCP.h>
  #include <ESPAsyncWebServer.h>
  #include <FS.h>
#endif
#include <Wire.h>

// Replace with your network credentials
const char* ssid = "";
const char* password = "";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

String readPOT()
{
    int pot = analogRead(14);
    Serial.println(pot);
    String myString = String(pot);
    return myString;
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(14,INPUT);

  // Initialize SPIFFS
  if(!SPIFFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html");
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readPOT().c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readPOT().c_str());
  });
  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readPOT().c_str());
  });

  // Start server
  server.begin();
}
 
void loop(){
      Serial.println(analogRead(14));
}

Agregue adicional en void lood que me imprimiera el valor que esta leyendo en la entrada analogica pero me marca 0, no ubico el error ni se a que se debe.

el programa en si recibe valores de sensores (en esta caso un pot, envio tres veces la misma funcion ya que estoy testeando varios tipos de graficas) y lo grafica en un web server elaborado con html y javascript, el problema es que la lectura del pin analogico me da 0.

enfatizo nuevamente que cuando agrego el primer codigo al esp32 funciona perfectamente

En readPOT() ésta línea

Serial.println(analogRead(pot));

está mal porque te estaría imprimiendo el valor leído de un pin cuyo número es el valor leído en el pin 14.

Cámbiala por

Serial.println(pot);

si quieres que imprima el valor leído en el pin 14, que creo es tu idea.

Saludos

1 Like

Hola, gracias por responder.

Si, tienes razón, voy a editar la publicación para corregir eso, pero a pesar de haber cambiado esa linea tal como tu mencionaste, me sigue arrojando 0 la lectura del adc, estoy testeando con un multímetro y efectivamente cuando muevo la perilla del potenciómetro el voltaje del divisor de tensión varia, pero al imprimir el valor en terminal me arroja 0. Lo curioso es que cuando subo el primer programa si me imprime el valor del adc correctamente.

Saludos.

La lectura del loop() también te muestra 0?

1 Like

exactamente, lo coloque alli para testear y tambien me arroja 0

Al loop() está entrando, no?
O sea, te imprime ceros continuamente sin parar.

si, imprime ceros continuamente sin parar

Probá agregando el delay() que tenés en el código de prueba por si viene por ese lado.

Otra cosa no se me ocurre y para peor no he trabajado con ESP32 todavía.

lo acabé de agregar, pero aun me sigue arrojando 0. Voy a seguir intentando a ver que puede ser. Muy agradecido por la colaboración

La verdad no veo cuál puede ser el problema, el código en principio está bien, al menos readPOT() es correcto y la lectura del loop() no tiene secretos.

No sé, me dejó desconcertado, no te puedo ayudar más :man_facepalming:t2:

Saludos

1 Like

El pin 14 creo que corresponde al canal ADC nro. 2, y si es así no se puede usar junto con WiFi.

ADC2 is used by the Wi-Fi driver.
Therefore the application can only use ADC2
when the Wi-Fi driver has not been started.

Ver link

Tenés que usar un pin asociado al ADC nro. 1 (fijate en el pinout de la placa)

Saludos

1 Like

Para que pones

pinMode(14,INPUT);

Para mi no tiene sentido.
Es un ADC no tienes que inicializarlo como entrada.

Es un detalle @Surbyte , el compilador lo corrige. Aunque es un desperdicio de código y tiempo... :wink:

Saludos

Si, efectivamente ese era el problema, muy agradecido. Saludos

Para la próxima @jx_colina cuando respondas, toma la parte de quien te ha señalado algo para que quede claro cual es la respuesta.
Me queda claro que la solución es la de @gatul porque hay que ver que funciones cumple cada pin en el boot y si no se le dice que haga otra cosa entonces quedará asignado a tal cuestión.