Go Down

Topic: Envoi de données carte SD ( compte-tours) (Read 540 times) previous topic - next topic

Projkart

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

vohu

#1
Mar 16, 2015, 12:15 pm Last Edit: Mar 16, 2015, 12:29 pm by vohu
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 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 ?

Projkart

#2
Mar 17, 2015, 01:08 pm Last Edit: Mar 17, 2015, 01:23 pm by Projkart
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

vohu

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

Projkart

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 .

vohu

#5
Mar 17, 2015, 01:50 pm Last Edit: Mar 17, 2015, 01:52 pm by vohu
Dans myFile.print(count);, remplace count par un nombre directement et vérifie si ça écrit

Et redonne ton code complet stp

Projkart

#6
Mar 17, 2015, 01:54 pm Last Edit: Mar 17, 2015, 01:57 pm by Projkart
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");
}
}

vohu

#7
Mar 17, 2015, 01:56 pm Last Edit: Mar 17, 2015, 02:10 pm by vohu
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");
        }
    }
}

Projkart


vohu

#9
Mar 17, 2015, 02:11 pm Last Edit: Mar 17, 2015, 02:13 pm by vohu
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.

Go Up