Arduino. как записать данные на sd карту без потери скорости

Тема в разделе "Arduino & Shields", создана пользователем Al2tik, 5 июн 2021.

  1. Al2tik

    Al2tik Нуб

    Господа, доброго времени суток! У меня имеется 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();
    }
     
  2. Vovka

    Vovka Гик

    может взять другую SD-карту?
     
  3. Al2tik

    Al2tik Нуб

    Пробовал много разных, дело не в этом(
    Он как будто с каждым новым файлом теряет скорость
     
  4. Al2tik

    Al2tik Нуб

    Есть небольшие продвижения. Эксперимент показал, что тормозит процесс количество файлов на SD карте. То есть чем их больше, тем медленнее работает все. Возможно надо как-то библиотеку изменить, если это поможет...но не уверен пока что. Вообще они создаются каждые 15 минут с именем текущего времени, так что за день их уже получается нормально. И тормозит именно не вес, а количество файлов