[ SOLUCIONADO ] Reloj, DS1307 y 74HC595

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 …

Me falto añadir la simulación…

ARDsoloRELOJ.zip (20.1 KB)

Puedes poner el link de la librería, ya tengo tantas que no se cual va.

Adjunto librerías. Gracias

Librerias.zip (38 KB)

Problema resuelto, código

#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t



const byte pinLatch   = 10; //Pin para el latch de los 74CH495
const byte pinDatos   = 11; //Pin para Datos serie del 74CH495
const byte pinReloj   = 12; //Pin para reloj del 74CH495
const byte pinSeconds = 13;

byte digitOne[10]= {
  // Codificación hexadecimal de los dígitos decimales en el display de 7 segmentos
  //0xEE, 0x82, 0xDC, 0xD6, 0xB2, 0x76, 0x7E, 0xC2, 0xFE, 0xF6};
  // Codificacion del autor del Hilo
  
  0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xb6, 0x3E, 0xE0, 0xFE, 0xF6};
  // con esta codificación los leds encienden correctamente
 
 
int  decenas  = 0;  //Número de las decenas
int unidades  = 0;    //Número de las unidades
int decimas   = 0;  //Numero de las decimas
int centesimas  = 0;    //Numero de las centesimas
int milesimas = 0;    //numero de las milesimas


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
  pinMode(pinLatch, OUTPUT);         
  pinMode(pinDatos, OUTPUT);         
  pinMode(pinReloj, OUTPUT);  
  pinMode(pinSeconds, OUTPUT); 

  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
  displayLED(hour()*100+minute());
  digitalWrite(pinSeconds, HIGH);
  delay(499);                // espera un segundo
  digitalWrite(pinSeconds, LOW);
  delay(499);                // espera un segundo
}

void digitalClockDisplay(){
  // visualización del reloj digital de la hora sobre serial
  Serial.print(hour(),DEC);
  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;
}
void displayLED(int numero){

  unidades   = numero/1000;
  numero    %= 1000;
  decimas    = numero/100;
  numero    %= 100;
  centesimas = numero/10;
  numero    %= 10;
  milesimas = numero;
  
  digitalWrite(pinLatch, LOW);
  shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[milesimas]); //digitOne centesimas
  shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]); //digitOne centesimas
  shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]);    //digitOne decimas
  shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]);   // digitOne unidades
  digitalWrite(pinLatch, HIGH);
}

ARDsoloRELOJ.zip (20.3 KB)

Muchas gracias.... lo he simulado y parece que los minutos y horas no incrementan correctamente. Minutos de cuando en cuando . No se si es que Proteus no funciona en tiempo real en mi ordenador...o hay algún gatito en el programa que se nos escapa. Los minutos si resetean a 0. Segundos led perfecto displays perfectos. Cuando puedas agradecería que lo mires. Salu2

pues minutos se incrementas y horas tambien. se forma un numero hora()*100+minute() ejemplo si son las 12:34 se forma 1234 y eso presenta. pon un Serial.print(numero) dentro de displayLED() para que lo veas transcurrir. Usa mi simulación porque la tuya estaba incompleta

Quizás sea por esto: ......

Como hago estos cambios que indicas, no he modificado la biblioteca.

//AjustarHora en la biblioteca de tiempo. //Dentro Time.cpp, el método AjustarHora fue reemplazado con: // // void adjustTime(long adjustment){ // setTime(sysTime + adjustment); // }

Ahh quieres ajustar el tiempo.
una forma es

#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>
...
setTime(hr,min,sec,day,month,yr);
RTC.set(now());

…Me podrías ampliar la información… el programa me indica un cambio en Time.cpp :

//AjustarHora en la biblioteca de tiempo.
//Dentro Time.cpp, el método AjustarHora fue reemplazado con:
//
// void adjustTime(long adjustment){
// setTime(sysTime + adjustment);
// }
(este trozo es parte de uno de la red.) Tengo que hacer este cambio…?. Lo hice y me da muchos errores…como organizar tus indicaciones de:

#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>

setTime(hr,min,sec,day,month,yr);
RTC.set(now());

“No logro ajustar el tiempo con los pulsadores +1 hora, +1 minuto…si resetea a cero los minutos con el pulsador”

Salu2

Pero franciscov, no lees tu código?

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

  }

Aca lo dices, si presionas el boton conectado al pin 2, estableces todos los minutos a 0 conservando el resto. Minutos Reset dice El boton conectado al pin 4 te agrega 1 minuto El boton conectado al pin 3 te agrega 1 hora.

Apreciado Surbyte si leo el código ...pero lo que intento explicar es que al simularlo y pulsar +1 hora no lo hace y a pulsar +1 minuto no lo hace solo actúa bien el reset de minutos. Salu2

A ver? Bueno ya lo comprendí. adjustTime(long seconds) actua sobre millis y no sobre el RTC. para ajustarlo yo usaría settime con el agregado que corresponda.

void loop()
{
  reset = digitalRead(2);
  if ( reset == 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);
  //  }
  //
  inchora = digitalRead(3);
   // following line sets the RTC to the date & time this sketch was compiled
  // RTC.adjust(DateTime(__DATE__, __TIME__));

  if ( inchora == LOW) {              // añadir una hora
    setTime(hour()+1,minute(),second(),day(),month(), year());
    RTC.set(now());                         // enviar el tiempo  a  RTC.
    Serial.println("Sumo una hora");      // enviar confirmación
  }

  incmin = digitalRead(4);

  if ( incmin == LOW) {                // añadir un minuto
    setTime(hour(),minute()+1,second(),day(),month(), year());              // ajustar el tiempo a  60 segundos (1min)

    RTC.set(now());                           // enviar el tiempo  a  RTC
    Serial.println("Sumo un minuto.");      // enviar confirmación
  }

solo que debes cambiar.

Parece que me ilumine un poco....je...je..... Gracias a Surbyte que me hace remirar debajo las piedras y lo bueno es que la solución estaba delante de mis ojos...:

La libreria Temp.ccp tiene este error :

void adjustTime(long adjustment){ sysTime += adjustment; }

Hay que reemplazarlo por :

void adjustTime(long adjustment){ setTime(sysTime + adjustment); }

Ahora funciona correctamente.....paciencia Surbyte que voy hacia delante.....como los CARACOLES..... Gracias.

Bien, yo lo resolví y pense que lo habia posteado y veo que no. era usar settime(hour(), minute()+1,second(), day(),month(), year()); eso para el +1 minuto

y similar para la hora.

Muchas gracias de nuevo.....

Salu2

hola,quisiera probar este código para aprender a utilizar el ds1307 pueden subir las librerias con las modificaciones que le hayan hecho y el codigo corregido gracias seria de gran ayuda

Mi amigo, lee los post uno a uno, al final adjuntadas estan las librerías y los archivos estan disponibles también. Lee bien.

buenas noches como puedo hacer para ponerlo en formato 12 horas

Primero respetando las normas y no respondiendo un hilo que tiene 120 dias sin movimientos Desde 2015 que nadie responde. Crea un hilo nuevo y entonces te responderemos.