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);
}