//_ESP8266_lolin_Jaune NodeMCU V3 #include #include #include #include //#include // version 2.23.15 installed #include #include #include #define VERSION "14-06-2025" #include //#include //#include #include #define option1 #include //#include // adresse I2C = 0x78 // voir nodemcu_esp8266_pinout.jpg //#define SCL 12 // D6 GPIO12 //#define SDA 14 // D5 GPIO14 // SD card test for esp8266 // SD card attached to SPI bus as follows: // CS GPIO 15 ...D8 // MOSI GPIO 13 ....D7 // SCK GPIO 14 ....D5 // MISO GPIO 12 ....D6 const int LedOnBoard = 2; //D4= GPIO2 bleue sur module #define BP1 4 // D2 =GPIO4 #define DHTTYPE DHT22 // DHT type (DHT11, DHT22) int DHTPIN = 5 ; // D1 =GPIO 5 <-- Broche du capteur AM2302 #define DIRECTORY "D:\\_ESP8266MOD_Lolin_2x15_Jaune\\_ESP8266_Lolin_Jaune_NTP_GPS_AM2302_SDCARD_2025-06" #define MODULE "ESP8266_Jaune_LOLIN_NodeMCU_V3" #define BOARD "Lolin VMOS D1 R1" #define SDCARD "Sandisk SD 2Gb " const char* ssid = "Freebox-5CF3C9"; const char* password = "mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; int i=0; int j=0; int k; unsigned long epoch = 0; int nujour = 0; //numero jour de la semaine avec 0 pour dimanche String jour = "mon jour"; // dimanche, lundi, etc. String heure = "mon heure .."; char buffer[80]; // Stockage de la date complete //float temperatureC ; //byte addr[8]; #define HIVER '1' #define ETE '0' const long gmtOffset_sec = 3600; const int daylightOffset_sec = 3600; int jd; int m1; int mn; int hh; int yy; int CH=HIVER; int Once=0; int Lecture_COM = 0; unsigned long lastTime = 0; unsigned long timerDelay = 4500; //4sec double lat ; double lng ; double alt ; int sat ; double dop; IPAddress local_IP(192, 168, 1, 11); IPAddress gateway(192, 168, 1, 254); IPAddress subnet(255, 255, 255, 0); IPAddress primaryDNS(212,27,40,241); //optional IPAddress secondaryDNS(212,27,40,240); //optional //Creation objet WIFI UDP WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 7200, 60000); // hiver //U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA, U8X8_PIN_NONE); // GPS en SoftwareSerial SoftwareSerial gpsSerial(0, 2); // RX, TX → GPS TX sur D3 = 18-GPIO0) TinyGPSPlus gps; char Tempchar [10]; char Humidchar[10]; float t = 0.0 ; // AM2302 temper float h = 0.0 ; // AM2302 Humid DHTesp dht; // AM2302 DHT12 String NomFichierLog="GPSN7001.log"; byte NumLogFile=1; File root; File myFile; File logFile; void printDirectory(File dir, int numTabs) { struct tm * tmstruct; while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // files have sizes, directories do not Serial.print("\t"); Serial.print(entry.size(), DEC); time_t cr = entry.getCreationTime(); time_t lw = entry.getLastWrite(); tmstruct = localtime(&cr); Serial.printf("\tCREATION: %d-%02d-%02d %02d:%02d:%02d", (tmstruct->tm_year)+1900 , (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); tmstruct = localtime(&lw); Serial.printf("\tLAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year)+1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); } Serial.print("\r\n"); entry.close(); } } // === Fonction callback pour la date/heure SD === void dateTime(uint16_t* date, uint16_t* time) { tmElements_t tm; breakTime(now(), tm); *date = FAT_DATE(tm.Year + 1970, tm.Month, tm.Day); *time = FAT_TIME(tm.Hour, tm.Minute, tm.Second); } // === Connexion au WiFi et synchro NTP === void setupTime() { configTime(gmtOffset_sec, daylightOffset_sec, "europe.ntp.org", "time.nist.gov"); Serial.print("Attente synchro NTP"); while (time(nullptr) < 100000) { delay(500); Serial.print("."); } Serial.println("\nSynchro OK"); time_t t = time(nullptr); struct tm* pTime = localtime(&t); setTime(pTime->tm_hour, pTime->tm_min, pTime->tm_sec, pTime->tm_mday, pTime->tm_mon + 1, pTime->tm_year + 1900); Serial.printf("Date/heure: %02d/%02d/%04d %02d:%02d:%02d\n", day(), month(), year(), hour(), minute(), second()); } void Affiche_Date_Heure_NTP_VO() { // Recup heure puis affichage timeClient.update(); epoch = timeClient.getEpochTime(); // Heure Unix nujour = timeClient.getDay(); // jour de la semaine heure = timeClient.getFormattedTime(); // heure // Calcul de la date en convertissant le temps UNIX epoch time_t timestamp = epoch; struct tm * pTime = localtime( & timestamp ); switch (nujour) { // on determine le jour case 0: jour = "dimanche"; break; case 1: jour = "lundi"; break; case 2: jour = "mardi"; break; case 3: jour = "mercredi"; break; case 4: jour = "jeudi"; break; case 5: jour = "vendredi"; break; case 6: jour = "samedi"; break; } // Envoi des donnees recuperees sur la liaison serie if (j%60==0) { Serial.print("\r\nTU : "); //Temps UNIX Serial.print(epoch); Serial.print(","); } Serial.print(jour); Serial.print(",buffer="); strftime( buffer,80, "%d/%m/%Y", pTime ); Serial.print(buffer); Serial.print(" "); Serial.print(timeClient.getFormattedTime()); Serial.print(","); if( Once==0) { jd=(buffer[0]-48) *10 ; jd=jd+(buffer[1]-48); m1=(buffer[3]-48) *10; m1= m1+(buffer[4]-48); yy=(buffer[6]-48) *1000; yy=yy+ (buffer[7]-48)*100; yy=yy+ (buffer[8]-48)*10; yy=yy+ (buffer[9]-48); hh=(heure[0]-48)*10; hh= hh+ (heure[1]-48); mn=(heure[3]-48)*10; mn= mn+ (heure[4]-48); Serial.println(" "); Serial.print("Annee="); Serial.print(yy,DEC);Serial.println(" "); Serial.print("mois="); Serial.print(m1,DEC);Serial.println(" "); Serial.print("jour="); Serial.print(jd,DEC);Serial.println(" "); Serial.print("heure=");Serial.print(hh,DEC);Serial.println(" "); Serial.print("minute="); Serial.print(mn,DEC);Serial.println(" "); Serial.println(" "); Once=1; } } void Affiche_Date_Heure_NTP() { // Recup heure puis affichage timeClient.update(); epoch = timeClient.getEpochTime(); // Heure Unix nujour = timeClient.getDay(); // jour de la semaine heure = timeClient.getFormattedTime(); // heure // Calcul de la date en convertissant le temps UNIX epoch time_t timestamp = epoch; struct tm * pTime = localtime( & timestamp ); //strftime( buffer,80, " %d/%m/%Y ", pTime ); switch (nujour) { // on determine le jour case 0: jour = "dimanche"; break; case 1: jour = "lundi"; break; case 2: jour = "mardi"; break; case 3: jour = "mercredi"; break; case 4: jour = "jeudi"; break; case 5: jour = "vendredi"; break; case 6: jour = "samedi"; break; } // Envoi des donnees recuperees sur la liaison serie if (j%60==0) { Serial.print("\r\nTU : "); //Temps UNIX Serial.print(epoch); Serial.print(","); } Serial.print(jour); Serial.print(",buffer="); strftime( buffer,80, "%d/%m/%Y", pTime ); Serial.print(buffer); Serial.print(" "); Serial.print( timeClient.getFormattedTime()); Serial.println(" "); } void setup() { // Open serial communications and wait for port to open: Serial.begin(115200); delay(500); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println(); delay(1000); Serial.println(); Serial.println(); Serial.print(" Directory : "); Serial.println(DIRECTORY); Serial.print(" MODULE : "); Serial.println(MODULE); Serial.print(" BOARD : "); Serial.println(BOARD); Serial.println(F(" ESP8266 Lolin Jaune 2x15pins\r\n")); Serial.print(" _ESP8266_Lolin_Jaune_NTP_GPS_AM2302_SDCARD_2025-06.ino "); Serial.println(VERSION); Serial.println(" NTP Server: europe.pool.ntp.org"); Serial.print("\r\n ESP getCoreVersion : "); Serial.println(ESP.getCoreVersion()); Serial.print(" ESP getSdkVersion : "); Serial.println(ESP.getSdkVersion() ); Serial.println(" SPI bus GPIO pour SD card :"); Serial.println(" CS GPIO 15 ... D8"); Serial.println(" MOSI GPIO 13 ... D7"); Serial.println(" SCK GPIO 14 ... D5"); Serial.println(" MISO GPIO 12 ... D6"); pinMode(BP1,INPUT_PULLUP); Serial.println(" BP1 input 4 ... D2"); Serial.println(" AM2302 5 ... D1"); Serial.println(" R = read GPS logFile, K= Kill logFile, Q= Quitter + ou - numero fichier H= Help\r\n"); Serial.print( "NomFichierLog ..par defaut :"); Serial.println(NomFichierLog); Serial.println(" "); dht.setup(DHTPIN,DHTesp::DHT22); delay(1000); t = dht.getTemperature(); if (isnan(t)) snprintf(Tempchar,6,"%s\t"," ???"); else snprintf(Tempchar,6,"%3.2f\t",t); //------------------- h=dht.getHumidity(); if (isnan(h)) snprintf(Humidchar,6,"%s\t"," ???"); else snprintf(Humidchar,6,"%2.2f\t",h); Serial.print(F(" DHT11 Temp : ")); Serial.print(Tempchar); Serial.print(F(" Humid : ")); Serial.println(Humidchar); Serial.println(" "); Serial.println(" Attente connection STAtion Wifi\r\n"); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } Serial.println ( "." ); // Demarrage client NTP Serial.println("Synchro NTP & Setup Time"); setupTime(); Serial.println(" "); j=0; Affiche_Date_Heure_NTP(); #ifdef option1 Serial.println(" Option 1"); #else Serial.println(" Option 2"); #endif Serial.println("Initializing GPS "); gpsSerial.begin(9600); Serial.println("Initializing SD card..."); delay(2000); // we'll use the initialization code from the utility libraries // since we're just testing if the card is working! if (!SD.begin(15)) // SS= Selec Scard=D8 { Serial.println("PB init SDCARD ,verifier:"); Serial.println("* carte SD inseree ?"); Serial.println("* cablage SPI correct?"); Serial.println("* SS chipSelect pin OK ?"); while (1); } else { Serial.println("Connections SPI OK et carte SD Presente."); } Serial.println(); // print the type of card Serial.println(); Serial.print("Card type: "); switch (SD.type()) { case 0: Serial.println("SD1"); break; case 1: Serial.println("SD2"); break; case 2: Serial.println("SDHC"); break; default: Serial.println("Unknown"); } Serial.print("Cluster size: "); Serial.println(SD.clusterSize()); Serial.print("Blocks x Cluster: "); Serial.println(SD.blocksPerCluster()); Serial.print("Blocks size: "); Serial.println(SD.blockSize()); Serial.print("Total Blocks: "); Serial.println(SD.totalBlocks()); Serial.println(); Serial.print("Total Cluster: "); Serial.println(SD.totalClusters()); Serial.println(); // print the type and size of the first FAT-type volume uint32_t volumesize; Serial.print("Volume type is: FAT"); Serial.println(SD.fatType(), DEC); volumesize = SD.totalClusters(); volumesize= volumesize * SD.clusterSize(); volumesize = volumesize / 1000; Serial.print("Volume size (Kb): "); Serial.println(volumesize); Serial.print("Volume size (Mb): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("Volume size (Gb): "); Serial.println((float)volumesize / 1024.0); Serial.print("Card size: "); Serial.print((float)SD.size()/1000000); Serial.println(" Mb"); Serial.println(" Synchro Time SDCARD \r\n"); SD.dateTimeCallback(dateTime); FSInfo fs_info; SDFS.info(fs_info); Serial.print("Total bytes: "); Serial.println(fs_info.totalBytes); Serial.print("Used bytes: "); Serial.println(fs_info.usedBytes); File dir = SD.open("/"); printDirectory(dir, 0); // ------------------------------------------- // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. // pour le 1er test seulement /*myFile.close(); myFile = SD.open("test2025.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test2025.txt"); } */ logFile = SD.open(NomFichierLog, FILE_WRITE); logFile.close(); Serial.println("\r\n"); } // fin du Setup //--------------------------------------------------- void loop(void) { j++; if (j ==500) { t = dht.getTemperature(); if (isnan(t)) snprintf(Tempchar,6,"%s\t"," ???"); else snprintf(Tempchar,6,"%3.2f\t",t); //------------------- h=dht.getHumidity(); if (isnan(h)) snprintf(Humidchar,6,"%s\t"," ???"); else snprintf(Humidchar,6,"%2.2f\t",h); Serial.print(F(" DHT11 Temp : ")); Serial.print(Tempchar); Serial.print(F(", Humid : ")); Serial.print(Humidchar); if (digitalRead(BP1)==HIGH) Serial.println(",BP1 ON"); else Serial.println(",BP1 OFF"); } //Affiche_Date_Heure_NTP(); while (gpsSerial.available()) { gps.encode(gpsSerial.read()); } if (gps.location.isUpdated()) { #ifdef option1 // Affiche_Date_Heure_NTP(); // Serial.print("GPS TU : " + String(gps.time.hour()) + ":" + String(gps.time.minute())+":"+ String(gps.time.second())+","); // Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" // + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) // + ":" + String(gps.time.second())); Serial.printf("%02d:%02d:%02d,", hour(), minute(), second()); lat = gps.location.lat(); lng = gps.location.lng(); alt = gps.altitude.meters(); dop= gps.hdop.value() / 100.0; sat = gps.satellites.value(); //Serial.print("\r\nTU : "); //Temps UNIX // Serial.print(epoch); Serial.print("LAT: "); Serial.print(gps.location.lat(), 6); Serial.print(",LON: "); Serial.print(gps.location.lng(), 6); // Serial.print("SPEED (km/h) = "); // Serial.println(gps.speed.kmph()); Serial.print(",ALT :"); Serial.print(gps.altitude.meters()); Serial.print(",DOP: "); Serial.print(gps.hdop.value() / 100.0); Serial.print(",SAT: "); Serial.print(gps.satellites.value()); Serial.print(",Tmp:"); Serial.print(t); Serial.print(",Hum:"); Serial.print(h); // Serial.print("Time in UTC: "); // Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" // + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) // + ":" + String(gps.time.second())); if (digitalRead(BP1)==HIGH ) { Serial.println(" *"); // Écriture SD logFile.close(); //logFile = SD.open("GPS/GPSN7001.log", FILE_WRITE); logFile = SD.open(NomFichierLog, FILE_WRITE); //if (!SD.begin(15)) if (logFile) { logFile.printf("%02d:%02d:%02d, %5d,Lat: %.6f,Lng: %.6f,Alt: %.1f m,Dop: %.2f,Sat: %d,Tmp: %.2f,Hum: %.2f\r\n", hour(), minute(), second(), lat, lng, alt, dop, sat, t,h); logFile.close(); } } else Serial.println(""); #endif #ifdef option2 Serial.print("LAT: "); Serial.println(gps.location.lat(), 6); Serial.print(",LON: "); Serial.println(gps.location.lng(), 6); // Serial.print("SPEED (km/h) = "); // Serial.println(gps.speed.kmph()); Serial.print(",ALT :"); Serial.println(gps.altitude.meters()); Serial.print(",DOP: "); Serial.println(gps.hdop.value() / 100.0); Serial.print(",SAT: "); Serial.println(gps.satellites.value()); // Serial.print("Time in UTC: "); // Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" // + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) // + ":" + String(gps.time.second())); Serial.println(""); #endif } else { if (j ==512) { // j=0; Serial.printf("\r\n"); Affiche_Date_Heure_NTP(); Serial.print("\r\n"); } } // dialogue possible avec operateur Lecture_COM=0; if (Serial.available() > 0) { // si données disponibles sur le port série // lit l'octet entrant Lecture_COM = Serial.read(); if (Lecture_COM=='R') { // re-open the file for reading: //logFile = SD.open("GPS/GPSN7001.log"); logFile = SD.open(NomFichierLog); if (logFile) { Serial.print("Read "); Serial.println(NomFichierLog); //Serial.println("Read GPS/GPSN7001.log :"); // read from the file until there's nothing else in it: while (logFile.available()) { Serial.write(logFile.read()); delay(1); } Serial.println(" "); // close the file: logFile.close(); } } if (Lecture_COM=='Q') { logFile.close(); Serial.println("Fin .. reset to restart"); do {delay(1000); Serial.print("."); }while(1); } if (Lecture_COM=='K') { logFile.close(); Serial.println("Kill logFile"); // SD.remove("GPS/GPSN7001.log"); SD.remove(NomFichierLog); delay(2000); } if (Lecture_COM=='+') { logFile.close(); NumLogFile++; NomFichierLog[7]=NumLogFile+48; Serial.println(" New log file : "); Serial.println(NomFichierLog); logFile = SD.open(NomFichierLog, FILE_WRITE); Lecture_COM=0; delay(2000); } if (Lecture_COM=='-') { logFile.close(); if (NumLogFile>1) NumLogFile--;; NomFichierLog[7]=NumLogFile+48; Serial.println(" New log file : "); Serial.println(NomFichierLog); logFile = SD.open(NomFichierLog, FILE_WRITE); Lecture_COM=0; delay(2000); } if (Lecture_COM=='H') { Serial.println("Help :"); Serial.println(" R Read GPS/GPSN7001.log file"); Serial.println(" K kill the file GPSN7001.log"); Serial.println(" Q Quit "); Serial.println(" + Incremente numero log file "); Serial.println(" - Decremente (si>1) numero log file "); delay(2000); } } delay(100); } /* Directory : D:\_ESP8266MOD_Lolin_2x15_Jaune\_ESP8266_Lolin_Jaune_NTP_GPS_AM2302_SDCARD_2025-06 MODULE : ESP8266_Jaune_LOLIN_NodeMCU_V3 BOARD : Lolin VMOS D1 R1 ESP8266 Lolin Jaune 2x15pins _ESP8266_Lolin_Jaune_NTP_GPS_AM2302_SDCARD_2025-06.ino 14-06-2025 NTP Server: europe.pool.ntp.org ESP getCoreVersion : 3.1.2 ESP getSdkVersion : 2.2.2-dev(38a443e) SPI bus GPIO pour SD card : CS GPIO 15 ... D8 MOSI GPIO 13 ... D7 SCK GPIO 14 ... D5 MISO GPIO 12 ... D6 BP1 input 4 ... D2 AM2302 5 ... D1 R = read GPS logFile, K= Kill logFile, Q= Quitter + ou - numero fichier H= Help NomFichierLog ..par defaut :GPSN7001.log DHT11 Temp : 28.80 Humid : 57.60 Attente connection STAtion Wifi ............ Synchro NTP & Setup Time Attente synchro NTP.Synchro OK Date/heure: 14/06/2025 17:36:35 TU : 1749922595,samedi,buffer=14/06/2025 17:36:35 Option 1 Initializing GPS Initializing SD card... Connections SPI OK et carte SD Presente. Card type: SDHC Cluster size: 32768 Blocks x Cluster: 64 Blocks size: 512 Total Blocks: 942 Total Cluster: 60342 Volume type is: FAT16 Volume size (Kb): 1977286 Volume size (Mb): 1930 Volume size (Gb): 1.88 Card size: 1977.29 Mb Synchro Time SDCARD Total bytes: 1977286656 Used bytes: 229376 System Volume Information/ IndexerVolumeGuid 76 CREATION: 2025-06-12 10:56:38 LAST WRITE: 2025-06-12 10:56:40 WPSettings.dat 12 CREATION: 2025-06-12 18:46:46 LAST WRITE: 2025-06-12 18:46:48 test2025.txt 1224 CREATION: 2098-01-01 00:00:22 LAST WRITE: 2025-06-14 14:35:52 GPSN7001.log 0 CREATION: 2025-06-14 17:34:48 LAST WRITE: 1979-11-30 00:00:00 SDcard2G.txt 59 CREATION: 2025-06-12 10:58:32 LAST WRITE: 2025-06-12 10:58:34 GPSN7002.log 625 CREATION: 2025-06-14 15:24:44 LAST WRITE: 2025-06-14 15:37:52 GPSN7003.log 270 CREATION: 2025-06-14 15:37:08 LAST WRITE: 2025-06-14 15:37:36 17:36:41,LAT: 45.824429,LON: 5.197135,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:36:42,LAT: 45.824431,LON: 5.197135,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:36:43,LAT: 45.824431,LON: 5.197131,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:36:44,LAT: 45.824431,LON: 5.197128,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:36:45,LAT: 45.824432,LON: 5.197135,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:36:49,LAT: 45.824431,LON: 5.197129,ALT :0.00,DOP: 0.00,SAT: 0,Tmp:28.80,Hum:57.60 17:28:37,LAT: 45.824591,LON: 5.197015,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:41,LAT: 45.824566,LON: 5.197031,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:42,LAT: 45.824559,LON: 5.197030,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:46,LAT: 45.824543,LON: 5.197038,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:47,LAT: 45.824539,LON: 5.197040,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:50,LAT: 45.824528,LON: 5.197045,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:51,LAT: 45.824526,LON: 5.197042,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:55,LAT: 45.824497,LON: 5.197015,ALT :205.60,DOP: 1.03,SAT: 8 * 17:28:56,LAT: 45.824480,LON: 5.197017,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:00,LAT: 45.824484,LON: 5.197017,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:01,LAT: 45.824481,LON: 5.197020,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:04,LAT: 45.824479,LON: 5.197026,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:05,LAT: 45.824482,LON: 5.197025,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:09,LAT: 45.824495,LON: 5.197010,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:10,LAT: 45.824492,LON: 5.197010,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:13,LAT: 45.824492,LON: 5.197011,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:14,LAT: 45.824496,LON: 5.197011,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:15,LAT: 45.824501,LON: 5.197009,ALT :205.60,DOP: 1.03,SAT: 8 * 17:29:17,LAT: 45.824503,LON: 5.197013,ALT :205.60,DOP: 1.03,SAT: 8 * */