Articles les plus consultés

lundi 27 août 2018

Premier programme de controle

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