Je pense que tu as repris le code de l'exemple COSM et tu la mélangé à ton code SD sans trop chercher à en comprendre la logique.
Le delay de 120 dans le loop est une mauvaise idée car tout est bloqué pendant 2 minutes.
Je suppose que toutes les 120 secondes tu veux enregistrer une donnée dans la SD et envoyer la mise à jour à COSM.
Si c'est bien cela j'ai revu la logique de ta boucle :
// variables globales :
#define PERIOD_WRITE_DATA 120000
unsigned long last_write_data;
void setup()
{
..... toute le reste et on finit par :
last_write_data = millis() - PERIOD_WRITE_DATA;
}
void loop(){ // debut de la fonction loop()
// On purge l'arrivée de caractères, retour de COSM (pour debug)
if (client.available()) {
while( client.available() )
Serial.print(client.read() );
}
// Si la communication a été coupée, on ferme le client et on indique lastConnected = false;
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println( (__FlashStringHelper *)PSTR("disconnecting."));
client.stop();
lastConnected = false;
}
// Si et seulement si PERIOD_WRITE_DATA s'est écoulé depuis la dernière fois, on exécute la fonction d'écriture SD et l'envoi sur COSM
// Sinon, on recommence loop
if ( (millis()-last_write_data) > PERIOD_WRITE_DATA )
{
last_write_data = millis();
//---- crée fichier en écriture ---
file = SD.open("data.txt", FILE_WRITE); // ouvre le fichier en écriture
// NB : le fichier est créé si il n'existe pas !
//---- test si fichier dispo en écriture
if (!file) { // si fichier pas dispo
Serial.println( (__FlashStringHelper *)PSTR("Erreur ouverture fichier !"));
} // fin if
else { // si le fichier existe et est ouvert
Serial.println( (__FlashStringHelper *)PSTR("Fichier pret pour ecriture !"));
//----- Ecriture dans le fichier au format CSV -----
Serial.println( (__FlashStringHelper *)PSTR("Enregistrement en cours :"));
// valeur deuxieme champ
file.print(comptageImpulsion);
file.print(';');
// valeur quatrieme champ
file.print(millis()), file.print(';');
// le dernier champ doit se terminer par un saut de ligne +++
if( now() != prevDisplay) //update the display only if the time has changed
{
prevDisplay = now();
digitalClockDisplay();
}
file.close(); // ferme le fichier
Serial.println( (__FlashStringHelper *)PSTR("Fin enregistrement !"));
Serial.println( (__FlashStringHelper *)PSTR("Fermeture fichier !"));
// cosm
// read the analog sensor:
int sensorReading = comptageImpulsion ;
// A chaque fois qu'on écrit dans le fichier, on envoi aussi sur COSM.
// La gestion du délai est déjà fait plus haut
sendData(sensorReading);
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
} // fin else
}
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
A coté de cela, tu peux encore gagner un peu de code par-ci par -là :
#define localPort 8888 // local port to listen for UDP packets
Toute constante gagne à être un #define plutot qu'une variable.
sendDataversion compacte :
void sendData(int thisData) {
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println( (__FlashStringHelper *)PSTR("connecting..."));
// send the HTTP PUT request:
client.print((__FlashStringHelper *)PSTR(\
"PUT /v2/feeds/" FEEDID ".csv HTTP/1.1\n" \
"Host: api.cosm.com\n" \
"X-ApiKey: " APIKEY "\n" \
"User-Agent: " USERAGENT "\n" \
"Content-Length: " \
));
// calculate the length of the sensor reading in bytes:
// 8 bytes for "sensor1," + number of digits of the data:
int thisLength = 8 + getLength(thisData);
client.println(thisLength);
// last pieces of the HTTP PUT request:
client.print((__FlashStringHelper *)PSTR(\
"Content-Type: text/csv\n" \
"Connection: close\n" \
"\n" \
));
// here's the actual content of the PUT request:
client.print( (__FlashStringHelper *)PSTR("sensor2,") );
client.println(thisData);
}
else {
// if you couldn't make a connection:
Serial.println( (__FlashStringHelper *)PSTR("connection failed"));
Serial.println();
Serial.println( (__FlashStringHelper *)PSTR("disconnecting."));
client.stop();
}
// note the time that the connection was made or attempted:
//lastConnectionTime = millis();
}
Attention, il faut que FEEDID soit une chaine et pas un nombre :
#define FEEDID "99999"
Le code si dessus est basé sur le fait que
"XXXX" "YYYY" "ZZZZ"
est automatiquement convertit par le compilateur en
"XXXXYYYYYZZZZ"
En ajoutant "\n" pour le retour chariot.
Tu obtient une chaîne plus longue qui est la somme de toutes le petites chaines mais tu n'a plus qu'un seul appel à la fonction print();
Attention, comme PSTR() est une macro (#define) il faut impérativement le symbole \ suivit de rien du tout (retour à la ligne immédiat) qui indique que la ligne de code se poursuit à la ligne de texte suivante.
ainsi :
client.print((__FlashStringHelper *)PSTR(\
"PUT /v2/feeds/" FEEDID ".csv HTTP/1.1\n" \
"Host: api.cosm.com\n" \
"X-ApiKey: " APIKEY "\n" \
"User-Agent: " USERAGENT "\n" \
"Content-Length: " \
));
est vu par le compilateur comme :
client.print((__FlashStringHelper *)PSTR( "PUT /v2/feeds/" FEEDID ".csv HTTP/1.1\n" "Host: api.cosm.com\n" "X-ApiKey: " APIKEY "\n" "User-Agent: " USERAGENT "\n" "Content-Length: " )); /code]
Et se compile correctement alors que sans les \ tu auras une erreur de compil
Parce qu'une substitution de macro doit se faire sur une seule "ligne de code"
Bref, j'obtient à l'exécution cela :
[code]Initialisation de la SD card...
Initialisation reussie !
Repertoire racine ouvert !
Fichier pret pour ecriture !
Fin enregistrement !
Fermeture fichier !
Fichier pret pour ecriture !
Enregistrement en cours :
Fin enregistrement !
Fermeture fichier !
connecting...
72848480474946493...(plein de chiffres).....0131032
disconnecting.
--------------------------------------------------->>>>> ( pause de 120 secondes ) <<<<<<
Fichier pret pour ecriture !
Enregistrement en cours :
Fin enregistrement !
Fermeture fichier !
connecting...
72848480474946493...(plein de chiffres).....0131032
disconnecting.
--------------------------------------------------->>>>> ( pause de 120 secondes ) <<<<<<
etc...
[/code]