Bonjour à tous,
je me bats depuis plusieurs semaines sur ce code qui me permet de relever les impulsions sur une entrée puis de réaliser l'envoie du nombre d'impulsion et quelques autres infos sur une BDD Sql ou Cosm ou si je n'ai pas de connexion au web d'ecrire sur la carte SD.
Je n'ai pas de probleme pour ecrire dans la BDD ni sur COSM par conte l'ecriture sur la carte SD se fait mais de facon aléatoire ...... et en ce moment cela bloque à "Initialisation de la SD card...
Echec Ethernet DHCP"
Pour "Echec Ethernet DHCP" normal j'ai retiré le cable reseau pour simuler justement une panne reseau et forcer l'ecriture sur la carte SD.
Par contre je ne sais pas pourquoi rien ne s'ecrit sur ma carte .... pourtant ca eu marché comme on dit ...
Auriez vous une idée du problème ?
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>
#include <avr/pgmspace.h>
// --- Déclaration des constantes utiles ---
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// cosm
#define APIKEY "oQ9B9mJPRT0g" // replace your Cosm api key here
#define FEEDID 569 // replace your feed ID
#define USERAGENT "Vea" // user agent is the project name
//
// variables globales :
#define PERIOD_WRITE_DATA 120000
unsigned long last_write_data;
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };
unsigned int localPort = 8888; // local port to listen for UDP packets
IPAddress ip(192, 168, 0, 35);
IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server
IPAddress timeServer2(129, 6, 15, 28); // time-a.nist.gov NTP server
IPAddress srvphp(192, 168, 0, 135); // Adresse IP serveur perso PHP
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
int Jour = day(); // variable d'initialisation pour la mise à zero de la production à minuit
volatile long comptageImpulsion=0; // variable accessible dans la routine interruption externe 0
int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
// cosm
// initialize the library instance:
EthernetClient client;
char server[] = "api.cosm.com"; // name address for cosm API
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
// const unsigned long postingInterval = 10*1000; //delay between updates to cosm.com
//
time_t prevDisplay = 0; // when the digital clock was displayed
const int timeZoneOffset = +1; // GMT zone;
// --- Déclaration des constantes des broches E/S numériques ---
const int brocheSDCardSelect=4;
// --- Déclaration des constantes des broches analogiques ---
// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
File file; // objet file
File root; // objet root pour le répertoire racine
void setup() { // debut de la fonction setup()
last_write_data = millis() - PERIOD_WRITE_DATA;
comptageImpulsion = 0;
Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission
// digitalWrite(10, HIGH); // mais désactive le circuit intégré W5100 du module ethernet!
attachInterrupt(0, gestionINT0, RISING); // attache l'interruption externe n°0 à la fonction gestionINT0()
// mode déclenchement possibles = LOW, CHANGE, RISING, FALLING
// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
Serial.println( (__FlashStringHelper *)PSTR("Echec Ethernet DHCP"));
Ethernet.begin(mac, ip);
// no point in carrying on, so do nothing forevermore:
// for(;;)
// ;
}
Udp.begin(localPort);
setSyncProvider(getNtpTime);
while(timeStatus()== timeNotSet); // wait until the time is set by the sync provider
//---- initialise l'utilisation de la carte mémoire SD en mode SPI
pinMode(10, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
} // fin de la fonction setup()
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;
// }
// Initialisation du compteur au changement de jour
if (Jour != day()) {
comptageImpulsion = 0;
Jour = day();
Serial.println( (__FlashStringHelper *)PSTR("Init compteur changement de jour"));
file.println( (__FlashStringHelper *)PSTR("Init compteur changement de jour") );
}
// 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 )
{
// Initialisation de la variale permettant la réinitialisation du compteur au changement de jour
Jour = day(); // Gestion de l'initialisation du compreur de changement de jour
last_write_data = millis(); // variable de gestion de la boucle if
// cosm
// read the analog sensor:
long 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
// ********************************************************************************