Étape 5: Utilisation de la carte SD dans gps2.ino
Configuration de la carte sd :
L’accès select de puce par défaut et la broche chipSelect réelles doivent être définis à la sortie.
La carte SD est accessible avec une instruction begin qui inclut les broches utilisées par la carte sur la carte gps.
La vitesse de la carte est fixée à SPI_Full_SPEED.
En cas d’erreur, le voyant lumineux clignote sortie un signal-détails de l’erreur dans l’en-tête de l’esquisse.
Si debug est défini sur true dans la config, Serial monitor également, les messages sont envoyés.
Si la carte s’initialise ok la variable hascard est définie sur true.
.
Assurez-vous que l’accès select de puce par défaut est définie sur
sortie, même si vous ne l’utilisez pas :
pinMode(SS,OUTPUT) ; goupille de select mega par défaut
pinMode(chipSelect,OUTPUT) ;
digitalWrite(chipSelect,LOW) ;
voir si la carte est présente et peut être initialisée :
if (!. SD.begin(chipSelect, 11, 12, 13)) {}
if(Debug) Serial.println (F ("carte init. a échoué!")) ;
Error(1) ;
} else {}
Si (! card.init (SPI_FULL_SPEED, chipSelect, 11, 12, 13)) {}
Error(2) ;
{if(Debug)}
Serial.println (F (« échouée de l’initialisation. Choses à vérifier: ")) ;
Serial.println (F (« * est une carte est insérée? ")) ;
Serial.println (F (« * est votre câblage correct? ")) ;
Serial.println (F (« * avez-vous changé la broche chipSelect pour correspondre à votre bouclier ou module? ")) ;
}
} else {}
hascard = true ;
if(Debug) Serial.println (F ("carte init. a réussi")) ;
}
}
Sélectionner le fichier SD pour la journalisation :
Lorsque l’openfile sous-routine main droite touche est appelée.
Il inspecte le dossier gps à la recherche d’un nom de fichier inutilisé dans la séquence GPSLOGnn.TXT, où nn = 0 à 99.
Si un fichier est trouvé, foundit la valeur true.
Si (! hascard) {return;} / / ne pas continuer si une carte n’existe pas ou est non disponible
octet i ;
char nom [18] ;
strcpy (filename, "/ gps/GPSLOG00. « « « TXT ») ;
NomFichier [17] = char(0) ;
foundit booléen = false ;
pour (i = 0; i < 100; i ++) {}
NomFichier [11] = « 0 » + i / 10 ;
NomFichier [12] = « 0 » + i % 10 ;
if (!. {SD.exists(filename))}
foundit = true ; rupture ;
}
}
Si tous les noms de fichiers sont en cours d’utilisation, foundit aura la valeur false et l’utilisateur est demandé si les 50 premiers doit être effacé. Si ce n’est pas ok, hascard a la valeur false afin qu’il peut y avoir aucune autre tentatives d’exploitation forestière.
Si (! foundit) {}
int Ceboutonsélectionnel = -1 ;
LCD.Clear() ;
LCD.Print ("Dir plein-Erase?") ;
lcd.setCursor(0,1) ;
LCD.Print (« Sel:Ok droit : aucune ") ;
{}
Ceboutonsélectionnel = read_LCD_buttons() ;
} while(thisbutton == btnNONE) ;
LCD.Clear() ;
Si (Ceboutonsélectionnel == btnSELECT) {}
LCD.Print("Deleting") ;
pour (i = 0; i < 50; i ++) {}
NomFichier [11] = « 0 » + i / 10 ;
NomFichier [12] = « 0 » + i % 10 ;
Si (SD.exists(filename)) SD.remove(filename) ;
}
i = 0 ;
NomFichier [11] = « 0 » + i / 10 ;
NomFichier [12] = « 0 » + i % 10 ;
} else {}
Error(4) ;
hascard = false ;
retour ;
}
}
Le fichier peut être ouvert :
Dans le cas d’une erreur des informations séries sont sorties et l’erreur code signalé par l’intermédiaire de l’État a conduit.
En cas de succès, la première ligne du fichier est sortie. Il s’agit des en-têtes de colonne.
Notez l’utilisation de logfile.flush(). Cela garantit que toutes les sorties sont envoyé dans le fichier de la SD avant de continuer.
logfile = SD.open (filename, FILE_WRITE) ;
Si (! logfile) {}
{if(Debug)}
Serial.Print ("Impossible de créer") ;
Serial.println(fileName) ;
}
Error(3) ;
hascard = false ;
} else {}
exploitation forestière = true ;
MyFile = filename ;
logfile.println (pad ("Time", 13) + lpad ("Date", 9) + lpad("Longitude",10)
+ lpad("Latitude",10) + lpad("Altitude",9) + "m" + lpad("Geoid",9) + "m" + lpad("Speed",7) + "mi/h portant") ;
logfile.Flush() ;
if(Debug) {Serial.print ("écrit à") ; Serial.println(fileName);}
}
.
LPAD et pad sont fonctions de remplissage du texte :
.
Chaîne lpad (octet String de temp, L) {}
mylen octets = temp.length() ;
Si (mylen > (L - 1)) return temp.substring(0,L-1) ;
pour (octet j’ai = 0; i < (L-mylen); i ++) temp = » "+ temp ;
Return temp ;
}
.
String pad (octet String de temp, L) {}
mylen octets = temp.length() ;
Si (mylen > (L - 1)) return
Temp.Substring(0,L-1) ;
pour (octet j’ai = 0; i < (L-mylen); i ++) temp = temp + "" ;
Return temp ;
}
.
Écriture dans le fichier :
La boucle principale lit le gps et affiche les valeurs dans un fichier si la journalisation est en cours. (Un « L » s’affiche en bas à droite de l’écran LCD).
.
Les valeurs sont formatés pour produire les colonnes à largeur fixe.
.
Dtostrf(float,w,dp,buf) fonction est une fonction de bibliothèque Arduino qui prend une variable float et le convertit en une chaîne, de largeur w avec dp décimales. buf est un tampon char qui doit être assez grand pour gérer la conversion.
J’ai défini buf avec "char buf [20];" dans l’en-tête de l’esquisse.
Le fichier est vidé avant de continuer.
.
ogfile.Print(PAD(Mytime,13)) ; comprend milli secondes
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() ;
.
Fermeture du dossier :
Si la carte n’est pas disponible retour, sinon rincer toutes les autres sorties de la carte avant de fermer le fichier.
void closefile() {}
Si (! hascard) return ;
logfile.Flush() ;
logfile.Close() ;
exploitation forestière = false ;
if(Debug) Serial.println (« Fichier » myfile + « fermé ») ;
}