J'ai essayé de tester le code en modifiant quelques trucs pour le tester maintenant puisqu'il n'est pas encore minuit:
/**
* 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>
#include <Arduino.h>
#define LENG 31 //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];
int year;
byte month, day, hour, minute, second, hundredths;
float flat, flon;
char sz[32];
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
//Le PIN SS de la carte GPS est relié à D5 et le pin SS de la carte GPS au pin D2
int GPS_SS=5;
int SD_SS=6;
/** Broche CS de la carte SD */
const byte SDCARD_CS_PIN = 6; // A remplacer suivant votre shield SD
/** Nom du fichier de sortie au format jour_mois_année */
char OUTPUT_FILENAME[10]={hour,"_",minute,".csv"};
/** Delai entre deux prise de mesures */
const unsigned long DELAY_BETWEEN_MEASURES = 1000;
int PM01Value=0; //define PM1.0 value of the air detector module
int PM2_5Value=0; //define PM2.5 value of the air detector module
int PM10Value=0; //define PM10 value of the air detector module
/** Fichier de sortie avec les mesures */
File file;
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);
/** Fonction setup() */
void setup() {
Serial.setTimeout(1500);
pinMode(SD_SS, OUTPUT);
pinMode(GPS_SS,OUTPUT);
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
Serial.begin(9600); // start serial for output
ss.begin(9600); // SoftSerial port to get GPS data.
while (!Serial) {
;
};
//Création du premier fichier ayant comme nom la date actuelle
creerFichier();
}
/** Fonction loop() */
void loop() {
/*Le module GPS écoute et le module SD est comme sourd et muet*/
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
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);
digitalWrite(SD_SS,LOW);
digitalWrite(GPS_SS,HIGH);
// Temps de la precedente mesure et de la mesure actuelle
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
/* Realise une prise de mesure toutes les DELAY_BETWEEN_MEASURES millisecondes */
if (currentMillis - previousMillis >= DELAY_BETWEEN_MEASURES) {
previousMillis = currentMillis;
//Appel de la fonction measure
measure();
}
if(Serial.find(0x42)){ //start to read when detect 0x42
Serial.readBytes(buf,LENG);
if(buf[0] == 0x4d){
if(checkValue(buf,LENG)){
PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module
PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module
PM10Value=transmitPM10(buf); //count PM10 value of the air detector module
}
}
}
}
static void smartdelay(unsigned long ms)
{
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
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)
{
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
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)
{
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
smartdelay(0);
}
static void print_date(TinyGPS &gps)
{
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print("********** ******** ");
else
{
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)
{
digitalWrite(SD_SS,HIGH);
digitalWrite(GPS_SS,LOW);
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
smartdelay(0);
}
char checkValue(unsigned char *thebuf, char leng)
{
char receiveflag=0;
int receiveSum=0;
for(int i=0; i<(leng-2); i++){
receiveSum=receiveSum+thebuf[i];
}
receiveSum=receiveSum + 0x42;
if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data
{
receiveSum = 0;
receiveflag = 1;
}
return receiveflag;
}
int transmitPM01(unsigned char *thebuf)
{
int PM01Val;
PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
return PM01Val;
}
//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
{
int PM2_5Val;
PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
return PM2_5Val;
}
//transmit PM Value to PC
int transmitPM10(unsigned char *thebuf)
{
int PM10Val;
PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module
return PM10Val;
}
/** Fonction de recuperation des donnees du GPS tant que la journée n'est pas finie, c'est à dire avant minuit */
void measure() {
if((hour==12)&&(minute==11)){
digitalWrite(SD_SS,LOW);
digitalWrite(GPS_SS,HIGH);
/* Recupere les valeurs */
float lon=flon;
float lat=flat;
float PM01 = PM01Value;
float PM25 = PM2_5Value;
float PM10 = PM10Value;
/* Affiche les donnees sur le port serie pour tester si les valeurs sont bien recuperees */
Serial.print(PM01);
Serial.print(F("- "));
Serial.print(PM25);
Serial.print(F("- "));
Serial.print(PM10);
Serial.print(lon);
Serial.print(F("- "));
Serial.print(lat);
Serial.print(F("- "));
Serial.println(sz);
/* Enregistre les donnees sur la carte SD */
file.print(PM01);
file.print(F("- "));
file.print(PM25);
file.print(F("- "));
file.print(PM10);
file.flush();
file.print(lon);
file.print(F("- "));
file.print(lat);
file.print(F("- "));
file.println(sz);
file.flush();
}
/* S'il est minuit, on ferme le fichier actuel et on en crée un autre*/
else {
file.close();
creerFichier();
}
}
/**Fonction pour créer un fichier*/
void creerFichier(){
/* Initialisation du port SPI */
//Le module SD écoute et le module GPS est comme sourd et muet
digitalWrite(SD_SS,LOW);
digitalWrite(GPS_SS,HIGH);
/* 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 ecriture */
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'entete CSV si le fichier est vide */
if (file.size() == 0) {
Serial.println(F("Ecriture de l'entete CSV ..."));
file.println(F("PM1.0- PM2.5- PM10 " "-Long - Lat - Date et Heure "));
file.flush();
}
}