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
RTC
No hay comentarios:
Publicar un comentario