He revisado todo con calma y he hecho paso a paso el tutorial que compartiste del DS3231 y ya conseguí que me escriba en la SD la fecha, la hora y la lectura del sensor utilizando las librerías.
Con la solución que me dio @Surbyte de crear un buffer conseguí simplificarlo más. En resumen ahora tengo un sketch que tiene 300 líneas menos de código y es muchísimo más fácil de leer y mantener.
Ahora el problema que tengo es que si el ESP32 pierde la alimentación, el tiempo no pasa para el RTC, por si no me explico bien, supongamos que tengo el ESP32 enchufado al USB del PC y apago el PC el día 22/08/21 a las 22:00, cuando lo encienda al día siguiente a las 09:00 por ejemplo, la primera lectura que me haga pondrá la fecha y hora en la que se apagó, es decir que para el RTC no habrá pasado el tiempo.
¿Cuál sería la forma correcta para hacer eso? porque si cada vez que se me queda sin batería tengo que resubir el sketch me es inviable, ya que el ESP32 va a estar alimentado por una batería externa.
Lo único que se me ocurre es pedirle al usuario que introduzca él mismo los datos desde un formulario, pero no sé si hay alguna otra forma de hacerlo sin que dicho usuario intervenga.
#include <Wire.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
#define uS_TO_S_FACTOR 1000000ULL /* Factor de conversión de microsegundos a segundos */
#define TIME_TO_SLEEP 30
const int SD_CS = 5;
const int sensor = 36; // El pin SP es el GPIO36 equivale a adc0.
int lecturaSensor;
char buffer[50];
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
RTC_DS3231 rtc;
File logFile;
void setup() {
Serial.begin(9600);
if (!SD.begin(SD_CS)) {
Serial.println("Error al iniciar");
return;
}
delay(300);
if (!rtc.begin()) {
Serial.println("No se puede conectar al RTC");
while (1);
}
// Si se ha perdido la corriente, fijar fecha y hora
if (rtc.lostPower()) {
// Fijar a fecha y hora de compilacion
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Fijar a fecha y hora específica. 22 de Agosto de 2021 a las 04:15:00
//rtc.adjust(DateTime(2021, 8, 22, 4, 43, 0));
}
// Abrir archivo y guardar la lectura del sensor
logFile = SD.open("/datalog.txt", FILE_APPEND);
if (logFile) {
int lecturaSensor = analogRead(sensor);
DateTime now = rtc.now();
logSDCard(now, lecturaSensor);
logFile.close();
}
else {
Serial.println(F("Error al abrir el archivo"));
}
delay(1000);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {
}
void readSensor()
{
lecturaSensor = analogRead(sensor);
}
// Función para guardar los datos en la SD
void logSDCard(DateTime rtc, int lecturaSensor)
{
sprintf(buffer, "Fecha: %02d/%02d/%02d Hora: %02d:%02d:%02d Sensor: %f\n", rtc.day(), rtc.month(), rtc.year(), rtc.hour(), rtc.minute(), rtc.second(), lecturaSensor);
logFile.print(buffer);
Serial.println();
Serial.println(buffer);
}