- Moderador
- #1
Buenas, supongo que ya hemos tenido tiempo para "jugar" con el potenciometro y cada una ya ha programado su menu personalizado con los opciones que ha creído oportunas....bien.
Ahora vamos a conectar un módulo de reloj, concretamente un DS1307, ya que es el más economico que he encontrado y va bastante bien, si es cierto que en algunos casos se atrasa o adelanta un poco debido generalmente a interferencias con el cristal de cuarzo que lleva, pero nada que no lo podamos solucionar mediante un pequeño ajuste con el programa.
-HARDWARE:
Al ser un módulo integrado y preparado para Arduino solo tenemos que conectar los pines en sus correspondientes lugares. Es muy fácil, solo tenemos 4 pines, 0v , 5v, SDA y SCL (los pines SDA y SCL están marcados en la placa Arduino asi que no tenemos problema.
Ejemplo en placa MEGA:
Ejemplo en Placa aTreef Shield:
Para no tener problemas con el cuarzo yo os aconsejo que lo pongais en una zona alejada de los reles y que no este tocando ningun otro componente y que tambien es bueno que no sufra moviemientos ni vibraciones.
-SOFTWARE:
Existen varias librerias para el módulo del reloj pero tienen mucho código el cual yo nunca he utilizado por lo que os voy a copiar el codigo que yo utilizo sin problemas:
Para ajustar la hora del reloj debemos utilizar el comando:
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year );
Donde cada variable debe tener su correspondiente valor, tambien valdría poner los valores directamente:
setDateDs1307(1, 1, 1, 1, 1, 1, 2014 ); Lo que dará como resultado 01:01:01 h , 1 de enero de 2014
Bueno pues ya teneis para entreteneros otro rato.
Cuando lo veais correctamente os aconsejo que programeis un submenu dentro de vuestro menu que sea "ajuste de reloj" y donde vayais pasando valores a las variables y al final las mandeis con el somando setDateDs1307.
Saludos
Jorge
Ahora vamos a conectar un módulo de reloj, concretamente un DS1307, ya que es el más economico que he encontrado y va bastante bien, si es cierto que en algunos casos se atrasa o adelanta un poco debido generalmente a interferencias con el cristal de cuarzo que lleva, pero nada que no lo podamos solucionar mediante un pequeño ajuste con el programa.
-HARDWARE:
Al ser un módulo integrado y preparado para Arduino solo tenemos que conectar los pines en sus correspondientes lugares. Es muy fácil, solo tenemos 4 pines, 0v , 5v, SDA y SCL (los pines SDA y SCL están marcados en la placa Arduino asi que no tenemos problema.
Ejemplo en placa MEGA:
Ejemplo en Placa aTreef Shield:
Para no tener problemas con el cuarzo yo os aconsejo que lo pongais en una zona alejada de los reles y que no este tocando ningun otro componente y que tambien es bueno que no sufra moviemientos ni vibraciones.
-SOFTWARE:
Existen varias librerias para el módulo del reloj pero tienen mucho código el cual yo nunca he utilizado por lo que os voy a copiar el codigo que yo utilizo sin problemas:
Código:
//CAP4 Modulo reloj DS1307
//LIBRERIAS
#include <Wire.h>
#include <LiquidCrystal_I2C.h>// Debemos instalar la libreria LiquidCrystal_I2C en la carpeta "libraries" del arduino IDE
LiquidCrystal_I2C lcd(0x27,16,2); // direccion i2c(puede variar segun la placa) del LCD y columnas,lineas
#include <Wire.h>//RELOJ
#define DS1307_I2C_ADDRESS 0x68//RELOJ Direccion
/*PINES CONECTADO EN ARDUINO MEGA
ANALOGICOS:
A14 - Potenciometro
DIGITALES:
D19 - Boton
D20 - SDA I2C / LCD+reloj
D21 - SCL I2C / LCD+reloj
*/
//VARIABLES
byte boton=19, pot=A14; //declaramos que la variable de los pines donde esta conectado boton y potenciometro
int menupot;// numero de menu
byte vboton,menus, menuactual,cambiomenu;//variables para los menus
//RELOJ
//RELOJ
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year,ajustereloj=0;
int hora=hour;
long offset;
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void setup()
{
pinMode(boton, INPUT);//Inidicamos que es una entrada
pinMode(pot, INPUT);
Wire.begin();//Inicializamos el reloj
setDateDs1307(0, 0, 8,1,1,1,2014);//Esto solo hay que ponerlo una vez, es para grabar la primera vez la hora luego se puede borrar esta linea
lcd.init();//Inicializamos el LCD
lcd.backlight();//Encendemos la luz
lcd.print(" CAP4. EL RELOJ ");
delay(2000);//Hacemos una pausa de 2 segundos
lcd.init();//Al inicializar el LCD tambien borramos la pantalla
}
void loop()
{
leehora();//funcion para leer la hora
verhora();//Mostramos informacion en pantalla
}
void leehora()
{
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//Almacenamos los valores actualizados en las variables
}
void verhora()
{
lcd.setCursor(0,0);
lcd.print (" CAP4. EL RELOJ ");
lcd.setCursor(0,1);
if (dayOfMonth <10) {lcd.print("0");}
lcd.print(dayOfMonth, DEC);
lcd.print("/");
if (month < 10){lcd.print("0");}
lcd.print(month, DEC);
lcd.print(" ");
if (hour < 10){lcd.print("0");}
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10){lcd.print("0");}
lcd.print(minute, DEC);
lcd.print(":");
if (second < 10){lcd.print("0");}
lcd.print(second, DEC);
}
Para ajustar la hora del reloj debemos utilizar el comando:
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year );
Donde cada variable debe tener su correspondiente valor, tambien valdría poner los valores directamente:
setDateDs1307(1, 1, 1, 1, 1, 1, 2014 ); Lo que dará como resultado 01:01:01 h , 1 de enero de 2014
Bueno pues ya teneis para entreteneros otro rato.
Cuando lo veais correctamente os aconsejo que programeis un submenu dentro de vuestro menu que sea "ajuste de reloj" y donde vayais pasando valores a las variables y al final las mandeis con el somando setDateDs1307.
Saludos
Jorge