Stap 5: Met behulp van de SD-kaart in gps2.ino
Het opzetten van de sd-kaart:
De standaard chip select pin en de werkelijke chipSelect pin moeten worden ingesteld om uit te voeren.
De SD-kaart is toegankelijk met een begin-instructie waarin de pinnen gebruikt door de kaart op het bord van de gps.
De kaart-snelheid is ingesteld op SPI_Full_SPEED.
In het geval van een fout die de led knippert een fout signaal-details in de kop van de schets.
Als foutopsporing is ingesteld op true in config, seriële monitor berichten worden ook verzonden.
Als de kaart vooruitgangsbalk ok de variabele hascard ingesteld op true.
.
Zorg ervoor dat de standaard chip select pin is ingesteld op
uitgang, zelfs als u niet gebruiken:
pinMode(SS,OUTPUT); standaard mega Selecteer pin
pinMode(chipSelect,OUTPUT);
digitalWrite(chipSelect,LOW);
Zie als de kaart aanwezig is en kan worden geïnitialiseerd:
if (!. SD.begin(chipSelect, 11, 12, 13)) {}
if(debug) Serial.println (F ("Card init. mislukt!"));
error(1);
} else {}
Als (! card.init (SPI_FULL_SPEED, chipSelect, 11, 12, 13)) {}
error(2);
if(debug) {}
Serial.println (F ("initialisatie is mislukt. Dingen te controleren: "));
Serial.println (F ("* is een kaart wordt ingevoegd?"));
Serial.println (F ("* klopt uw bedrading?"));
Serial.println (F ("* heb je de pincode van de chipSelect zodat deze overeenkomen met uw schild of module veranderen?"));
}
} else {}
hascard = true;
if(debug) Serial.println (F ("Card init. geslaagd"));
}
}
De SD-bestand te selecteren voor aanmelding:
Wanneer de openfile subroutine rechtse knop is ingedrukt wordt aangeroepen.
Dit inspecteert de map van de gps op zoek naar een ongebruikt bestandsnaam in de reeks GPSLOGnn.TXT, waarbij nn = 0 tot en met 99.
Als een bestand wordt gevonden, stelt u foundit in op true.
Als (! hascard) {terugkeer;} / / ga niet verder als een kaart niet bestaat of niet beschikbaar is
byte i;
char bestandsnaam [18];
strcpy (filename, "/ gps/GPSLOG00. TXT");
bestandsnaam [17] = char(0);
Boole foundit = false;
voor (ik = 0; ik < 100; i ++) {}
bestandsnaam [11] = '0' + i / 10;
bestandsnaam [12] = '0' + i % 10;
if (!. SD.exists(filename)) {}
foundit = true; breken;
}
}
Als alle van de bestandsnamen in gebruik zijn, foundit zullen valse en wordt de gebruiker gevraagd als de eerste 50 moet worden gewist. Als dit niet ok is, is hascard ingesteld op false zodat er kan geen verdere pogingen tot logboekregistratie plaatsvinden.
Als (! foundit) {}
int thisbutton = -1;
LCD.Clear();
LCD.Print ("Dir volledig wissen?");
lcd.setCursor(0,1);
LCD.Print ("Sel:Ok recht: No");
{}
thisbutton = read_LCD_buttons();
} while(thisbutton == btnNONE);
LCD.Clear();
Als (thisbutton == btnSELECT) {}
LCD.Print("deleting");
voor (ik = 0; ik < 50; i ++) {}
bestandsnaam [11] = '0' + i / 10;
bestandsnaam [12] = '0' + i % 10;
Als (SD.exists(filename)) SD.remove(filename);
}
Ik = 0;
bestandsnaam [11] = '0' + i / 10;
bestandsnaam [12] = '0' + i % 10;
} else {}
error(4);
hascard = false;
terugkeer;
}
}
Het bestand kan worden geopend:
In het geval van een fout seriële informatie wordt uitgevoerd en de fout code kenbaar gemaakt via de status geleid.
Als dat lukt, wordt de eerste regel van het bestand uitgevoerd. Dit is de kolomkoppen.
Let op het gebruik van logfile.flush(). Dit zorgt ervoor dat alle uitvoer wordt verzonden naar de SD-bestand voordat u verdergaat.
logfile = SD.open (filename, FILE_WRITE);
Als (! logfile) {}
if(debug) {}
Serial.Print niet kon ("aanmaken");
Serial.println(filename);
}
error(3);
hascard = false;
} else {}
logboekregistratie = true;
MyFile = bestandsnaam;
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 Bearing");
logfile.Flush();
if(debug) {Serial.print ("schrijvend aan'); Serial.println(filename);}
}
.
lpad aan en het stootkussen zijn tekst opvulling functies:
.
String lpad (String temp, byte L) {}
byte mylen = temp.length();
Als (mylen > (L - 1)) terug van temp.substring(0,L-1);
voor (byte ik = 0; ik < (L-mylen); i ++) temp = "" + temp;
retourneren temp;
}
.
String pad (String temp, byte L) {}
byte mylen = temp.length();
Als (mylen > (L - 1)) terug
Temp.substring(0,L-1);
voor (byte ik = 0; ik < (L-mylen); i ++) temp = temp + "";
retourneren temp;
}
.
Schrijven naar het bestand:
De hoofdlus leest de gps en uitgangen de waarden naar een bestand als logboekregistratie plaatsvindt. (Een "L" wordt weergegeven in de rechterbenedenhoek van het LCD-scherm.)
.
De waarden zijn geformatteerd voor het produceren van kolommen met vaste breedte.
.
Functie dtostrf(float,w,dp,buf) is een Arduino library functie die ervoor zorgt dat een float-variabele wordt geconverteerd naar een tekenreeks, breedte w met dp decimaaltekens. BUF is een char-buffer die moet groot genoeg zijn om de conversie.
Ik heb gedefinieerd buf met "char buf [20];" in de kop van de schets.
Het bestand wordt leeggemaakt voordat u verdergaat.
.
ogfile.Print(pad(MyTime,13)); omvat milli-seconden
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();
.
Sluiten van het bestand:
Als de kaart niet beschikbaar terugkeer, anders spoel alle resterende uitvoer naar de kaart voordat het bestand wordt gesloten.
ongeldig closefile() {}
Als (! hascard) terugkeer;
logfile.Flush();
logfile.Close();
logboekregistratie = false;
if(debug) Serial.println ("Bestand" MijnBestand + 'gesloten');
}