void sendData(int thisData) {
// if there's a successful connection:
if (client.connect(srvphp, 80)) {
char reqhttp[100];
int annee = year();
int sec = second();
int jour=day();
int mois = month();
int heure= hour();
int minut= minute();
Serial.println("connected srvphp");
// Make a HTTP request:
sprintf( reqhttp, "GET /solaire/txp2.php?nom_inst=Dupont&date_prod=%04d%02d%02d%02d%02d%02d&prod=%05d&commentaires=arduino HTTP/1.0",annee,mois,jour,heure,minut,sec,comptageImpulsion);
client.println(reqhttp);
client.println();
Serial.println(F("Fin envoie srvphp"));
client.stop();
}
else {
if (client.connect(server, 80)) {
Serial.println( (__FlashStringHelper *)PSTR("connecting COSM..."));
// send the HTTP PUT request:
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.cosm.com");
client.print("X-ApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("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.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();
// here's the actual content of the PUT request:
client.print("sensor2,");
client.println(thisData);
Serial.println(F("Fin envoie COSM"));
client.stop();
}
else {
char datafile[13] = {'\0'};
int jour=day();
int mois = month();
int heure= hour();
int minut= minute();
sprintf(datafile,"%02d%02d%02d%02d.txt",mois,jour,heure,minut); // %d pour un int
//----- initialisation de la carte SD -----
Serial.println( (__FlashStringHelper *)PSTR("Initialisation de la SD card..."));
SD.begin(brocheSDCardSelect); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false
root = SD.open("/"); // ouvre la SD Card à la racine
Serial.println( (__FlashStringHelper *)PSTR("Rep racine ouvert"));
Serial.println(datafile);
//---- crée fichier en écriture ---
file = SD.open(datafile, 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();
}
Serial.println( (__FlashStringHelper *)PSTR("connection failed"));
Serial.println();
Serial.println( (__FlashStringHelper *)PSTR("disconnecting"));
file.close(); // ferme le fichier
Serial.println( (__FlashStringHelper *)PSTR("Fin enregistrement"));
Serial.println( (__FlashStringHelper *)PSTR("Fermeture fichier"));
}
// note the time that the connection was made or attempted:
// lastConnectionTime = millis();
}
}
// This method calculates the number of digits in the
// sensor reading. Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:
}
int getLength(int someValue) {
// there's at least one byte:
int digits = 1;
// continually divide the value by ten,
// adding one to the digit count for each
// time you divide, until you're at 0:
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
// return the number of digits:
return digits;
}
// ------------------- fonction de gestion l'interruption externe n°0 (broche 2) ----------------
// cette fonction est appelée à chaque fois que l'interruption a lieu selon le mode configuré (LOW, CHANGE, RISING, FALLING)
void gestionINT0() {// la fonction appelée par l'interruption externe n°0
comptageImpulsion=comptageImpulsion+1; // Incrémente la variable de comptage
//---- affiche le nombre d'impulsions sur le port série
Serial.print("Nombre impulsions = ");
Serial.println(comptageImpulsion);
// tout se passe dans la fonction de gestion de l'interruption externe
}
// ////////////////////////// AUTRES FONCTIONS DU PROGRAMME ////////////////////
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" -- ");
Serial.print(day());
Serial.print("/");
Serial.print(month());
Serial.print("/");
Serial.print(year());
Serial.println();
file.print(hour()), file.print(';');
printDigitsSD(minute()), file.print(';');
printDigitsSD(second()), file.print(';');
file.print(day()), file.print(';');
file.print(month()), file.print(';');
file.print(year()), file.print(';');
file.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
void printDigitsSD(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
if(digits < 10)
file.print('0');
file.print(digits);
}
/*-------- NTP code ----------*/
unsigned long getNtpTime()
{
sendNTPpacket(timeServer); // send an NTP packet to a time server
delay(1000);
if ( Udp.parsePacket() ) {
// We've received a packet, read the data from it
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer
//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years and add the time zone:
unsigned long epoch = secsSince1900 - seventyYears + (timeZoneOffset * 3600L);
Serial.println( (__FlashStringHelper *)PSTR("Heure sur serveur ntp 1"));
return epoch;
}
else {
sendNTPpacket(timeServer2); // send an NTP packet to a time server
delay(1000);
if ( Udp.parsePacket() ) {
// We've received a packet, read the data from it
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer
//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years and add the time zone:
unsigned long epoch = secsSince1900 - seventyYears + (timeZoneOffset * 3600L);
Serial.println( (__FlashStringHelper *)PSTR("Heure sur serveur ntp 2"));
return epoch;
}
}
return 0;
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}