#include #include #include // Libreria per la creazione di un seriale sulla porta 9600 via software. Sintassi: SoftwareSerial mySerial(TXpin, RXpin); #include SoftwareSerial mySerial(3,2); // Dichiarazione oggetto GPS con invio dei dati al seriale mySerial. Adafruit_GPS GPS(&mySerial); // Variabili per le frasi NMEA String NMEA1; String NMEA2; // Variabili per la lettura dei caratteri nelle frasi NMEA char c; // per legere i caratteri delle stringhe float deg; // per leggere i gradi dalle stringhe float degWhole; // per leggere la parte intera dei gradi float degDec; // per leggere la parte decimale dei gradi // Dichiarazione del pin SS della scheda SD. // N.B. Controllare con precisione quale sia la comunicazione SS della propria scheda SD // Le logging shield hanno il pin SS su D10, di solito // int chipSelect = 4; int chipSelect = 10; // Dichiarazione della variabile di tipo File, la useremo dopo per scrivere i log File mySensorData; void setup() { // Apre comunicazione seriale su 115200. La porta 9600 è occupata dal GPS! Serial.begin(115200); // Inizializzazione del GPd sulla porta 9600 GPS.begin(9600); // Spegne gli update sulla antenna GPS.sendCommand("$PGCMD,33,0*6D"); // Richiede solo le frasi GPGGA e GPRMC delle frasi NMEA. Dubbi? controlla i dati GPS per utilizzare correttamente le frasi NMEA GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Imposta la frequenza di update su 1HZ, consigliato dalla fabbrica GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); delay(1000); // Se la scheda SD non ha SS su D10, va dichiarato uscita anche se non viene usato // pinMode(10, OUTPUT); // Inizializza la scheda SD sul pin selezionato in precedenza (SS) SD.begin(chipSelect); readGPS(); // Controllo se i file sono già presenti sulla scheda, se si, lo cancello per avere dati nuovi. // Da sistemare, piuttosto aggiungere una stringa con un time-stamp! if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mySensorData.println("<----------------------- Nuova sessione ----------------------->"); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.month); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.hour); mySensorData.print(":"); mySensorData.print(GPS.minute); mySensorData.print(":"); mySensorData.print(GPS.seconds); mySensorData.println(" ***"); mySensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mySensorData.println(""); mySensorData.println("<----------------------- Nuova sessione ----------------------->"); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.month); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.hour); mySensorData.print(":"); mySensorData.print(GPS.minute); mySensorData.print(":"); mySensorData.print(GPS.seconds); mySensorData.println(" ***"); mySensorData.close(); } } void loop() { readGPS(); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. //if(GPS.fix==1) { //Only save data if we have a fix mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Apre il file per le frasi NMEA grezze mySensorData.println(NMEA1); //Scrive prima NMEA sul file mySensorData.println(NMEA2); //Scrive seconda NMEA sul file mySensorData.close(); //Chiude file!! mySensorData = SD.open("GPSData.txt", FILE_WRITE); // Converte e scrive la longitudine convLong(); mySensorData.print(deg,4); // Scrive le coordinate in gradi sul file mySensorData.print(","); // Scrive una virgola per separare i dati Serial.print(deg); Serial.print(","); // Converte e scrive la latitudine convLati(); mySensorData.print(deg,4); // Scrive le coordinate in gradi sul file mySensorData.print(","); // Scrive una virgola per separare i dati Serial.print(deg); Serial.print(","); // Scrive l'altitudine mySensorData.print(GPS.altitude); mySensorData.print(" "); Serial.println(GPS.altitude); mySensorData.close(); //} } void readGPS() { clearGPS(); // Resta in loop finché non c'è una nuova frase NMEA while(!GPS.newNMEAreceived()) { // Quando la frase c'è, viene immagazzinata nella variabile c. c=GPS.read(); } // Codifica l'ultima frase NMEA e la passa alla variabile NMEA1 GPS.parse(GPS.lastNMEA()); NMEA1=GPS.lastNMEA(); // Ripete per frase 2 while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.lastNMEA(); // Scrive le frasi salvate nelle variabili Serial.println(NMEA1); Serial.println(NMEA2); // Serial.println(""); } // Simile alla funzione readGPS(), questa funzione legge le prime tre frasi NMEA e le ignora, in modo che le frasi lette siano sicuramente corrette void clearGPS() { while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); } void convLong(){ // Richiama solo la longitudine, la divide per 100 per spostare l'ordine di grandezza ai gradi, ne crea un numero intero e lo riconverte in float per le operazioni successive degWhole=float(int(GPS.longitude / 100)); // Richiama la latitudine e sottrae i gradi moltiplicati per 100 per farli toranare allo stesso O.d.G., ottenendo così i minuti. // Dinivi i minuti per 60 per convertirli in gradi degDec=(GPS.longitude - degWhole * 100 ) / 60; // Somma la i gradi e i minuti convertiti in gradi per ottenere solo gradi, i dati che ci servono per fare un file .kml deg = degWhole + degDec; // Cambia il segno dei gradi a seconda dell'emisfero in cui si trova. if(GPS.lon=='W'){ deg = (-1) * deg; } } void convLati(){ // Richiama solo la longitudine, la divide per 100 per spostare l'ordine di grandezza ai gradi, ne crea un numero intero e lo riconverte in float per le operazioni successive degWhole=float(int(GPS.latitude / 100)); // Richiama la latitudine e sottrae i gradi moltiplicati per 100 per farli toranare allo stesso O.d.G., ottenendo così i minuti. // Dinivi i minuti per 60 per convertirli in gradi degDec=(GPS.latitude - degWhole * 100 ) / 60; // Somma la i gradi e i minuti convertiti in gradi per ottenere solo gradi, i dati che ci servono per fare un file .kml deg = degWhole + degDec; // Cambia il segno dei gradi a seconda dell'emisfero in cui si trova. if(GPS.lat=='S'){ deg = (-1) * deg; } }