Proyecto 38 – Sensor de Humedad de Suelo + LCD 1602

En este proyecto utilizaremos un sensor de humedad de suelo HW-080 o higrómetro con una pantalla LCD 1602 y su módulo I2C con nuestro Arduino para detectar la humedad en un terreno y visualizarlo en la pantalla. Vamos a basarnos en Proyecto 27 pero le agregaremos una pantalla LCD 1602 como la utilizada en el Proyecto 30 para visualizar los datos obtenidos.

Sensor de Humedad
Sensor de Humedad + LCD 1602

En los proyectos 27 y 30 vemos el funcionamiento de cada uno de estos dos componentes por separado, por lo que no vamos a volver a explicar cada uno de ellos, en cambio vamos a hacer un proyecto más práctico, ya que no depende de esta conectado a una computadora para ver los datos en el monitor serial, sino en la propia pantalla del proyecto.

Componentes

  • Arduino UNO o placa compatible
  • Sensor de humedad en tierra HW-080 o FC-28
  • Pantalla LCD 1602
  • Interfaz I2C para pantalla LCD
  • Cables o Jumpers
Diagrama de conexiones del sensor de humedad de suelo con la pantalla LCD 1602
Diagrama de conexiones del Arduino con el sensor de humedad de suelo y la pantalla LCD 1602

En este proyecto las conexiones son bastante simples, lo primero que debemos hacer es revisar es en el módulo comparador los pines de conexión, en un lado están los dos conectores que van a conectarse al sensor y por el otro lado encontraremos 4 pines (AO, DO, GND, VCC), los cuales son la alimentación del módulo (VCC, GND), un pin de salida digital (DO) y uno de salida análoga (AO).

Lo primero que vamos a hacer conectar los 5V del Arduino a uno de los buses del protoboard (algunos están marcados con un linea roja para indicar el +), luego conectamos el GND del Arduino y lo conectamos a otro de los buses, luego conectamos el GND del modulo comparador al GND del protoboard, el VCC a los 5V del protoboard y por último conectamos el pin AO del módulo a el pin A0 del Arduino.

La siguiente tabla es la distribución de las conexiones entre la pantalla y nuestro Arduino, utilizando el módulo I2C:

Pin módulo I2CPin Arduino
SDAA4
SCLA5
Tabla de conexiones entre el Módulo I2C y el Arduino

Por último conectaremos los pines VCC y GND del módulo I2C a los 5V y la tierra respectivamente en el protobard.

Código

#include «Wire.h»
#include «LiquidCrystal_I2C.h»

#define sensor A0
LiquidCrystal_I2C lcd(0x27, 16, 2); 
int valor = 0;



void setup()
{
    lcd.init();
    lcd.backlight();
}


void loop()
{
    int valor = map(analogRead(sensor), 0, 1023, 100, 0);
    lcd.clear();
    lcd.setCursor(4,0);
    lcd.print("Humedad: ");
    lcd.setCursor(5,1);
    lcd.print(valor);
    lcd.setCursor(8,1);
    lcd.print("%");
    lcd.print(" ");
    delay(200);
}

Explicación del código

Vamos a comenzar a revisar el código y como es de costumbre vamos a ver primero la declaración de las variables y las librerías que vamos a utilizar en el proyecto:

#include «Wire.h»
#include «LiquidCrystal_I2C.h»

#define sensor A0
LiquidCrystal_I2C lcd(0x27, 16, 2);
int valor = 0;

Lo primero que vemos en esta parte del código es que incluimos la librería Whire.h que es la encargada de realizar la comunicación I2C, luego encontramos que incluimos también la librería LiquidCrystal.h, que es la librería que se va a encargar de controlar nuestro módulo I2C para que maneje el LCD. Esta librería la debemos agregar ya que no es una librería estándar de Arduino, cuando la busquemos instalemos el creado por Frank de Brabander.

Luego vemos que declaramos el objeto lcd del tipo LiquidCrystal_I2C, al cual le entregamos la dirección I2C 0x27 (también puede ser 0x3F o si se ha cambiado la dirección como lo muestra la tabla arriba)y le decimos que tiene 16 columnas y 2 filas, por último vemos que declaramos una variable de tipo entero de nombre pinSensor a la que le asignamos A0, el cual lógicamente sería el pin análogo del Arduino al que utilizaremos para conectar nuestro sensor.

Función setup()

lcd.init();
lcd.backlight();

Como hemos visto anteriormente en otros proyectos en el setup ponemos todo lo que debe ser inicializado o ejecutado una sola vez, en nuestro caso encontramos en la primera línea la función init, la cual inicializa la pantalla, luego encontramos la función light que enciende la luz de fondo del display.

Función loop()

int valor = map(analogRead(sensor), 0, 1023, 100, 0);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Humedad: ");
lcd.setCursor(5,1);
lcd.print(valor);
lcd.setCursor(8,1);
lcd.print("%");
lcd.print(" "); 
delay(200);

Comenzaremos revisando el contenido de nuestra función loop, para esto vamos a irlo desglosando un poco, para que sea mas fácil de entender.

int valor = map(analogRead(sensor), 0, 1023, 100, 0);

Aquí podemos ver que se declara una variable de tipo entero llamada valor, vamos a hacer una pausa aquí para analizar lo que le estamos asignando a la variable valor. Vemos una función que no habíamos trabajado aún, la función map, la cual toma un valor lo mapea de un rango a otro rango, en nuestro caso mapea los valores capturados por el puerto A0 que vienen de nuestro sensor de 0-1023 a un nuevo rango que sería 100-0, donde el valor 0 de nuestro sensor equivale a 100 y el 1024 del sensor equivale a 0. No olvidemos que si el sensor registra un valor 0 equivale al 100% de humedad y si el valor es de 1023 está completamente seco.

Entonces podemos resumir que en esta línea se declara la variable entera valor, a la cual le asignamos la captura del valor del sensor mapeado de 0-1023 a 100-0.

lcd.clear();
lcd.setCursor(4,0);
lcd.print("Humedad: ");
lcd.setCursor(5,1);
lcd.print(valor);
lcd.setCursor(8,1);
lcd.print("%");
lcd.print(" "); 
delay(200);

Ahora  vemos en el loop es la función clear, que nos limpia la pantalla LCD, luego ubicamos el cursor para escribir en la linea 1 y fila 5 con la función setCursor(4,0), para luego mostrar en esa posición el texto ‘Humedad: ’ con la función print, de igual manera posicionamos el cursor en la línea 2 y fila 6 con la función serCursor(5,1) y luego mostramos el contenido de la variable ‘valor’, acto seguido posicionamos el cursor en la línea 2 y fila 9 con la función setCursor(8,1), para luego mostrar el ‘%’ y luego un espacio en blanco, este espacio en blanco está ya que al mostrar caracteres que no son letras y números, suele mostrar algún carácter adicional diferente luego de este, seguramente hay una forma más elegante de arreglar este problema (si alguien sabe, les agradecería publicarlo en los comentarios).

Por último veos un delay de 200 milisegundos, lo que hará una pausa de 0,2 segundos antes de volver a comenzar el loop.

Resumen

En resumen al alimentar nuestro Arduino podremos ver en la pantalla LCD los valores que capturamos y procesamos desde el higrómetro.

NOTA:  El  análisis de los valores del sensor en el código no es una referencia real del porcentaje de humedad del suelo, por lo que hay que tener presente que  este código es para fines educativos, no para aplicaciones que  necesiten precisión.

Deja un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.