Bonjour!
J'ai vraiment besoin de vous. D'abord voilà mes outils:
une carte arduino uno
une LoRa GPS Shield with LoRa BEE
un module SD (MicroSD Card Adapter)
Je veux enregistrer les données de la carte GPS dans ma carte SD mais on m'a dit hier que les deux utilisent le même bus SPI donc ne pouvaient cohabiter ensemble. De ce fait j'ai décidé d'opter pour le I2C ,j'ai branché carte GPS sur un arduino UNO et la carte SD sur un autre. J'ai bien testé avec les exemples (slavesender et masterreader) d'arduino pour voir si les branchements sont bons et ça a marché.
Maintenant pour stocker les données c'est autre chose. Voilà mon code pour récupérer les données du GPS dans la carte SD mais je ne sais pas comment le changer puisque je dois utiliser le modèle master-slave.
/**
- Exemple de code Arduino pour un datalogger basique avec stockage sur carte SD.
*/
/* Dépendances */
#include <SPI.h> // Pour la communication SPI
#include <SD.h> // Pour la communication avec la carte SD
#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial ss(3, 4); // Arduino TX, RX ,
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
/** Broche CS de la carte SD */
const byte SDCARD_CS_PIN = 10; // A remplacer suivant votre shield SD
/** Nom du fichier de sortie /
const char OUTPUT_FILENAME = "data.csv";
/** Delai entre deux prise de mesures */
const unsigned long DELAY_BETWEEN_MEASURES = 5000;
/** Fichier de sortie avec les mesures */
File file;
/** Fonction setup() */
void setup() {
ss.begin(9600); // SoftSerial port to get GPS data.
while (!Serial) {
;
};
/* Initialisation du port série (debug) /
Serial.begin(9600);
/ Initialisation du port SPI */
pinMode(10, OUTPUT); // Arduino UNO
//pinMode(53, OUTPUT); // Arduino Mega
/* Initialisation de la carte SD */
Serial.println(F("Initialisation de la carte SD ... "));
if (!SD.begin(SDCARD_CS_PIN)) {
Serial.println(F("Erreur : Impossible d'initialiser la carte SD"));
Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
for (;;); // Attend appui sur bouton RESET
}
/* Ouvre le fichier de sortie en écriture */
Serial.println(F("Ouverture du fichier de sortie ... "));
file = SD.open(OUTPUT_FILENAME, FILE_WRITE);
if (!file) {
Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
for (;;); // Attend appui sur bouton RESET
}
/* Ajoute l'entête CSV si le fichier est vide */
if (file.size() == 0) {
Serial.println(F("Ecriture de l'entete CSV ..."));
file.println(F("Long- Lat- Date et Heure"));
file.flush();
}
}
/** Fonction loop() */
void loop() {
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_date(gps);
gps.stats(&chars, &sentences, &failed);
Serial.println();
smartdelay(1000);
//delay(1000);
// Temps de la précédente mesure et actuel
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
/* Réalise une prise de mesure toutes les DELAY_BETWEEN_MEASURES millisecondes */
if (currentMillis - previousMillis >= DELAY_BETWEEN_MEASURES) {
previousMillis = currentMillis;
measure();
}
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
{
//ss.print(Serial.read());
gps.encode(ss.read());
}
} while (millis() - start < ms);
}
static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartdelay(0);
}
static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz[32];
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz = ' ';
- if (len > 0)*
- sz[len-1] = ' ';*
- Serial.print(sz);*
- smartdelay(0);*
}
static void print_date(TinyGPS &gps)
{ - int year;*
- byte month, day, hour, minute, second, hundredths;*
- unsigned long age;*
- gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);*
- if (age == TinyGPS::GPS_INVALID_AGE)*
_ Serial.print("********** ******** ");_ - else*
- {*
- char sz[32];*
- sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",*
- day, month, year, hour, minute, second);*
- Serial.print(sz);*
- }*
- smartdelay(0);*
}
static void print_str(const char *str, int len)
{ - int slen = strlen(str);*
- for (int i=0; i<len; ++i)*
_ Serial.print(i<slen ? str : ' ');_
* smartdelay(0);*
}
/** Fonction de mesure - Ã personnaliser selon ses besoins */
void measure() {
_ /* Réalise la mesure /_
_ float flon,flat;_
_ char sz;_
_ float lon = flon;_
_ float lat = flat;_
_ char dateEtHeure = sz;*_
_ /* Affiche les données sur le port série pour debug /_
_ Serial.print(lon);_
_ Serial.print(F("- "));_
_ Serial.print(lat);_
_ Serial.print(F("- "));_
_ Serial.println(dateEtHeure);*_
_ /* Enregistre les données sur la carte SD /_
_ file.print(lon);_
_ file.print(F("- "));_
_ file.print(F(" "));_
_ file.print(lat);_
_ file.print(F("- "));_
_ file.print(F(" "));_
_ file.println(dateEtHeure);_
_ file.flush();_
_}*_
Aidez-moi svp c'est urgent.