GPS et ESP32
Dans ce projet, l’objectif est de déterminer la vitesse maximale d’un avion.
Pour cela, une ESP32 équipée d’un écran ainsi qu’un module GPS sont nécessaires.
matériel nécessaire :
- Lolin ESP32 OLED
- NEO-6M module GPS
- un fer à souder
câblage :
L’alimentation de l’ESP32 se fera via la borne 5V et GND par une lipo 1S.
Le module GPS prendra son alimentation sur la borne 3.3V et gnd de l’ESP32
La borne TX du GPS sera reliée à la borne 16 de l’ESP32
Un programme se charge de relever les positions GPS du module pour alors en déterminer la vitesse et afficher d’autres informations.
-> le code complet ….
#include <TinyGPS++.h>
#include <HardwareSerial.h> // sollte bereits mit Arduino IDE installiert sein
#include <Wire.h>
#include "SSD1306Wire.h"
TinyGPSPlus gps;
SSD1306Wire display(0x3c, 5, 4);
HardwareSerial SerialGPS(1);
char data;
double latitude;
double longitude;
double alt=0;
double vitesse;
unsigned long nbre_sat;
double alt_Max;
double v_Max;
double dist;
double dist_Total;
double lat_an;//latitude de la precedente mesure
double long_an;// longitude de la precedente mesure
int i=0;
#define TASK_SERIAL_RATE 1000 // ms
uint32_t nextSerialTaskTs = 0;
uint32_t nextOledTaskTs = 0;
void setup() {
Serial.begin(115200);
SerialGPS.begin(9600, SERIAL_8N1, 16, 17); //TX GPS borne 16 ESP
display.init();
display.setContrast(255);
}
void loop() {
if (alt ==0){ // permet d'afficher un message tant que le GPS ne communique pas car alt restera a zero
display.setLogBuffer(5, 30);//5,30
display.clear();
display.println( "initialisation GPS...");
display.print ("SAT : ");display.println (gps.satellites.value());
display.drawLogBuffer(0, 0);
// Display it on the screen
display.display();
}
while (SerialGPS.available()) {
data = SerialGPS.read();
//Serial.println (data);
gps.encode(data);
if (gps.location.isUpdated())
{
if(gps.satellites.value() > 4){ //attendre 4 satellites pour commencer les mesures
lat_an = latitude;
long_an = longitude;
latitude = gps.location.lat();
longitude = gps.location.lng();
alt = gps.altitude.meters();
vitesse = gps.speed.kmph();
nbre_sat = gps.satellites.value();
if (alt > alt_Max) {
alt_Max = alt;
}
if (vitesse < 5) {// ne prend pas en compte les vitesse inferieur a 5
v_Max = v_Max;
}
else if (vitesse > v_Max) {
v_Max = vitesse;
}
dist = TinyGPSPlus::distanceBetween(latitude, longitude, lat_an, long_an);
if (dist>9999){// ne pas prendre en compte les distance trop importante liés a l’initialisation du GPS
dist=0;
}
if (dist > 1) {// ne pas prendre en compte les déplacement de moins de 1m liés au manque de précision
dist_Total = dist_Total + dist;
}
Serial.println("-------------");
Serial.print("LATITUDE="); Serial.println(latitude);
Serial.print("LONGITUDE="); Serial.println(longitude);
Serial.print("ALTITUDE (m) ="); Serial.println(alt);
Serial.print("VITESSE (km/h)="); Serial.println(vitesse);
Serial.print("NOMBRE SATTELLITES="); Serial.println(nbre_sat);
Serial.print("ALT_MAX"); Serial.println(alt_Max);
Serial.print("V_MAX"); Serial.println(v_Max);
Serial.print("DIST"); Serial.println(dist);
Serial.print("DIST_TOTAL"); Serial.println(dist_Total);
}
display.setLogBuffer(5, 30);//5,30
display.clear();
display.print ("SAT : ");display.print (gps.satellites.value());display.print(" ");display.print("ALT : ");display.println(alt);
display.print ("ALT MAX : ");display.println (alt_Max);
display.print ("V MAX : ");display.print (v_Max);display.print(" ");display.print("V : ");display.println(vitesse);
display.print ("DST : ");display.println(dist_Total);
display.drawLogBuffer(0, 0);
// Display it on the screen
display.display();
}
}
}



L’imites du système :
L’initialisation est parfois longue, voire impossible en intérieur.
La vitesse n’est pas mesurée en piqué mais uniquement en vol horizontal (distance et temps entre 2 points GPS).
Maintenant on sait qu’un EFX va à 220 km/h !!