problème enregistreur de données format csv sur carte SD

salut à tous, je me suis mis à arduino il y a un mois à peu prés et je me régalle! :slight_smile:
j’ai commencé par un kit d’aprentissage avec des programmes plus ou moins tout fait, j’ai ensuite fait mes premiers programmes avec ce que j’avais apris notament un plateau tournant avec marche/ arret inversion de sens de rotation et réglage vitesse de rotation via potentiometre tout ça souder pot d’échappement je vous montrerai tout ça une fois le projet totallement terminé.
mais voila 15 jours que je butte sur un projet !
Je voudrais faire du monitoring de température et consommation électrique pour un système de
chauffage; apparemment rien de trop compliqué vu les tutos et les exemples fournis sur le net!
Je me suis donc équipé d’une carte uno d’un dht22, d’un module RTC PCF8523 et d’un module micro sd…
J’ai vite concentré mon programme sur le relevé de température et d’humidité pour l’enregistrer sur carte sd puis pour pouvoir l’ouvrir sur tableur…
Mon problème malgrés mon acharnement est que j’arrive bien à relever ma température et mon humiditée mais je n’arrive pas à afficher sur mon fichier csv les températures dans une colonne et l’humidité dans la colonne suivante ce qui rend mon tableur sans intéret j’ai essayé la virgule comme j’ai pu le voir sur des vidéos de u=ri mais rien n’y fait!
Merci d’avance pour votre aide.
voila mon dernier code:

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#include <DHT_U.h>

// on indique sur quelle broche est connecté le DHT22
#define CS_PIN 10
#define DHTPIN 2

// on indique le type de capteur utilisé 

#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

File monFichier;

void setup() {
  //on indique la liaison serie pour comuniquer avec le moniteur serie

  Serial.begin(9600);
  // on initialize le capteur DHT22
  dht.begin();
   Serial.print("Initialisation de la carte SD en cours...");
  if (SD.begin())
  {
    Serial.println(" Terminee.");
  } else
  {
    Serial.println(" Echec.");
    return;
  
  // put your setup code here, to run once:
  }
  monFichier = SD.open("donnees.csv", FILE_WRITE);
  if (monFichier) 
  {   
    monFichier.println("Temperature,Humidite");
    
    monFichier.close();    
  }
}

void loop() {
  
   // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();


  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) ) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");

 
   String donnee = String(t) + "," +  String(h);
   // On enregistre la donnée 
  monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier) 
  {   

    monFichier.println(donnee);
        monFichier.close();    
  } 
  else 
  {
    Serial.println("Impossible d'ouvrir le fichier");
  }  
   // delai entre les mesures
  delay(1000);
}

Pourquoi passer par des Strings?

Faites

monFichier = SD.open("donnees.csv", FILE_WRITE);
if (monFichier) {
   monFichier.print(t);
   monFichier.print("\t"); // une tabulation
   monFichier.println(h);
   monFichier.close();
}

Mais votre pb sans doute c'est les point en anglais pour marquer la décimale alors que Excel attend une virgule en français

Vous voyez quoi sur votre carte SD?

bonjour JML merci pour votre réponse

Si je passe par des string ce que étant novice, j’ai choisis peut être à tord la facilitée en copiant un code sur le net qui apparement fonctionne trés bien!?

En lisant ton code je le comprend tout à fait et vais l’essayer…

pour ce qui est de ma carte SD voila ce que ça donne:

bon je viens de tester, rien à faire :confused:
dans mon fichier excel température et humiditée toujours dans la même cellule!
il me manquerait pas une bibliothèque?
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#include <DHT_U.h>

 monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier) 
  {   

    monFichier.print(t);
    monFichier.print("\t");
    monFichier.println(h);
        monFichier.close();    
  } 
  else 
  {
    Serial.println("Impossible d'ouvrir le fichier");
  }  
   // delai entre les mesures
  delay(1000);

Bonjour,

En standard dans la config française le séparateur de champs dans les fichiers csv est le point virgule et non la tabulation.
Essaie:

 if (monFichier) 
 {   

   monFichier.print(t);
   monFichier.print(";");
   monFichier.println(h);
   monFichier.close();    
 }

je n'ai plus Excel mais de mémoire quand tu importe un fichier csv tu peux modifier le séparateur de champs
dans ton cas tu choisi la virgule et il devrait te donner 2 colonnes

merci kamill le point virgule fonctionne!
merci également à rnjc38 et jml pour m’être venue en aide, j’ai testé la virgue mais ça ne fonctionne pas…
voila le code qui fonctionne pour moi:

monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier) 
  {   

    monFichier.print(t);
    monFichier.print(";");
    monFichier.println(h);
        monFichier.close();    
  }

voila ce que ça donne avec le point virgule et en dessous avec virgule:
je vais pouvoir poursuivre mon projet, je voudrais rajouter la date, l’heure et un relevé conso ainsi qu’une sonde extèrieure plus un afficheur lcd…je partagerai tout ça merci encore…

Il y a encore un problème: tes données sont considérées comme du texte car le séparateur décimal est la virgule et non le point.

? :o arr tu as peut être vu un problème que je n'ai pas encore dissimulé...quel est le souci pour toi?

Le soucis c’est que c’est traité par excel comme une chaine de caractères (on le voit dans ta hard copy, c’est cadré à gauche contrairement aux chiffres qui sont cadrés à droite).
Tu ne pourra donc pas t’en servir en tant que chiffres pour tracer un graphique par exemple.

j'ai bien peur d'avoir compris ce dont tu parles!! :confused:
c'était trop beau...
bon je suppose qu'il doit y avoir une combine, je vais y travailler....

Il suffit que tu fasse une petite fonction qui remplace le '.' par une ',' pour l'enregistrement des variables en flottant.

merci kamill, je te demande pas la réponse tout de suite ;D je vais essayer de trouver ça avant ce week end j,espère!....

je pense avoir trouvé!!! ;D ;D ;D

 String donnee = String(t) + ";" +  String(h);
   // On enregistre la donnée 
  monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier) 
  { 
 donnee.replace(".", ",");//remplace le . par une ,
    monFichier.println(donnee);
    
        monFichier.close();    
  }

Bravo!
La tu devrais pouvoir exploiter tes fichiers csv

:wink: ca fonctionne!
merci pour ton aide…

bravo ! (c'était le point mentionné dans mon post #1)

Mais votre pb sans doute c'est les point en anglais pour marquer la décimale alors que Excel attend une virgule en français

(ça se change aussi dans les préférences d'excel au fait on peut lui dire que le . est le séparateur décimal)

Autre solution dans le tableur (sans rien changer à sa configuration) :

  • Sélectionner la colonne qui contient les valeurs avec le symbole décimal à l'américaine
  • Faire Rechercher "le point", Remplacer par "la virgule" pour passer au symbole décimal européen.