Page 1 sur 1

[Arduino] Parser et ecrire sur carte SD des données Arduino

Publié : 14 juin 2013 09:46
par papy94
En partant de l'exemple :Transfer et Parser des données Arduino

j'ai rajouté du code pour écrire mes données sur une carte SD
Image

Code : Tout sélectionner

/*carte Nano RECEPTRICE
 arduino v1.0.1

 donnees (trame) recus : <1;-3;16;2294;531>
 '<' = le debut de la trame
 '>' = la fin de la trame
 ';' = delimitateur des donnees

ce qui sera enregistre sur la carte sd
    00:02:48;1;-3;16;22.94;5.31
*/


#include <SD.h>
#define SD_CARD_CD_DIO 10 /* DIO broche utilise pour commander les modules CS broche */
File SDFileData;

//----------
String Trame;              // Chaine pour contenir la Trame entrante
boolean TrameRecu = false; // si la Trame a ete recue dans son integralite
int NbrData = 4;           // Nombre de donnes qui seront recus
long Jours=0;
long heures=0;
long minutes=0;
long secondes=0;


//=======================================================================================================
void setup()
{
pinMode(10,OUTPUT);  // Sortie CS Carte SD

Serial.begin(9600);

//-------carte SD
if (!SD.begin(SD_CARD_CD_DIO)){ // Initialise la SD carte
  Serial.println("ERROR: SD card, Echec de l'initialisation");
 }else{Serial.println("SD Card OK");}
   
      //----suppression du fichier si il existe deja
       /*while(SD.exists("test.txt")){      // Verifiez si le fichier texte existe deja
       Serial.println("test.txt existe deja ... SUPPRESSION");
       SD.remove("test.txt");}             //Si oui, alors le supprimer
       */
//-------Fin carte SD

}
//======================================
void loop() {
  handleCommand();


} //*************** FIN LOOP
//======================================


//************************* routines
void serialEvent(){
  while (Serial.available()) {// si recois des donnes
    char incomingByte = (char)Serial.read();
    if (incomingByte == '>'){ // Fin de la Trame
       TrameRecu = true;
       return;
    }else if (incomingByte == '<'){ // Debut d une nouvelle Trame
       Trame = "";
       TrameRecu = false;
       return;
    }else{
      Trame += incomingByte;
      return;
    }
  }
}

void handleCommand() {
  if (!TrameRecu) return; // aucune Trame a parser
  int data[NbrData];     // un maximum de 5 nombres entiers de donnees
  char cmd[Trame.length()+1];
  Trame.toCharArray(cmd, Trame.length()+1);
  char *token = strtok(cmd, ";");

  for (int i = 0; i < NbrData+1; i++) { // mettre datas dans tableau
    if (token) {
      data[i] = atoi(token);
      token = strtok(NULL, ";");
    }
 }
  CalculTemps(); // pour inserer avant la trame: hh:mm:ss
//---Pour verif sur monitor de ce qui a ete recu
  Serial.print("data[0] = ");Serial.println(data[0]);
  Serial.print("data[1] = ");Serial.println(data[1]);
  Serial.print("data[2] = ");Serial.println(data[2]);
  Serial.print("data[3] = ");Serial.print(data[3]/100);Serial.print(",");Serial.println(data[3]%100);
  Serial.print("data[4] = ");Serial.print(data[4]/100);Serial.print(",");Serial.println(data[4]%100);

//---Ecriture sur carte SD
  SDFileData = SD.open("test.txt", FILE_WRITE);
  if (SDFileData){;            // Si le fichier est bien present
    SDFileData.print(heures);SDFileData.print(":");SDFileData.print(minutes);SDFileData.print(":");SDFileData.print(secondes);SDFileData.print(";");
    SDFileData.print(data[0]);SDFileData.print(";");
    SDFileData.print(data[1]);SDFileData.print(";");
    SDFileData.print(data[2]);SDFileData.print(";");
    SDFileData.print(data[3]/100);SDFileData.print(".");SDFileData.print(data[3]%100);SDFileData.print(";");
    SDFileData.print(data[4]/100);SDFileData.print(".");SDFileData.println(data[4]%100);
    SDFileData.close();        // Ferme le fichier
    Serial.println("Donnees enregistrees sur carte SD.");
  }else{
    Serial.println("Erreur d'ecriture du fichier !");
  }
//
  TrameRecu = false;// Drapeau pour dire que nous avons traite la commande
 }

//-------------- Calcul du temps pour affichage
void CalculTemps()
{
  secondes = millis()/1000; //convect millisecondes en secondes
  minutes=secondes/60; //convertir secondes en minutes
  heures=minutes/60; //convertir minutes en heures
  Jours=heures/24; //convertir heures en Jours
  secondes=secondes-(minutes*60); //soustraire les secondes converties afin d'afficher 59 secondes max
  minutes=minutes-(heures*60);    //soustraire les minutes converties afin d'afficher 59 minutes max
  heures=heures-(Jours*24);       //soustraire les heures converties afin d'afficher 59 heures max 
  Serial.print(heures);Serial.print(":");Serial.print(minutes);Serial.print(":");Serial.print(secondes);Serial.println(";");
}//----FIN Calcul du temps pour affichage
sur la carte SD, j'ai donc un fichier test.txt, qui contient

Code : Tout sélectionner

0:0:15;1;7;14;21.20;4.72
0:0:15;1;7;14;21.20;4.72
0:0:21;0;5;11;21.16;4.72
0:0:23;1;5;4;21.16;4.72
0:0:24;0;5;22;21.17;4.72
0:0:25;1;4;14;21.16;4.72
0:0:27;8;7;13;21.14;4.72
0:0:29;1;7;8;21.14;4.72
0:0:36;2;7;803;21.11;4.72
0:0:40;2;4;1169;21.12;4.72
0:0:43;0;6;1500;21.14;4.72
0:0:44;1;4;1532;21.11;4.72
0:0:44;4;5;1601;21.11;4.72
0:0:54;5;4;1891;21.11;4.72
0:0:58;1;7;1587;21.7;4.72
0:0:59;2;5;1469;21.9;4.72
0:1:2;1;7;791;21.9;4.72
0:1:5;0;4;800;21.7;4.72
0:1:5;2;6;814;21.6;4.72
0:1:6;2;6;827;21.7;4.72
0:1:7;3;5;963;21.7;4.72
0:1:10;2;5;1208;21.7;4.72
0:1:12;3;5;1184;21.6;4.72
0:1:13;2;4;1072;21.4;4.72
0:1:14;1;7;780;21.6;4.72
0:1:25;0;5;111;21.6;4.72
0:1:25;1;4;96;21.4;4.72
0:1:26;0;3;104;21.4;4.72
0:1:30;0;5;103;21.2;4.72
0:1:55;0;6;100;21.1;4.72
0:2:9;1;5;99;21.4;4.72
0:2:15;0;5;96;21.1;4.72
0:2:20;0;5;96;21.3;4.72
0:2:41;7;2;85;21.3;4.72
il me reste plus qu'a ouvrir ce fichier avec Excel, et j'ai de quoi faire des beaux graphiques et analyser

Image

Honnêtement ,écrire les données sur une carte SD n'est pas indispensable,mais cela m'a permis de comprendre 2 ou 3 petites choses qui me serviront, et cela peut servir aux autres

J'ai extrais le code de mon programme principal pour simplifier la compréhension, je ne pense par avoir oublié de lignes, je n'ai pas testé ce programme court,mais cela fonctionne très bien avec le programme principal

bien sur , il y a surement une meilleur façon d’écrire ce code,mais cela fonctionne et cela me suffit

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 11:42
par laurent0091
Bonjour Thierry,
et bien chapeau bas l'ami, tu peux être satisfait de ton travail. c'est vraiment très intéressant de stoker des informations et de pouvoir les analyser sur un graph. ça ouvre pas mal de perspective.
En tout cas tu l'un de ceux qui a le plus avancé sur la question.
As tu un schéma de l'interconnexion des deux arduino et de la carte sd à nous montrer?

Laurent

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 12:17
par Teba
Bonjour, :)

Je me joint au coup de chapeau, moi qui n'y connais rien, au fil des messages , je t'ai vu progresser et maintenant je vois que tu affiche tes résultats avec graphiques comme un pro, exemple à suivre bravo. :o :respect: :respect: :respect:

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 14:27
par papy94
Merci les gars, cela fait toujours plaisir :oops:
Mais j'y passe vraiment beaucoup trop de temps et mon soum n'avance plus

Laurent ,je met en pièce jointe le fichier FRITZING, je pense que tu là
je ne retouche pas a chaque fois, mais il est récent
_Platine_NANOv3.3_V2.rar
(58.5 Kio) Téléchargé 297 fois
si tu as un doute sur des branchements n’hésites pas à demander

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 14:51
par Jacky-Soum
Salut Papy et bravo ! ;)

:applaudi: :applaudi:
Étant débutant sur Arduino (et oui, je m'y mets moi aussi !!!) je rejoins Laurent et Michel dans leurs commentaires ! :respect:
Et n'étant pas débutant dans le domaine de la programmation, loin de là, je suis tout à fait d'accord avec toi lorsque tu dis que ça prend du temps !!! :frust: :Oo:
Mais c'est le prix à payer pour atteindre un résultat valable ! :Up:

Cordialement de jacky-Soum :trinque:

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 17:29
par papy94
c'est cool mon jacky d'amour ,si toi aussi tu tu touches a cette petit drogue,comme ça ont pourra fumer ensemble :drunk:

j'essaye encore un ou deux truc, âpres j'enferme cette drogue a double tour et j'installe dans le soum le bazar :bave:

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 18:37
par Geeks
Wah !

C'est bien coder, c'est commenté et ça marche :Up:

Vraiment, châpeau !

Bon, ben il a une longueur d'avance maintenant !
Il faut que je m'y remette :) :lol:

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 20:47
par coaxial
Si tu monte tout ça dans le soum , c'est sur tu prends un train d'avance :Up:

:applaudi:

Re: Parser et ecriture sur carte SD des données Arduino

Publié : 14 juin 2013 21:40
par gagouze
je suis du même avis que Geeks

cela fait au moins 8 ans que je n'ai pas codé en C ou en C ++

et je comprends ton code très bien :Up:

tous les programmeurs pros ne font pas un code aussi lisible (faute de temps et ils doivent tenir les délais ou qu'ils se foutent de la maintenabilité de leur code et les collègues se démerderont avec :evil: :evil: :evil: :evil: )