Dans cet article, je vous propose un programme complet:
//Ce programme capture, décode et affiche les données provenant
//d'un module GPS GY-NEO6MV2 sur un afficheur LCD (20*4) en SPI
//il peut afficher les données aussi sur le port serie-ordi pour controle...
//Il affiche l'heure, la longitude+ direction, la latitude+direction, l'altitude
//Il peut donc etre transporté de facon autonome pour des relevés extérieurs
//Il utilise un Arduino Mega2560
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x27); // cale l'adresse du LCD sur 0x27(Changer si adresse LCD différente!)
// Mega2560 20 (SDA) , 21 (SCL)
// Déclaration des chaines pour pouvoir etre affichées sur l'afficheur LCD...
String Date = "dddddd";
String MessageDate = "Date= ";
String MessageLongitude = "Long.= ";
String Longitude = "aaaaaaaaa";
String DirectionLongitude = "d";
String MessageLatitude ="Lat.= ";
String Latitude = "uuuuuuuuuu";
String DirectionLatitude = "d";
String MessageAltitude= "Alt.= ";
String Altitude = "sssssssss";
String Espace = " ";
//On crée un tableau de caractères qui contiendra un bloc de trames GPS
char TableauGPS[1010];
int Compteur1 = 0;
int CompteurTableauGPS = 0;
int CompteurVirgules = 0;
char CaracteretableauGPS = '.';
boolean TrameGGPGA = false;
boolean TableauPlein = false;
void setup() {
//On initialise les ports série et SPI
Serial.begin(9600); // USB serial port 0 (pour controle sur ordi)
Serial3.begin(9600); // serial port 3 (TX= 14, RX= 15)
// (Tx du GPS sur Rx arduino, Rx du GPS sur Tx Arduino!)
Wire.begin();
Wire.beginTransmission(0x27);//Changer si adresse LCD différente!
lcd.begin(20, 4); // initialize the lcd (20chars and 4 line)
}
void loop() {
//Boucle principale
CaptureTableauGPS(); //Capture d'un bloc de trames GPS
RecherchetrameGPGGA();//Recherche de la trame GPGGA
DecodageTrameGPGGA();//Recherche des données utiles dans la trame GPGGA
ConstructionChainesGPS();//Mise en forme des données pour affichage
AffichageSerieOrdi();//Affichage sur port série-ordi pour controle
AffichageGPSLCD();//Affichage sur LCD
}
void CaptureTableauGPS(){
while (TableauPlein == false)
{
if (Serial3.available())
{
while(Serial3.available()&& TableauPlein == false)
{
CaracteretableauGPS = Serial3.read();
TableauGPS[CompteurTableauGPS] = CaracteretableauGPS;
CompteurTableauGPS++;
if (CompteurTableauGPS > 1000)
{
TableauPlein = true;
}
}
}
}
}
void RecherchetrameGPGGA(){
if(TableauPlein == true)
{
CompteurTableauGPS = -1;
while (TableauPlein == true)
{
CompteurTableauGPS ++;
if(TableauGPS[CompteurTableauGPS] == 'G' && TableauGPS[CompteurTableauGPS+1] == 'P' && TableauGPS[CompteurTableauGPS+2] == 'G' && TableauGPS[CompteurTableauGPS+3] == 'G' && TableauGPS[CompteurTableauGPS+4] == 'A')
{
Serial.println("Trame GPGGA trouvée!!!");
for (Compteur1 =0; Compteur1 < 80; Compteur1++)
{
CaracteretableauGPS = TableauGPS[CompteurTableauGPS + Compteur1];
Serial.print(CaracteretableauGPS);
}
Serial.println("-");
TableauPlein =false;
TrameGGPGA = true;
}
if (CompteurTableauGPS > 920)
{
Serial.println("PAS de Trame GPGGA trouvée...");
TableauPlein =false;
TrameGGPGA = false;
CompteurTableauGPS =0;
}
}
}
}
void DecodageTrameGPGGA(){
if ( TrameGGPGA == true){
Date = "dddddd";
MessageDate = "Date= ";
MessageLongitude = "Long.= ";
Longitude = "aaaaaaaaa";
DirectionLongitude = "d";
MessageLatitude ="Lat.= ";
Latitude = "uuuuuuuuuu";
DirectionLatitude = "d";
MessageAltitude= "Alt.= ";
Altitude = "sssssssss";
Espace = " ";
//recuperation Heures de Date... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 6 ;// saut $GPGGA, + placement au caractere suivant
for (Compteur1 =0; Compteur1 <7;Compteur1 ++)
{
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
Date.setCharAt(Compteur1, CaracteretableauGPS);
CompteurTableauGPS++;
}
//recuperation Longitude... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 4 ;// virgule + placement au caractere suivant
for (Compteur1 =0; Compteur1 <9;Compteur1 ++)
{
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
Longitude.setCharAt(Compteur1, CaracteretableauGPS);
CompteurTableauGPS++;
}
//recuperation DirectionLongitude... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 1 ; // virgule + placement au caractere suivant
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
DirectionLongitude.setCharAt(0,CaracteretableauGPS);
//recuperation Latitude... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 2 ;// virgule + placement au caractere suivant
for (Compteur1 =0; Compteur1 < 10; Compteur1 ++)
{
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
Latitude.setCharAt(Compteur1, CaracteretableauGPS);
CompteurTableauGPS++;
}
//recuperation DirectionLatitude... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 1 ; // virgule + placement au caractere suivant
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
DirectionLatitude.setCharAt(0,CaracteretableauGPS);
//recuperation Altitude... ------------------------------------------------------------
CompteurTableauGPS = CompteurTableauGPS + 2 ;// virgule + placement au caractere suivant
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
CompteurVirgules = 0;
while (CompteurVirgules < 3)
{
if (CaracteretableauGPS == ',')
{
CompteurVirgules ++;
}
CompteurTableauGPS ++;
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
}
Compteur1 = 0;
while (CaracteretableauGPS != ',')
{
CaracteretableauGPS = TableauGPS[CompteurTableauGPS];
Altitude.setCharAt(Compteur1, CaracteretableauGPS);
CompteurTableauGPS ++;
Compteur1 ++;
}
}
}
void ConstructionChainesGPS()
{
if ( TrameGGPGA == true){
MessageDate += Date ;
MessageLongitude += Longitude += Espace += DirectionLongitude;
Espace = " ";
MessageLatitude += Latitude += Espace += DirectionLatitude;
MessageAltitude += Altitude ;
}
}
void AffichageSerieOrdi()
{
if ( TrameGGPGA == true){
Serial.println (MessageDate);
Serial.println (MessageLongitude);
// Serial.println (DirectionLongitude);
Serial.println (MessageLatitude);
// Serial.println (DirectionLatitude);
Serial.println (MessageAltitude);
}
}
void AffichageGPSLCD()
{
if ( TrameGGPGA == true){
lcd.setBacklight(255);
lcd.home();
lcd.clear();
lcd.setCursor(0, 0);// premiére ligne
lcd.print(MessageDate);
lcd.setCursor(0, 1);
lcd.print(MessageLongitude);
lcd.setCursor(0, 2);
lcd.print(MessageLatitude);
lcd.setCursor(0, 3);
lcd.print(MessageAltitude);
CompteurTableauGPS =0;
TrameGGPGA == false;
}
}
Et voila!
Lien vers un site expliquant les fonctions sur les chaines:
https://mathsp.tuxfamily.org/spip.php?article271