Categoría Proyecto de usuario
Autor Fernán
Fecha 01/10/2015
Concepto Estación meteorológica con reloj.
Descripción Un proyecto que combina un Arduino UNO, display 20x4más un sensor DHT-11 y reloj RTC para montar presentar la hora, temperatura y humedad en el display.
Dificultad Media

 

Material requerido.

Imagen de Arduino UNO     Arduino UNO o equivalente.
Protoboardconexiones Una Protoboard más cables.
Display  Un LCD de 20×4 o también se puede adaptar un display de 16×2 o de 16×4
Sensor temperatura y humedad  Un sensor de temperatura DHT11
Reloj con bateria RTC clock  Un reloj Tiny RTC
Pot Un potenciometro de 10k

Descripción del proyecto

 

Nuestro amigo Fernán nos remite este interesante proyecto en el que combina varios componentes para montar una estación meteorológica con reloj incorporado que es ideal para aquellos que vayáis finalizando el curso de inicio y quieran ir atacando proyectos un poco más complejos.

Este es un proyecto de dificultad media pero al alcance de cualquiera que se sienta ya cómodo con la programación de Arduino y sus sensores.

Es precisamente la mezcla de diferentes componentes y sensores lo que le hace tan interesante, porque sirve magníficamente como proyecto de fin de carrera para los que estáis ya animados a finalizar el curso de iniciación.

Al final si conseguimos una caja en la que embeber todo el proyecto de Fernán, tendremos un bonito despertador y hecho por vosotros, así que ánimo.

Proyecto Arduino

Para los que quieran ir a por nota, seria de lo más interesante combinar el reloj I2C con un display también I2C, algo para lo que se pensó el Bus pero que exigirá un poco más de esfuerzo, porque hay que enviar comandos a diferentes direcciones I2C y eso es algo que hasta la fecha no hemos abordado.

Pero… ¿Quién dijo miedo?  No hay recompensa sin osadía y tengo plena confianza en que lo podeis llevar adelante.

 

Esquema del circuito

 

Fernán incluye en su proyecto un esquema para el montaje en protoboard de todo el conjunto, con un diagrama realizado en Fritzing que podeis descargar aqui Esquema Fritzing

rtcds1307_dht11_LCD4x20_bb

El montaje no es complicado pero requiere muchas conexiones, así que es importante que prestéis atención, para evitar dolores de cabeza con los componentes.

Os recomiendo que vayáis montando y probando los componentes poco a poco y asegurando todo porque si lo hacéis de un golpe, mostrareis arrojo y valentía pero la probabilidad de resbalar es notablemente alta.

 

El programa de control

 

El programa no es complicado pero tiene una moderada dificultad por lo que supone de mezcla de componentes y librerías, pero por lo demás es similar los ejemplos que hemos ido viendo previamente.

Aqui os dejo el programa y su listado: Estacion Meteo

/* Programa para crear un reloj con hora y fecha,tempertura y humedad
*  union de los programas RTC, DHT11 y LCD de PROMETEC
*/
#include <DHT11.h>
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //( RS, EN, d4, d5, d6, d7) Asignacion pines del LCD
int pin=2;
DHT11 dht11(pin);    // Asignacion pin DHT11, el RTC tiene SDA en el A4 
                     //(SDA del arduino) y el SCL en el A5 (SCL del arduino)

void setup()
   { Serial.begin(115200);
     lcd.begin(20, 4);               // Fijar numero aracteres y filas
     setSyncProvider(RTC.get);       // Vamos a usar el RTC

     setTime(00,31,22,28,9,2015);    // hh,mm,ss,dd,mm,yy, si en la fecha alguna cifra es de
                                     // un solo digito no añadir 0, da error 
     // El setTime hay que comentarlo una vez que el RTC tiene ya la hora y fecha correcta

     if (timeStatus() != timeSet) 
         Serial.println("Unable to sync with the RTC"); 
     else
         Serial.println("RTC has set the system time"); 
   }

void loop()
   {   digitalClockDisplay();
       int err;
       float temp, hum;
       if((err = dht11.read(hum, temp)) == 0)    // Si devuelve 0 es que ha leido bien
          {  Serial.print("Temperatura: ");
             Serial.print(temp);
             lcd.setCursor(0, 2);                // Tercera columna LCD
             lcd.print("Temperatura: ");
             lcd.print(temp);
             Serial.print(" Humedad: ");
             Serial.print(hum);
             lcd.setCursor(0, 3);                // Cuarta columna LCD
             lcd.print("Humedad:     ");
             lcd.print(hum);
             Serial.println();
          }
       else
          {  Serial.println();
             Serial.print("Error Num :");
             Serial.print(err);
             Serial.println();
          }
       delay(1000);             //Recordad que solo lee una vez por segundo
   }

   void digitalClockDisplay()
      {      lcd.setCursor(0, 0);          // Primera columna LCD
             printDigits(hour());          // Hacer que la hora tenga siempre dos digitos
             lcd.print(":");        
             printDigits(minute());
             lcd.print(":");
             printDigits(second());
             Serial.print(" ");
             Serial.print(day());
             lcd.setCursor(0, 1);                // Segunda columna LCD        
             lcd.print(day());
             lcd.print("/");      
             Serial.print("/");
             Serial.print(month());
             lcd.print(month());
             lcd.print("/");
             Serial.print("/");
             Serial.print(year());
             lcd.print(year());
             Serial.println();
      }

void printDigits(int digits)    // Modifico esta funcion para que a la vez que imprime 
   {     Serial.print(":");     // via serie tambien lo haga via LCD
         //lcd.print(":");         
         if(digits < 10)
           {  Serial.print('0');
              lcd.print('0');
           }
         Serial.print(digits);
         lcd.print(digits);
   }

Aquí tenéis una foto del resultado:

Arduino Display