Proyecto 31 – Sensor de lluvia + LCD1602 I2C

En este proyecto utilizaremos un sensor de lluvia con una pantalla LCD1602 y su módulo I2C con nuestro Arduino para detectar la presencia de precipitaciones, es decir lluvia. Vamos a basarnos en el segundo ejemplo del proyecto 26 pero esta vez utilizaremos una el LCD para mostrar los resultados.

Sensor de lluvia MH-RD + LCD1602 con módulo I2C
Sensor de lluvia MH-RD + LCD1602 con módulo I2C

En proyectos anteriores hemos visto como funcionan cada uno de estos módulos y en este proyecto los vamos a combinar para hacer algo más práctico, e independiente de la computadora, ya que en los proyectos de sensores anteriores miramos los resultados a través del monitor serial, ahora podremos verlo en una pantalla independiente.

Componentes

  • Arduino UNO o placa compatible
  • Módulo Sensor de lluvia
  • Pantalla LCD1602
  • Interfaz I2C para LCD
  • Cables o Jumpers
Diagrama de conexiones entre el Arduino, el sensor MH-RD y el LCD1602
Diagrama de conexiones entre el Arduino, el sensor MH-RD y el LCD1602

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>

LiquidCrystal_I2C lcd(0x27, 16, 2); 
int pinSensor=A0;

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

void loop()
{
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("ACortes SENSOR");
  int valor = analogRead(pinSensor);
  if (valor > 950)
    {
      lcd.setCursor(1, 1);
      lcd.print("No hay lluvia");
    }    
  else if (valor <= 950 && valor >600 )
  {
    lcd.setCursor(5, 1);
    lcd.print("Llueve");
  }
  else if (valor <= 600 && valor > 300)
  {
    
    lcd.setCursor(4, 1);
    lcd.print("Aguacero");
  }
  else
  {
    lcd.setCursor(0, 1);
    lcd.print("Se inundo esto!");
  }
  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:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
int pinSensor=A0;

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()

lcd.clear();
lcd.setCursor(1, 0);
lcd.print("ACortes SENSOR");
int valor = analogRead(pinSensor);
if (valor > 950)
  {
    lcd.setCursor(1, 1);
    lcd.print("No hay lluvia");
  }    
else if (valor <= 950 && valor >600 )
{
  lcd.setCursor(5, 1);
  lcd.print("Llueve");
}
else if (valor <= 600 && valor > 300)
{
  lcd.setCursor(4, 1);
  lcd.print("Aguacero");
}
else
{
  lcd.setCursor(0, 1);
  lcd.print("Se inundo esto!");
}
delay(200); 

Ya que la función loop es algo larga la vamos a ir desglosando un poco, para que sea mas fácil de entender.

lcd.clear();
lcd.setCursor(1, 0);
lcd.print("ACortes SENSOR");

Lo primero que 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 2 con la función setCursor(1,0), para luego mostrar en esa posición el texto ‘ACortes SENSOR’ con la función print.

int valor = analogRead(pinSensor);

En la siguiente línea podemos ver que a la variable valor le asignamos la lectura análoga del pinSensor, es decir el valor que nos envía el sensor.

if (valor > 950)
  {
    lcd.setCursor(1, 1);
    lcd.print("No hay lluvia");
  }    
else if (valor <= 950 && valor >600 )
{
  lcd.setCursor(5, 1);
  lcd.print("Llueve");
}
else if (valor <= 600 && valor > 300)
{
  lcd.setCursor(4, 1);
  lcd.print("Aguacero");
}
else
{
  lcd.setCursor(0, 1);
  lcd.print("Se inundo esto!");
}

A continuación vemos una serie de comparaciones, el primer if que encontramos nos pregunta si el valor capturado del sensor es mayor a 950, entonces muestra en el LCD «No hay lluvia». Si la condición no se cumple encontramos un else if que pregunta que si valor mayor o igual a 950 y menor que 600, entonces muestra en el LCD «Llueve». Si las condiciones anteriores no se cumplen encontramos otro else if en el cual preguntamos si valor es menor o igual a 600 y mayor a 300, entonces muestra en el LCD «Aguacero». Por ultimo encontramos un else, que si no se cumple ninguna de las anteriores condiciones, entonces muestra en el LCD «Se inundó esto!».

delay(200); 

Finalmente veremos un delay de 200 milisegundos, que realizará una pausa de 0,2 segundos antes de volver a comezar todo el loop.

Resumen

En resumen al conectar nuestro Arduino a la computadora comenzaremos registrar en la pantalla LCD si esta seco, hay lluvia o un aguacero, inclusive si hay una posibilidad de inundación.

NOTA:  El  análisis de los valores del sensor en el código no es una referencia real de la intensidad de lluvia, 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.