problème d'acquisition de données WIFI + SD

Bonjour,

J'ai dans l'optique d'utiliser une carte arduino pour relever des temps d'arrêts et renvoyer les données sur une page HTML par wifi.
Les temps sont mesurer simplement par 2 fils dans un contacteur et note une ligne au moment de la fermeture ou de l'ouverture du contacteur.

Les données enregistrer sont des lignes type :

"ARRET 12/03/2013 12:32:55"
"MARCHE 12/03/2013 14:21:37"

J'utilise pour cela une carte UNO REV3, un shield wifi officiel, un module RTC DS1307 et une carte SD.

Apres plusieurs essais et en bidouillant les librairies j'arrive sans problemes à :

-Utiliser la librairie RTC.
-Vérifier l'état du contact et écrire un relevé sur la SD tel que cité au dessus.
-Etablir la liaison wifi entre le routeur et la carte.
-Afficher simplement les données de la carte en HTML via le serveur WEB.

Apres des soirées de recherche ca coince quand je veux fusionner le 2eme et 4eme code afin que la carte soient autonome et incrémente la SD suivant l'état du contact et avoir la possibilité pour l'utilisateur d'aller vérifier à l'instant T les données sur la SD depuis le réseau sur l'IP de la carte via une simple page HTML.
En effet soit la carte ne se connecte plus, soit rien ne s'affiche, soit la page HTML me lance un téléchargement :shock: :?: :?:
Voici mes deux codes que je voudrais fusionner :
Avez vous une idée ?

Voila le code qui fonctionne pour incrémenter la SD :

#include <Wire.h>
#include "RTClib.h"
#include <SD.h>

RTC_DS1307 rtc;

const int BP=2;
const int APPUI=0;
const int PAS_APPUI=1;
int A;
int B = 0;
int ETAT_BP;


void setup () {


if (!SD.begin(4)) {
Serial.println("Erreur à l'init!");
return;
}
Serial.println("init Ok.");


pinMode(BP,INPUT);
digitalWrite(BP,HIGH);

Serial.begin(9600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
}
}


void loop () {



DateTime now = rtc.now();

ETAT_BP=digitalRead(BP);


if (ETAT_BP==APPUI){

A = 1;
}
else {

A=0;
}


//// Traitement écriture sur la S


if (A==1 && B==0) {




File theFile;
theFile = SD.open("fichier.txt", FILE_WRITE); // ouverture de fichier.txt en écriture

if (theFile) {
Serial.print("Ecriture de données sur la premiere ligne");

theFile.println(),
theFile.print("EN FONCTIONNEMENT "); 
theFile.print(now.year(), DEC); 
theFile.print('/'); 
theFile.print(now.month(), DEC);
theFile.print('/');
theFile.print(now.day(), DEC);
theFile.print(' ');
theFile.print(now.hour(), DEC);
theFile.print(':');
theFile.print(now.minute(), DEC);
theFile.print(':');
theFile.print(now.second(), DEC);



// Fermeture du fichier:
theFile.close();
Serial.println("C'est écrit !");
} else {
// impossible d'ouvrir/créer le fichier:
Serial.println("Erreur d'ouverture de fichier.txt");
}



B = 1; }

else 
if (A==0 && B==1) {
File theFile;
theFile = SD.open("fichier.txt", FILE_WRITE); // ouverture de fichier.txt en écriture

if (theFile) {
Serial.print("Ecriture de données sur la premiere ligne");

theFile.println(),
theFile.print("EN ARRET ");
theFile.print(now.year(), DEC);
theFile.print('/');
theFile.print(now.month(), DEC);
theFile.print('/');
theFile.print(now.day(), DEC);
theFile.print(' ');
theFile.print(now.hour(), DEC);
theFile.print(':');
theFile.print(now.minute(), DEC);
theFile.print(':');
theFile.print(now.second(), DEC);



// Fermeture du fichier:
theFile.close();
Serial.println("C'est écrit !");
} else {
// impossible d'ouvrir/créer le fichier:
Serial.println("Erreur d'ouverture de fichier.txt");
}
B = 0; }

//////////// Lecture de la carte SD

File theFile = SD.open("fichier.txt");
if (theFile) {
Serial.println("fichier.txt:");
// lecture du fichier jusqu'à la fin:
while (theFile.available()) {
Serial.write(theFile.read());
}
// Fermeture du fichier:
theFile.close();
} 
else {
// Ouverture impossible:
Serial.println("Ouverture impossible de fichier.txt");
}


delay(1000);

}
Voila le code qui lis la carte SD et l'affiche en HTML :
















#include <SPI.h>
#include <WiFi.h>
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"

RTC_DS1307 rtc;

const int BP=2;
const int APPUI=0;
const int PAS_APPUI=1;
int A;
int B = 0;


IPAddress ip(192, 168, 70, 211);

char ssid[] = "LINKSIS3245"; // your network SSID (name) 
char pass[] = "**************"; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {




pinMode(BP,INPUT);
digitalWrite(BP,HIGH);

Serial.begin(9600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
}

SD.remove("fichier.txt");


///////////////////////////////////// init SD
if (!SD.begin(4)) {
Serial.println("Erreur à l'initit de la carte SD");
return;


}
Serial.println("init Ok.");





//Initialize serial and wait for port to open:
Serial.begin(9600); 
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present"); 
// don't continue:
while(true);
} 

// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) { 
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network: 
status = WiFi.begin(ssid, pass);

// wait 10 seconds for connection:
delay(10000);
} 
server.begin();
// you're connected now, so print out the status:
printWifiStatus();

}


void loop() {
// listen for incoming clients
WiFiClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 2"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin


client.print("Ceci est un essai");

File theFile = SD.open("fichier.txt");
if (theFile) {
Serial.println("fichier.txt:");
// lecture du fichier jusqu'à la fin:
while (theFile.available()) {
client.write(theFile.read());
}
// Fermeture du fichier:
theFile.close();
} 




}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} 
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);

// close the connection:
client.stop();
Serial.println("client disonnected");
}
}


void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}

bonjour,
utilise la balise code pour rendre plus lisible.
plus en tête les pins utilisées, mais à mon avis ca ressemble à une pin utilisée par les 2 cartes.
D4 de mémoire pour la carte SD
quel shield wifi?

C'est le shield officiel : http://arduino.cc/en/Main/ArduinoWiFiShield

ok donc la SD est sur la carte
tu utilise quelle lib?
le git

j'utilise les libs d'origine wifi.h, sd.h wire.h et RTClib.h pour l'horloge.

Pour le moment j'ai simplement bidouillé l'exemple serveur wifi pour lire ma carte sur une page HTML et l'exemple readWrite de SD.h auquel j'ai simplement ajouté la lib RTClib.h et une lecture du contact sur la pin 2 afin de noter ce que je veux sur la carte SD suivant l'état du contact et afficher le contenu sur le moniteur série.

En fait je n'arrive pas mettre en place la boucle qui lit l'état du contact en permanence et la mettre en pause quand un client se connect sur la carte par le wifi afin de laisser la carte envoyer les données sur la page HTML puis une fois terminé repartir sur la boucle de lecture du contact.

Je ne sais pas si je suis bien clair :~

c'est pas le même problème évoqué plus haut alors.

En fait je n'arrive pas mettre en place la boucle qui lit l'état du contact en permanence et la mettre en pause quand un client se connect sur la carte par le wifi afin de laisser la carte envoyer les données sur la page HTML puis une fois terminé repartir sur la boucle de lecture du contact.

tu donne la solution dans ta réponse :wink:
regarde du coté de switch avec case peut être

Bon alors voila des semaines que je me casse la tête avec ce problème.
Voila ce code fonctionne :

#include <SPI.h>
#include <WiFi.h>
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"

RTC_DS1307 rtc;

const int BP=2;
const int APPUI=0;
const int PAS_APPUI=1;
int A;
int B = 0;
int ETAT_BP;

IPAddress ip(192, 168, 70, 211);

char ssid[] = "TP-LINK_H11CFL1";      // your network SSID (name) 
char pass[] = "ceciestlaprotectionwifih11cfl";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
  
  
 
 
   pinMode(BP,INPUT);
  digitalWrite(BP,HIGH);
  
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }

    SD.remove("fichier.txt");

  digitalWrite(4, LOW);
    digitalWrite(10, HIGH);

  ///////////////////////////////////// init SD
  if (!SD.begin(4)) {
    Serial.println("Erreur à l'initit de la carte SD");
    return;
    
   
}
Serial.println("init Ok.");

  digitalWrite(10, LOW);
    digitalWrite(4, HIGH);



  //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  } 
  
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  } 
  server.begin();
  // you're connected now, so print out the status:
  printWifiStatus();

}








void loop() {
  // listen for incoming clients
  WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 2");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          
           
                File theFile = SD.open("fichier.txt");
  if (theFile) {
    Serial.println("fichier.txt:");
    // lecture du fichier jusqu'à la fin:
    while (theFile.available()) {
    client.write(theFile.read());
  }
  // Fermeture du fichier:
  theFile.close();
} 

          
          
          
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
        
        
        
        
        
        
      }
    }
    // give the web browser time to receive the data
    delay(1);
    
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
  
  
  

  
  
  
          Serial.print("BOUCLE !!");

 
  
  
  }
  


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Il fait afficher en boucle le mot : "BOUCLE" sur le port série et quand un client se connecte au serveur il stop la boucle, il balance les données sur la page HTML puis quand le client déconnecte il repart sur la boucle.
J'ai fait ca pour bien identifier ou placer ma boucle d'acquisition pour écrire sur la SD quand il n'y a pas de client connectés.

Ensuite je remplace donc le mot "BOUCLE" par mon bout de code qui me permet d'écrire sur la SD :

/*
  WiFi Web Server
 
 A simple web server that shows the value of the analog input pins.
 using a WiFi shield.
 
 This example is written for a network using WPA encryption. For 
 WEP or WPA, change the Wifi.begin() call accordingly.
 
 Circuit:
 * WiFi shield attached
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 31 May 2012
 by Tom Igoe

 */

#include <SPI.h>
#include <WiFi.h>
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"

RTC_DS1307 rtc;

const int BP=2;
const int APPUI=0;
const int PAS_APPUI=1;
int A;
int B = 0;
int ETAT_BP;

IPAddress ip(192, 168, 70, 211);

char ssid[] = "TP-LINK_H11CFL1";      // your network SSID (name) 
char pass[] = "ceciestlaprotectionwifih11cfl";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
  
  
 
 
   pinMode(BP,INPUT);
  digitalWrite(BP,HIGH);
  
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }

    SD.remove("fichier.txt");

  digitalWrite(4, LOW);
    digitalWrite(10, HIGH);

  ///////////////////////////////////// init SD
  if (!SD.begin(4)) {
    Serial.println("Erreur à l'initit de la carte SD");
    return;
    
   
}
Serial.println("init Ok.");

  digitalWrite(10, LOW);
    digitalWrite(4, HIGH);



  //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  } 
  
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  } 
  server.begin();
  // you're connected now, so print out the status:
  printWifiStatus();

}








void loop() {
  // listen for incoming clients
  WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 2");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          
           
                File theFile = SD.open("fichier.txt");
  if (theFile) {
    Serial.println("fichier.txt:");
    // lecture du fichier jusqu'à la fin:
    while (theFile.available()) {
    client.write(theFile.read());
  }
  // Fermeture du fichier:
  theFile.close();
} 

          
          
          
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
        
        
        
        
        
        
      }
    }
    // give the web browser time to receive the data
    delay(1);
    
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
  
  

  // Début de la boucle d'acquisition des données pour écrire sur la SD tant qu'il n'y a pas de clients connectés.
  
  
{
  

   
    DateTime now = rtc.now();
    

 
   
   
     ETAT_BP=digitalRead(BP);
     
     
 if (ETAT_BP==APPUI){
   
   A = 1;
   }
   else {
  
  A=0;
  }
  
  
  
  
  
  //// Traitement écriture sur la S
  
  
  if (A==1 && B==0) {
    
    
    
    
    File theFile;
theFile = SD.open("fichier.txt", FILE_WRITE); // ouverture de fichier.txt en écriture

if (theFile) {
    Serial.print("Ecriture de données sur la premiere ligne");
   
     theFile.println(),
    theFile.print("EN FONCTIONNEMENT "); 
    theFile.print(now.year(), DEC); 
    theFile.print('/'); 
    theFile.print(now.month(), DEC);
    theFile.print('/');
    theFile.print(now.day(), DEC);
    theFile.print(' ');
    theFile.print(now.hour(), DEC);
    theFile.print(':');
    theFile.print(now.minute(), DEC);
    theFile.print(':');
    theFile.print(now.second(), DEC);

    
    
    // Fermeture du fichier:
    theFile.close();
    Serial.println("C'est écrit !");
  } else {
    // impossible d'ouvrir/créer le fichier:
    Serial.println("Erreur d'ouverture de fichier.txt");
}
    
    
    
        B = 1;   }
    
                                       else 
                                            if (A==0 && B==1) {
       File theFile;
theFile = SD.open("fichier.txt", FILE_WRITE); // ouverture de fichier.txt en écriture

if (theFile) {
    Serial.print("Ecriture de données sur la premiere ligne");
   
    theFile.println(),
    theFile.print("EN ARRET          ");
    theFile.print(now.year(), DEC);
    theFile.print('/');
    theFile.print(now.month(), DEC);
    theFile.print('/');
    theFile.print(now.day(), DEC);
     theFile.print(' ');
    theFile.print(now.hour(), DEC);
    theFile.print(':');
    theFile.print(now.minute(), DEC);
    theFile.print(':');
    theFile.print(now.second(), DEC);

    
    
    // Fermeture du fichier:
    theFile.close();
    Serial.println("C'est écrit !");
  } else {
    // impossible d'ouvrir/créer le fichier:
    Serial.println("Erreur d'ouverture de fichier.txt");
}
                                                 B = 0; }

 
  
  
  }
   }


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Et la plus moyens de recevoir une info quand je me connecte sur le serveur ca me balance des caractères aléatoires.
J'ai bien essayer de gérer le tout avec des digitalWrite pour gérer les pin 4 et 10 mais absolument aucune différence j'ai l'impression que l'arduino gère tout seul les pins pour arrêter la SD ou le WIFI.

Une solution serais peut être de copier chaque ligne sur la ram et ensuite l'envoyer sur le réseau vu que la sd et le wifi ne peuvent fonctionner en même temps ?