Как при достижении определенного размера файла закрыть его и создать новый для записи

romchik123
Offline
Зарегистрирован: 20.10.2019
Здравсвуйте.
Возник такой вопрос у меня создается файл на SD карте,этот файл переполняется,как сделать так чтоб при заполнении(2Гб памяти) создавался новый файл и данные писались уже в нем
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <TimeLib.h>                        // Подключаем библиотеку TimeLib
#include <DS1307RTC.h>                      // Подключаем библиотеку DS1307RTC
//--------------------------------------///
#define ADC_ref 5.0
#define analog_resolution 1024.0
//--------------------------------------///
const int chipSelect = 10;
unsigned long time;
int size = 0; 
File gFile;
const int xPin = A0;                 
const int yPin = A1;                 
const int zPin = A2; 
const int XPin = A3;                 
const int YPin = A4;                 
const int ZPin = A5; 
//--------------------------------------///
const float X0 = 1.80; //значения по осям при нулевых "g";
const float Y0 = 4.10; //эти значения вы должны определить
const float Z0 = 4.22; //самостоятельно (см.шаг 4)
//-----------------------------------------------------------------//
const float x0 = 1.77; //значения по осям при нулевых "g";
const float y0 = 1.80; //эти значения вы должны определить
const float z0 = 2.13; //самостоятельно (см.шаг 4)

const float sens_X = 0.03; //чувствительность по осям в В/g;
const float sens_Y = 0.03; //эти значения вы должны определить
const float sens_Z = 0.03; //самостоятельно (см.шаг 4)
//-----------------------------------------------------------------//
const float sens_x = 0.32; //чувствительность по осям в В/g;
const float sens_y = 0.32; //эти значения вы должны определить
const float sens_z = 0.32; //самостоятельно (см.шаг 4)

void setup()
{
  Serial.begin (9600);
  Serial.print("Initializing SD card... ");
  pinMode(SS, OUTPUT);
  if (!SD.begin(chipSelect)){
    Serial.println("SD card not found... Try again");
    while (1) ;}
    
    gFile = SD.open("glog.txt", FILE_WRITE);
    
 if (! gFile){
    Serial.println("Error opening glog.csv");
     while (1) ;}
  Serial.println("Data logging initiated");
}
void loop(){
  time = millis();
 // Serial.println(time);
/*tmElements_t tm;  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
     Serial.print(tm.Hour);//функция за вывод часов
    Serial.write(':');
      Serial.print(tm.Minute);//функция за вывод минут
    Serial.write(':');
   Serial.print(tm.Second);//функция за вывод секнуд
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
}
else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
 // delay(1000);*/
unsigned int x = analogRead(xPin);
unsigned int y = analogRead(yPin);
unsigned int z = analogRead(zPin);
//-------------------------------------------------//
unsigned int X = analogRead(XPin);
unsigned int Y = analogRead(YPin);
unsigned int Z = analogRead(ZPin);
float gx = (x * ADC_ref / analog_resolution - x0) / sens_x;
float gy = (y * ADC_ref / analog_resolution - y0) / sens_y;
float gz = (z * ADC_ref / analog_resolution - z0) / sens_z;
float gX = (X * ADC_ref / analog_resolution - X0) / sens_X;
float gY = (Y * ADC_ref / analog_resolution - Y0) / sens_Y;
float gZ = (Z * ADC_ref / analog_resolution - Z0) / sens_Z;
//------------------------------------------------------------//
String getdata = (String(time)+':');
String dataaccel = (String(gx) + ',' + String(gy) + ',' + String(gz) + ':' + String(gX) + ',' + String(gY) + ',' + String(gZ) + ';');
//------------------------------------------------------------//
//Serial.println(gFile.size());

gFile.print(getdata);
gFile.println(dataaccel); 
  gFile.flush();
  
delay(200);
}

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Заведите переменную file_size типа unsigned long и добавляйте к ней в самом конце вашего цикла размер записанных данных.

// псевдокод
file_size += getdata.Length();
file_size += dataaccel.Length() + 2;
if ( file_size > 2Gb )
{
  close_old_file(handle);
  handle = open_new_file();
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Получать размер файла после каждой записи в него - и проверять.

negavoid
Offline
Зарегистрирован: 09.07.2016

Или так, но мой метод не будет дёргать фс/читать с карты лишний раз :) Впрочем, фиг её знает эту библиотеку, может она кэширует куда размер.

ratman
Offline
Зарегистрирован: 11.10.2015

А закрывать файл вообще не планируется?