voici mon programme GPS. toutes les commandes d'affichage sur le terminal seront supprimés sur la version finale. elles ne servent que pour les tests.
#include <NewSoftSerial.h>
#include "Wire.h"
#include <TinyGPS.h>
#include <Deuligne.h>
Deuligne lcd;
int escape=0;
int x; //variable servant au calcul de conversion
int y;
int d;
int m;
int D;
int M;
const int brocheTX=2; // Constante pour la broche 2
const int brocheRX=3; // Constante pour la broche 3
String chaineReceptionGPS=""; // chaine réception
NewSoftSerial mySoftSerial(brocheRX, brocheTX);
TinyGPS gps; // déclare un objet GPS
void setup() { // debut de la fonction setup()
Serial.begin(115200);
mySoftSerial.begin(4800);
lcd.init();
// désactivation envoi automatique des trames GPS par le module GPS
envoiGPS("PSRF103,00,00,00,01");
envoiGPS("PSRF103,01,00,00,01");
envoiGPS("PSRF103,02,00,00,01");
envoiGPS("PSRF103,03,00,00,01");
envoiGPS("PSRF103,04,00,00,01");
envoiGPS("PSRF103,05,00,00,01");
mySoftSerial.flush(); // vide le buffer série logiciel
} // fin de la fonction setup()
void loop(){ // debut de la fonction loop()
mySoftSerial.flush();
Serial.print("Requete trame GGA :");
envoiGPS("PSRF103,00,01,00,01");
Serial.print("Reponse du GPS : "); // message
while(!mySoftSerial.available()); // attend une réponse du GPS - stop si pas de réponse
receptionGPS(); // analyse réponse GPS
Serial.print("Requete trame RMC :");
envoiGPS("PSRF103,04,01,00,01"); // Demande de trame RMC avec controle activé
Serial.print("Reponse du GPS : ");
while(!mySoftSerial.available());
receptionGPS();
Serial.println();
gestionGPS(gps); // appel la fonction de gestion du GPS
Serial.println();
Serial.println();
}
//while(1); // stop loop
// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************
// ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS ////////////////////
// ////////////////////////// AUTRES FONCTIONS DU PROGRAMME ////////////////////
//----- fonction analyse réponse GPS ----
void receptionGPS() {
while(mySoftSerial.available()) {
int c = mySoftSerial.read();
chaineReceptionGPS=chaineReceptionGPS+char(c);
Serial.print(char(c)); // affiche le caractère reçu
boolean test=gps.encode(c);
delay(1); // entre 2 réceptions... laisse le temps au caractère suivant d'arriver...
if(test==true) {
Serial.println();
Serial.print("Une chaine valide (GGA ou RMC) a ete recue par la librairie TinyGPS :");
Serial.println(chaineReceptionGPS); // affiche la chaine reçue
chaineReceptionGPS=""; // RAZ chaine de réception
} // fin nouvelle trame valide
} // fin while SoftSerial
} //-- fin fonction receptionGPS
//----- fonction envoi instruction GPS ---
void envoiGPS ( String chaineEnvoi) {
String checksumChaine=String (checkSum(chaineEnvoi),HEX);
Serial.println();
chaineEnvoi="$"+chaineEnvoi+"*"+checksumChaine+char(0xD)+char(0xA);
Serial.print("Commande envoyee au GPS : ");
Serial.print(chaineEnvoi); // debug - affiche commande GPS
//Serial.println();
mySoftSerial.flush(); // vide le buffer série logiciel avant requete GPS
mySoftSerial.print(chaineEnvoi); // envoi la chaine sur le port série logiciel
} // fin fonction envoi GPS
int checkSum (String chaineTest) {
int test=0; // initialise variable locale
for (int i=0; i<chaineTest.length(); i++) {
char c=chaineTest.charAt(i); // extrait le caractère de la chaine
// Serial.print(c); // debug - affiche caractère
// si c'est le premier passage
if (test == 0) {
// on initialise la variable test avec la valeur du caractère
test = byte(c);
}
else {
// sinon on fait un XOR entre la variable test et la valeur du caractère
test = test ^ byte(c);
}
} // fin for i
return test; // renvoie la valeur de controle
} // fin fonction Checksum
//---- fonction de Gestion du GPS ----
void gestionGPS(TinyGPS &gps) { // la fonction reçoit le pointeur de l'objet GPS
float latitude, longitude; // variable locale de latitude et longitude
x = latitude ;
y = longitude ;
gps.f_get_position(&latitude, &longitude); // la fonction reçoit les pointeurs des variables
//et met les valeurs dans les variables
Serial.print("Lat/Long: ");
Serial.print(latitude,5); // avec 5 décimales
Serial.print(", ");
Serial.println(longitude,5); // avec 5 décimales
int annee; // variable locale
byte mois, jour, heure, minute, seconde, centiemes;// variables locales
gps.crack_datetime(&annee,&mois,&jour,&heure,&minute,&seconde,¢iemes); // la fonction reçoit les pointeurs des variables
//et met les valeurs dans les variables
Serial.print("Date: "); Serial.print(mois, DEC); Serial.print("/");
Serial.print(jour, DEC); Serial.print("/"); Serial.print(annee);
Serial.print(" Time: "); Serial.print(heure, DEC); Serial.print(":");
Serial.print(minute, DEC); Serial.print(":"); Serial.print(seconde, DEC);
Serial.print("."); Serial.println(centiemes, DEC);
// les fonctions suivantes renvoient directement la valeur float
Serial.print("Altitude (metres): "); Serial.println(gps.f_altitude());
Serial.print("Course (degres): "); Serial.println(gps.f_course()); // ?
Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
Serial.println();
//--- statistiques décodage GPS ---
unsigned long chars; // variable locale
unsigned short sentences, failed_checksum;
gps.stats(&chars, &sentences, &failed_checksum); // la fonction reçoit les pointeurs des variables
//et met les valeurs dans les variables
Serial.print("Erreurs Checksums: ");Serial.print(failed_checksum); // message indiquant si erreur de validité des chaines reçues
Serial.println(); Serial.println();
//---- génération de l'adresse utilisable dans Googlemap
// Serial.println("Adresse pour google map : ");
// Serial.print("http://maps.google.com/maps?q=");
Serial.print(latitude,5);
Serial.print(",+");
Serial.println(longitude,5);
lcd.clear ();
x=latitude;//mise en x de la valeur de latitude
y=longitude;// mise en y de la valeur longitude
d=(((latitude-x)*1000*60)/1000);// formule de conversion en degres sexagesime
m=((((latitude-x)*1000*60)/1000)-d)*60;// conversion pour latitude
lcd.print ( x ); lcd.print ( "d"); lcd.print (d); lcd.print ( "m");lcd.print (m); // affichage des coordonnées
D=(((longitude-y)*1000*60)/1000); // conversion en degres sexagesime
M=((((longitude-y)*1000*60)/1000)-D)*60;
lcd.setCursor ( 0,1);
lcd.print ( y ); lcd.print ("d");lcd.print (D); lcd.print ( "m");lcd.print (M);;// affichage du resultat
lcd.setCursor ( 9,1);
lcd.print(gps.f_altitude()); // affichage de l'altitude.
lcd.setCursor ( 14 , 1);
lcd.print ("m");