Bonjour à vous,
pas de soucis c’était pour ne pas encombrer.
c'est ma première class, elle fonctionne aussi
- J'aimerais avoir vos avis sur sa construction
- j'aimerais y intégrer le software Serial
voilà les fichiers
"DJ_GPS.ino
/* DJ 09/10/23
- Test du fonctionnement d'un module GPS Neo-6M avec carte Uno
*/
#include "DJ_Gps.h"
DJ_Gps Neo6m(6,9);
SoftwareSerial gpsSerial(Neo6m.Rx,Neo6m.Tx); // Rx = 6 (Tx = 9)
void setup() {
Serial.begin(115200); // Démarre la communication série avec l'ordinateur
gpsSerial.begin(9600); // Démarre la communication série avec le module GPS
}
void loop() {
Neo6m.Recept_Gps(); // Reception GPS
if(Neo6m.Check_Ok){ // Utilisation Data Reception
char Date_c[12];
char Heure_c[10];
sprintf(Date_c,"%02d/%02d/20%02d ",Neo6m.Jour,Neo6m.Mois,Neo6m.Annee);
Serial.print(Date_c);
sprintf(Heure_c,"%02d:%02d:%02d ",Neo6m.Heure,Neo6m.Minute,Neo6m.Seconde);
Serial.println(Heure_c);
if(Neo6m.Vit_Ok){
Serial.print(F("Vitesse:"));
Serial.print (Neo6m.Vitesse,3);
Serial.println(" Km/h");
}
Serial.println();
// Preparation nouvelle Reception :
Neo6m.Jour=Neo6m.Mois=Neo6m.Annee=Neo6m.Heure=Neo6m.Minute=Neo6m.Seconde=Neo6m.Vitesse=0;
Neo6m.Check_Ok = false;
}
}
"
DJ_GPS.h
/* DJ_Gps V8-A 07/10/23
*
*/
#ifndef DJ_GPS_H
#define DJ_GPS_H
#include "Arduino.h"
#include <SoftwareSerial.h>
class DJ_Gps {
public:
DJ_Gps(uint8_t _Rx,uint8_t _Tx);
uint8_t Rx;
uint8_t Tx;
uint8_t Jour;
uint8_t Mois;
uint8_t Annee;
uint8_t Heure;
uint8_t Minute;
uint8_t Seconde;
bool Check_Ok; // Checksum Trame OK
bool Vit_Ok; // Vitesse OK
float Vitesse;
void Recept_Gps(); // Reception GPS
private:
char Gps_Data[85]; // Tableau pour stocker la trame GPS
uint8_t Data_Index; // Index pour la nouvelle trame
bool Recept_Trame(); // Reception Trame :
// Extraction Trame souhaitée :
bool Extract_Trame (char* Gps_Data, char Test_T[7]);
bool Calc_Checksum(char* Gps_Data);
// Calcul du Checksum de la Trame :
// Extraction du Checksum de la Trame :
uint8_t Extr_Checksum(char* Gps_Data);
// Extraction Vitesse de la Trame :
float Extr_Vitesse(char* Gps_Data);
// Extraction Date(_Date true),Heure(_Date false) :
void Extr_D_H(char* Gps_Data,bool _Date,uint8_t &_C1,uint8_t &_C2,uint8_t &_C3);
// Conversion 2 Caract Ascii en uint8_t :
uint8_t Trslt_Dble(char* Trsl);
};
extern SoftwareSerial gpsSerial; // Rx = 6 (Tx = 9)
#endif
"
"DJ_GPS.cpp
/* DJ_Gps V8-A 07/10/23
*
*/
include "DJ_Gps.h"
DJ_Gps::DJ_Gps(uint8_t _Rx,uint8_t _Tx){
Rx = _Rx;
Tx = _Tx;
}
const uint8_t Pos_Date = 9; // Position Date dans Trame $GPRMC
const uint8_t Pos_Heure = 1; // Position Heure dans Trame $GPRMC
const uint8_t Pos_Vitesse = 7; // Position Vitesse dans Trame $GPRMC
char Id_Trame[7] = {'$','G','P','R','M','C',0}; // Identifiant Trame
char Gps_Data[85]; // Tableau pour stocker la trame GPS
uint8_t Data_Index = 0; // Index pour la nouvelle trame
uint8_t Checks_Idx = 0; // Index pour isolement Checksum
uint8_t Jour=0,Mois=0,Annee=0,Heure=0,Minute=0,Seconde=0;
float Vitesse=0;
bool Check_Ok = false; //Checksum Trame OK
bool Vit_Ok = false; // Vitesse OK
void DJ_Gps::Recept_Gps(){ // Reception GPS :
if(Recept_Trame()){
// Traitement Trame :
if(Extract_Trame (Gps_Data,Id_Trame)){
for(uint8_t i = 0;i < Data_Index;i ++) Serial.print(Gps_Data[i]);
if(Calc_Checksum(Gps_Data)){
Extr_D_H(Gps_Data,true,Jour,Mois,Annee);
Extr_D_H(Gps_Data,false,Heure,Minute,Seconde);
Vitesse = Extr_Vitesse(Gps_Data);
Check_Ok = true; //Checksum Trame OK
}
else {
Serial.println("Trame non Valide");
Check_Ok = false;
}
} // Fin Traitement
Data_Index = 0; // réinitialiser l'index ici pour la nouvelle trame
}
}
// Reception Trame :
bool DJ_Gps::Recept_Trame(){
while (gpsSerial.available() > 0){ // Reception GPS
char c = gpsSerial.read();
Gps_Data[Data_Index] = c; // Stocke le caractère dans le tableau
Data_Index++;
// Si nous atteignons la fin de la trame GPS
if (c == '\n') return true;
}
return false;
}
// Extraction Trame souhaitée
bool DJ_Gps::Extract_Trame (char* Gps_Data, char Test_T[7]){
uint8_t C_Ok = 0;
for (uint8_t i = 0; i < 7;i ++){
if(Gps_Data[i] == Test_T[i]) C_Ok ++;
}
if(C_Ok == 6) return true;
else return false;
}
bool DJ_Gps::Calc_Checksum(char* Gps_Data) {
// Calcul du Checksum de la Trame
uint8_t Checksum = 0;
uint8_t i = 1;
for (; Gps_Data[i] != '*'; i++) {
Checksum ^= Gps_Data[i];
}
Checks_Idx = i + 1;
if(Checksum == Extr_Checksum(Gps_Data)) return true;
else return false;
}
uint8_t DJ_Gps::Extr_Checksum(char* Gps_Data){ // Extraction du Checksum de la Trame
uint8_t Checks_PF = Gps_Data[Checks_Idx]; // Extraction Poids fort en Ascii Hexa
uint8_t Checks = Gps_Data[Checks_Idx + 1]; // Extraction Poids faible en Ascii Hexa
// Conversion Ascii HEX vers Decimal
if((Checks_PF <= 57)&&(Checks_PF >= 48)) Checks_PF = Checks_PF - 48; // 0 a 9 en Ascii
else if((Checks_PF <= 70)&&(Checks_PF >= 65)) Checks_PF = Checks_PF - 55; // A a F en Ascii
Checks_PF *= 16;
if((Checks <= 57)&&(Checks >= 48)) Checks = Checks - 48; // 0 a 9 en Ascii
else if((Checks <= 70)&&(Checks >= 65)) Checks = Checks - 55; // A a F en Ascii
Checks += Checks_PF;
return Checks;
}
float DJ_Gps::Extr_Vitesse(char* Gps_Data){ // Extraction Vitesse de la Trame
uint8_t i = 1,k = 0,Cmpt_idx = 0,B_Inf = 0,B_Sup = 0;
float Vit = 0.0;
char Ext_T[10];
for(uint8_t j = 0; j<= 9;j ++) Ext_T[j] = 0; // Rst Tableau extract Vitesse
for (; Gps_Data[i] != '*'; i++){
if((Gps_Data[i] == ',')&&(B_Inf != 0)) {B_Sup = i; break;} // Borne Superieure Data Vitesse
if((Gps_Data[i] == ',')&&(B_Inf == 0)){
Cmpt_idx ++;
if(Cmpt_idx == Pos_Vitesse) B_Inf = i; // Borne Inferieure Data Vitesse
}
}
if((B_Sup - B_Inf) > 1){ // Test si Recept. Vitesse non vide
for(uint8_t j = (B_Inf + 1); j <= B_Sup; j++) {
Ext_T[k] = Gps_Data[j]; // Extract Vitesse
k ++;
}
// Conversion Tableau Ascii en float
// Vit = atof(Ext_T);
uint16_t Ent = 0, Dec = 0;
uint8_t i = 0, Cmpt_B = 0;
for(i = 0; Ext_T[i] != '.'; i ++){ // Extract et convert. partie entiere
Ent *= 10;
if((Ext_T[i] <= 57)&&(Ext_T[i] >= 48)) Ent += (Ext_T[i] - 48); // 0 a 9 en Ascii => dec
}
for(i=i+1;(Ext_T[i] <= 57)&&(Ext_T[i] >= 48);i++){ // Extract et convert. partie decimale
Dec *= 10;
if((Ext_T[i] <= 57)&&(Ext_T[i] >= 48)){
Dec += (Ext_T[i] - 48); // 0 a 9 en Ascii => dec
Cmpt_B ++;
}
}
switch (Cmpt_B){
case 0 : {Vit = Ent;break;}
case 1 : {Vit = ((Ent * 10) + Dec) / 10.0; break;}
case 2 : {Vit = ((Ent * 100) + Dec) / 100.0; break;}
case 3 : {Vit = ((Ent * 1000) + Dec) / 1000.0; break;}
}
if(Dec < 1000){
Vit *= 1.852; // Vitesse neuds => Km/h
Vit_Ok = true;
}
else Vit_Ok = false;
}
else Vit_Ok = false;
return Vit;
}
// Extraction Date, Heure
void DJ_Gps::Extr_D_H(char* Gps_Data,bool _Date,uint8_t &_C1,uint8_t &_C2,uint8_t &_C3){
uint8_t i = 1,k = 0,Cmpt_idx = 0,B_Inf = 0,B_Sup = 0,Pos = 0;
char Ext_T[10];
if(_Date) Pos = (uint8_t)Pos_Date;
else Pos = (uint8_t)Pos_Heure;
for (; Gps_Data[i] != '*'; i++){
if((Gps_Data[i] == ',')&&(B_Inf != 0)) {B_Sup = i; break;} // Borne Superieure Data
if((Gps_Data[i] == ',')&&(B_Inf == 0)){
Cmpt_idx ++;
if(Cmpt_idx == Pos) B_Inf = i; // Borne Inferieure Data
}
}
if((B_Sup - B_Inf) > 6){
for(uint8_t j = (B_Inf + 1); j < B_Sup; j++) {
Ext_T[k] = Gps_Data[j];
k ++;
}
char Trsl[3];
Trsl[0] = Ext_T[0]; Trsl[1] = Ext_T[1]; // Conversion 1
_C1 = Trslt_Dble(Trsl);
Trsl[0] = Ext_T[2]; Trsl[1] = Ext_T[3]; // Conversion 2
_C2 = Trslt_Dble(Trsl);
Trsl[0] = Ext_T[4]; Trsl[1] = Ext_T[5]; // Conversion 3
_C3 = Trslt_Dble(Trsl);
}
else{
if(_Date) Serial.println(F("Date HS"));
else Serial.println(F("Heure HS"));
}
}
uint8_t DJ_Gps::Trslt_Dble(char* Trsl){ // Conversion 2 Caract Ascii en uint8_t
uint8_t Conv = 0;
if((Trsl[0] <= 57)&&(Trsl[0] >= 48)) Conv = Trsl[0] - 48; // 0 a 9 en Ascii => dec
Conv *= 10;
if((Trsl[1] <= 57)&&(Trsl[1] >= 48)) Conv += (Trsl[1] - 48);
return Conv;
}
"
Merci de votre attention
Denis