Precisión Reloj DS3231

Buenos dias, antes de todo decir que soy novato en todo esto.

Necesito hacer el siguiente bucle infinito:

LED encendido durante 0,5s
LED apagado durante 4,5s

El tema es que lo hice con el reloj interno de Arduino y comando “delay”, pero al cabo de poco tiempo se iba desfasando bastante con la hora real…Estoy hablando de 52 segundo de desfase en 8 horas!!

Me recomendaron un reloj externo, y ya lo he comprado, en concreto el RTC 3231, se supone que es muy exacto, pero no se como hacer el código para hacer que arduino funcione con ese reloj externo. He probado con este código, y me devuelve la hora…pero yo lo que quiero es encender y apagar un led utilizando el DS3231.

Muchas gracias de antemano.

[table][tr][td]#include <Wire.h> 

#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {

Wire.begin(); // Inicia el puerto I2C

RTC.begin(); // Inicia la comunicación con el RTC

//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)

Serial.begin(9600); // Establece la velocidad de datos del puerto serie
}
void loop(){

DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
  
Serial.print(now.year(), DEC); // Año
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();

delay(60000); // La información se actualiza cada 60 seg.
}[/td]
[/tr]
[/table]

Perdona pero no puedo dejar de reirme y disculpa.
Resulta que se te defasa el tiempo por usar delay. Te recomienda usar un RTC, lo compras y vuelves a usar delay!!! Es para reir.
Claro que no!!!

delay no es una maravilla pero me sorprende que digas que se defasa 52 seg en 8hs aunque lo creo, no deja de sorprenderme.
Usa millis(), mira el ejemplo BlynkWithoutdelay.ino.

El DS3231 te sirve para operaciones de tiempo horario, pero no entiendo para que te puede servir en este caso.

Si modificas el BlynkWithoutdelay.ino. y usas tus tiempos resuelves el problema.
Ahora como se comporte a lo largo del día será otro tema.
El cristal del Arduino no es TCXO o sea no tiene compensación en temperatura asi que puede tener un drift.
No creo que sea perceptible a menos que haya gran cambio de temperatura en 8 hs para citar tu ventana de tiempo.

Tengo dudas ahora si mi consejo funcionará o no.

Muchas gracias por la respuesta.

Aunque no lo creas, si, el tiempo de desfase es el que te comento. Empiezo a sospechar que el problema esta en mi placa de arduino...puede que no sea original y ese sea el problema de todo.

Voy a probar con una otra placa Arduino que me han dejado y ver si lo soluciono. Utilizaré el BlynkWithoutdelay.ino y ya te comentaré.

De todas maneras y como curiosidad...si tuviese que apañar con mi placa china...¿Con ese reloj externo no se podría hacer nada para solucionarlo?

Entiendo que quieres:

  • encender 1 led por 0.5s
  • apagar ese led por 4.5s

No necesitas de un reloj externo para conseguir ese comportamiento en el led.

A menos que tengas un proceso secundario que requiera de una determinada hora para cubrir un determinado número de encendidos/apagados; cosa que no aclaras en tu pregunta inicial.

¿Estas construyendo un reloj o algo parecido?

Lo que quiero es exactamente lo que dices...Pero con una buena precisión. Y la precisión que he conseguido hasta ahora es insuficiente. Ya te digo que puede que el problema esté en la placa, que dudo que sea oficial.

Puedo permitirme un desfase de +- 10 seg/dia con tiempo real, pero 52 segundo en 8 hrs es demasiado error. Por eso compré el reloj DS3231.

Quiero fabricar una especie de metrónomo para timelapses de fotografía. Es un poco complicado de explicar.

Muchísimas gracias por vuestras respuestas. Sois grandes.

Precisión que linda palabra. Con que vas a medir la base de tiempos? tienes un contador de precisión calibrado? Seguramente me dirás que no. Entonces vas a confiar en lo que dice que cosa? El reloj de tu celular, un GPS, algo que sea preciso en tantas ppm/°C

Yo te comprendo pero tenemos limitaciones. Si quires en lugar de usar milis() (milisegundos) usa Micros() y lo manejas en microsegundos pero entonces cuenta también cuanto demoran las instrucciones usadas para conseguir cada cosa.

Precisión que linda palabra. Con que vas a medir la base de tiempos? Tienes un contador/frecuencímetro para contrastar las lecturas? Seguramente me dirás que no. Entonces vas a confiar en lo que dice qué cosa, el cronómetro de tu celular, un GPS, algo que sea preciso en tantas ppm/°C

Yo te comprendo pero todos tenemos limitaciones. Se me acaba de ocurrir algo mejor que millis() o Micros() y es usar una librería de Timer como lo es TimerOne.h y te independizas de todo y usarás la mejor resolución de un cristal de 16Mhz de tu Arduino o sea 65nseg por tick de reloj.

Después de muchos dolores de cabeza, acabo lo acabo de resolver…Mi arduino era un clon barato,así que ojo.

y para que conste ante todos los foreros, he realizado este video.
Clon arduino

Ahora mi pregunta es:
Cambiando el oscilador de cuarzo por otro supuestamente mejor, se arreglaría?

Buenas noches.

No se que decirte... cristal de 16Mhz como el que tiene tu Arduino Original es mas o menos similar al Clon. Vuelvo al tema de que todo pasa por un cristal que no es TCXO Temperature Compensated Crystal Oscillator

Ahora para tener ese corrimiento, el cristal debe estar muy corrido de 16Mhz Revisa por favor si tiene cristal o tal vez no lo tenga.

Ambas placas tienen cristal, aunque parecen de diferentes fabricantes. Cambiando ese cristal crees que solucionaría el problema? Adjunto foto: |500x281

Creo que acabo de descubirir que pasa

Cambiarlo por un TCXO de 16Mhz podria resolver el tema. Dejame ver, el cristal de nuestros arduinos requiere de 2 capacitores de algunos pF. Esta es una opción sugerida por un excelente administrador del foro en inglés

CrossRoads: Use a tighter tolerance crystal, and microSeconds for timing. Will be plenty accurate: Digikey 16MHz ±10ppm Crystal 18pF 30 Ohm -20°C ~ 70°C Through Hole HC49/US

Te agrego la hoja de datos Quartz Crystal Part Number Guide, High Accuracy 9B Series, High Accuracy

Mañana lo cambio y os cuento. GRACIAS

Nada, lo he cambiado y sigue sucediendo lo mismo. Habrá que comprar una placa original. Tema cerrado.