Arduino Forum

International => Français => Topic started by: Projkart on Mar 16, 2015, 11:48 am

Title: Envoi de données carte SD ( compte-tours)
Post by: Projkart on Mar 16, 2015, 11:48 am
Bonjour,
Je suis en STI et notre établissement nous demande de réaliser un projet, un compte-tours de karting.
Nous avons fait la programmation du GPS, récupérer la fréquence d'un GBF et réussit à envoyer les données avec Xbee.
On nous demande maintenant de sauvegarder sur une carte SD (avec un shield) toutes ces données, et on a réalisé le programme de base qui fonctionne quand on envois des valeurs comme 1,2 ou 3 mais lorsqu'on essaye de sauvegarder les variables du programme de la fréquence (par exemple), la valeur se met à 0, sauf pour les tours par minutes.

Pouvez-vous nous aider car nous ne comprenons pas?

Code: [Select]
#include <FreqCount.h>
#include <SD.h>
File myFile;
int trs = 0;
int count = 0 ;
void setup() {
  Serial.begin(57600);
  FreqCount.begin(1000);
   Serial.print("Initialisation de la carte SD... ");
     pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("l'initialisation a echoue");
    return;
    Serial.println("finie");
}
}

void loop() {
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.print(count);
    Serial.println(" Hz ") ;
   trs = count * 60;
    Serial.print(trs) ;
    Serial.println(" Trs/min " ) ;
    delay(2000);
  }
  {
  //Ouverture du ficher
  //Un ficher seuleument ouvert en même temps. Doit fermer celui-ci pour en ouvrir un autre.
  myFile = SD.open("data.txt", FILE_WRITE);
  // si le ficher est bien ouvert, écrire:
  if (myFile) {
    Serial.print("Ecritude dans le document txt....");
    myFile.print("Frequence: ") ;
    myFile.print(count);
    myFile.println(" Hz ") ;
    myFile.print("Vitesse: ") ;
    myFile.print(trs) ;
    myFile.println(" Trs/min " ) ;
    // fermer le ficher
    myFile.close();
    Serial.println("finie");
  } else {
    // si le ficher ne s'est pas ouvert, afficher
    Serial.println("erreur d'ouvertude de data.txt");
}
}
}


PS : tout marche parfaitement sur le moniteur série, mais pas sur le ficher txt
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: vohu on Mar 16, 2015, 12:15 pm
Il y a une erreur qui s'affiche quelque part ou ça n'écrit juste pas ?

J'ai l'impression de me répéter un peu, mais, avec une indentation plus réfléchie, on voit tout de suite des choses bizarres : comme un bloc d'accolades inutile qui entoure la partie écriture justement. Je ne sais pas si ça empêche le fonctionnement, mais c'est déjà pas propre
Code: [Select]

....
        Serial.println(" Trs/min " ) ;
        delay(2000);
    }
    {                                <---- c'est quoi ici ?
        //Ouverture du ficher
        //Un ficher seuleument ouvert en même temps. Doit fermer celui-ci pour en ouvrir un autre.
        myFile = SD.open("data.txt", FILE_WRITE);
...



Est ce que l'exemple d'ici (http://arduino.cc/en/Tutorial/ReadWrite) fonctionne seul ?

Sur certaines cartes arduino, il faut utiliser d'autres pin que la 10 et la 4 pour la lib SD. Vous avez quelle carte et quel shield ?
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: Projkart on Mar 17, 2015, 01:08 pm
Oui l'ensemble fonctionne seul je n'est pas d'erreur écrite. J'utilise la carte arduino uno et le SD card Shield V4.0
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: vohu on Mar 17, 2015, 01:23 pm
Commente tout ce qui n'est pas écriture de la carte SD. et fait des essais en ajoutant lignes à lignes (quand c'est possible)
Tu pourras voir ainsi ce qui gène
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: Projkart on Mar 17, 2015, 01:40 pm
Voila ce que je reçoit dans ma carde SD :
Frequence = 0 Hz
Vitesse = 13520 Trs/min

Je ne voit pas d'où viens le problème étant données que j'arrive a voir la variable vitesse dans la carte SD mais pas celle de la fréquence qui est constamment a 0 sur la carte SD mais sur le moniteur série non je voit la valeur de la fréquence .
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: vohu on Mar 17, 2015, 01:50 pm
Dans myFile.print(count);, remplace count par un nombre directement et vérifie si ça écrit

Et redonne ton code complet stp
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: Projkart on Mar 17, 2015, 01:54 pm
Ok je vais essayer sa.

EDIT: Je viens d'essayer et oui ça ma bien écrit 5 Hz dans la carte SD
Code: [Select]
#include <FreqCount.h>
#include <SD.h>
File myFile;
int trs = 0;
int count ;
void setup() {
  Serial.begin(57600);
  FreqCount.begin(1000);
   Serial.print("Initialisation de la carte SD... ");
     pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("l'initialisation a echoue");
    return;
    Serial.println("finie");
}
}

void loop() {
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.print(count);
    Serial.println(" Hz ") ;
   trs = count * 60;
    Serial.print(trs) ;
    Serial.println(" Trs/min " ) ;
    delay(2000);
  }
 
  //Ouverture du ficher
  //Un ficher seuleument ouvert en même temps. Doit fermer celui-ci pour en ouvrir un autre.
  myFile = SD.open("data.txt", FILE_WRITE);
  // si le ficher est bien ouvert, écrire:
  if (myFile) {
    Serial.print("Ecritude dans le document csv... ");
    myFile.print("Frequence: ") ;
    myFile.print(count);
    myFile.println(" Hz ") ;
    myFile.print("Vitesse: ") ;
    myFile.print(trs) ;
    myFile.println(" Trs/min " ) ;
    // fermer le ficher
    myFile.close();
    Serial.println("finie");
  } else {
    // si le ficher ne s'est pas ouvert, afficher
    Serial.println("erreur d'ouvertude de data.csv");
}
}
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: vohu on Mar 17, 2015, 01:56 pm
Actuellement ton écriture se fait en dehors du if FreqCount.available()
Du coup lorsque l'écriture de la carte se fait count vaut 0 (et encore c'est un coup de chance car tu ne l'a pas initialisé. En C, il faut toujours initialiser ses variables ou pointeurs. Même à 0 ou NULL

En plus, count est déclaré 2 fois :
- int count ; // un int en variable publique
et
- unsigned long count = FreqCount.read(); // un unsigned long qui sera une variable locale existant seulement dans le if

 Essaye comme ça :
Code: [Select]
#include <FreqCount.h>
#include <SD.h>
File myFile;
int trs = 0;
unsigned long count = 0;

void setup() {
    Serial.begin(57600);
    FreqCount.begin(1000);
    Serial.print("Initialisation de la carte SD... ");
    pinMode(10, OUTPUT);

    if (!SD.begin(4)) {
        Serial.println("l'initialisation a echoue");
        return;
        Serial.println("finie");
    }
}

void loop() {
    if (FreqCount.available()) {
        count = FreqCount.read();
        Serial.print(count);
        Serial.println(" Hz ") ;
        trs = count * 60;
        Serial.print(trs) ;
        Serial.println(" Trs/min " ) ;
        delay(2000);


        //Ouverture du ficher
        //Un ficher seuleument ouvert en même temps. Doit fermer celui-ci pour en ouvrir un autre.
        myFile = SD.open("data.txt", FILE_WRITE);
        // si le ficher est bien ouvert, écrire:
        if (myFile) {
            Serial.print("Ecritude dans le document csv... ");
            myFile.print("Frequence: ") ;
            myFile.print(count);
            myFile.println(" Hz ") ;
            myFile.print("Vitesse: ") ;
            myFile.print(trs) ;
            myFile.println(" Trs/min " ) ;
            // fermer le ficher
            myFile.close();
            Serial.println("finie");
        }
        else
        {
            // si le ficher ne s'est pas ouvert, afficher
            Serial.println("erreur d'ouvertude de data.csv");
        }
    }
}
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: Projkart on Mar 17, 2015, 02:04 pm
Merci cela marche du feu de dieu :!!
Title: Re: Envoi de données carte SD ( compte-tours)
Post by: vohu on Mar 17, 2015, 02:11 pm
Attention, j'ai réédité mon message entre temps. J'ai remarqué des erreurs et remodifié le code (même si ça marche déjà, il faut corriger)

Essaye de bien comprendre pourquoi ça marchait pas. Si t'as pas compris pose des questions.