Datalogger, al cabo de un tiempo no guarda datos en la SD

Hola
Estoy realizando un proyecto para leer, con un arduino UNO dos sensores el BME280 y el VEML6070 por I2C, e insertarle fecha y hora desde un RTC adafruit, todo este string con fecha hora datos de temperatura, humedad, presión, altura, y radiación UV los insertamos en una SD.
Me funciona durante un rato pero llega un momento que por el puerto serie todo va bien pero la memoria SD no se guardan los datos, suele tardar entre una hora y dos horas pero no es siempre el mismo tiempo. El intervalo de lectura ronda el segundo.
Me podríais ayudar por favor, seguro que es una tontería pero no veo donde tengo el error..

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Adafruit_VEML6070.h"
#include <SD.h>
#include "RTClib.h"

#if defined(ARDUINO_ARCH_SAMD)

// Para Arduino Zeroo, para salida al puerto serie USB, quitar esta linea o comentarla, Quite la línea abajo si está utilizando el puerto de programación para programar el Zero!
#define Serial SerialUSB
#endif

/*#define BME_SCK 13
 #define BME_MISO 12
 #define BME_MOSI 11
 #define BME_CS 10*/

const int chipSelect = 10; //direccion del sensor BME

RTC_PCF8523 rtc;// si no inicializaste el reloj acuardate de hacerlo primero...
// RTC_DS1307 rtc; // mas antiguo si no inicializaste el reloj acuardate de hacerlo primero...

#define SEALEVELPRESSURE_HPA (1035.50) //presion a nivel de mar, para calcular cosas 
Adafruit_BME280 bme; // descomenta esta linea si quieres conexion al sensor con el Arduino en I2C


#define SAMPLE_DELAY 1000 // Define el retardo entre muestras del BME, en millisegundos, 1000=1s 10.000=10s es posible que interfiera con el muestro del VEML
Adafruit_VEML6070 uv = Adafruit_VEML6070();
C

void setup() {
 Serial.begin(57600);
 // Ponga su código de configuración aquí, para ejecutar una vez:
 if (!bme.begin()) {
   Serial.println("No hay sensor BME280 que funcione, chequea el cableado");
   Serial.println("VEML6070 Test"); //test sensor UV
   /*  Hay cuatro tiempos de "integración" para calcular la intensidad.
        Cuanto más largo es el tiempo de integración, más luz se recoge.
        Con tiempos de integración cortos se obtinenen mediciones rápidas pero con menos precisión.
        Con tiempos más largos dará más precisión, pero más tiempo en la lectura!
        VEML6070_HALF_T ~ 62.5ms
        VEML6070_1_T ~ 125ms
        VEML6070_2_T ~ 250ms
     VEML6070_4_T ~ 500ms */
   uv.begin(VEML6070_4_T); //utilizo la maxima precision y el mayor tiempo de lectura posible
   while (1);
 }
 Serial.print("Inicializando la tarjeta SD...");
 pinMode(10, OUTPUT);
 // comprueba si la tarjeta está presente y puede ser inicializada:
 if (!SD.begin(chipSelect)) {
   Serial.println("Falla la tarjeta SD, no existe, inserta una SD valida");
   // no hacer nada mas
   return;
 }
 Serial.println("Tarjeta SD inicializada FUNCIONA.");

}

//añadir cadena dia mes año, hora y segundos

/*
 // Si queremos leer una entrada analogica p.e. una LDR o una PT100
 dataString += String (analogRead(A0));
 File dataFile = SD.open("datalogp.txt", FILE_WRITE);

*/

void loop() {

 String dataString = "";
 DateTime now = rtc.now();

 dataString += String(now.year(), DEC);
 dataString += "/";
 dataString += String(now.month(), DEC);
 dataString += "/";
 dataString += String(now.day(), DEC);
 dataString += " ";
 dataString += String(now.hour(), DEC);
 dataString += ":";
 dataString += String(now.minute(), DEC);
 dataString += ":";
 dataString += String(now.second(), DEC);
 dataString += " ;";
 //Añadir datos de Temp;Presion;humedad;UV a la cadena
 double reading = bme.readTemperature(); // kelvin double reading = bme.readTemperature()*9.0/5+32;
 dataString += String(reading);
 dataString += " C;";
 reading = bme.readPressure() / 100.F; // comentar si no queremos presion
 dataString += String(reading);  // comentar si no queremos presion
 dataString += " hPa;";              // comentar si no queremos presion
 reading = bme.readAltitude(SEALEVELPRESSURE_HPA); // comentar si no queremos altitud
 dataString += String(reading);  // comentar si no queremos presion
 dataString += " m;";              // comentar si no queremos presion
 reading = bme.readHumidity(); // comentar si no queremos humedad
 dataString += String(reading);// comentar si no queremos humedad
 dataString += " %;";// comentar si no queremos humedad
 reading = uv.readUV(); // comentar si no queremos UV
 dataString += String(reading);  // comentar si no queremos UV
 dataString += " nivel luz UV";// comentar si no queremos UV


 File dataFile = SD.open("ibilaldi.txt", FILE_WRITE); //max 8.3 caracteres nombre.txt, abrimos el archivo para guardar los datos de: fecha,hora,min,seg,temperatura,presion, humedad en la SD

 // Si el archivo está disponible, escríbelo en el..
 if (dataFile) {
   dataFile.print( (millis() / 1000 ) ); //pone numero a las lineas
   dataFile.print(";"); //pone numero a las lineas
   dataFile.println(dataString);
   dataFile.close();
   // imprimir tambien por el puerto serie la informacion
   Serial.println(dataString);
 }
 // Si el archivo no está abierto, aparecerá un error:
 else {
   Serial.println("Error, no se puede abrir el .txt");
 }
 delay(SAMPLE_DELAY);

Cuando compilas tu código que dice responde de la RAM utilizada?

Esto es lo que dice el compilador:

El Sketch usa 22976 bytes (71%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 1397 bytes (68%) de la memoria dinámica, dejando 651 bytes para las variables locales. El máximo es 2048 bytes.

la cadena que imprime es la siguiente el Arduino via serie y al fichero de ls SD:

0;2010/11/20 3:2:40 ; NAN C; NAN hPa; NAN m; NAN %;3.00 nivel luz UV
1;2010/11/20 3:2:41 ;19.77 C;1034.97 hPa;-110.70 m;55.09 %;3.00 nivel luz UV
2;2010/11/20 3:2:42 ;19.78 C;1034.96 hPa;-110.57 m;55.06 %;3.00 nivel luz UV
3;2010/11/20 3:2:43 ;19.79 C;1034.92 hPa;-110.24 m;54.97 %;3.00 nivel luz UV
4;2010/11/20 3:2:44 ;19.79 C;1034.95 hPa;-110.49 m;54.92 %;3.00 nivel luz UV
5;2010/11/20 3:2:45 ;19.80 C;1034.98 hPa;-110.75 m;54.88 %;3.00 nivel luz UV
6;2010/11/20 3:2:46 ;19.80 C;1034.89 hPa;-109.97 m;54.86 %;3.00 nivel luz UV
7;2010/11/20 3:2:47 ;19.80 C;1034.94 hPa;-110.41 m;54.83 %;3.00 nivel luz UV
8;2010/11/20 3:2:48 ;19.81 C;1034.92 hPa;-110.26 m;54.76 %;3.00 nivel luz UV
.
.
.
.

Solo por probar cambia el SAMPLE_DELAY a 5000 o sea 5 seg y prueba a ver que ocurre.

Si ya le he subido.
De momento esta en marcha, lo dejare toda la noche, a ver que pasa..
Mañana os cuento.
Gracias

Hola

Despues de tenerlo toda la noche y parte de la mañana en funcionamiento puedo decir que ahora va bien.

¿cual es el problema, se puede calcular el limite de tiempo?

Un saludo y mil gracias..

:slight_smile: :slight_smile: