Господа, доброго времени суток! У меня имеется 3 акселерометра, ардуино МЕГА и Шилд. Необходимо записывать на SD карту показания с датчиков, обычно скорость у меня составляет 4-5 показаний в секунду, но потом, после полудня или целого дня работы он начинает затормаживать, как будто чем-то переполняется, и показания 1-2 в секунду. Подскажите пожалуйста что можно подправить? Код (C++): //Импорт библиотек #include "DHT.h" #define DHTPIN 2 #include <Wire.h> #include <string.h> #include <SPI.h> #include <SD.h> #define SDCARD_CS 4 unsigned long timing_welcome; //1 accel unsigned int xPin = A0; unsigned int yPin = A1; unsigned int zPin = A2; //2 accel unsigned int x1Pin = A3; unsigned int y1Pin = A4; unsigned int z1Pin = A5; //3 accel unsigned int x2Pin = A6; unsigned int y2Pin = A7; unsigned int z2Pin = A8; float Vmax = 5.0; float Vmax1 = 5.0; float Vmax2 = 5.0; float x0 = 1.71; float y0 = 1.69; float z0 = 1.68; float x01 = 1.71; float y01 = 1.69; float z01 = 1.68; float x02 = 1.71; float y02 = 1.69; float z02 = 1.68; float sens_x = 0.35; float sens_y = 0.35; float sens_z = 0.35; float sens_x1 = 0.35; float sens_y1 = 0.35; float sens_z1 = 0.35; float sens_x2 = 0.35; float sens_y2 = 0.35; float sens_z2 = 0.35; RTC_DS1307 RTC; char fileName[] = "00000000.CSV"; //Название файла File webFile; DHT dht(DHTPIN, DHT11); void setup() { delay(300); pinMode(4, OUTPUT); digitalWrite(4, HIGH); // Serial.begin(115200); Wire.begin(); //Important for RTClib.h // initialize SD card if (!SD.begin(4)) { return; } webFile = SD.open(fileName, FILE_WRITE); if (webFile) { //Создание колонок String Name0 = (fileName); String header0 = ("Time Gx Gy Gz Gx1 Gy1 Gz1 Gx2 Gy2 Gz2 t,C"); webFile.println(Name0); webFile.println(header0); webFile.close(); } } void my_func() { //Считывания аналога unsigned int value_x = analogRead(xPin); unsigned int value_y = analogRead(yPin); unsigned int value_z = analogRead(zPin); unsigned int value_x1 = analogRead(x1Pin); unsigned int value_y1 = analogRead(y1Pin); unsigned int value_z1 = analogRead(z1Pin); unsigned int value_x2 = analogRead(x2Pin); unsigned int value_y2 = analogRead(y2Pin); unsigned int value_z2 = analogRead(z2Pin); //Формула для расчета float Gx = (value_x * Vmax / 1024.0 - x0) / sens_x; float Gy = (value_y * Vmax / 1024.0 - y0) / sens_y; float Gz = (value_z * Vmax / 1024.0 - z0) / sens_z; float Gx1 = (value_x1 * Vmax1 / 1024.0 - x01) / sens_x1; float Gy1 = (value_y1 * Vmax1 / 1024.0 - y01) / sens_y1; float Gz1 = (value_z1 * Vmax1 / 1024.0 - z01) / sens_z1; float Gx2 = (value_x2 * Vmax2 / 1024.0 - x02) / sens_x2; float Gy2 = (value_y2 * Vmax2 / 1024.0 - y02) / sens_y2; float Gz2 = (value_z2 * Vmax2 / 1024.0 - z02) / sens_z2; int time = millis() / 1000; unsigned int time1 = millis(); webFile = SD.open(fileName, FILE_WRITE); webFile.print (time1); if (webFile) { //Выводим строку со значениями акселерометра и емпературы webFile.println(' ' + String(Gx) + ' ' + String(Gy) + ' ' + String(Gz) + ' ' + String(Gx1) + ' ' + String(Gy1) + ' ' + String(Gz1) + ' ' + String(Gx2) + ' ' + String(Gy2) + ' ' + String(Gz2) + ' ' + String(t)); webFile.close(); } else { // Serial.println("EROR222"); return; } } void loop() { webFile = SD.open(fileName, FILE_WRITE); if (webFile) { String Name = (fileName); // Имя файла String header = ("Time Gx Gy Gz Gx1 Gy1 Gz1 Gx2 Gy2 Gz2 t,C"); //Заголовок webFile.println(Name); webFile.println(header); webFile.close(); } my_func(); } void createFileName() { webFile = SD.open(fileName, FILE_WRITE); webFile.close(); }
Есть небольшие продвижения. Эксперимент показал, что тормозит процесс количество файлов на SD карте. То есть чем их больше, тем медленнее работает все. Возможно надо как-то библиотеку изменить, если это поможет...но не уверен пока что. Вообще они создаются каждые 15 минут с именем текущего времени, так что за день их уже получается нормально. И тормозит именно не вес, а количество файлов