Se puede crear una pausa con RTC sin millis ni delay??

Hola, he visto algunos tutoriales de como crear una pausa con millis para no utilizar delay, había pensado en utilizar el módulo RTC para no utilizar ninguna de las dos, es posible?....Gracias de antemano.

Hola,

Ah, que buena idea, en principio.

Pero te explico porque yo no lo haría, (aunque me gustaria la opinion de alguien que sabe bien del tema) cada vez que uso un RTC para diferentes proyectos trato que se abra, tome el dato deseado y cierre en el menor tiempo posible porque en mi cabeza esta girando el hecho (ciero o equivocado es lo que quisiera saber) de que si lo tengo permanentemente abierto se consume la bateria que lleva el modulo.

Entonces un uso excesivo llevaria a un consumo mas rapido de la bateria.

Ahora otro tema totalmente distinto, si la lectura de un RTC reemplaza a una direrencia de millis() en digamos 3500 miliseg. ¿podras lograr exactamente tal diferencia?

Seria bueno que postees un codigo sencillo a modo de ejemplo para poder discutirlo.

Saludos.

Pues en realidad ese era el tema, no sé como encuadrar un código de ese tipo..he rebuscado mucho pero no he encontrado nada, y creo que sería buena idea para no utilizar esas dos funciones.

Respecto a cerrar el RTC, no lo había pensado de esa forma, pero la idea es que la fecha y hora aparezca e una pantalla OLED constantemente, entonces no puedo cerrar el módulo si quiero anular millis y delay.

Puedes utilizar el tipo time_t.

time_t es una variable muy común en ordenadores con sistema operativo linux y te da el número de segundos que han transcurrido desde el 1 de enero de 1970.

Casi todos las librerias que he visto de RTC dan la opción de obtener dicho tiempo a traves de la función unixtime.

time_t simplemente es un entero largo sin signo (unsigned long), así que tal y como haces con millis puedes hacerlo con la función unixtime, salvo que en vez de milisegundos, el tiempo lo tendras en segundos.

Un ejemplo:

/*
 * Blink con RTC
 */
#include "RTClib.h"

RTC_DS1307 rtc; // El reloj.

uint32_t tactual=0;       
uint32_t tanterior=0;        

void setup () {
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  pinMode(13,OUTPUT);
}

void loop () {
    DateTime now = rtc.now();
    tactual = now.unixtime();

    // hacemos un parpadeo cada dos segundos.
    if ( tactual - tanterior > 2 ) {
      digitalWrite(13,!digitalRead(13));
      tanterior = tactual;
    }

}

Las buenas librerías que llaman el RTC no lo consultan a cada momento, usan a millis() para la tarea llevando adelante un reloj interno que cada X tiempo puede consultar al RTC para saber que tan preciso esta.

Esa actualización puede ser la que gustes, cada 10 min, 30 min, 1 hora o 12 hs por dar algunos ejemplos.
De esta forma, el RTC no será constantemente consultado, su batería durará mucho mas y tienes lo mejor de ambos mundos.

Todo esto esta resuelto en algunas librerías así que no hay que ponerse a programar mucho, solo elegir la librería adecuada.

Por otro lado usada en conjunción con Time de PJRC
obtienes cosas como las que comenté al comienzo donde puedes decirle al sistema cada cuanto tiempo el RTC debe sincronizarse

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

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  setSyncInterval(300);         // intervalo de sincronización en segundos
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

setSyncProvider(getTimeFunction);
Consifugra el tiempo a ser automáticamente llamda por la función getTimeFunction(). Esta función obtendría el tiempo de otro servicio sea GPS, NTP, RTC, Serial, etc y devuelve un time_t numero o zero si la hora es desconocida.

setSyncInterval(seconds);
Configura la tasa de consulta en segundos de la función getTimeFunction.

Fjga7306:
Hola, he visto algunos tutoriales de como crear una pausa con millis para no utilizar delay, había pensado en utilizar el módulo RTC para no utilizar ninguna de las dos, es posible?..Gracias de antemano.

Definitivamente puedes usa la libreria RTC en lugar de millis(), que presenta tremendas ventajas para presentar fecha-hora respecto a millis().

Recuerda que incluso es posible usar la libreria RTC sin hadware.

#include <RTClib.h>
RTC_Millis rtc; 

void setup () {
   rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
}

void loop () {
    DateTime hoy = rtc.now();
    ...
}