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);