DATA LOGGIN BOARD DEEK BOARD

hola buena tarde a todos, compre este modulo de data logger deek board, me tope con este código en internet, que activa con 1 boton en el pin 7 la grabación de un dato analogico A0, y se detiene presionando ese botón guardando la hora y fecha con el dato, y te avisa con LEDS el estado de grabacion y STOP.
utilice primero el un modulo de micro SD y RTC DS3231 y funciona perfecto sin ningun problema.

pero al utilizar el modulo de data logger deek (que es mas pequeño que los modulos separados) este usa el RTC 1307, investigue en internet y la libreria RTClib y usa comandos de now.day(), now.month, etc.
como no estoy familiarizado con esa libreria y comandos.

en un inicio pense que funcionaria con las mismas librerias del DS 3231 y funciona muy bien de las 0 horas (12am) hasta las 16 horas (4pm) y despues comienza a escribir 10 en lugar de 17 horas, 11 en lugar de 18, 12 horas en lugar de 19, y cuando llega a las 17 horas (como las 11pm) se reinicia en 0 y continua con la toma de informacion.

MI GRAN PREGUNTA ES: ALGUIEN PODRIA AYUDARME A CORREGIR ESTE ERROR, Y QUE PUEDA ESCRIBIR LA HORA EN ESE FORMATO SENCILLO DE GET.CLOCK ( INFORMACION) EN VEZ DE UTILIZAR LOS COMANDOS now.day();

otra duda si alguien sabe que consumo en mAh tiene el modulo de data loggin ??

este es el codigo de data logger con ds3231:

#include <SPI.h>
#include <SD.h>
File myFile;
#include <DS3231.h>
#include <Wire.h>
#include <TimerOne.h>
DS3231 Clock;
#define FACTOR_VOLTAJE (5.0 / 1023.0)
byte year, month, date, DoW, hour, minute, second;
char linea[24];
char voltaje[5];

#define LED1    A1
#define LED2    A2
#define chipSelect      10
#define LED3    4
#define LED4    3
#define LED5    2
#define LED6    A3


void setup()
{
    TIMSK0 = 0; 
  Wire.begin();
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);

  
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT); 
  pinMode(chipSelect, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT); 
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT); 

digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);


  if (!SD.begin(chipSelect))
  {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
    return;
  }
  
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);

  Timer1.initialize(2000); 
}


void loop()
{
  if (!digitalRead(7)) grabar();
}

void grabar() {
  while (!digitalRead(7)); // Espera a que el botón se suelte

  myFile = SD.open("datalog1.txt", FILE_WRITE);//abrimos  el archivo
  if (!myFile) {
  
  return;}
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);

  Clock.getTime(year, month, date, DoW, hour, minute, second);
  myFile.write(linea, sprintf(linea, "Iniciado el %02d/%02d/20%02d, a las %02d:%02d:%02d\r\n", date, month, year, hour, minute, second)); 
   Timer1.attachInterrupt (timerIsr); // attach service
  while (digitalRead(7)){
     unsigned long tAnterior = 0;
    unsigned long tActual = millis();
    if (tActual >= tAnterior) { // Pide información nueva al RTC cada segundo
      tAnterior = tActual + 1000;
      Clock.getTime(year, month, date, DoW, hour, minute, second);
} 
  }
  Timer1.detachInterrupt(); // detach service
  while (!digitalRead(7)); // Espera a que el botón se suelte

  Clock.getTime(year, month, date, DoW, hour, minute, second);
  myFile.write(linea, sprintf(linea, "Finalizado el %02d/%02d/20%02d, a las %02d:%02d:%02d\r\n", date, month, year, hour, minute, second)); // Pie
  myFile.close(); //cerramos el archivo
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
 
digitalWrite(LED3, LOW); 
digitalWrite(LED4, LOW);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, LOW);
}

void timerIsr()
{
      dtostrf(analogRead(A0) * FACTOR_VOLTAJE, 0, 2, voltaje);
    myFile.write(linea, sprintf(linea, "%s\t%02d:%02d:%02d\r\n", voltaje, hour, minute, second));
 }

este es el codigo de 1307: con comandos now

#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(3000); // La información se actualiza cada 1 seg.

}
void getTime(byte* year, byte* month, byte* date, byte* DoW, byte* hour, byte* minute, byte* second) {
  DateTime now = RTC.now();
  if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

  *year = now.year() - 2000;
  *month = now.month();
  *date = now.day();
  *DoW = now.dayOfTheWeek();
  *hour = now.hour();
  *minute = now.minute();
  *second = now.second();
}

Esta es la adaptación más cercana que puedo hacer. La diferencia es que para llamarlo correctamente, todos los nombres de las variables deben presidir con &. Ejemplo:

getTime(&year, &month, &date, &DoW, &hour, &minute, &second);

Este parece ser el consumo

16MHz, 5 volt, 36mA draw current, 14 digital pins, ATmega32U4 MCU - Deek-Robot Pro Micro

por otro lado mira este hilo Deek robot SD shield y verás posibles respuestas a tu problema

encrone_90:

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino: In function 'void getTime(byte*, byte*, byte*, byte*, byte*, byte*, byte*)':

sketch_feb09c:76: error: no match for ‘operator!’ (operand type is ‘DateTime’)

if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

^

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: candidate is:

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: operator!(bool)

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note:  no known conversion for argument 1 from ‘DateTime’ to ‘bool’

exit status 1
no match for ‘operator!’ (operand type is ‘DateTime’)

No sé si colocar otro paréntesis bastará:

if (!(now))

El detalle es que no sé cómo maneja la función now() un error como que el RTC no responda a la petición del Arduino. No vaya a ser que la fecha y hora se actualize con valores fuera de serie.

encrone_90:
una pregunta ese void debe ir en el primer boceto??

Fuera de cualquier función; como se declara setup y loop (excepto que tiene parámetros).

encrone_90:
y lo de llamar con un & tambien aplica a la hora de imprimir los datos???

No. La idea de esta adaptación es para que puedas hacer exactamente lo mismo que en código viejo, pero con la librería nueva (recuerda que no tiene la función getTime, así que básicamente la “reinventé”).

encrone_90:
pero de curioso omití esa linea, y funciona.

Era obvio. El compilador decía que la clase DateTime no tenía operador ! definido.

Además, según la implementación de dicha función:

DateTime RTC_DS1307::now() {
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire._I2C_WRITE((byte)0); 
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);
  uint8_t ss = bcd2bin(Wire._I2C_READ() & 0x7F);
  uint8_t mm = bcd2bin(Wire._I2C_READ());
  uint8_t hh = bcd2bin(Wire._I2C_READ());
  Wire._I2C_READ();
  uint8_t d = bcd2bin(Wire._I2C_READ());
  uint8_t m = bcd2bin(Wire._I2C_READ());
  uint16_t y = bcd2bin(Wire._I2C_READ()) + 2000;
  
  return DateTime (y, m, d, hh, mm, ss);
}

El objeto se crea de todas formas, INDEPENDIENTEMENTE DE SI EL MÓDULO RESPONDE O NO.

Eso es lo que me temía: cuando por algún motivo suceda, la fecha y hora aparecerá con valores fuera de lo normal (165/165/2165 - 165:165:165).

Por lo tanto, se puede corregir de la siguiente manera:

void getTime(byte* year, byte* month, byte* date, byte* DoW, byte* hour, byte* minute, byte* second) {
  DateTime now = RTC.now();
  if (now.second() > 59) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

  *year = now.year() - 2000;
  *month = now.month();
  *date = now.day();
  *DoW = now.dayOfTheWeek();
  *hour = now.hour();
  *minute = now.minute();
  *second = now.second();
}