Acquistion de données

Bonjour,

Dans le cadre de mon stage je dois réaliser un 2 datalogger avec une carte SD. Le premier était de faire un nombre de mesure avec un délai entre chaque mesure et pouvoir ensuite mettre le fichier dans un tableur.
Cette partie la est okey, cependant la suite c’est : créer un datalogger qui réalise admettons une 20aine de mesure tout en ayant un délai entre chaque mesure et APRES la prise de mesure il écrit sur la carte les 20 mesures qu’il vient de prendre. Je me doute bien que par rapport a l’autre programme il s’agira de changer l’ordre de plusieurs lignes et l’ajout d’un compteur mais je vois pas trop comment m’y prendre, si certains d’entre vous auraient des conseils, je suis preneur.

J’utilise un arduino mega et un microShield RFD22130
Voici le code du premier programme :

#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD
#include <Wire.h>
int e=1;
int f=1;
byte compteur;

/** Broche CS de la carte SD */
const byte SDCARD_CS_PIN = 53; // A remplacer suivant votre shield SD

/** Nom du fichier de sortie */
const char* OUTPUT_FILENAME = "Dossier/Fichier.txt";

/** Delai entre deux prise de mesures */
const unsigned long DELAY_BETWEEN_MEASURES = 2000;


/** Fichier de sortie avec les mesures */
File file;


/** Fonction setup() */
void setup() {

  /* Initialisation du port série (debug) */
  Serial.begin(115200);

  /* Initialisation du port SPI */
  pinMode(53, OUTPUT); // Arduino UNO
  //pinMode(53, OUTPUT); // Arduino Mega

  /* Initialisation de la carte SD */
  Serial.println(F("Initialisation de la carte SD ... "));
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println(F("Erreur : Impossible d'initialiser la carte SD"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }

  /* Ouvre le fichier de sortie en écriture */
  Serial.println(F("Ouverture du fichier de sortie ... "));
  
 file = SD.open(OUTPUT_FILENAME, FILE_WRITE);
  if (!file) {
    Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }
  
  
  /* Ajoute l'entête CSV si le fichier est vide */
  if (file.size() == 0) {
    Serial.println(F("Ecriture de l'entete txt ..."));
    file.println(F("Mesure; Tension A0; Temps;"));
    file.flush();
  }
}


/** Fonction loop() */
void loop() {
  // Temps de la précédente mesure et actuel
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();

  /* Réalise une prise de mesure toutes les DELAY_BETWEEN_MEASURES millisecondes */
  if (currentMillis - previousMillis >= DELAY_BETWEEN_MEASURES) {
    previousMillis = currentMillis;
    measure();
  }
}


/** Fonction de mesure - à personnaliser selon ses besoins */
void measure() {

  /* Réalise la mesure */
  float v_1 = analogRead(A0) * 5.0 / 1023; 

  
  /* Affiche les données sur le port série pour debug */ 
  Serial.print(f++);
  Serial.print(F("; "));
  Serial.print(v_1);
  Serial.print(F("; "));
  Serial.println(millis());

  /* Enregistre les données sur la carte SD */
  file.print(e++);
  file.print(F("; "));
  file.print(v_1);
  file.print(F("; "));
  file.println(millis());
  

  file.flush();
}

Bravo et karma pour avoir formulé une question correctement et mis le code entre balises lors d'un de vos premiers posts !


il vous faut un tableau pour stocker les 20 mesures et effectivement une variable qui vous dit où vous en êtes dans le remplissage du tableau.

l'algorithme ressemble à cela

dans le setup()

initialiser INDEX = 0

dans la loop()

Si c'est le moment de faire la mesure
    - effectuer la mesure et l'enregistrer à la position INDEX
    - augmenter INDEX de 1
    - si INDEX vaut 20 c'est qu'on a fini, 
        - sauvegarder les 20 données dans un fichier (faire une boucle de 0 à 19 et écrire les données)
        - réinitialiser INDEX = 0

Merci beaucoup pour votre aide !