Buscar este blog

Información semanal de las clases de electrónica y las sucesivas prácticas realizadas por Guillermo Cayetano Espejo alumno del Ciclo de Grado Superior de Manteniemintos Electronicos de 2º Curso del CIFPN1 (Peñacastillo,Santander) Dpto:Electricidad y Electrónica

martes, 6 de diciembre de 2016

Practica 2: RTC


Introducción:
En esta  práctica lo que vamos a hacer es imprimir la fecha y hora en una pantalla LCD (Liquid Crystal Dislay) ofrecida por un módulo RTC (Real time clock) todo ello dirigido por un dispositivo a Arduino, mediante comunicación I2C.

Desarrollo:
Lo primero que debemos conocer es cómo funciona el BUS I2C, a grandes rasgos es un BUS en el que la comunicación se establece en dos hilos (tres contando GND), uno será SDA que es el de datos y otro es el SCL que es el reloj para sincronizar la comunicación. (Bus explicado extensamente en este mismo blog en la entrada:(Bus I2C).
La pantalla viene con un chip integrado (Expansor remoto de I/O a I2C), con lo que la comunicación con este chip ya se hace en I2C.
El módulo RTC (DS1307), viene integrado con el cristal y ofrece su salida en I2C, además lleva una pila integrada para mantener la hora después de apagarse.
La conexión es sencilla por un lado, se conectan las salidas de la pantalla y el RTC del bus I2C (SDA y SCL) a las entradas del Arduino del mismo nombre los cuales físicamente son los pines analógicos 4 y 5. Seguidamente se alimenta la pantalla y el RTC a 5 voltios desde la salida de 5 voltios del arduino.
Después de realizar el montaje solo queda hacer el programa, yo le he hecho en Proteus para poder hacer un esquemático del montaje, pero como había conflicto con algunas libreris cargue el programa desde el IDE de arduino.


En mi caso he utilizado dos librerías: virtuabotixRTC y LiquidCrystal_I2C, la primera la utilizo para establecer la hora del RTC por primera vez, y para crear el objeto RTC. La segunda la utilizo para printar en la pantalla LCD.
El Programa:
/*
////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Guillermo                                              Octubre/2016
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Practica2 RTC             VERSIÓN:       1.3
//   DISPOSITIVO: ATMEL 328                            COMPILADOR:    AVR
//   Entorno IDE:   1.6.12                              SIMULADOR:     VIRTRONIC
//   TARJETA DE APLICACIÓN: ARDUINO                    DEBUGGER:    
////////////////////////////////////////////////////////////////////////////////////
Printar en pantalla LCD la hora y la fecha establecidos por un RTC.
////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// LIBRERÍAS //////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//
*/
// Declaramos las librerías
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>
// include--> es una directiva que le dice al compilador donde buscar la librería
//"<>" Con esas instrucciones le dices al compilador que busque las librerías en el lugar por defecto.
virtuabotixRTC RTC(2,3,4); // Instancias la clase virtuabotixRTC y creas el objeto RTC y como   //demanda la librería virtuabotix le asignamos los pines que corresponden en orden al reloj, datos
// y reset del RTC(DS1302).
LiquidCrystal_I2C lcd(0x27,16,2); // Instancias la clase LiquidCrtistal y creas el objeto lcd y se le //asigna la dirección y los pines que corresponden en orden a: dirección, columnas y filas.

///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
int start=0; // Inicializamos la Variable global de tipo int 2 bytes (65536).



////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// CONFIGURACIÓN ///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void setup()
{

Wire.begin(); // Inicializamos las funciones de I2C de arduino (Que es lo que hace la librería Wire)
//RTC.setDS1302Time(0,9,10,4,11,11,2016);  // Activas la función de la librería virtuabotix para el //objeto RTC, Esta función le metes la fecha y hora y se la asigna al rtc, solo sería necesario hacerlo //la primera vez, luego esa línea se podría comentar. Los parámetros son n orden: seg, min, hora, //diadelasemana, diadelmes, mes, año.


lcd.begin(16,2); //Inicializamos el LCD con 16 columnas y 2 filas.
lcd.backlight(); // Establece la retroiluminación en nuestro objeto lcd.
}
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void loop()
{

   if (start==0){
   lcd.print("Buenos Días"); // Al empezar start vale 0 y nos da un mensaje de Buenos Días.
   delay(1000);
   }
start++; // Incrementa la variable global start en uno.
RTC.updateTime(); // Esta función pertenece a la librería virtuabotix y lo que hace es subir el //tiempo del reloj al objeto RTC.



lcd.setCursor(0,0); //Esta función sitúa el cursor (por llamarlo de alguna forma) en la posición que  //le des, en este caso es 0,0 por lo tanto lo siguiente que se escriba en el LCD empezara a partir de //la columna 0 y fila 0.

// lcd.print("Hora ");
   if (RTC.hours<10){// Si el valor de la hora es menor de 10 pone un "0" delante
      lcd.print("0");
      lcd.print(RTC.hours);
   }
   else{
      lcd.print(RTC.hours);
   }

lcd.print(":");
   if (RTC.minutes<10){
      lcd.print("0");
      lcd.print(RTC.minutes);
   }
   else{
      lcd.print(RTC.minutes);
   }

lcd.print(":");
   if (RTC.seconds<10){
      lcd.print("0");
      lcd.print(RTC.seconds);
   }
   else{
      lcd.print(RTC.seconds);
   }


lcd.setCursor(0,1);
switch (RTC.dayofweek){ // la librería virtuabotix asigna a los días de la semana como números //del 1 al 7 con este switch asigno los días a su equivalente en nombre de día de la semana.

       case 1:
                               lcd.print("Lunes");
                               break;
       case 2:
                               lcd.print("Martes");
                                break;
       case 3:
                               lcd.print("Miercoles");
                               break;
       case 4:
                                lcd.print("Jueves");
                               break;
       case 5:
                                lcd.print("Viernes");
break;
       case 6:
                                lcd.print("Sabado");
                                break;
       case 7:
                                lcd.print("Domingo");
                                break;
      }
delay(3000); // Espera 3 segundos hasta seguir con el programa.
lcd.clear(); // Limpia la pantalla de nuestro lcd.
lcd.setCursor(0,0);
lcd.print("Fecha ");
lcd.print(RTC.dayofmonth);
lcd.print("/");
lcd.print(RTC.month);
lcd.print("/");
lcd.print(RTC.year);
delay(1000);
lcd.clear();
//lcd.función ()à a la izquierda del punto tenemos el objeto y a la derecha la función que se //aplicara //a ese objeto, dentro del paréntesis introduciríamos los parámetros que necesita la //función.

}
Archivo fuente en el siguiente enlace:
RTC

No hay comentarios:

Publicar un comentario