IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Arduino + board SD + GPS + capteur MQ : problème de syntaxe ?


Sujet :

Arduino

  1. #1
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut Arduino + board SD + GPS + capteur MQ : problème de syntaxe ?
    Bonsoir,
    Je me bats depuis quelques temps avec des problèmes de syntaxe sur un montage et un sketch, je recherche un petit coup de main.

    - Le montage : UNO + carte SD + GPS + capteur MQ
    - Je veux avoir en sortie dans un fichier CSV sur ma carte SD ces lignes
    "datas GPS","data MQ"
    "datas GPS","data MQ"
    etc .

    - Mon problème aujourd'hui est que je n'arrive pas à avoir ces infos à la suite, sur chaque ligne les "datas MQ" se retrouvent à la ligne après les "datas GPS"
    Je pense que la syntaxe n'est pas bonne à la fin du sketch, peut-être des \n que je ne mets pas, mais malgré beaucoup d'essais rien à faire. Il y aun retour chariot qui traîne, mais pas moyen de trouver !

    Merci pour votre aide !
    Nico

    (je ne mets pas tout le début du sketch)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //getting the voltage reading from the temperature sensor 
    int reading = analogRead(sensorPin);  
    word voltage = reading * aref_voltage;
     
     
    float sensor_volt;
    float sensorValue;
    sensorValue = analogRead(A0);
    sensor_volt = sensorValue/1024*5.0;
     
     
     // Rad. lets log it!
     Serial.println(F("Log"));
     
     uint8_t stringsize = strlen(stringptr);
        if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))
            error(4);
        if (strstr(stringptr, "RMC") || strstr(stringptr, "GGA"))   logfile.flush();
     
    logfile.print(",");
    logfile.println(sensor_volt);
     
        Serial.println();
    }
    }
     
    /* End code */

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    difficile de vous aider avec un bout de code partiel. qu'est-ce que stringptr par exemple, comment est-il rempli etc ...

    vous avez des if pour l'écriture dans le fichier, avez vous vérifié ce qu'ils font ?
    au lieu d'écrire dans le fichier, dans un premier temps écrivez sur la console série avec les valeurs testées dans le if et ce qui serait normalement mis dans le fichier log.
    ça devrait vous aider à débuguer

    (se peut il que le décalage que vous voyez ce ne sont pas les même lectures mais 2 lectures consécutives ?)

    PS/ c'est mieux de mettre les balises de code quand vous en partagez, ça simplifie la lecture. sélectionnez le code et appuyez sur le symbole # dans la barre des outils au dessus de votre post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //getting the voltage reading from the temperature sensor 
    int reading = analogRead(sensorPin); 
    word voltage = reading * aref_voltage;
     
     
    float sensor_volt;
    float sensorValue;
    sensorValue = analogRead(A0);
    sensor_volt = sensorValue/1024*5.0;
     
     
    // Rad. lets log it!
    Serial.println(F("Log"));
     
    uint8_t stringsize = strlen(stringptr);
    if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))
    error(4);
    if (strstr(stringptr, "RMC") || strstr(stringptr, "GGA")) logfile.flush();
     
    logfile.print(",");
    logfile.println(sensor_volt);
     
    Serial.println();
    }
    }
    (et s'il était indenté ça faciliterait aussi la lecture avec l'alignement des { et }

  3. #3
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut
    Bonjour Jay M et merci pour ta réponse.

    Je mets le code au complet ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    // #include <SPI.h>
    #include <Adafruit_GPS.h>
    #include <SoftwareSerial.h>
    #include <SD.h>
    // #include <avr/sleep.h>
    // example original sensor temp <a href="https://forums.adafruit.com/viewtopic.php?f=31&t=121089" target="_blank">https://forums.adafruit.com/viewtopic.php?f=31&t=121089</a>
    // Ladyada's logger modified by Bill Greiman to use the SdFat library
    // Adaptation avec capteur gaz MQ
    // This code shows how to listen to the GPS module in an interrupt
    // which allows the program to have more 'freedom' - just parse
    // when a new NMEA sentence is available! Then access data when
    // desired.
    //
    // Tested and works great with the Adafruit Ultimate GPS Shield
    // using MTK33x9 chipset
    //    ------> <a href="http://www.adafruit.com/products/" target="_blank">http://www.adafruit.com/products/</a>
     
    SoftwareSerial mySerial(8, 7);
    Adafruit_GPS GPS(&mySerial);
     
    // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
    // Set to 'true' if you want to debug and listen to the raw GPS sentences
    #define GPSECHO  true
    /* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
    #define LOG_FIXONLY false  
     
    // this keeps track of whether we're using the interrupt
    // off by default!
    boolean usingInterrupt = false;
    void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy
     
    // Set the pins used
    #define chipSelect 10
    #define ledPin 13
     
     
    #define aref_voltage 4.8
     
    File logfile;
     
    // read a Hex value and return the decimal equivalent
    // uint8_t parseHex(char c) {
    //  if (c < '0')
    //    return 0;
    //  if (c <= '9')
    //    return c - '0';
    //  if (c < 'A')
    //    return 0;
    //  if (c <= 'F')
    //    return (c - 'A')+10;
    // }
     
    // blink out an error code
    void error(uint8_t errno) {
      /*
      if (SD.errorCode()) {
       putstring("SD error: ");
       Serial.print(card.errorCode(), HEX);
       Serial.print(',');
       Serial.println(card.errorData(), HEX);
       }
       */
      while(1) {
        uint8_t i;
        for (i=0; i<errno; i++) {
          digitalWrite(ledPin, HIGH);
          delay(100);
          digitalWrite(ledPin, LOW);
          delay(100);
        }
        for (i=errno; i<10; i++) {
          delay(200);
        }
      }
    }
     
    void setup() {
      // for Leonardos, if you want to debug SD issues, uncomment this line
      // to see serial output
      //while (!Serial);
     
      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println(F("\r\nUltimate GPSlogger Shield"));
      pinMode(ledPin, OUTPUT);
     
      // make sure that the default chip select pin is set to
      // output, even if you don't use it:
      pinMode(10, OUTPUT);
     
      // see if the card is present and can be initialized:
      //if (!SD.begin(chipSelect, 11, 12, 13)) {
        if (!SD.begin(chipSelect)) {      // if you're using an UNO, you can use this line instead
        Serial.println(F("Card init. failed!"));
        error(2);
      }
      char filename[15];
      strcpy(filename, "GPSLOG00.CSV");
      for (uint8_t i = 0; i < 100; i++) {
        filename[6] = '0' + i/10;
        filename[7] = '0' + i%10;
        // create if does not exist, do not open existing, write, sync after write
        if (! SD.exists(filename)) {
          break;
        }
      }
     
      logfile = SD.open(filename, FILE_WRITE);
      if( ! logfile ) {
        Serial.print(F("Couldnt create ")); 
        Serial.println(filename);
        error(3);
      }
      Serial.print(F("Writing to ")); 
      Serial.println(filename);
     
      // connect to the GPS at the desired rate
      GPS.begin(9600);
     
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude modif 2606
      // GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // only GGA rajout 3006
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_GGA);
      // uncomment this line to turn on only the "minimum recommended" data modif 2606
      // GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For logging data, we don't suggest using anything but either RMC only or RMC+GGA
      // to keep the log files at a reasonable size
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);   // 100 millihertz (once every 10 seconds), 1Hz or 5Hz update rate
     
      // Turn off updates on antenna status, if the firmware permits it
      GPS.sendCommand(PGCMD_NOANTENNA);
     
      // the nice thing about this code is you can have a timer0 interrupt go off
      // every 1 millisecond, and read data from the GPS for you. that makes the
      // loop code a heck of a lot easier!
      useInterrupt(true);
     
      Serial.println(F("Ready!"));
    }
     
     
    // Interrupt is called once a millisecond, looks for any new GPS data, and stores it
    SIGNAL(TIMER0_COMPA_vect) {
      char c = GPS.read();
      // if you want to debug, this is a good time to do it!
      #ifdef UDR0
          if (GPSECHO)
            if (c) UDR0 = c;  
          // writing direct to UDR0 is much much faster than Serial.print 
          // but only one character can be written at a time. 
      #endif
    }
     
    void useInterrupt(boolean v) {
      if (v) {
        // Timer0 is already used for millis() - we'll just interrupt somewhere
        // in the middle and call the "Compare A" function above
        OCR0A = 0xAF;
        TIMSK0 |= _BV(OCIE0A);
        usingInterrupt = true;
      } 
      else {
        // do not call the interrupt function COMPA anymore
        TIMSK0 &= ~_BV(OCIE0A);
        usingInterrupt = false;
      }
    }
     
    void loop() {
    int sensorPin = 0;
     
     
     
      if (! usingInterrupt) {
        // read data from the GPS in the 'main loop'
        char c = GPS.read();
        // if you want to debug, this is a good time to do it!
        if (GPSECHO)
          if (c) Serial.print(c);
      }
     
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences! 
        // so be very wary if using OUTPUT_ALLDATA and trying to print out data
     
        // Don't call lastNMEA more than once between parse calls!  Calling lastNMEA 
        // will clear the received flag and can cause very subtle race conditions if
        // new data comes in before parse is called again.
        char *stringptr = GPS.lastNMEA();
     
        if (!GPS.parse(stringptr))   // this also sets the newNMEAreceived() flag to false
          return;  // we can fail to parse a sentence in which case we should just wait for another
     
        // Sentence parsed! 
        Serial.println(F("OK"));
        if (LOG_FIXONLY && !GPS.fix) {
          Serial.print(F("No Fix"));
          return;
        }
     
    //getting the voltage reading from the temperature sensor THX : partie modifiee
    int reading = analogRead(sensorPin);  
    word voltage = reading * aref_voltage;
     
     
    float sensor_volt;
    float sensorValue;
    sensorValue = analogRead(A0);
    sensor_volt = sensorValue/1024*5.0;
     
     
        // Rad. lets log it!
        Serial.println(F("Log"));
     
        uint8_t stringsize = strlen(stringptr);
        if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
            error(4);
        if (strstr(stringptr, "RMC") || strstr(stringptr, "GGA"))   logfile.flush();
     
    logfile.print(",");
    // partie ajoutee perso
    logfile.print(sensor_volt);
     
        Serial.println();
    }
    }
     
    /* End code */

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    le log se fait ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Rad. lets log it!
        Serial.println(F("Log"));
     
        uint8_t stringsize = strlen(stringptr);
        if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
          error(4);
        if (strstr(stringptr, "RMC") || strstr(stringptr, "GGA"))   logfile.flush();
     
        logfile.print(",");
        // partie ajoutee perso
        logfile.print(sensor_volt);
    s'il y a eu une erreur avec l'écriture de la phrase du GPS, il ne faudrait pas écrire la tension ==> un else si pas d'erreur permettrait de le faire.

    Vous n'écrivez pas non plus de retour à la ligne dans votre fichier, pour avoir un passage à la ligne après la tension il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     logfile.println(sensor_volt);[
    Avez vous vérifié si la phrase du GPS ne contient pas un passage à la ligne ?

    vous ne faites pas de flush() après l'écriture de la tension.

    Vous ne fermez jamais le fichier, donc il se peut qu'à l'éjection de la SD tout ne soit pas dessus.

  5. #5
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut
    Bonjour Jay M,

    Merci pour votre réponse.

    Le fichier qui est créé sur la SD donne ça (c'est un choix de n'avoir que les infos GPS du type GPGGA).
    Les mesures venant du capteur MQ se retrouvent mis à la ligne en effet après les datas GPS, je ne sais pas si ce retour à la ligne vient directement de la programmation du GPS je vais voir si je trouve quelque chose

    $GPGGA,120409.800,4901.2825,N,00305.8821,E,1,05,1.60,115.1,M,47.3,M,,*68
    ,1.50

    $GPGGA,120410.000,4901.2825,N,00305.8821,E,1,05,1.60,115.1,M,47.3,M,,*68
    ,1.50

    $GPGGA,120410.200,4901.2826,N,00305.8821,E,1,05,1.60,115.1,M,47.3,M,,*69
    ,1.50

  6. #6
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Nico_projet

    Il y a certainement des caractères "invisibles" comme "Nouvelle ligne" \n ou "Retour chariot" \r en fin de ce que tu reçoit du GPS.

    J'ai ajouté ceci à ton programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        //if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
        //error(4);
        String stringptrNew = (String)stringptrNew;
        stringptrNew.replace("\n", "");
        stringptrNew.replace("\r", "");
    ...
    //logfile.print(",");
    // partie ajoutee perso
        logfile.print(stringptrNew + ","); Serial.println(sensor_volt);
        Serial.print(stringptrNew + ","); Serial.println(sensor_volt);
    Pour supprimer ces caractères, j'ai testé la méthode mais pas le programme, n'ayant pas de GPS
    Cette méthode va certainement "piquer les yeux" de Jay M, mais je n'ai pas trouvé de méthode pratique pour supprimer un caractère dans un tableau char().

    Ton programme modifié mais non testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    // #include <SPI.h>
    #include <Adafruit_GPS.h>
    #include <SoftwareSerial.h>
    #include <SD.h>
    // #include <avr/sleep.h>
    // example original sensor temp <a href="https://forums.adafruit.com/viewtopic.php?f=31&t=121089" target="_blank">https://forums.adafruit.com/viewtopic.php?f=31&t=121089</a>
    // Ladyada's logger modified by Bill Greiman to use the SdFat library
    // Adaptation avec capteur gaz MQ
    // This code shows how to listen to the GPS module in an interrupt
    // which allows the program to have more 'freedom' - just parse
    // when a new NMEA sentence is available! Then access data when
    // desired.
    //
    // Tested and works great with the Adafruit Ultimate GPS Shield
    // using MTK33x9 chipset
    //    ------> <a href="http://www.adafruit.com/products/" target="_blank">http://www.adafruit.com/products/</a>
     
    SoftwareSerial mySerial(8, 7);
    Adafruit_GPS GPS(&mySerial);
     
    // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
    // Set to 'true' if you want to debug and listen to the raw GPS sentences
    #define GPSECHO  true
    /* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
    #define LOG_FIXONLY false  
     
    // this keeps track of whether we're using the interrupt
    // off by default!
    boolean usingInterrupt = false;
    void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy
     
    // Set the pins used
    #define chipSelect 10
    #define ledPin 13
     
     
    #define aref_voltage 4.8
     
    File logfile;
     
    // read a Hex value and return the decimal equivalent
    // uint8_t parseHex(char c) {
    //  if (c < '0')
    //    return 0;
    //  if (c <= '9')
    //    return c - '0';
    //  if (c < 'A')
    //    return 0;
    //  if (c <= 'F')
    //    return (c - 'A')+10;
    // }
     
    // blink out an error code
    void error(uint8_t errno) {
      /*
      if (SD.errorCode()) {
       putstring("SD error: ");
       Serial.print(card.errorCode(), HEX);
       Serial.print(',');
       Serial.println(card.errorData(), HEX);
       }
       */
      while(1) {
        uint8_t i;
        for (i=0; i<errno; i++) {
          digitalWrite(ledPin, HIGH);
          delay(100);
          digitalWrite(ledPin, LOW);
          delay(100);
        }
        for (i=errno; i<10; i++) {
          delay(200);
        }
      }
    }
     
    void setup() {
      // for Leonardos, if you want to debug SD issues, uncomment this line
      // to see serial output
      //while (!Serial);
     
      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println(F("\r\nUltimate GPSlogger Shield"));
      pinMode(ledPin, OUTPUT);
     
      // make sure that the default chip select pin is set to
      // output, even if you don't use it:
      pinMode(10, OUTPUT);
     
      // see if the card is present and can be initialized:
      //if (!SD.begin(chipSelect, 11, 12, 13)) {
        if (!SD.begin(chipSelect)) {      // if you're using an UNO, you can use this line instead
        Serial.println(F("Card init. failed!"));
        error(2);
      }
      char filename[15];
      strcpy(filename, "GPSLOG00.CSV");
      for (uint8_t i = 0; i < 100; i++) {
        filename[6] = '0' + i/10;
        filename[7] = '0' + i%10;
        // create if does not exist, do not open existing, write, sync after write
        if (! SD.exists(filename)) {
          break;
        }
      }
     
      logfile = SD.open(filename, FILE_WRITE);
      if( ! logfile ) {
        Serial.print(F("Couldnt create ")); 
        Serial.println(filename);
        error(3);
      }
      Serial.print(F("Writing to ")); 
      Serial.println(filename);
     
      // connect to the GPS at the desired rate
      GPS.begin(9600);
     
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude modif 2606
      // GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // only GGA rajout 3006
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_GGA);
      // uncomment this line to turn on only the "minimum recommended" data modif 2606
      // GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For logging data, we don't suggest using anything but either RMC only or RMC+GGA
      // to keep the log files at a reasonable size
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);   // 100 millihertz (once every 10 seconds), 1Hz or 5Hz update rate
     
      // Turn off updates on antenna status, if the firmware permits it
      GPS.sendCommand(PGCMD_NOANTENNA);
     
      // the nice thing about this code is you can have a timer0 interrupt go off
      // every 1 millisecond, and read data from the GPS for you. that makes the
      // loop code a heck of a lot easier!
      useInterrupt(true);
     
      Serial.println(F("Ready!"));
    }
     
     
    // Interrupt is called once a millisecond, looks for any new GPS data, and stores it
    SIGNAL(TIMER0_COMPA_vect) {
      char c = GPS.read();
      // if you want to debug, this is a good time to do it!
      #ifdef UDR0
          if (GPSECHO)
            if (c) UDR0 = c;  
          // writing direct to UDR0 is much much faster than Serial.print 
          // but only one character can be written at a time. 
      #endif
    }
     
    void useInterrupt(boolean v) {
      if (v) {
        // Timer0 is already used for millis() - we'll just interrupt somewhere
        // in the middle and call the "Compare A" function above
        OCR0A = 0xAF;
        TIMSK0 |= _BV(OCIE0A);
        usingInterrupt = true;
      } 
      else {
        // do not call the interrupt function COMPA anymore
        TIMSK0 &= ~_BV(OCIE0A);
        usingInterrupt = false;
      }
    }
     
    void loop() {
    int sensorPin = 0;
     
     
     
      if (! usingInterrupt) {
        // read data from the GPS in the 'main loop'
        char c = GPS.read();
        // if you want to debug, this is a good time to do it!
        if (GPSECHO)
          if (c) Serial.print(c);
      }
     
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences! 
        // so be very wary if using OUTPUT_ALLDATA and trying to print out data
     
        // Don't call lastNMEA more than once between parse calls!  Calling lastNMEA 
        // will clear the received flag and can cause very subtle race conditions if
        // new data comes in before parse is called again.
        char *stringptr = GPS.lastNMEA();
     
        if (!GPS.parse(stringptr))   // this also sets the newNMEAreceived() flag to false
          return;  // we can fail to parse a sentence in which case we should just wait for another
     
        // Sentence parsed! 
        Serial.println(F("OK"));
        if (LOG_FIXONLY && !GPS.fix) {
          Serial.print(F("No Fix"));
          return;
        }
     
    //getting the voltage reading from the temperature sensor THX : partie modifiee
    int reading = analogRead(sensorPin);  
    word voltage = reading * aref_voltage;
     
     
    float sensor_volt;
    float sensorValue;
    sensorValue = analogRead(A0);
    sensor_volt = sensorValue/1024*5.0;
     
     
        // Rad. lets log it!
        Serial.println(F("Log"));
     
        uint8_t stringsize = strlen(stringptr);
        //if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
        //error(4);
        String stringptrNew = (String)stringptrNew;
        stringptrNew.replace("\n", "");
        stringptrNew.replace("\r", "");
     
        if (strstr(stringptr, "RMC") || strstr(stringptr, "GGA"))   logfile.flush();
     
    //logfile.print(",");
    // partie ajoutee perso
        logfile.print(stringptrNew + ","); Serial.println(sensor_volt);
        Serial.print(stringptrNew + ","); Serial.println(sensor_volt);
    }
    }
     
    /* End code */
    Cordialement
    jpbbricole

  7. #7
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut
    Bonjour jpbbricole

    Merci pour ton aide, je vais tester ce soir
    Nico

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Salut Nico,

    A voir ce que vous avez il semble très clair que la phrase reçue du GPS contient un passage à la ligne.

    Citation Envoyé par jpbbricole Voir le message
    Pour supprimer ces caractères, j'ai testé la méthode mais pas le programme, n'ayant pas de GPS
    Cette méthode va certainement "piquer les yeux" de Jay, mais je n'ai pas trouvé de méthode pratique pour supprimer un caractère dans un tableau char().
    je vais passer pour le vieux gardien du temple

    Mais non, en pratique il n’y a pas de méthode magique pour virer un caractère au milieu d’un tableau et de tout décaler, il faut le faire d’une façon ou d’une autre Plus ou moins à la main. La vôtre en vaut une autre surtout si le morcellement mémoire potentiel ne devient pas un problème (souci de la classe String suivant ce que l’on fait).

    (A noter que si vous avez plusieurs phrases du GPS dans le buffer séparées par des CR et/ou LF en les replaçant par rien du tout vous allez coller les phrases et l’analyse standard du buffer ne marcherait plus. Donc il faut l’analyser avant pas après modif. Une recherche juste de sous chaîne continuerait à fonctionner)

    Sans passer par la Classe String On pourrait

    1) Imprimer les caractères un par un au lieu de faire un print total mais tester avant d’imprimer si c’est un CR ou LF auquel cas on ne l’imprime pas. Ça a le mérite de la simplicité.

    2) il y a de fortes chances que le retour à la ligne soit en toute fin de phrase du GPS. Comme ce que l’on reçoit est assez constant, on pourrait regarder une fois pour toute et s’il y a un \r et un \n ou juste un \n à la fin de manière systématique il suffit de mettre un \0 à la place où on veut terminer. (strlen() pour avoir la longueur de la cString, ensuite c’est juste une écriture dans le tableau)

    3) faire à la main ce que vous faites avec la classe String, si on trouve un caractère interdit, on décale toute la suite de la cString d’un cran.

    4) si on veut s’éviter le décalage et le risque de joindre deux phrases NMEA GPS, on peut remplacer ces caractères invisibles par des espaces. Pour cela on utiliserait strchr() pour rechercher les \r et \n et on met un blanc à la place. Une fois que c’est fait on peut faire print

  9. #9
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut
    - jpbbricole:
    J'ai essayé le sketch, toujours le même problème, par contre c'est bien plus claire sur le console Série, merci !

    - JayM :
    Donc, cela confirme que le CR est inclus dans le code du GPS. J'ai essayé de voir ce qui pouvait être modifié directement dans la librairie Adafruit_GPS , il y a 2 fichiers principaux (mis en pièces jointes) :
    Adafruit_GPS.cpp
    Adafruit_GPS.h
    J'avoue ne pas trop savoir où chercher en fait ;-) Il doit bien être indique quelque part ce CR ! J'ai trouvé un \n dans Adafruit_GPS.cpp ligne 288, et cela semble correspondre à la sortie Serial.println

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     {
        if(!gpsHwSerial->available()) return c;
        c = gpsHwSerial->read();
      }
     
      //Serial.print(c);
     
    //  if (c == '$') {         //please don't eat the dollar sign - rdl 9/15/14
    //    currentline[lineidx] = 0;
    //    lineidx = 0;
    //  }
      if (c == '\n') {
        currentline[lineidx] = 0;
     
        if (currentline == line1) {
          currentline = line2;
          lastline = line1;
        } else {
          currentline = line1;
          lastline = line2;
        }
     
        //Serial.println("----");
        //Serial.println((char *)lastline);
        //Serial.println("----");
        lineidx = 0;
        recvdflag = true;
      }
     
      currentline[lineidx++] = c;
      if (lineidx >= MAXLINELENGTH)
        lineidx = MAXLINELENGTH-1;
     
      return c;
    }
    Si je te suis, on peut se dire que le CR existe bien en "caché" juste après les infos GPS, et qu'on pourra le chercher et adapter la sortie sur la SD , alors comment intégrer ta proposition la plus simple &) "Imprimer les caractères un par un au lieu de faire un print total" ou à moins que les 2) et 3) soient plus simples à implémenter ?

    Nico
    Fichiers attachés Fichiers attachés

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    J'avoue ne pas trop savoir où chercher en fait ;-) Il doit bien être indique quelque part ce CR !
    On dirait que la bibliothèque ne capture pas le ‘\n’ mais n’ignore pas les ‘\r’.

    Mes 4 options étaient pour modifier un tableau. Vous n’en avez pas forcément besoin ici.

    le plus simple est de ne pas écrire le dernier caractère dans votre fichier si notre hypothèse est correcte que un ‘\r’ est juste à la fin

    Pour le moment vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uint8_t stringsize = strlen(stringptr);
    if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
          error(4);
    donc vous calculez le nombre de caractères et c’est ce que vous écrivez. Il suffit d’en écrire un de moins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uint8_t stringsize = strlen(stringptr) - 1; // -1 pour sauter le \r de fin
    if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    // Check to see if the data written is correct.
          error(4);
    Essayez comme cela

    Jay.

    PS: pour éviter tout souci il faudrait s’assurer que la chaîne n’est pas vide (taille 0) sinon on va écrire 255 caractères aléatoires (0-1 ça fait 255 sur un uint8_t) donc testez d’abord si la longueur est nulle

  11. #11
    Membre averti
    Homme Profil pro
    Créateur d'entreprise
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Créateur d'entreprise
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut
    Ouiiii ça marche nickel

    $GPGGA,184200.800,4901.2761,N,00305.8722,E,1,03,2.50,102.7,M,47.3,M,,*6C,1.72
    $GPGGA,184201.000,4901.2764,N,00305.8719,E,1,03,2.50,102.7,M,47.3,M,,*68,1.72

    Vraiment merci à vous deux, si vous passer dans le nord du 77 ou vers Rosa parks dans le 19°, je vois dois une bière (ou un café !)

    A bientôt donc et bonne soirée

    Nico

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    C’est cool! Bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arduino Uno et TF Mini Plus : problème d'alimentation
    Par FERRARIS dans le forum Arduino
    Réponses: 4
    Dernier message: 24/12/2019, 08h42
  2. Réponses: 4
    Dernier message: 08/04/2018, 11h17
  3. Problème de syntaxe
    Par Mister_FX dans le forum ASP
    Réponses: 5
    Dernier message: 30/06/2004, 10h01
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo