Este sensor capacitivo de humedad terrestre es más resistente a la corrosión por la oxidación del mismo al estar en contacto con la humedad y de la tierra y transmitir una corriente eléctrica. Funciona en un voltaje entre  3,3 y 5,5 V. Transmite la información correspondiente a la humedad por el pin AOUT, dando una lectura analógica.

Para obtener el rango de valores sobre los que opera el sensor, he realizado un programa en C++ utlizando Platformio en el entorno de Arduino

Está pensado para ser utilziado con un ESP8266, el cual solo tiene una entrada analógica para la lectura de los datos.

Para poder utilizar más de una entrada analógica de datos he utilizado un multiplexor analógico, para el que he creado una función que mide la entrada de información de cada una de sus entradas. La función devuelve un valor entero, que es la lectura de la entrada solicitada, teniendo la siguiente nomenclatura:

int readAnalogMultiplexor(int *multiplexorControPINTable,int input).

El primer argumento nos informa de los tres pines en los que estamos controlando al multiplexor , siendo una matriz de integers de 3 números.

El segundo argumento argumento es la entrada analógica del multiplexor al que solicitamos la información.

Calibración del sensor

Para calibrar el sensor he realizado un proceso en el que se realizan 50 lecturas de cada sensor dado de alta en los pines del multiplexor. En el caso que he implementado se podrían calibrar 2 sensores a la vez, los cuales están conectados en los pines 4 y 6 del multiplexor.

Al final del loop, que se repite cada 5 minutos, se visualiza el valor más alto, el valor más bajo, la media de los valores y la covarianza de las lecturas, de cada uno de los sensores.

El código sería el siguiente


 #include <Arduino.h>

#define numTests 50

#define moistureNumSensors 2

//PINS for analog reads by multiplexor, versión 1.0

int multiplexorControPIN[3]={18,17,16};//to control analog input to read

int multiplexorAnalogReadPIN=34;//analog input read pin for multiplexor

int moistureLectureMultplexorPINS[moistureNumSensors]={4,6};//multplexor inputs to read

int moistureValues[numTests][moistureNumSensors];

int minLectures[moistureNumSensors];

int maxLectures[moistureNumSensors];

bool _DEBUG_=false;//bool data to show Serial debuging

void readMoisturePlants(int moistureLandRegisters[moistureNumSensors]);

int readAnalogMultiplexor(int *multiplexorControPINTable,int input);

void setup() {

  Serial.begin(115200);

  //configuracion del multiplexor analogico inicilializado a  alto

  for(int i=0;i<3;i++){

    pinMode(multiplexorControPIN[i],OUTPUT);

  }

  for(int i=0;i<3;i++){

    digitalWrite(multiplexorControPIN[i],HIGH);

    delay(50);

  }

  //inicialización de las variables de medición

  for(int i=0;i<moistureNumSensors;i++){

    minLectures[i]=99999;

    maxLectures[i]=0;

  }

  Serial.print("Configuración realizada. Programa inicializado.\n");

}

void loop() {

  int totalForAverage[moistureNumSensors];

  //inicialización de las variables de medición

  for(int i=0;i<moistureNumSensors;i++)

    totalForAverage[i]=0;

  for(int i=0;i<moistureNumSensors;i++){

    minLectures[i]=99999;

    maxLectures[i]=0;

  }

  Serial.println("Realizando lecturas");

  for(int i=0;i<numTests;i++){

    if(_DEBUG_) Serial.print("=============================================Realizando lectura "+(String)(i+1)+"=============================================\n");

    readMoisturePlants(moistureValues[i]);

    if(_DEBUG_) Serial.print("Valores totales = [ ");

    for(int j=0;j<moistureNumSensors;j++){

      if(moistureValues[i][j]>maxLectures[j])

        maxLectures[j]=moistureValues[i][j];

      if(moistureValues[i][j]<minLectures[j])

        minLectures[j]=moistureValues[i][j];

      totalForAverage[j]=totalForAverage[j]+moistureValues[i][j];

      if(_DEBUG_) Serial.print((String) totalForAverage[j]);

      if(_DEBUG_) if(j<moistureNumSensors) Serial.print(" ");

    }

    if(_DEBUG_) Serial.print("]\n");

    Serial.print(".");

    delay(500);

  }

  Serial.print("\n=============================================Resultados=============================================\n");

  Serial.print("Valores máximos: [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print(maxLectures[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  Serial.print("Valores mínimos: [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print(minLectures[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  Serial.print("Valor medio = [");

  int media[moistureNumSensors];

  for(int i=0;i<moistureNumSensors;i++){    

    media[i]=totalForAverage[i]/numTests;

    Serial.print(media[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  //Cálculo de la varianza

  int sumaDiferenciaMediaCuadrado[moistureNumSensors];

  for(int i=0;i<moistureNumSensors;i++)

    sumaDiferenciaMediaCuadrado[i]=0;

  for(int i=0;i<moistureNumSensors;i++){    

    for(int j=0;j<numTests;j++){      

       sumaDiferenciaMediaCuadrado[i]=sumaDiferenciaMediaCuadrado[i]+(((moistureValues[j][i]-media[i])*(moistureValues[j][i]-media[i])));

    }

  }

  Serial.print("Varianza = [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print((String) (sumaDiferenciaMediaCuadrado[i]/numTests));

    if(i<moistureNumSensors-1) Serial.print(" ");    

  }

  Serial.print("]\n");

  Serial.print("=============================================Esperando =============================================\n");

  delay(300000);//paro 5 minutos hasta repetir la prueba

}

void readMoisturePlants(int moistureLandRegisters[moistureNumSensors])

{

  //Lecturas de la humedad terrestre

  if(_DEBUG_) Serial.println("=============================================================");

  if(_DEBUG_) Serial.println("Leyendo lecturas de humedad terrestre (son "+ (String) moistureNumSensors +")");

  for(int i=0;i<moistureNumSensors;i++){

    moistureLandRegisters[i]=readAnalogMultiplexor(multiplexorControPIN,moistureLectureMultplexorPINS[i]);

    if(_DEBUG_) Serial.println("Lectura en "+ (String) i+ " situada en la entrada del multiplexor "+ (String) moistureLectureMultplexorPINS[i] +" es "+ (String) moistureLandRegisters[i]);

    delay(5);

    if(_DEBUG_) Serial.println("=============================================================");

   }

}

int readAnalogMultiplexor(int *multiplexorControPINTable,int input)

{

  //selecciono la entrada con el bit menos significativo tutorial en:

  //https://www.youtube.com/watch?v=OsY3hs06h2M

  if(input<0||input>7){

    Serial.println("Input selected out of range");

    return -1;

  }

  //Serial.println("Asking input"+ (String) input+" value");

  digitalWrite(multiplexorControPINTable[0], HIGH && (input & B00000001));  

  digitalWrite(multiplexorControPINTable[1], HIGH && (input & B00000010));

  digitalWrite(multiplexorControPINTable[2], HIGH && (input & B00000100));

  delay(25);//cambiado de 25 a 50 para que tenga más tiempo de actuar

  return analogRead(multiplexorAnalogReadPIN);

}