Как при достижении определенного размера файла закрыть его и создать новый для записи
- Войдите на сайт для отправки комментариев
Пнд, 30/12/2019 - 22:36
Здравсвуйте. Возник такой вопрос у меня создается файл на 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);
}
Заведите переменную 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(); }Получать размер файла после каждой записи в него - и проверять.
Или так, но мой метод не будет дёргать фс/читать с карты лишний раз :) Впрочем, фиг её знает эту библиотеку, может она кэширует куда размер.
А закрывать файл вообще не планируется?