Hola a todos, lo primero un saludo que soy nuevo en el foro.
Llevo solo unos meses con Arduino y principalmente con el control de motores de paso para aplicación en un telescopio, así que mi experiencia es limitada.
Solicito vuestra ayuda para un tema que no entiendo. He comprado un módulo de reloj DS3234 y con un pequeño programa de prueba (bajado de la página oficial de Sparkfun) conecto el reloj y recoge la hora de su primera conexión y la puedo ver a través del monitor serie del IDE de Arduino.
Lo que no comprendo es que si por ejemplo desconecto el módulo y lo vuelvo a conectar pasados 15 minutos, la hora que indica en el monitor serie es la hora en que se conectó por primera vez, es decir no actualiza automáticamente la hora como supongo que debería hacer. Es decir la hora que se conectó por primera vez está como grabada en una memoria y siempre empieza por dicha hora.
Lo curioso es que he quitada la batería al módulo DS3234 y vuelve a manifestar la hora de su conexión original.
Por favor que hago mal o que no estoy interpretando bien ?
Por cierto compré dos módulos DS3234 y en los dos me pasa lo mismo por lo que descarto que el dispositivo estuviera mal.
Saludos,
Lo que no comprendo es que si por ejemplo desconecto el módulo y lo vuelvo a conectar pasados 15 minutos, la hora que indica en el monitor serie es la hora en que se conectó por primera vez, es decir no actualiza automáticamente la hora como supongo que debería hacer. Es decir la hora que se conectó por primera vez está como grabada en una memoria y siempre empieza por dicha hora.
Seguramente porque el código de ejemplo que deberías haber posteado tiene una instrucción que sirve para setear la hora inicial de tu DS3234 iniclalmente con el momento en que se compiló.
Luego debes comentar esa línea y entonces volver a subirlo para que no ajuste de nuevo con cada comienzo a tu RTC.
Muchas gracias por responder y disculpa la tardanza en hacerlo yo a tu mensaje.
Mis conocimientos de electrónica y programación son muy pequeños (hace unos meses no sabía lo que era un Arduino) pero dado que ahora dispongo de tiempo (jubilado) es una magnífica forma de aprovecharlo. En estos días he estado analizado el programa para con la ayuda de google intentar comprender su funcionamiento y ver cada sentencia que es lo que hace y he conseguido avances para mi importantes como anular que salga la fecha en formato americano, quitar las alarmas que venían preprogramadas en el ejemplo, hacer que el tiempo se establezca de forma automática o manual en una hora y dia predeterminado y alguna otra cosilla, pero referente a como se setea la hora inicial no consigo verlo (sospecho que con la sentencia Static Int8 _ t lastSecond=-1 pero esto es solo una intuición porque no la comprendo bien y aunque la he quitado y vuelto a poner no consigo el resultado que quería.
Así que adjunto el programa que estoy utilizando (cierto que tenía que haberlo hecho antes) que es el que viene como ejemplo en la librería SparkFunDS3234RTC.h con las modificaciones que he comentado antes. Y os agradecería alguna sugerencia.
Muchas gracias por vuestra atención y un saludo,
/******************************************************************************
DS3234_RTC_Demo.ino
Jim Lindblom @ SparkFun Electronics
original creation date: October 2, 2016
https://github.com/sparkfun/SparkFun_DS3234_RTC_Arduino_Library
Configures, sets, and reads from the DS3234 real-time clock (RTC).
Resources:
SPI.h - Arduino SPI Library
Development environment specifics:
Arduino 1.6.8
SparkFun RedBoard
SparkFun Real Time Clock Module (v14)
*****************************************************************************/
#include <SPI.h>
#include <SparkFunDS3234RTC.h>
// Comment out the line below if you want month printed before date.
// E.g. October 31, 2016: 10/31/16 vs. 31/10/16
//////////////////////////////////
// Configurable Pin Definitions //
//////////////////////////////////
#define DS13074_CS_PIN 10 // DeadOn RTC Chip-select pin
//#define INTERRUPT_PIN 2 // DeadOn RTC SQW/interrupt pin (optional)
void setup()
{
// Use the serial monitor to view time/date output
Serial.begin(9600);
#ifdef INTERRUPT_PIN // If using the SQW pin as an interrupt
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
#endif
// Call rtc.begin([cs]) to initialize the library
// The chip-select pin should be sent as the only parameter
rtc.begin(DS13074_CS_PIN);
//rtc.set12Hour(); // Use rtc.set12Hour to set to 12-hour mode
// Now set the time...
// You can use the autoTime() function to set the RTC's clock and
// date to the compiliers predefined time. (It'll be a few seconds
// behind, but close!)
rtc.autoTime();
// Or you can use the rtc.setTime(s, m, h, day, date, month, year)
// function to explicitly set the time:
// e.g. 7:32:16 | Monday October 31, 2016:
//rtc.setTime(16, 32, 7, 2, 31, 10, 16); // Uncomment to manually set time
// Update time/date values, so we can set alarms
// Configure Alarm(s):
// (Optional: enable SQW pin as an intterupt)
// Set alarm1 to alert when seconds hits 30
// Set alarm2 to alert when minute increments by 1
}
void loop()
{
static int8_t lastSecond=-1;
// Call rtc.update() to update all rtc.seconds(), rtc.minutes(),
// etc. return functions.
rtc.update();
if (rtc.second() != lastSecond) // If the second has changed
{
printTime(); // Print the new time
lastSecond = rtc.second(); // Update lastSecond value
}
// Check for alarm interrupts
#ifdef INTERRUPT_PIN
// Interrupt pin is active-low, if it's low, an alarm is triggered
if (!digitalRead(INTERRUPT_PIN))
{
#endif
// Check rtc.alarm1() to see if alarm 1 triggered the interrupt
if (rtc.alarm1())
{
Serial.println("ALARM 1!");
// Re-set the alarm for when s=30:
rtc.setAlarm1(30);
}
// Check rtc.alarm2() to see if alarm 2 triggered the interrupt
if (rtc.alarm2())
{
Serial.println("ALARM 2!");
// Re-set the alarm for when m increments by 1
rtc.setAlarm2(rtc.minute() + 1, rtc.hour());
}
#ifdef INTERRUPT_PIN
}
#endif
}
void printTime()
{
Serial.print(String(rtc.hour()) + ":"); // Print hour
if (rtc.minute() < 10)
Serial.print('0'); // Print leading '0' for minute
Serial.print(String(rtc.minute()) + ":"); // Print minute
if (rtc.second() < 10)
Serial.print('0'); // Print leading '0' for second
Serial.print(String(rtc.second())); // Print second
if (rtc.is12Hour()) // If we're in 12-hour mode
{
// Use rtc.pm() to read the AM/PM state of the hour
if (rtc.pm()) Serial.print(" PM"); // Returns true if PM
else Serial.print(" AM");
}
Serial.print(" | ");
// Few options for printing the day, pick one:
Serial.print(rtc.dayStr()); // Print day string
//Serial.print(rtc.dayC()); // Print day character
//Serial.print(rtc.day()); // Print day integer (1-7, Sun-Sat)
Serial.print(" - ");
#ifdef PRINT_USA_DATE
Serial.print(String(rtc.month()) + "/" + // Print month
String(rtc.date()) + "/"); // Print date
#else
Serial.print(String(rtc.date()) + "/" + // (or) print date
String(rtc.month()) + "/"); // Print month
#endif
Serial.println(String(rtc.year())); // Print year
}
Hi,
Esta es la linea que tienes que uncomentar despues de escribir los volores del reloj. Yo le puse lo que cada variable es pero depende de libraria es el orden que van.
rtc.setTime(segundos, minutos, hora, dia de la semana, dia del mes, mes, year); // Uncomment to manually set time
Gracias Tauro0221, pero creo que ese no es el problema, con esa sentencia pongo la hora de forma manual al principio, (aunque yo lo he hecho de forma automática con rtc.autoTime).
surbyte:
Seguramente porque el código de ejemplo que deberías haber posteado tiene una instrucción que sirve para setear la hora inicial de tu DS3234 iniclalmente con el momento en que se compiló.
Luego debes comentar esa línea y entonces volver a subirlo para que no ajuste de nuevo con cada comienzo a tu RTC.
Creo que el problema lo has fijado en tu primera frase.
La solución es la segunda frase pero por favor que quieres decir con "comentar esa línea" (en el supuesto de que pueda dar con ella)
Saludos,
Aca esta tu problema
// Now set the time...
// You can use the autoTime() function to set the RTC's clock and
// date to the compiliers predefined time. (It'll be a few seconds
// behind, but close!)
rtc.autoTime();
// Or you can use the rtc.setTime(s, m, h, day, date, month, year)
// function to explicitly set the time:
// e.g. 7:32:16 | Monday October 31, 2016:
//rtc.setTime(16, 32, 7, 2, 31, 10, 16); // Uncomment to manually set time
Se nota que has probado cientos de cosas en ese codigo
// rtc.autoTimer()
comentalo // esto es comentar
Gracias, lamento haceros perder el tiempo, pero está claro que no he sabido transmitir mi problema.
Yo puedo establecer el tiempo perfectamente tanto si lo hago de forma automática con la sentencia rtc.autoTime (recoje la hora que tiene en ese momento el ordenador) como si lo hago explicitamente con la sentencia rtc.setTime (marco la hora que yo elijo con independencia de la que tenga en ese momento el ordenador)
Ejemplo fijo las 7:10:00 del día 14/10/2015 y en monitor serie del IDE de Arduino veo como se va actualizando segundo a segundo.
Hasta aquí todo perfecto.
Si apago el ordenador, y lo vuelvo a conectar cuando ha transcurrido por ejemplo 3 días 1 hora y 22 minutos y conecto el monitor serie de Arduino vuelve a salir las 7:10:00 del día 14/10/2015 iniciales y yo lo que busco es que la hora que apareciera fuera 8:32:00 del día 17/10/2015 (el tiempo inicial más el tiempo transcurrido apagado el ordenador)
Esto que indico lo he probado dos veces, con la sentencia rtc.autoTime y otras dos veces con la sentencia rtc.setTime con el mismo resultado y he tenido la precaución de entre prueba y prueba borrar la memoria del Arduino y quitar la pila del DS3234 para que no hubiera alguna posible interferencia.
En fin un saludo y disculpar la insistencia.
Hi,
En otras palabras si yo lo entiendo lo que sucede es que el modulo no mantiene la hora si lo apagas. Mientras no lo apague el mantiene la hora. Si lo apagas la hora que aparece es la hora orignal del modulo. Si esto es correcto entoces la bateria no esta mantiniedo el voltaje y el modulo pierda la hora.
Usas esta librería
#include <SparkFunDS3234RTC.h>
Hay dos comandos que fijan la hora uno es
rtc.autoTime();
Fija la hora y fecha a los valores de la compilacion. de modo que si desconectas el arduino lo vuelves a energizar va a arrancar con siempre con la hora de la compilacion y su fecha
Solución comentarlo o sea // rtc.autoTime();
rtc.setTime(16, 32, 7, 2, 31, 10, 16); // Uncomment to manually set time
este es la 2da opción. Fija la hora a lo indicado dentro de los ()
La comentas y no tendrá nada para hacerlo.
y finalmente en esta libreria
// Update time/date values, so we can set alarms
rtc.update();
Que actualiza el sistema con la hora del reloj.
Asi que solo comentando las dos anteriores te aseguras que funcione bien.
Mil gracias, problema resuelto, el DS3234 funciona ahora como yo lo necesito.
Como podeís imaginar el asunto estaba en que yo no era capaz de entender lo que reiteradamente me deciaís. Por supuesto que sabía que en un programa todo lo que iba después de // servía para aclarar el programa y no tenía efectos en el mismo pero no intuí que se podía "comentar" una sentencia
Esta frase me lo ha aclarado todo
Fija la hora y fecha a los valores de la compilacion. de modo que si desconectas el arduino lo vuelves a energizar va a arrancar con siempre con la hora de la compilacion y su fecha
Solución comentarlo o sea // rtc.autoTime();
Un cordial saludo,
Miguel