Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

[Arduino, C++] Problème d'écriture sur carte SD




  1. #1
    man_of_steel

    [Arduino, C++] Problème d'écriture sur carte SD

    Bonjour à tous !!

    Je bosse actuellement sur un projet Arduino dans lequel je récupère sur une carte SD les données fournies par 3 capteurs. Le problème est qu'une fois compilé et téléversé sur la carte arduino, le programme s'arrête au bout de 24 prises de mesure (avant c'était 21, parfois c'est 22 ... bizarre !) . J'ai essayer pas mal de truc, mais rien y fait

    Je vous joins le code. D'ailleurs si vous trouvez des trucs à redire ou à améliorer je suis preneur
    Code:
    /**** PROGRAMME PRINCIPAL *****/
    
    #include <SPI.h>  // Pour la communication SPI
    #include <SD.h>   // Pour la communication avec la carte SD
    
    int CS_PIN = 10;
    
    int NbTopsFan; //mesurer le front de montée du signal
    float Debit;                               
    int debitmetre = 3;    //Où placer le capteur
    int R = 16000;  // résistance "fixe" du pont diviseur de tension
    int Vcc = 5;    // tension d'entrée  
    
    void rpm () {     //Voici la fonction que l'interruption déclenche
      NbTopsFan++;  //Cette fonction mesure les fronts de montée et de descente du signal envoyé par les capteurs à effet Hall
    }
    
    void setup() {
      /* Initialisation du port série */
      Serial.begin(9600);
      pinMode(debitmetre, INPUT); //initializes digital pin 3 as an input
      attachInterrupt(0, rpm, RISING); //and the interrupt is attached
      
      /* Initialisation du port SPI */
      pinMode(10, OUTPUT); 
      
      /* Initialisation de la carte SD */
      Serial.print("Init SD card... ");
      if (!SD.begin(CS_PIN)) { // gestion du cas d'erreur
        Serial.println("FAIL");
        for(;;); } // Attend l'appui sur bouton RESET
      Serial.println("OK");
    
    }
    
    void loop() {
    
      /* calcul de température */
      int valeur0 = analogRead(A0); //tension mesurée aux bornes de la thermistance
      float Ut0 = valeur0 * (Vcc / 1024.0); //conversion de la valeur analogique en volt
      float Rt = (Ut0*R/(Vcc-Ut0))/1000; // calcul de la valeur de la thermistance (pont diviseur de tension)
      float Temperature = 450.57*pow(Rt,-0.619); // température mesurée
      Serial.println(" ");Serial.print("Temperature = ");Serial.println(Temperature);
    
      /* calcul du débit */
      NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
      sei();      //Enables interrupts
      delay (1000);  
      cli();      //Disable interrupts
      Debit = NbTopsFan / 7.5; //fonction de calcul du débit
      Serial.print("Débit = "); Serial.println(Debit);
    
      /* calcul de la pression */
      int valeur1 = analogRead(A1); //tension mesurée aux bornes du capteur de pression
      float Ut1 = valeur1 * (Vcc / 1024.0); //conversion de la valeur analogique en volt
      float Pression = 2.55*Ut1 - 1.37; // pression mesurée
      Serial.print("Pression = "); Serial.println(Pression);
    
      /* Ecriture des données dans le fichier*/
      File fichier = SD.open("donnees", FILE_WRITE); // Ouverture d'un fichier en écriture{
      if(!SD.open ("donnees", FILE_WRITE)) { // gestion du cas d'erreur
        Serial.println("Erreur ouverture fichier");
        for(;;);} // Attend appui sur bouton RESET
      Serial.print("écriture des données sur la carte SD...");
      fichier.print("(");fichier.print(Temperature);fichier.print(", ");fichier.print(Debit);fichier.print(", ");fichier.print(Pression);fichier.println(")");
      Serial.println("OK");
      fichier.close();
    
    }
    Merci d'avance pour votre aide !!
    P.S. : si ça peut vous aider je joins le screen du moniteur série au moment ou ça bug :
    bug_SD.PNG

    -----


  2. Publicité
  3. #2
    jiherve

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Bonsoir
    Le charabia arduino me déplait mais bon!
    Ceci dit il est plus que vraisemblable que l'UART soit géré par interruption(ou c'est nul), moi c'est ce que je fais mais en ASM et si c'est le cas derrière le "cli" cela va être difficile pendant un certain temps.
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    Jack

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Le charabia arduino me déplait mais bon!
    C'est ce que je pensais dans un 1er temps, mais finalement, il suffit d'ajouter une fonction main qui lance setup(), puis loop(), les .h des classes de base (serial, etc.) et c'est bien du C++.
    Dernière modification par Jack ; 12/01/2018 à 22h24.


  5. #4
    Jiav

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Citation Envoyé par man_of_steel Voir le message
    P.S. : si ça peut vous aider je joins le screen du moniteur série au moment ou ça bug :
    Perso je ne vois rien dans le code (disclaimer: niveau débutant). Je te suggère d'ajouter plein de Serial.print("étape #"); afin de trouver quand l'erreur intervient et si elle est systématique. Deux centimes contre un roudoudou à la fraise qu'elle ne l'est pas.
    The opposite of a deep truth may well be another deep truth. Information is physical.

  6. #5
    Chanur

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Bonjour

    C'est bizarre d'ouvrir 2 fois le fichier sur la carte SD. C'est une erreur ou bien quelque chose m'échappe ?

    Code:
    /**** PROGRAMME PRINCIPAL *****/
    
    (...)
    
    void loop() {
    
    (...)
    
      /* Ecriture des données dans le fichier*/
      File fichier = SD.open("donnees", FILE_WRITE); // Ouverture d'un fichier en écriture{
      if(!SD.open ("donnees", FILE_WRITE)) { // gestion du cas d'erreur
    
    (...)
    }
    Et puis tu ne ferme qu'une fois : tu dois accumuler les descripteurs de fichier ouverts. Ca ne peut pas marcher bien longtemps ...
    Dernière modification par Chanur ; 13/01/2018 à 11h34.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  7. A voir en vidéo sur Futura
  8. #6
    Jack

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Bien vu.

    Mais apparemment ça doit réouvrir le même descripteur et il est étonnant que la 2ème ouverture réussisse.

    @man_of_steel : il te reste donc à supprimer la première ouverture:
    Code:
      /* Ecriture des données dans le fichier*/
      File fichier ; 
      if (!SD.open ("donnees", FILE_WRITE)) { //  Ouverture d'un fichier en écriture et gestion du cas d'erreur

  9. #7
    man_of_steel

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Bonjour, merci beaucoup de vos réponse !! (je ne recevais pas de notif, je trouvais ça bizarre )

    Je vais essayer effectivement de supprimer cette ligne de code. Jiav j'ai utilisé ton astuce mais c'est assez bizarre vu que le code s'arrête vraiment au milieu d'une phrase ...

  10. Publicité
  11. #8
    Chanur

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Citation Envoyé par Jack Voir le message
    Mais apparemment ça doit réouvrir le même descripteur et il est étonnant que la 2ème ouverture réussisse.
    Non, ça ouvre le même fichier, en lui affectant un nouveau descripteur.

    En C/C++, on a tout à fait le droit d'ouvrir plusieurs fois un même fichier en écriture (c'est évidemment absurde de le faire dans la même fonction). C'est à éviter, mais ça peu avoir un sens dans le cas d'un fichier de log, par exemple.

    Sauf erreur la norme dit que toutes les données écrites seront dans le fichier si aucun des appelant ne se déplace dans le fichier (avec fseek() par exemple) mais ne spécifie rien quand à l'ordre dans lequel elles on les retrouvera, ce qui peut se régler avec l'utilisation de fflush(). Si un des appelants utilise fseek(), il me semble que le résultat est indéterminé.

    On peut aussi (ça a déjà plus de sens) ouvrir un fichier en écriture d'une part et en lecture d'autre part. Par exemple envoyer la sortie d'un process dans un fichier et ouvrir le fichier par un tail -f (sous Linux).

    @man_of_steel: si tes affichages ne sont pas complet, c'est qu'ils sont bufferisés et que le programme, en plantant, stoppe l'écriture du buffer. Ça se résout en utilisant fflush() quand on a ouvert un fichier avec fopen(). Il se peut que cette solution marche pour tes traces en faisant fflush(stdout) après chaque écriture.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  12. #9
    Jack

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    je ne sais pas comment c'est géré avec arduino, mais un appel de open devrait renvoyer faux si le fichier est déjà ouvert avec un code d'erreur EEXIST, non?

  13. #10
    man_of_steel

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Ok alors je crois que j'ai à peu près tout éssayé là !!
    le bug venait effectivement du fait que j'ouvrais 2x le fichier (merci Chanur). Par contre ça ne marchait toujours pas avec le code que Jack m'avais conseillé ...
    Code:
      File fichier ; 
      if (!SD.open ("donnees", FILE_WRITE)) { //  Ouverture d'un fichier en écriture et gestion du cas d'erreur
    Du coup j'ai carrément enlevé la condition qui gérait le cas d'erreur et qui en même temps ré-ouvrait le fichier, et là miracle ça marche !! Ce qui est frustrant c'est que je ne saurais pas expliquer pourquoi (moyen comme retour sur expérience), et surtout je sais pas si c'est une solution fiable sur le long terme.

  14. #11
    Chanur

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Ça dépend des flags qu'on passe à open : O_TRUNC permet d'écraser un fichier existant, O_CREAT de créer un fichier inexistant.
    On peut aussi bien interdire d'écrire dans un fichier s'il existe déjà que ne permettre l'écriture que si le fichier existe.

    fopen (nom, "w") revient à faire open (nom, O_RDONLY | O_CREAT | O_TRUNC, 0666). (plus le fait de bufferiser l'écriture)
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  15. #12
    Chanur

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Citation Envoyé par man_of_steel Voir le message
    Ok alors je crois que j'ai à peu près tout éssayé là !!
    le bug venait effectivement du fait que j'ouvrais 2x le fichier (merci Chanur). Par contre ça ne marchait toujours pas avec le code que Jack m'avais conseillé ...
    Code:
      File fichier ; 
      if (!SD.open ("donnees", FILE_WRITE)) { //  Ouverture d'un fichier en écriture et gestion du cas d'erreur
    Du coup j'ai carrément enlevé la condition qui gérait le cas d'erreur et qui en même temps ré-ouvrait le fichier, et là miracle ça marche !! Ce qui est frustrant c'est que je ne saurais pas expliquer pourquoi (moyen comme retour sur expérience), et surtout je sais pas si c'est une solution fiable sur le long terme.
    Ben non, tu ne renseignes pas la variable fichier.
    il faut écrire :
    Code:
    File fichier = SD_open ...
    if (!fichier)
        traitement de l'erreur
    Dernière modification par Chanur ; 13/01/2018 à 20h32.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  16. #13
    Jack

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Citation Envoyé par man_of_steel Voir le message
    Par contre ça ne marchait toujours pas avec le code que Jack m'avais conseillé ...
    Oui, c'est ma (très grande) faute. Le bon code était:
    Code:
     /* Ecriture des données dans le fichier*/  File fichier ; 
      if (!fichier =SD.open ("donnees", FILE_WRITE)) { //  Ouverture d'un fichier en écriture et gestion du cas d'erreur
    avec l'affectation qui manquait à fichier.
    En tout cas, c'est comme ça que je fais pour ouvrir un fichier.
    Dernière modification par Jack ; 13/01/2018 à 20h44.

  17. #14
    man_of_steel

    Re : [Arduino, C++] Problème d'écriture sur carte SD

    Super tout fonctionne, merci beaucoup !!
    (J'ouvre un autre topic sur les modes veille de l'arduino si ça vous intéresse )

Discussions similaires

  1. [Programmation] Problème de carte arduino
    Par tchou21 dans le forum Électronique
    Réponses: 16
    Dernier message: 28/08/2017, 17h20
  2. [Outils/Fab/Comp] Quelle carte arduino choisir ? Et probleme condition
    Par Tpe de ssi dans le forum Électronique
    Réponses: 0
    Dernier message: 08/02/2017, 16h11
  3. Problème carte micro sd (Arduino Yun)
    Par PierreYun dans le forum Électronique
    Réponses: 1
    Dernier message: 30/12/2014, 13h03
  4. probleme ecriture carte sd
    Par guillaume83 dans le forum Électronique
    Réponses: 0
    Dernier message: 28/09/2014, 14h46
  5. Problème ecriture/lecture carte SD
    Par cyril18000 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 18/04/2011, 21h22