Registros de datos con base a intervalos definidos por RTC

Hola, buen día

El siguiente sketch muestra como salida lecturas de 3 sensores cada segundo, por la vía delay, pero como ven tengo un reloj RTC, así que me gustaría que la salida de las lecturas sea cada vez que en el RTC se cumplen 10 minutos, por ejemplo, si la primer salida es a las 8:10:00 a.m, el siguiente registro de datos sea a las 8:20:00 am, cómo puedo modificar el código para que las salidas se den de esa forma, y no de acuerdo a retasos de registro por la via delay()

  #include <SD.h>        // Tarjeta
  #include <SPI.h>       // Tarjeta
  #include <Wire.h>      // Reloj
  #include "RTClib.h"    // Reloj
  RTC_DS1307 RTC;        // Reloj
  const int chipSelect= 10;        // Tarjeta. Ojo ajustarlo a cada tarjeta vr página 318 del libro para más info.
  boolean hasSD;                   // Tarjeta. Guarda si tiene o no tiene tarjeta.
  const int piranoPin1= A1;        // Piranometro 1. Defino donde colocaré el pin del piaranometro 1.
  int radiacionLevel1, high1=1023, low1=0;       // Piranometro 1.
  const int piranoPin2= A2;                      // Piranometro 2. Defino donde colocaré el pin del piaranometro 2.
  int radiacionLevel2, high2=1023, low2=0;       // Piranometro 2.
  const int piranoPin3= A3;                      // Piranometro 3. Defino donde colocaré el pin del piaranometro 3.
  int radiacionLevel3, high3=1023, low3=0;       // Piranometro 3.
  File myFile;
  
  
 
  void setup () {           // INICIA VOID SETUP.
  
  Serial.begin(9600);                            // Constante General. Establece la velocidad de datos del puerto serie.
  Wire.begin();             // Reloj. Inicia el puerto I2C
  RTC.begin();              // Reloj. Inicia la comunicación con el RTC
  
  if (!RTC.isrunning()){
    Serial.println ("RTC no está coriendo!");
  }
  else{  
    RTC.adjust(DateTime(__DATE__, __TIME__));      // Reloj. Establece la fecha y hora Comentar una vez establecida la hora.
    Serial.println ("Reloj RTC1307 corriendo!");    // Reloj. 
  }

  pinMode (10, OUTPUT);                             // Tarjeta.
    if (!SD.begin (10)){                            // Tarjeta.
  Serial.println ("La tarjeta no esta presente!");       // Tarjeta
  hasSD=false;                                   // Tarjeta.
  }                                              // Tarjeta.
  else{                                          // Tarjeta.
  Serial.println ("Tarjeta inicializada.");      // Tarjeta.
  hasSD=true;                                    // Tarjeta.
  }                                              // Tarjeta.

 }                           // Cierra void setup.
  
  void loop(){               // INICIA VOID LOOP.
  
  String dataString= "";
  DateTime now = RTC.now();                      // Reloj. Obtiene la fecha y hora del RTC                                                                            
  
  dataString+= String(now.year(), DEC); // Año          // Reloj.
  dataString+= "/";                                     // Reloj.
  dataString+=String(now.month(), DEC); // Mes          // Reloj.
  dataString+= "/";                                     // Reloj.
  dataString+=String(now.day(), DEC); // Dia            // Reloj.                                              
  dataString+= " ";                                     // Reloj.
  dataString+=String(now.hour(), DEC); // Horas         // Reloj.
  dataString+= ":";                                     // Reloj.
  dataString+=String(now.minute(), DEC); // Minutos     // Reloj.    
  dataString+= ":";                                     // Reloj.   
  dataString+=String(now.second(), DEC); // Segundos    // Reloj. 
  dataString+= " - ";                                   
  dataString +=String("watts/m2");                
  dataString+= " - ";
  dataString +=String("p1= ");                
  dataString +=String(radiacionLevel1);
  dataString+= " - ";
  dataString +=String("p2= ");
  dataString +=String(radiacionLevel2);  
  dataString+= " - ";
  dataString +=String("p3= ");                
  dataString +=String(radiacionLevel3);
  
  myFile= SD.open ("pirano.txt", FILE_WRITE);
  if (myFile){                                   // Tarjeta. Si fichero está OK escribir en él. El nombre del fichero no puede tener más de 6 o 8 caracteres y no puede estar ya en la memoria porque no se graba y uno no se da cuenta.
  myFile. println (dataString);                  // Tarjeta.
  myFile.close();                                // Tarjeta.
  // Imprima todo tambien en el puerto serial.
  Serial.println(dataString);
  }
  else{
    Serial.println("Error al abrir el archivo");
  }
  
  radiacionLevel1 = analogRead(piranoPin1);      // Piranoometro 1. Defino que el nivel de radiacion estará definida por la lectura analógica del pin donde se ubicará el piranometro.
  manualTune1();                                 // Piranometro 1. Este será el valor que luego se deberá correlacionar con los valores reales del piranometro de la estacion profesional.
  radiacionLevel2 = analogRead(piranoPin2);      // Piranometro 2. Defino que el nivel de radiacion estará definida por la lectura analógica del pin donde se ubicará el piranometro.
  manualTune2();                                 // Piranometro 2. Este será el valor que luego se deberá correlacionar con los valores reales del piranometro de la estacion profesional.
  radiacionLevel3 = analogRead(piranoPin3);      // Piranometro 3. Defino que el nivel de radiacion estará definida por la lectura analógica del pin donde se ubicará el piranometro.
  manualTune3();                                 // Piranometro 3. Este será el valor que luego se deberá correlacionar con los valores reales del piranometro de la estacion profesional.
                                                 // Retardo preliminar de la variable, este delay debe desaparecer y en su lugar tomarlo el intervalo de tiempo de cada registro que son 30 minutos.
  delay(1000);                 
  }                                                  // Cierra void loop.
   
   void manualTune1()
  {
  radiacionLevel1 = map(radiacionLevel1, 0, 1023, 3000, 0);     // Piranometro 1. Como la radiación se medirá en un rango de 0 a 3000 watts/m2, estoy definiendo con map estas salidas.
 } 
  void manualTune2()
  {
  radiacionLevel2 = map(radiacionLevel2, 0, 1023, 3000, 0);     // Piranometro 2. Como la radiación se medirá en un rango de 0 a 3000 watts/m2, estoy definiendo con map estas salidas.
   } 
  void manualTune3()
  {
  radiacionLevel3 = map(radiacionLevel3, 0, 1023, 3000, 0);     // Piranometro 3. Como la radiación se medirá en un rango de 0 a 3000 watts/m2, estoy definiendo con map estas salidas.
  }

Hola. Tal vez algo así, definiendo una variable global byte lastminute=1;

if (now.minute()!=lastminute) { // si hemos cambiado el minuto
    lastminute=now.minute(); 
    if (lastminute%10 == 0) { // si el resto de dividir el minuto actual entre 10 es cero
        grabaDatos();
    }
}

Si te fijas, utilizo now.minute(), que supongo que contiene los minutos de tu RTC. Evidentemente, antes de entrar en estos if deberás primero actualizar la lectura de de hora de tu reloj ( now=rtc.now() ). Luego sencillamente comparo los minutos, ya que la hora y los segundos no los necesito: con saber que el minuto actual es múltiplo de diez y que aún no he grabado los datos, sé que tengo que grabarlos, y posteriormente marcar que ya están grabados (para que no los grabe repetidamente mientras seguimos en ese minuto). Cuando pase de ese minuto, la variable que indica que se han grabado los datos se vuelve a poner a cero, para que cuando de nuevo se llegue a un múltiplo de diez en los minutos, volverá a repetir el proceso. El meollo es el lastminute%10, que será true a las x:00, x:10, x:20, x:30, x:40 y x:50. Relee el código a ver si lo entiendes.

jvasquez05: Muchas gracias noter, con saber que sí contemplaste la hora del RTC quedo satisfecho, ya que será cuestión de entender el código, muchas gracias, creo que la clave está en el

( now=rtc.now() ) que imagino se coloca en el void setup?

la línea que dices se coloca cada vez que quieras que arduino "mire" la hora y guarde los datos en la estructura now. Lo que hacemos posteriormente es consultar esa estructura para comparar la hora leída (bueno, en este caso los minutos).

tengo el mismo inconveninete