Heure GPS sur LCD

Bonjour, je possède un shield GPS sur une carte arduino UNO ainsi qu'un écran LCD et une carte SD. J'utilise actuellement de façon à enregistrer les données gps chaque seconde et écrire sur l'écran "marche" et "arret". J'aurais aimé pouvoir afficher l'heure donnée par le GPS. Cependant, je n'arrive pas à gérer la trame NMEA donnée par celui-ci, comment faire?

Mon code est actuellement le suivant:

#include <SPI.h>
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include <SD.h>
#include <avr/sleep.h>
#include <LiquidCrystal.h>
// Ladyada's logger modified by Bill Greiman to use the SdFat library
//
// 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
//    ------> http://www.adafruit.com/products/
// Pick one up today at the Adafruit electronics shop 
// and help support open source hardware & software! -ada

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  

// Set the pins used
#define chipSelect 10
#define ledPin 13

const int buttonPin = A0;     // the number of the pushbutton pin


// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

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);
    }
  }
}
LiquidCrystal lcd(A1, A2, 5, 4, 3, 2);
void setup() {
 
    
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     

  // 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("\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("Card init. failed!");
    error(2);
  }
  char filename[15];
  strcpy(filename, "GPSLOG00.TXT");
  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("Couldnt create "); Serial.println(filename);
    error(3);
  }
  Serial.print("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
  //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  // uncomment this line to turn on only the "minimum recommended" data
  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_1HZ);   // 1 or 5 Hz update rate

  // Turn off updates on antenna status, if the firmware permits it
  GPS.sendCommand(PGCMD_NOANTENNA);
  
  Serial.println("Ready!");
   // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop() {
   // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    
    char c = GPS.read();
  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
    //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
        
    if (!GPS.parse(GPS.lastNMEA()))   // 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("OK");
    if (LOG_FIXONLY && !GPS.fix) {
        Serial.print("No Fix");
        return;
    }

    // Rad. lets log it!
    Serial.println("Log");
    
    char *stringptr = GPS.lastNMEA();
    uint8_t stringsize = strlen(stringptr);
    if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    //write the string to the SD file
      error(4);
    if (strstr(stringptr, "RMC"))   logfile.flush();
    Serial.println();
    // Print a message to the LCD.
  lcd.print("Marche");
  lcd.setCursor(0, 0);
    
  
  }
}
else {
   lcd.print("Arret ");
   lcd.setCursor(0, 0);
  }
}


/* End code */

Si quelqu'un s'y connaît un peu ça serait sympa, merci et bonne journée :slight_smile:

bonjour,

http://arduiniana.org/libraries/tinygps/
tu as tout ce qu'il faut

J'ai déjà essayé avec cette librairie, cependant j'utilise ce shield: Adafruit Ultimate GPS Logger Shield - Includes GPS Module : ID 1272 : $29.95 : Adafruit Industries, Unique & fun DIY electronics and kits
Et la librairie ne fonctionne pas :confused:

Je crois que je vais abandonner l'idée de l'heure en direct.. :disappointed_relieved: =(

Je ne comprends, pas la librairie que tu utilises retourne la date, l'heure, la position. Où est le problème?

Une fois que parse à réussi tu disposes de toutes ces valeurs

  uint8_t hour, minute, seconds, year, month, day;
  uint16_t milliseconds;
  float latitude, longitude, geoidheight, altitude;
  float speed, angle, magvariation, HDOP;
  char lat, lon, mag;
  boolean fix;
  uint8_t fixquality, satellites;

Je n'arrive pas à inclure le code de la librairie dans mon programme.. :~

essaye ça :

http://arduiniana.org/libraries/tinygps/

A télécharger ici :

abarbeau:
Je n'arrive pas à inclure le code de la librairie dans mon programme.. :~

Le code de la librairie tu l'utilises pour faire le parse de la chaine NMEA. Une fois le parse effectué, il suffit de récupérer GPS.hour, GPS.minute, GPS.seconds pour les afficher.

Justement, le parse fonctionne parfaitement mais je voudrais l'effectuer sur les valeurs qu'on enregistre chaque seconde sur la carte SD. Le but est d'afficher sur l'écran LCD l'heure en direct en prenant celle-ci sur les coordonnées gps qu'on inscrit sur la carte SD à une fréquence de 1 hz :slight_smile:

Si le parse fonctionne l'heure est disponible il n'est pas nécessaire d'aller la chercher sur la carte SD elle est déjà en mémoire et tu la récupères comme je te l'ai indiqué.
Tu regardes dans les exemples de la librairie tout est là.

Je sais mais j'ai besoin des infos sur la carte SD pour un traitement informatique par la suite, l'heure est simplement un "bonus".. :confused: Et je n'arrive pas à inclure le parse dans mon programme.. Par conséquent je pense que je vais abandonner cette histoire d'heure :slight_smile:

Tu le fais exprès ou quoi tu utilises déjà parse dans ton programme.
Regarde un peu ton code
Dans le if ci-dessous tu appelles parse
A partir de la ligne :
Serial.println("Log");
tu es certain que la trame NMEA est interprétée et tu peux récupérer l'heure avec GPS.hour, GPS.minute, ....

    if (!GPS.parse(GPS.lastNMEA()))   // 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("OK");
    if (LOG_FIXONLY && !GPS.fix) {
        Serial.print("No Fix");
        return;
    }

    // Rad. lets log it!
    Serial.println("Log");
    
    char *stringptr = GPS.lastNMEA();
    uint8_t stringsize = strlen(stringptr);
    if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    //write the string to the SD file
      error(4);
    if (strstr(stringptr, "RMC"))   logfile.flush();
    Serial.println();
    // Print a message to the LCD.
  lcd.print("Marche");
  lcd.setCursor(0, 0);
    
  
  }

il me suffit de rajouter "lcd.print(GPS.hour)?? :blush: J'ai honte.. ^^

:grin: :grin: il me semble que c'est ce que te dit
fdufnews depuis hier oui

Serial.print("\nTime: ");
    Serial.print(GPS.hour, DEC); Serial.print(':');
    Serial.print(GPS.minute, DEC); Serial.print(':');
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    Serial.println(GPS.milliseconds);
    Serial.print("Date: ");
    Serial.print(GPS.day, DEC); Serial.print('/');
    Serial.print(GPS.month, DEC); Serial.print("/20");
    Serial.println(GPS.year, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality); 
    if (GPS.fix) {
      Serial.print("Location: ");
      Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
      Serial.print(", "); 
      Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
      
      Serial.print("Speed (knots): "); Serial.println(GPS.speed);
      Serial.print("Angle: "); Serial.println(GPS.angle);
      Serial.print("Altitude: "); Serial.println(GPS.altitude);
      Serial.print("Satellites: "); Serial.println((int)GPS.satellites);

Une belle leçon de morale que de comprendre ce petit bout de texte.. Merci en tout cas et désolé pour le dérangement :slight_smile: :blush: XD

De rien