Problème capteurs + serveur web sur Arduino Uno

Bonjour à tous
Dans mon projet de construction d’une station météo basé sur de l’Arduino, (voir mes anciens post ) je suis actuellement confronté à un problème que je n’arrive pas à résoudre.
J’espère que vous pourrez m’aider.
L’idée principale est de transférer mon fichier de donnée se trouvant sur la carte SD de mon Shield Ethernet de mon Arduino sur mon PC. Pour cela j’active un serveur web simplifié sur mon Arduino et mon PC, via le logiciel wget, se connectera sur le serveur WEB de l’Arduino et transféra ce fichier.
Ma problématique est que mes trois fonctions (lecture des capteurs, écriture sur le fichier SD, activation du serveur WEB) ne fonctionnent pas ensemble. Ils fonctionnent par deux, lecture du capteur, écriture sur le fichier SD ou écriture sur le fichier SD activation du serveur Web ou lecture du capteur, activation du serveur web. Mais les trois fonctions activées posent problèmes.
Je joins mon programme allégé, qui inclut la lecture de température un capteur BM180, avec l’écriture des données sur le fichier DATA.CSV de la carte SD et le serveur WEB
Pour cette exemple l’erreur indiqué sur le moniteur série dès que j’active les lignes de programmation de la lecture de la température est : » Impossible d’ouvrir le fichier de sortie » , “Vérifiez la carte SD et appuyez sur le bouton RESET” puis le programme se bloque.
Je vous remercie d’avance pour votre aide

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <SFE_BMP180.h> 
#include <Wire.h>

#define ALTITUDE 550.0
SFE_BMP180 pressure;
double t,h = 0;
//long oldDataTime;
bool first;
double T1,P,p0,a;
//unsigned long previousMillis=0 ;
//unsigned long interval = 30000;
char status;

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 77); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;


void setup()
{
   

    
    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for DATA.CSV file
    if (!SD.exists("DATA.CSV")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    
       
       //if (!pressure.begin()){
       //Serial.print("BMP180  no init success");
        //return;
       //}
       //Serial.println("BMP180 succes de l'initialisation");

    Ethernet.begin(mac, ip);  // initialize Ethernet device
    
}

void loop()
{  
   { 
    Serial.println("SUCCESS - Found DATA.CSV file.");
    webFile = SD.open("DATA.CSV", FILE_WRITE);
     if (!webFile) {
    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
  }
  if (webFile.size() == 0) {
    Serial.println(F("Ecriture de l'entete CSV ..."));
    webFile.println(F("Date; Heure; Temperature exterieur; humidité; Temperature intérieur; Pression abolue mb; Pression relative mb;Altitude calculée"));
    webFile.flush();
  }
  
  delay(500);
  
  status = pressure.startTemperature();
   if (status != 0) {
    delay(1000);
    status = pressure.getTemperature(T1);
    Serial.print(T1);
  }
  
      webFile.print(T1);
      webFile.println(";");
      webFile.flush();
      first = false;
      webFile.close();
   }
 
  
  server.begin(); 
EthernetClient client = server.available(); // try to get client

if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// last line of client request is blank and ends with \n
// respond to client only after last line received
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");
client.println();
// send web page
webFile = SD.open("DATA.CSV"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
}
break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} //end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
 
// end if (client)
}

delay(3000);
}

Jean-Christophe

Bonsoir
Toujours dans mes essais pour résoudre mes problèmes, voici mon dernier code où:

  • j’arrive à ouvrir mon fichier DATA se trouvant sur la carte SD
  • écrire des données (pour l’instant toujours les mêmes ) sur le fichier DATA
  • fermer le fichier
  • accéder depuis un ordinateur en local sur Ethernet au fichier DATA pour le copier sur celui-ci.
    repetition toutes les 3 secondes

Prochaine étape: intégrer les données du capteur BMP 180
Si quelqu’un à une idée merci d’avance

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

double t,h = 0;
bool first;
char status;

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 77); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;


void setup()
{
   

   
    Serial.begin(9600);       // for debugging
   
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for DATA.CSV file
    if (!SD.exists("DATA.CSV")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
   
   Ethernet.begin(mac, ip);  // initialize Ethernet device
   
}
void loop()
{ 
   {
   
    webFile = SD.open("DATA.CSV", FILE_WRITE);
     if (!webFile) {
    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
     }
  if (webFile.size() == 0) {
    Serial.println(F("Ecriture de l'entete CSV ..."));
    webFile.println(F("Date; Heure; Temperature exterieur; humidité; Temperature intérieur; Pression abolue mb; Pression relative mb;Altitude calculée"));
    webFile.flush();
    
  }
  delay(100);
    
      webFile.print("20");
      webFile.println(";");
      webFile.flush();
      first = false;
      webFile.close();
   
   }
 
server.begin();
EthernetClient client = server.available(); // try to get client

if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// last line of client request is blank and ends with \n
// respond to client only after last line received
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");
client.println();
// send web page
webFile = SD.open("DATA.CSV"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
}
//break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} //end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
 
// end if (client)
}

delay(3000);
}

Jean-Christophe

bonsoir
Apres l’ajout de la fonction pour lire la donnée température du BMP 180

  • j’arrive à ouvrir mon fichier DATA se trouvant sur la carte SD
  • écrire les données température sur le fichier DATA
  • fermer le fichier
    Mais je n’arrive plus à accéder à mon fichier depuis un ordinateur sur Ethernet en local
    voici mon nouveau code
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <SFE_BMP180.h>

double t,h,T1 = 0;
bool first;
char status;

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 77); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;


void setup()
{
   

   
    Serial.begin(9600);       // for debugging
   
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for DATA.CSV file
    if (!SD.exists("DATA.CSV")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }

   Ethernet.begin(mac, ip);  // initialize Ethernet device
   

}
void loop()
{ 
   {
   
    webFile = SD.open("DATA.CSV", FILE_WRITE);
     if (!webFile) {
    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
     }
  if (webFile.size() == 0) {
    Serial.println(F("Ecriture de l'entete CSV ..."));
    webFile.println(F("Date; Heure; Temperature exterieur; humidité; Temperature intérieur; Pression abolue mb; Pression relative mb;Altitude calculée"));
    webFile.flush();
    
  }
   }
  delay(100);

 {
  SFE_BMP180 pressure;
 pressure.begin();
 status = pressure.startTemperature();
   if (status != 0) {
    delay(1000);
    status = pressure.getTemperature(T1);
    
   }
   Serial.println(T1);
  
  }
 
  {
     delay(100);
      webFile.print(T1);
      webFile.println(";");
      webFile.flush();
      first = false;
      webFile.close();
   
   }
 
server.begin();
EthernetClient client = server.available(); // try to get client

if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// last line of client request is blank and ends with \n
// respond to client only after last line received
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");
client.println();
// send web page
webFile = SD.open("DATA.CSV"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
}
//break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} //end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
 
// end if (client)
}

delay(3000);
}

Si quelqu’un pouvait m’aider se serait tres sympas
merci d’avance