Enregistrement de valeurs sur carte sd

Bonjour à tous,
Je suis sur un projet qui permet de mesurer la température et l'humidité dans une pièce, je dois enregistrer toutes les 30 secondes pendant 24h donc 2880 fois par jour.
J'utilise donc une carte sd pour pouvoir enregistrer les valeurs.
J'arrive à enregistrer les valeurs les unes à la suite des autres et de choisir à l'endroit où j'écris.
J'aimerais enregistrer dans la carte sd toutes les 10 valeurs et que la dernière valeur enregistré soit à la première ligne donc inverser l'ordre.
Je n'arrive pas à décaler les valeurs de 10 lignes, soit je n'ai pas de décalage soit j'ai un décalage mais pas de 10 lignes et j'ai des valeurs qui sont supprimés ou toutes les valeurs ont été supprimés.

float tab[60][3]; //tableau pour enregistrer les valeurs []liges []colonnes
int n = 0;
int m = 0;
int o = 0;
int A = 1;
int taille_tab = 10;
int humidite = 0;
float temperature = 0;
int pos1;
int pos2;
int pos3;
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include "SparkFun_SCD30_Arduino_Library.h" //Click here to get the library: http://librarymanager/All#SparkFun_SCD30
SCD30 airSensor;
File tab_SD;
void setup()
{
  delay(100);
  Serial.begin(115200);
  Wire.begin();




  while (airSensor.begin() == false)
  {
    Serial.println("Air sensor not detected. Please check wiring. Freezing...");
    delay(200);
  }
  airSensor.setMeasurementInterval(3);
  //The SCD30 has data ready every two seconds



  if (!SD.begin(6)) {
    Serial.println("initialization failed!");
    delay(10);
    //return;
  }
  Serial.println("initialization done.");




  if (SD.exists("tab.csv")) {

    Serial.println("tab.csv exists.");
    SD.remove("tab.csv");
    if (!SD.exists("tab.csv"))
    {
      Serial.println("fichier supprimé");
    }
  } else {

    Serial.println("tab.csv doesn't exist.");
  }



  tab_SD = SD.open("tab.csv", FILE_WRITE);
  if (tab_SD) {
    tab_SD.print("temperature");
    tab_SD.print(";");
    tab_SD.print("humidite");
    tab_SD.print(";");
    tab_SD.println("n");
    pos1 = tab_SD.position();
    Serial.print("position 1:    ");
    Serial.println(pos1);
    Serial.println("début écriture des 0");
    for (int j = 0; j < 2880; j++)
    {

      tab_SD.print("00.00");
      tab_SD.write(0x3B);
      tab_SD.print("00.00");
      tab_SD.write(0x3B);
      tab_SD.println("00.00");
      //      tab_SD.println(n);


    }
    Serial.println("fin écriture des 0");
    Serial.println("");
    delay(1000);
    // close the file:
    tab_SD.close();

  }
}

void loop()
{
  if (airSensor.dataAvailable())  {


    temperature = airSensor.getTemperature();
    humidite = airSensor.getHumidity();

    for (int i = taille_tab; i >= 1; i--)
    {
      tab[i][1] = tab[i - 1][1] ;
      tab[i][2] = tab[i - 1][2];
      tab[i][3] = tab[i - 1][3];
    }
    n++;
    m++;
    o = m;
    
    Serial.println("SCD30");
    Serial.print(temperature);
    Serial.println(" C");
    tab[0][1] = temperature;

    Serial.print(humidite);
    Serial.println("%");
    //Serial.println(airSensor.getCO2());
    Serial.println(n);
    Serial.println();
    tab[0][2] = humidite;
    tab[0][3] = n;

    Serial.println(tab[0] [1]);
    Serial.println(tab[1] [1]);
    Serial.println(tab[2] [1]);
    Serial.println(tab[3] [1]);
    Serial.println(tab[4] [1]);
    Serial.println();

    Serial.println(tab[0][2]);
    Serial.println(tab[1][2]);
    Serial.println(tab[2][2]);
    Serial.println(tab[3][2]);
    Serial.println(tab[4][2]);
    Serial.println();
    Serial.println("-------------------");

    if (m >= taille_tab)
    {
      tab_SD = SD.open("tab.csv", O_READ | O_WRITE);
      tab_SD.seek(24);
      Serial.println(tab_SD);

      if (tab_SD) {
        Serial.println("écrit dans tab.CSV...");
        Serial.println("ecriture dans la carte sd");
        //tab_SD.print(0);
        tab_SD.seek(24);

        for (int k = 0; k < taille_tab; k++)
        {
          pos2 = tab_SD.position();
          Serial.print("position 2:    ");
          Serial.println(pos2);
          tab_SD.print(tab[k][1]);
          tab_SD.write(0x3B);
          tab_SD.print(tab[k][2]);
          tab_SD.write(0x3B);
          tab_SD.print(tab[k][3]);
          tab_SD.write(13);
        }

        // close the file:
        tab_SD.close();
        Serial.println("fait.");

      }
      else {
        // if the file didn't open, print an error:
        Serial.println("erreur d'ouverture tab.CSV");
      }
      Serial.println("pause");
      delay(2000);
      Serial.println("fin pause");
      Serial.println("décallage");
      m = 0;
    }

    if (o >= taille_tab)
    {
      tab_SD = SD.open("tab.csv", O_READ | O_WRITE);
      if (tab_SD) {
        tab_SD.seek(24);
        for (int p = 0; p < 2 ; p++)
        {

          //          tab_SD.print(00.00);
          //          tab_SD.write(0x3B);
          //          tab_SD.print(00.00);
          //          tab_SD.write(0x3B);
          //          tab_SD.print(00.00);
          tab_SD.print("a");
          tab_SD.print(";");
          tab_SD.print("b");
          tab_SD.print(";");
          tab_SD.println("c");
          pos3 = tab_SD.position();
          Serial.print("position 3:    ");
          Serial.println(pos3);
        }
        A++;

        Serial.println("fin decallage");
        delay(2000);
        Serial.println("reprise");
        tab_SD.close();

      }
      o = 0;

    }


  }

}

capture
Ici j'ai essayé avec un décalage de 2 lignes.
Si quelqu'un à une idée pour régler mon problème ça m'aiderais beaucoup.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Tu veux que dans le fichier, les valeurs soient dans l'ordre inverse chronologique. Avec les plus récentes au début.
Cela veut dire qu'à chaque écriture il faut décaler les valeurs précédemment écrites. C'est-à-dire réécrire le fichier dans sont intégralité à chaque fois. Cela va consommer beaucoup de ressources alors que cela peut être fait en un rien de temps lorsque tu dépouille les valeurs dans ton tableur.

J'ai pas besoin de tout réécrire si je fait de 10 en 10. la 1ère boucle ca fera 10-9...2-1 et la 2ème boucle 20-19...2-1. je pense qu'il suffit juste de décalé les valeurs de 10 lignes pour pouvoir écrire les 10 nouvelles valeurs aux 10 premières lignes.

Oui mais à la fin de la journée, pour écrire les 10 dernières lignes il faut en décaler 2870.

La notion de ligne n'existant pas dans un fichier, il faut décaler tout le contenu du fichier octet par octet.

En fait, pour insérer des lignes dans un fichier, ce que l'on fait c'est:

  • on ouvre un fichier temporaire
  • on écrit les 10 nouvelles lignes
  • on recopie le contenu de l'ancien fichier à la suite
  • on ferme les 2 fichiers
  • on efface l'ancien fichier
  • on renomme le nouveau fichier avec le nom original

J'ai pensé à faire comme ça mais je sais pas comment copier le contenu d'un fichier sans l'écrire dans la mémoire de l'arduino.

Ah mais il faut passer par la mémoire. On lit un certain nombre d'octets dans un fichier. On les écrit dans l'autre. Et ainsi de suite.
Le problème, c'est que pour chaque fichier ouvert, il faut allouer une zone mémoire tampon. Et les Arduino n'ont souvent pas beaucoup de mémoire.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.