Création et gestion d'un fichiers (.txt) et (.csv) sur Arduino Yun.

Bonjour,

Je suis sur un projet où il me faut créer et gérer un fichier (.txt) et aussi un fichier (.csv) dans le même programme.

Le problème c'est que le programme bloque dans la fonction de recherche de l'heure (getTimeStamp()) au niveau de la boucle while.
L’extension du fichier n'a pas d’importance car j'ai essayer avec deux fichiers (.txt).

Je n'ai pas ce problème si je ne gère qu'un seul fichier (.txt ou .csv). Je ne comprends pas car je ferme bien les fichiers une fois que j'ai écrit dedans.

Mon programme est le suivant:

#include <DHT.h>    // Bibliothèque pour les capteurs DTH
#include <FileIO.h> // Bibliothèque pour la gestion de fichier
#include <Process.h>


int photocellPin = 0; // La photorésistance est connecter sur a0
int photocellReading; // La valeur de luminositer
float mesure[6];
String Date;
String Heure;
String Heure1;


#define DHTPINSOL 8        // La pin de donnée est connecter au pin 8 de l'arduino pour capteur Sol.
#define DHTPINAIR 9        // La pin de donnée est connecter au pin 9 de l'arduino pour capteur Air.
#define DHTTYPE DHT22      // Le capteur de température / humidité est un DTH22

// Connecter la pin 1 (à gauche) du capteur à + 5V.
// Connectez la pin 2 du capteur sur votre pin arduino déclarer (DHTPIN).
// Connectez la broche 4 (à droite) du capteur au GROUND.
// Connectez une résistance 10K de la broche 2 (données) à la broche 1 (à gauche) du capteur.


DHT dhtSol(DHTPINSOL, DHTTYPE); // Initialisation capteur DHT pour Arduino de 16MHz normale.
DHT dhtAir(DHTPINAIR, DHTTYPE); // Initialisation capteur DHT pour Arduino de 16MHz normale.

// NOTE : Pour travailler avec une puce plus rapide , vous pourrier avoir besoin d'augmenter 
// le seuil pour le comptage de cycle considéré comme un 1 ou 0.
// Vous pouvez le faire en passant un 3e paramètre de ce seuil. 
// La valeur par défaut pour un Arduino 16MHz est une valeur de 6. 
// Pour une Arduino qui fonctionne à 84MHz une valeur de 30 doit être mise. 
// Exemple pour initialiser capteur de DHT pour Arduino à 84MHz :
// DHT dht(DHTPIN, DHTTYPE, 30);



void setup() {
  // Initialisation de la Bridge et de la série
  Bridge.begin();
  Serial.begin(9600);
  FileSystem.begin();
  
  dhtSol.begin(); // Initialisation le capteur de température / humidité du sol.
  dhtAir.begin(); // Initialisation le capteur de température / humidité de l'air.

  while(!Serial);  // Attendre pour le port série pour connecter.
  Serial.println("Filesystem datalogger\n");
  
  //Ecrit dans le fichier (.csv) l'en-tête
  File logFile = FileSystem.open("/mnt/sd/arduino/www/Test_Exel_Texte/LOG.csv", FILE_WRITE);
  if (logFile)
  {
    //logFile.println(", , , ,"); //Just a leading blank line, incase there was previous data
    String header = "Date/Heur; Temperature Sol; Humiditer Sol; Temperature Air; Humiditer Air; Luminositer; Pluviometrie";
    logFile.println(header);
    logFile.close();
    Serial.println(header);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
}


void loop () {
  Mesure(); // Prend les mesures

  String dataString="";
  Heure="";
  Date="";
  getTimeStamp(); // Lecture de l'heure et de la date
  
  // Faire une chaîne qui commence avec un horodatage pour assembler les données pour vous connecter:
  dataString += Date;
  dataString += ";";
  dataString += Heure;
  dataString += ";";  
  

  // Lire trois capteurs et ajouter à la chaîne:
  for (int i = 0; i < 6; i++) {

    dataString += String(mesure[i]);
    if (i < 5) {
      dataString += ";"; // Séparer les valeurs par une virgule
    }
  }
  
  
  // Ecrit dans le fichier (.csv)
  File logFile = FileSystem.open("/mnt/sd/arduino/www/Test_Datalogger_CSV/LOG.csv", FILE_APPEND);
  if (logFile)
  {
    logFile.println(dataString);
    logFile.close();
    Serial.println(dataString);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }  
  
  logFile.flush(); // Je vide le buffer 

  delay(30000);  // Attente de 30s
  
  
  // Ecrit dans le fichier (.txt)
  File dataFile = FileSystem.open("/mnt/sd/arduino/www/Test_Datalogger/datalog.txt", FILE_APPEND);

  // Si le fichier est disponible, on écrit:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // Imprimer sur le port série:
    Serial.println(dataString);
    Serial.println(Heure);
  }  
  // Si le fichier ne est pas ouvert, une fenêtre d'erreur:
  else {
    Serial.println("error opening datalog.txt");
  } 
  
  dataFile.flush(); // Je vide le buffer 

  delay(30000);  // Attente de 30s
  
}



// Cette fonction retourne une chaîne avec l'horodatage
String getTimeStamp() {
  String result="";
  Process time;
  // Date est un utilitaire de ligne de commande pour obtenir la date et l'heure
  // Dans différents formats en fonction du paramètre supplémentaire
  time.begin("date");
  time.addParameter("+%D-%T"); // paramètres: D pour la date complète mm / jj / aa
                               // T pour les hh: mm: ss   
  time.run(); // Exécutez la commande
  time.flush();
 // Lire la sortie de la commande
  while(time.available()>0) {        // Le programme bloque à ce niveau
    char c = time.read();
    if(c != '\n')
      result += c;  
  }
  
  Date=result.substring(0,8);  
  Heure=result.substring(9,17);
  Heure1=result.substring(9,10);
  return result;
}



void Mesure(){
  mesure[0] = dhtSol.readTemperature();
  mesure[1] = dhtSol.readHumidity(); 
  mesure[2] = dhtAir.readTemperature();  
  mesure[3] = dhtAir.readHumidity();
  mesure[4] = analogRead(photocellPin);
  mesure[5] = analogRead(photocellPin);  
}

Si quelqu'un à une solution à me proposer pour corriger ce problème.

Merci d'avance.

Test_Datalogger_CSV.ino (5.33 KB)

bonjour,
je dirais que tu tourne en boucle dans le while puisque time.available()>0 sera toujours vrai et change en permanence.
fais un Serial.print pour véirifier.

Bonjour,

Le programme est bien bloquer dans le while de la fonction getTimeStamp(), mais uniquement lorsque je gère deux fichier dans mon programme.

Je voudrai savoir pourquoi le programme bloque dans la boucle while.

merci.