Estoy intentando hacer un reloj digital con un arduíno uno,DS1307 y representarlos en display 7 seg. por medio de unos 74HC595.
No me añade minutos ni horas.....correctamente... para cambiar el Ds1307, en terminal virtual representa y lee RTC pero no aprecio que añada hora y minutos, si resetea a 0 los segundos bien. ( Solo lo he simulado con Proteus aún no en físico.)
El IDE es 1.05-r2 con los nuevos tengo problemas.
Me falta solventar lo comentado anteriormente , añadir la visualización y un pin que encienda y apague cada segundo.
Adjunto simulación e IDE.
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
void setup() {
Serial.begin(9600); // iniciar la conexión serie
pinMode(2, INPUT); // pin 2 como entrada
digitalWrite(2, HIGH); // activar la resistencia pull-up interna en el pin 2
pinMode(3, INPUT); // pin 3 como entrada
digitalWrite(3, HIGH); // activar la resistencia pull-up interna en el pin 3
pinMode(4, INPUT); // pin 4 como entrada
digitalWrite(4, HIGH); // activar la resistencia pull-up interna en el pin 4
setSyncProvider(RTC.get); // función para obtener el tiempo desde el RTC
setSyncInterval(60); // establecer el número de segundos entre resincronización
if(timeStatus()!= timeSet)
Serial.println("No puede sincronizar con el RTC.");
else
Serial.println("RTC ha sido leido.");
}
void loop()
{
if (digitalRead(2) == LOW) { // Cero los minutos ... !
// establecer el tiempo en 0 minutos.
setTime(hour(),0,second(),day(),month(), year());
RTC.set(now()); // envia el tiempo de la RTC.
Serial.println("Minutos Reset."); // enviar la confirmación
}
//AjustarHora en la biblioteca de tiempo.
//Dentro Time.cpp, el método AjustarHora fue reemplazado con:
//
// void adjustTime(long adjustment){
// setTime(sysTime + adjustment);
// }
//
if (digitalRead(3) == LOW) { // añadir una hora
adjustTime(3600); // ajustar el tiempo a 3600 segundos (1 hora)
RTC.set(now()); // enviar el tiempo a RTC.
Serial.println("Añadir una hora"); // enviar confirmación
}
if (digitalRead(4) == LOW) { // añadir un minuto
adjustTime(60); // ajustar el tiempo a 60 segundos (1min)
RTC.set(now()); // enviar el tiempo a RTC
Serial.println("Añadir un minuto."); // enviar confirmación
}
// Para configurar el chip RTC desde el terminal serial.
if(Serial.available()){
time_t t = processSyncMessage();
if(t >0)
{
RTC.set(t); // establecer la RTC y el sistema de tiempo para el valor recibido
setTime(t);
}
}
digitalClockDisplay(); // envía una actualización de la hora
delay(1000); // espera un segundo
}
void digitalClockDisplay(){
// visualización del reloj digital de la hora sobre serial
Serial.print(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
Serial.println();
}
void printDigits(int digits){
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
/* código para procesar mensajes de sincronización de tiempo desde el puerto serie */
#define TIME_MSG_LEN 11
#define TIME_HEADER 'T' // Etiqueta de cabecera para el mensaje de sincronización de tiempo serie
time_t processSyncMessage() {
// devolver el tiempo si se recibe un mensaje de sincronización válida en el puerto serie.
while(Serial.available() >= TIME_MSG_LEN ){ // mensaje de tiempo consiste en una cabecera y diez dígitos ASCII
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convertir dígitos a un número
}
}
return pctime;
}
}
return 0;
}
Muchas gracias .......