Problemas en la lectura de sensor humedad y esp32 v2

Hola, recurro a vosotros nuevamente para intentar solucionar algo que en realidad no he podido solucionar:
Tengo un Esp32 wifi lora v32 con pantalla ole incluida, un sensor humedad de tierra HW-080, el cual pongo a funcionar con 3,3v ya que el moduloesp32 soloadmite por sus entradas 3,3v, estos modulos de humedad no me han dado problemas con placas arduino donde van alimentadas con 5v, pero el problema esta en que al poner el modulo con el esp32 v2 obtengo una lectura de 400 en seco cuando debiera de ser 0, he intentado cambiar los valores, ponerle offset para restar el valor resultante, colocarles resistencias para hacer como un divisor de tension, pero al poner dichas resistencias solo obtengo 0 sin cambios.
cuando he puesto offset, estos en vez de restarse lo que hace es sumarlos al valor resultante que es el que quiero que en seco sea 0 y en humedo 400.
Decir que los valores que he obtenido haciendo las pruevas tanto en seco como en humedo son las siguientes:
valor seco = 400
valor humedo = 170

#include "heltec.h"


#define Sensor0 13
#define Boton 15

// LoRa Band ISM en la Región 868MHz
#define BAND 868E6       // 433E6, 868E6, 915E6
byte spread_factor = 8;  // Rango 6-12, por defecto 7

// Mensaje LoRa a enviar con direcciones
byte dir_local = 0xC1;    // Dispositivo 1
byte dir_destino = 0xD1;  // Dispositivo 2
byte id_msjLoRa = 0;      // Conteo de mensajes

// SENSOR Blink
//String sensorEstado = "ON";  // ON/OFF: 1/0

// Tiempo entre lecturas
long tiempo_antes = 0;
long tiempo_intervalo = 60000;  // 1 minuto
long tiempo_espera = tiempo_intervalo + random(5000);

// Identificador único del dispositivo
byte identificador = 0x01;

unsigned long tiempo_ultimo_parpadeo = 0;
unsigned long tiempo_inicio_envio = 0;
unsigned long tiempo_anterior = 0;

bool pantalla_encendida = true;
unsigned long tiempo_pantalla = 0;

// Función para leer la humedad del suelo
int leer_humedad() {
  int humedad = analogRead(13);
  return humedad;
}

// Función para enviar datos vía LoRa
void envia_lora(byte dirDestino, byte dirLocal, byte idMensaje, byte idDispositivo, String datos) {
  LoRa.beginPacket();
  LoRa.write(dirDestino);
  LoRa.write(dirLocal);
  LoRa.write(idMensaje);
  LoRa.write(idDispositivo);
  LoRa.print(datos);
  LoRa.endPacket();
}

void setup() {

  pinMode(Sensor0, INPUT);  // configura el pin del sensor 13 como entrada
  pinMode(Boton, INPUT_PULLUP);  // configura el pin 15 del boton como entrada pullup
  Heltec.begin(true /*DisplayEnable Enable*/,  // activamos el modulo esp32 v2
               true /*Heltec.Heltec.Heltec.LoRa Disable*/,
               true /*Serial Enable*/,
               true /*PABOOST Enable*/,
               BAND /*long BAND*/);
  Heltec.display->init();   // iniciamos el modulo esp32 v2
  Heltec.display->flipScreenVertically();
  LoRa.setSpreadingFactor(spread_factor);
  LoRa.receive();      // Configura LoRa para recibir mensajes
  Heltec.display->clear();
  Heltec.display->display();

  // Mensaje en el monitor serial
  Serial.begin(115200);
  Serial.println("Configuración finalizada.");
}

void loop() {
  

  // Leer los datos de la humedad del suelo
  int humedad = leer_humedad();
  int humedad_porcentaje = map(humedad, 0, 1023, 0, 100);  // Convertir los datos de humedad a un porcentaje
  Serial.println("ID: " + String(identificador));
  Serial.println("humedad: " + String(humedad_porcentaje) + "%" );  // Imprimir el valor de humedad en porcentaje con el símbolo de porcentaje

  // Datos en la pantalla
  if (pantalla_encendida) {
    Heltec.display->clear();
    Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
    Heltec.display->setFont(ArialMT_Plain_24);
    Heltec.display->drawString(0, 0, "ID: " + String(identificador));
    Heltec.display->setFont(ArialMT_Plain_16);    
    Heltec.display->drawString(0, 30, "humedad: " + String(humedad_porcentaje) + " %");
    Heltec.display->display();
  }

  // Verificar si el pulsador ha sido presionado
  if (digitalRead(Boton) == HIGH) {

    // Encender la pantalla por un minuto si no está encendida
    if (!pantalla_encendida) {   // si la pantalla no esta encendida
      Heltec.display->displayOn();
      tiempo_pantalla = millis() + 60000;
      pantalla_encendida = true;
    }
    // Si la pantalla está encendida y se presiona el botón, apagarla
    else if (digitalRead(Boton) == LOW) {   // si la pantalla esta encendida
      Heltec.display->displayOff();
      pantalla_encendida = false;
    }
   
  }

  // Verificar si es tiempo de apagar el LED
  if (digitalRead(LED) == HIGH && millis() - tiempo_inicio_envio >= 500) {
    digitalWrite(LED, LOW);
  }

  // Verificar si es tiempo de enviar los datos vía LoRa
  if (millis() - tiempo_inicio_envio >= tiempo_espera) {

    // Generar el mensaje a enviar
    String mensaje = "ID:" + String(identificador) + ";H:" + String(humedad)+ "%";
    envia_lora(dir_destino, dir_local, id_msjLoRa, identificador, mensaje);

    // Encender el LED
    digitalWrite(LED, HIGH);

    // Actualizar los tiempos de espera
    tiempo_inicio_envio = millis();
    tiempo_espera = tiempo_intervalo + random(5000);
    id_msjLoRa++;
  }

  // Verificar si es tiempo de apagar la pantalla
  if (pantalla_encendida && millis() >= tiempo_pantalla) {
    Heltec.display->displayOff();
    pantalla_encendida = false;
  }
}

la seccion es donde sice "Leer los datos de la humedad del suelo". Gracias

Parte del problema es que no has tenido en cuenta que el ADC del ESP32 es de 12 bits por lo que el máximo valor que devuelve es 4095 (no 1023 como el UNO).
Por otro lado la función map() no limita los valores los "acomoda" al rango que le defines dentro de una recta.
Como le pasas un valor 4 veces más grande, la respuesta es de la misma magnitud, o sea, 400.
Fijate

Edito: Tal vez no se entendió del todo.
A map() le pasamos el valor a mapear, le indicamos el rango de entrada (en el que se supone que se encuentra ese valor) y el rango de salida en el que queremos que lo mapee (o acomode) pero nada le decimos de los límites.
Por ej., tu caso se supone que el valor está en el rango 0, 1023 y quieres que te devuelva ese valor "acomodado" o "repartido" en otro rango, o sea, 0 a 100.
Mientras le pasemos un valor entre 0 y 1023 no hay sorpresas, devuelve un valor entre 0 y 100, pero como la función virtualmente no tiene límites (excepto por el tipo entero largo que devuelve), si el valor ingresado está por fuera del rango lo "acomoda" proporcionalmente al mismo.
O sea, si ingresamos 2047 devuelve 200, o 4095 devuelve 400 e incluso -1023 devolverá -100

muchas gracias por la aclaracion y el simulador muy bueno, asi no tengo que introducir el codigo en el esp32 cada vez que hago un cambio.
He cambiado los valores en el simulador y obtengo 0 como bien dices al no tener en cuenta los bits .
Gracias MaximoEsfuerzo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.