Arduino Mega GPS med LCD och SD loggning (5 / 9 steg)
Steg 5: Använda SD-kort i gps2.ino
Ställa in sd-kortet:
Standard chip Välj stift och den faktiska chipSelect PIN-kod måste anges till utgång.
SD-kortet är tillgängligt med ett begin uttalande som innehåller stiften används av kortet på gps ombord.
Kort hastigheten ligger på SPI_Full_SPEED.
Vid eventuella fel ut led blinkar en signal-felinformation i skiss-huvudet.
Om debug anges till true i config, Serial monitor meddelanden skickas också.
Om kortet initialises ok den variabla hascard är satt till true.
.
se till att den standard chip välja stiftet är inställd
utgång, även om du inte använder det:
pinMode(SS,OUTPUT); standard mega Välj pin
pinMode(chipSelect,OUTPUT);
digitalWrite(chipSelect,LOW);
se om kortet är närvarande och kan initieras:
IF (!. SD.begin(chipSelect, 11, 12, 13)) {
IF(debug) Serial.println (F ("kort init. misslyckades!"));
error(1);
} annat {
om (! card.init (SPI_FULL_SPEED, chipSelect, 11, 12, 13)) {
error(2);
IF(debug) {
Serial.println (F ("initieringen misslyckades. Saker att kontrollera: "));
Serial.println (F ("* är ett kort sätts?"));
Serial.println (F ("* stämmer ditt ledningar?"));
Serial.println (F ("* har du ändrat chipSelect PIN-koden för att matcha din sköld eller modul?"));
}
} annat {
hascard = sant;
IF(debug) Serial.println (F ("kort init. lyckades"));
}
}
Att välja filen SD för loggning:
När högra knappen trycks subrutin openfile kallas.
Detta inspekterar gps mappen letar du efter en oanvänd filnamn i ordning GPSLOGnn.TXT, där nn = 0 till 99.
Om en fil finns, ange foundit till true.
om (! hascard) {return;} / / Fortsätt inte om ett kort finns inte eller finns un-
byte i.
char filnamn [18].
strcpy (filnamn, "/ gps/GPSLOG00. TXT");
filnamn [17] = char(0);
booleska foundit = false;
för (jag = 0; jag < 100; i ++) {
filnamn [11] = '0' + i / 10;
filnamn [12] = '0' + i % 10.
IF (!. SD.exists(filename)) {
foundit = sant; bryta;
}
}
Om alla filnamnen är i bruk, foundit kommer att vara falsk och användaren tillfrågas om de första 50 skall raderas. Om detta inte är ok, är hascard inställd på false så att det kan finnas några ytterligare försök att loggning.
om (! foundit) {
int thisbutton = -1;
LCD.Clear();
LCD.Print ("Dir radera?");
lcd.setCursor(0,1);
LCD.Print ("Sel:Ok rätt: ingen");
göra {
thisbutton = read_LCD_buttons();
} while(thisbutton == btnNONE);
LCD.Clear();
om (thisbutton == btnSELECT) {
LCD.Print("deleting");
för (jag = 0; jag < 50; i ++) {
filnamn [11] = '0' + i / 10;
filnamn [12] = '0' + i % 10.
om (SD.exists(filename)) SD.remove(filename);
}
Jag = 0;
filnamn [11] = '0' + i / 10;
filnamn [12] = '0' + i % 10.
} annat {
error(4);
hascard = false;
hemkomst.
}
}
Filen kan öppnas:
Vid ett fel seriella information matas ut och fel kod signalerat via status ledde.
Om det lyckas, är den första raden i filen. Detta är kolumnrubrikerna.
Observera användningen av logfile.flush(). Detta säkerställer att alla utdata skickas till SD-filen innan du fortsätter.
Logfile = SD.open (filnamn, FILE_WRITE);
om (! loggfil) {
IF(debug) {
Serial.Print kunde inte ("skapa");
Serial.println(filename);
}
error(3);
hascard = false;
} annat {
Logga = sant;
MinFil = filnamn.
logfile.println (pad ("Time", 13) + lpad ("datum", 9) + lpad("Longitude",10)
+ lpad("Latitude",10) + lpad("Altitude",9) + "m" + lpad("Geoid",9) + "m" + lpad("Speed",7) + "mph uthärda");
logfile.flush();
IF(debug) {Serial.print ("skriftligen till"); Serial.println(filename);}
}
.
lpad och pad är text stoppning funktioner:
.
Sträng lpad (String temp, byte L) {
byte mylen = temp.length();
om (Charlotta > (L - 1)) återvända temp.substring(0,L-1);
för (byte jag = 0; jag < (L-Charlotta); i ++) temp = "" + temp;
returnera härda;
}
.
Sträng pad (sträng temp, byte L) {
byte mylen = temp.length();
om (Charlotta > (L - 1)) tillbaka
Temp.substring(0,L-1);
för (byte jag = 0; jag < (L-Charlotta); i ++) temp = temp + "";
returnera härda;
}
.
Skrivning till filen:
Huvudloop läser gps och utgångar värdena till en fil om loggning sker. (Ett "L" visas i det nedre högra hörnet av LCD-skärmen.)
.
Värdena är formaterade för att producera fast bredd kolumner.
.
Funktionen dtostrf(float,w,dp,buf) är en Arduino bibliotek funktion som tar en float variabel och omvandlar den till en textsträng, bredd w med dp decimalpunkter. BUF är en char buffert som måste vara tillräckligt stor för att hantera omvandlingen.
Jag definierade buf med "char buf [20]." i rubriken skiss.
Filen är spolas innan du fortsätter.
.
ogfile.Print(pad(mytime,13)); inkluderar milli sekunder
logfile.Print(pad(myyear,9));
logfile.Print(dtostrf(Longitude,10,5,BUF));
logfile.Print(dtostrf(Latitude,10,5,BUF));
logfile.Print(dtostrf(altitudem,9,1,BUF)), logfile.print ("m").
logfile.Print(dtostrf(GeoID,9,1,BUF)); logfile.Print ("m").
logfile.Print(dtostrf(speedmph,7,2,BUF)); logfile.Print ("mph");
logfile.Print(dtostrf(heading,6,1,BUF)); logfile.println ("deg");
logfile.flush();
.
Stängning av filen:
Om kortet inte är tillgänglig avkastning, annars spola alla återstående utdata till kortet innan du stänger filen.
void closefile() {
om (! hascard) återvända;
logfile.flush();
logfile.Close();
Logga = false;
IF(debug) Serial.println ("Fil" + minfil + "stängd");
}