IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Arret fonction prise de capteurs


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Arret fonction prise de capteurs
    Bonjour
    Est-il possible d'arrêter la fonction lié a des capteurs .
    Je m'explique:
    Mon programme arduino est un serveur Web qui permet d'accéder à un fichier de données.
    Toute les 15 minutes, via la fonction Millis, le fichier de données se ferme, le serveur Web se coupe et les lectures des capteurs se lancent.
    J'aimerais , une fois les lectures de donnes effectuées que la fonction des capteurs se coupe car, sinon mon serveur Web n'est plus accessible.
    Je vous mets une partie de mon code à partir de la fonction Mills, qui lance ensuite la reception des mesures d' un module radio qui réceptionne diverses données et d'un capteur BMP180.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    if( millis() - previousMillis >= interval) {
        previousMillis = millis();
         webFile.close();
    server.available().stop();           // fermeture du fichier DATA et arrêt du serveur Web
    delay(1000);
     
     {
     
    mySwitch.enableReceive(0);
     
     temporaryValue = mySwitch.getReceivedValue();
     
    if(temporaryValue >= -300 && temporaryValue < 700){
    t = temporaryValue /10;                                                    //  réception des données temperature depuis                                                                                                      module reception 433 Mgz//
     
    Serial.println(t);
    }
     
     
    }
     
     
     
    delay(1500);
    {
      SFE_BMP180 pressure;
     pressure.begin();
     status = pressure.startTemperature();
       if (status != 0) {
        delay(1000);
        status = pressure.getTemperature(T1);                // réception des données tu capteur BMP180
     
       }
    delay(1500);
     
     
     
     webFile = SD.open("DATA.CSV", FILE_WRITE);                                  // Ouverture du fichier DATA
     delay(2000);
       Serial.println(T1);
          delay(100);
          webFile.print(T1);                                        // ecriture de la donnée sur le fichier DATA
          webFile.println(";");
          webFile.flush();
          first = false;
          webFile.close();                                           // fermeture du fichier de DATA
      }   
      }
     
    //delay(3000);
    }
    voilà l'idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    if( millis() - previousMillis >= interval) {
        previousMillis = millis();
         webFile.close();
    server.available().stop();           // fermeture du fichier DATA et arrêt du serveur Web
    delay(1000);
     
     {
     
    mySwitch.enableReceive(0);
     
     temporaryValue = mySwitch.getReceivedValue();
     
    if(temporaryValue >= -300 && temporaryValue < 700){
    t = temporaryValue /10;                                                    //  réception des données temperature depuis                                                                                                      module reception 433 Mgz//
     
    Serial.println(t);
     
     
                (  fermeture de la fonction module radio ) ;
    }
     
     
    }
     
     
     
    delay(1500);
    {
      SFE_BMP180 pressure;
     pressure.begin();
     status = pressure.startTemperature();
       if (status != 0) {
        delay(1000);
        status = pressure.getTemperature(T1);                // réception des données tu capteur BMP180
     
     
     
                   (  fermeture de la fonction module BMP180 ) ;
       }
    delay(1500);
     
     
     
     webFile = SD.open("DATA.CSV", FILE_WRITE);                                  // Ouverture du fichier DATA
     delay(2000);
       Serial.println(T1);
          delay(100);
          webFile.print(T1);                                        // ecriture de la donnée sur le fichier DATA
          webFile.println(";");
          webFile.flush();
          first = false;
          webFile.close();                                           // fermeture du fichier de DATA
      }   
      }
     
    delay(3000);
    }

    J'ai essayer de mettre par exemple une commande "pressure.begin().stop();" mais j'ai un message d'erreur lié je pense à la bibiliothèque
    Merci d'avance pour votre aide
    Jean-Christophe

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir
    personne n'a d'idées pour résoudre mon problème ?
    merci
    Jean-Christophe

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    L'indentation est assez catastrophique, ça ne facilite pas la lecture du code...

    La vraie question à se poser est : pourtant arrêtes-tu ton serveur web ? Ce n'est pas nécessaire et ce n'est pas bon du tout pour l'utilisateur qui était gentiment en train d'essayer de regarder ton site !

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour
    Merci d'avoir pris le temps de regarder mon problème. Pour ce qui concerne l'indentation, je suis vraiment désolé, je débute en programmation. Je joins de nouveau mon code, en espérant qu'il sera plus lisible.
    Mon serveur Web n'est pas accessible depuis l’extérieur. il est présent pour que mon PC, sur lequel sera installé mon logiciel météo, se connecte, toutes les 15 minutes, via wget et transfert le fichier DATA se trouvant sur la carte SD de l'Arduino.

    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.

    L'idée donc est de couper le serveur Web au bout de 15 minutes, de lancer les relevés de températures, d’écrire les données sur la carte SD.de relancer le serveur WEB pour qu'il soit de nouveau accessible du PC. Dans l’état actuel des choses , ce programme ne fonctionne qu'une fois !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
                  ////////// extinction du serveur Web et fermeture du fichier DATA //////////////// 
     
    if( millis() - previousMillis >= interval) 
        {
          previousMillis = millis();
          webFile.close();
          server.available().stop();
          delay(1000);
     
                               ////////// Réception de la donnée température depuis le module 433 Mgz//////////////// 
            {
              mySwitch.enableReceive(0);
              temporaryValue = mySwitch.getReceivedValue();
     
      if(temporaryValue >= -300 && temporaryValue < 700)
         {
           t = temporaryValue /10;
           Serial.println(t);
         }
     
             }
     
          delay(1500);
     
                                //////////  lecture donnée température intérieur //////////////// 
        {
        SFE_BMP180 pressure;
        pressure.begin();
        status = pressure.startTemperature();
      if (status != 0) 
           {
             delay(1000);
             status = pressure.getTemperature(T1);
           }
     
       delay(1500);
     
                               //////////  ouverture du fichier DATA et ecriture des données température et température intérieur //////////////// 
     
       webFile = SD.open("DATA.CSV", FILE_WRITE);
     
       delay(2000);
     
       Serial.println(T1);
          delay(100);
          webFile.print(T1);
          webFile.println(";");
          webFile.flush();
          first = false;
          webFile.close();
        }    
      }
          delay(2000);
    }
    Mon idée serait, une fois les données inscrites sur la carte SD, que les fonctions des capteurs soient coupées pour que mon serveurweb soit de nouveau accessible


    Merci d'avance pour vote aide
    Jean-Christophe

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Avant d'appeler ce code, tu avais appelé un autre code qui démarrait ton serveur web. Pourquoi ne rappelles-tu pas cet autre code à nouveau pour re-démarrer ton serveur ?

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    bonjour,
    Le démarrage du serveur Web est intégré au début de ma fonction Loop.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    void loop()
    { 
     
    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)
    }
     
     ////////// extinction du serveur Web et fermeture du fichier DATA //////////////// 
     
    if( millis() - previousMillis >= interval) 
        {
          previousMillis = millis();
          webFile.close();
          server.available().stop();
          delay(1000);
     
                               ////////// Réception de la donnée température depuis le module 433 Mgz//////////////// 
            {
              mySwitch.enableReceive(0);
              temporaryValue = mySwitch.getReceivedValue();
     
      if(temporaryValue >= -300 && temporaryValue < 700)
         {
           t = temporaryValue /10;
           Serial.println(t);
         }
     
             }
     
          delay(1500);
     
                                //////////  lecture donnée température intérieur //////////////// 
        {
        SFE_BMP180 pressure;
        pressure.begin();
        status = pressure.startTemperature();
      if (status != 0) 
           {
             delay(1000);
             status = pressure.getTemperature(T1);
           }
     
       delay(1500);
     
                               //////////  ouverture du fichier DATA et ecriture des données température et température intérieur //////////////// 
     
       webFile = SD.open("DATA.CSV", FILE_WRITE);
     
       delay(2000);
     
       Serial.println(T1);
          delay(100);
          webFile.print(T1);
          webFile.println(";");
          webFile.flush();
          first = false;
          webFile.close();
        }    
      }
          delay(2000);
    }
    Hier soir j'ai fait des tests en ajoutant la fonction
    asm volatile (" jmp 0"); qui permet de faire un reset de l'arduino à la fin du Loop
    Mon serveur Web se relance bien mais aucune données n'est ecritent sur le fichier DATA (alors que le fichier s'ouvre bien)

    Si j’enlève cette fonction mon serveur Web n'est accessible qu'une fois, avant le lancement des mesures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
                                                                    ////////// extinction du serveur Web et fermeture du fichier DATA ////////////////
    if( millis() - previousMillis >= interval) 
        {
          previousMillis = millis();
          webFile.close();
     
     
          server.available().stop();
     
     
                                                               ////////// Réception de la donnée température depuis le module 433 Mgz//////////////// 
            if (!server.available()) {
              mySwitch.enableReceive(0);
              temporaryValue = mySwitch.getReceivedValue();
     
      if(temporaryValue >= -300 && temporaryValue < 700)
         {
           t = temporaryValue /10;
     
         }
     
     
     
          //delay(1500);
     
                                                //////////  lecture donnée température intérieur //////////////// 
     
        SFE_BMP180 pressure;
        pressure.begin();
        status = pressure.startTemperature();
      if (status != 0) 
           {
             delay(1000);
             status = pressure.getTemperature(T1);
           }
     
       //delay(1500);
     
                                          //////////  ouverture du fichier DATA et ecriture des données température et température intérieur //////////////// 
     
       webFile = SD.open("DATA.CSV", FILE_WRITE);
        if (webFile) 
            {
               Serial.println(F(" le fichier DATA  ouvert"));
            }
       delay(2000);
       Serial.println(t);
       Serial.println(T1);
          delay(100);
          webFile.print(T1);
          webFile.println(";");
          webFile.flush();
          first = false;
          webFile.close();
          delay(1000);
            }
          asm volatile ("  jmp 0");
        }
        }
    cordialement

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il faut vraiment que tu revois la logique de ton code. Avec une bonne logique, d'abord écrite en pseudo-code puis traduite en code, tu t'en sortiras. Là, je pense que tu es comme moi et que tu te perds dans les chemins d'exécution.

    La fonction loop est faite pour être appelé.... en boucle. Dedans, tu devrais regarder le temps pour faire si c'est le moment de la mise à jour. Dans ce cas tu arrêtes ton serveur, tu fais ta mesure et tu relances ton serveur ; sinon, tu appelles la fonction de gestion de ton serveur.

    Il faut que tu fasses des fonctions pour simplifier ton code. Il faut que tu fasses attention à l'indentation. Il y a énormément de delay(), c'est généralement mauvais signe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asm volatile (" jmp 0");

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse
    je vais suivre tes conseils et repartir de 0
    cordialement

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Des fois, repartir de zéro est une bonne décision. Cela permet de clairement reposer la structure et le flow d'exécution.

    Ce ne veut pas dire tout jeter pour autant. Tu peux reprendre des morceaux ton ancien code mais il faut le faire avec parcimonie et quand tu penses que ces morceaux sont de qualité.

    Bon courage et n'hésite pas à poser tes futures questions sur le forum.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    J'ai essayé de simplifier mon code avec le peu de mes connaissances et en essayant de trouver des informations .
    L'idée principale est que la fonction principale de mon programme est un serveurWeb simplifié au maximum sur lequel un fichier le fichier de données méteo " DATA.CSV" est accessible depuis un PC de mon réseau local.
    Toutes les 15 minutes celui-ci s’arrêtera, les données des capteurs seront mises à jour sur le fichier DATA.CSV et le loop recommencera avec le redémarrage du serveur.
    Dans la version de test, dont je joins le code, le serveur se coupe toutes les 30 secondes et la donnée température du capteur BMP180 est mise à jour.
    Tout fonctionne tres bien
    Avez vous des remarques, des améliorations à apporter sur celui-ci avant que j'ajoute le code pour d'autres capteurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    #include <SPI.h>      // librairie pour Ethernet et ecran LCD
    #include <Ethernet.h> // librairie Ethernet
    #include <SD.h>       // librairie lecteur carte SD
    #include <SFE_BMP180.h>
    #include <RCSwitch.h>
    #include <Wire.h>
     
     
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    float temporaryValue;
    double t,h,T1 = 0;
    bool first;
    unsigned long previousMillis=0 ;
    unsigned long interval = 30000;
     
    IPAddress ip(192,168,1,77);
    EthernetServer server(80);
     
    void setup()
     
    { 
     Serial.begin(9600); // ouverture de la communication série
     
     // activation du serveur
       Ethernet.begin(mac, ip);
       server.begin();
     
       SD.begin(4);
     
    } 
     
    void loop() {
     
                                                     ////////// démarrage du serveur Web //////////////// 
     
      EthernetClient client = server.available();
      if (client)
      {
     
       String buffer = "";
       boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            Serial.write(c);
     
           buffer +=c;
    static String requeteHTML;
    int GetPosition = buffer.indexOf("GET /");// position de la chaine "GET /" dans la requête
    int HTTPPosition = buffer.indexOf(" HTTP");// position de la chaine " HTTP" dans la requête
    requeteHTML = buffer.substring(GetPosition+5, HTTPPosition); // récupère la valeurs en chaîne de caractère.
     
            if (c == '\n' && currentLineIsBlank) {
     
     
    Serial.println ();
    Serial.print("La requete est ");
    Serial.print (requeteHTML);
    Serial.println ();
     
     
    // traitement de la requête et envoie des images et fichier stocker sur la carte microsd
    if (requeteHTML != "")
      {
      // debut
      static char namefile[20];
      requeteHTML.toCharArray(namefile, 20); // conversion en char pour afficher dans la fonction SD.open
      File webFile;
       webFile = SD.open(namefile);
      if (webFile)
        {
        while(webFile.available())
          {
         client.write(webFile.read()); // send web page to client
           }
        //webFile.close();   
        }
      }
              break;
            }
            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 disconnected");
      }
     
                                                    ////////// extinction du serveur Web  //////////////// 
     
        if( millis() - previousMillis >= interval) 
      {
          previousMillis = millis();
          server.available().stop();
     
                                                   //////////  lecture donnée température du capteur BMP180 //////////////// 
          char status;
          SFE_BMP180 pressure;
          pressure.begin();
          status = pressure.startTemperature();
        if (status != 0) 
              {
            status = pressure.getTemperature(T1);
              }
     
                                //////////  Ouverture du fichier de données, écriture de la donnée température, fermeture du fichier de données  //////////////// 
     
           File webFile;
           webFile = SD.open("DATA.CSV", FILE_WRITE);
        if (webFile) 
              {
               Serial.println(F(" le fichier DATA  ouvert"));
              }
     
            Serial.println(T1);
            webFile.print(T1);
            webFile.println(";");
            webFile.flush();
            first = false;
            webFile.close();
     
      } // fin de la fonction if( millis)
    }

    Merci

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    J'ai ajouté la fonction de réception des données de mon module radio à la suite de la fonction de relevé de mon capteur BMP 180
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mySwitch.enableReceive();
            temporaryValue = mySwitch.getReceivedValue();
     
         if(temporaryValue >= -300 && temporaryValue < 700)
             {
           t = temporaryValue /10;
             }
    et de nouveau plus aucunes données sont écrites sur le fichier DATA, et mon serveur ne devient plus accessible.

    Je vous joins le code complet posant problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    #include <SPI.h>      // librairie pour Ethernet et ecran LCD
    #include <Ethernet.h> // librairie Ethernet
    #include <SD.h>       // librairie lecteur carte SD
    #include <SFE_BMP180.h>
    #include <RCSwitch.h>
    #include <Wire.h>
     
    RCSwitch mySwitch = RCSwitch();
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    float temporaryValue;
    double t,h,T1 = 0;
    bool first;
    unsigned long previousMillis=0 ;
    unsigned long interval = 30000;
    long value = mySwitch.getReceivedValue();
     
    IPAddress ip(192,168,1,77);
    EthernetServer server(80);
     
    void setup()
     
    { 
     Serial.begin(9600); // ouverture de la communication série
     
     // activation du serveur
       Ethernet.begin(mac, ip);
       server.begin();
     
       SD.begin(4);
     
    } 
     
    void loop() {
     
                                                                                    ////////// démarrage du serveur Web ////////////////
      EthernetClient client = server.available();
      if (client)
      {
     
       String buffer = "";
       boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            Serial.write(c);
     
           buffer +=c;
    static String requeteHTML;
    int GetPosition = buffer.indexOf("GET /");// position de la chaine "GET /" dans la requête
    int HTTPPosition = buffer.indexOf(" HTTP");// position de la chaine " HTTP" dans la requête
    requeteHTML = buffer.substring(GetPosition+5, HTTPPosition); // récupère la valeurs en chaîne de caractère.
     
            if (c == '\n' && currentLineIsBlank) {
     
     
    Serial.println ();
    Serial.print(F("La requete est "));
    Serial.print (requeteHTML);
    Serial.println ();
     
     
    // traitement de la requête et envoie des images et fichier stocker sur la carte microsd
    if (requeteHTML != "")
      {
      // debut
      static char namefile[20];
      requeteHTML.toCharArray(namefile, 20); // conversion en char pour afficher dans la fonction SD.open
      File webFile;
       webFile = SD.open(namefile);
      if (webFile)
        {
        while(webFile.available())
          {
         client.write(webFile.read()); // send web page to client
           }
        //webFile.close();   
        }
      }
              break;
            }
            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 disconnected");
      }
                                                                                      ////////// extinction du serveur Web  //////////////// 
     
        if( millis() - previousMillis >= interval) 
      {
          previousMillis = millis();
          server.available().stop();
     
                                                                                       //////////  lecture donnée température du capteur BMP180 ////////////////
          char status;
          SFE_BMP180 pressure;
          pressure.begin();
          status = pressure.startTemperature();
        if (status != 0) 
              {
            status = pressure.getTemperature(T1);
              }
                                                                                       //////////  lecture donnée du module radio 433ghZ////////////////
     
            mySwitch.enableReceive();
            temporaryValue = mySwitch.getReceivedValue();
     
         if(temporaryValue >= -300 && temporaryValue < 700)
             {
           t = temporaryValue /10;
             }
     
                                       //////////  Ouverture du fichier de données, écriture de la donnée température, fermeture du fichier de données  //////////////// 
           File webFile;
           webFile = SD.open("DATA.CSV", FILE_WRITE);
        if (webFile) 
              {
               Serial.println(F(" le fichier DATA  ouvert"));
              }
     
     
            Serial.println(T1);
            webFile.print(T1);
            webFile.println(F(";"));
            webFile.flush();
            first = false;
            webFile.close();
     
     
         }                                              // fin de la fonction if( millis)
       }
    Je précise que ma fonction relevée des données de mon module 433ghz si il n'est pas associé à la fonction de relevée du BMP180 tout fonctionne très bien.
    Il y a donc bien quelque chose qui pose problème entre ces deux fonctions.
    Mais quoi ?
    merci

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    server.available().stop();
    Cette ligne me semble suspecte... Tu attends un nouveau client pour faire ton stop ?

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Si je comprends mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( millis() - previousMillis >= interval) 
      {
          previousMillis = millis();
          server.available().stop();
    Si l'intervalle de temps apres le démarrage du programme est supérieur à 30 secondes, l'ancien temps deviens le nouveau temps, le serveur Web n'est plus disponible.

    Ensuite les données des capteurs sont enregistrés. Fin de la LOOP
    Au redemarrage de la loop suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EthernetClient client = server.available();
    Le serveur Web est de nouveau disponible

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    https://www.arduino.cc/en/Reference/ServerAvailable
    Gets a client that is connected to the server and has data available for reading
    Moi, je pense que available() est une bloquante qui attend qu'un client se connecte. Quand cela arrive, elle renvoie un EthernetClient.

    Ainsi, server.available().stop() attend un client et fait stop() dessus dés qu'il devient disponible.

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour
    Je suis toujours avec mon problème et j'ai beau tourner mon programme dans tous les sens, impossible de faire fonctionner ensemble, l'enregistrement des données de mes capteurs dans un fichier sur la carte SD et le partage via une connexion internet de se fichier.

    Je viens de trouver sur le site arduino https://www.arduino.cc/en/Main/ArduinoEthernetShieldV1 cette information.

    "Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work.

    Note that because the W5100 and SD card share the SPI bus, only one can be active at a time. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the W5100, set digital pin 10 as a high output. "

    Mon problème pourrait-il venir de là ?

    jean-Christophe

Discussions similaires

  1. Fonction arret d'urgence
    Par BenNibbi dans le forum VB.NET
    Réponses: 4
    Dernier message: 18/05/2007, 18h36
  2. Réponses: 4
    Dernier message: 18/05/2007, 15h37
  3. Question d'arrete une fonction
    Par etplus dans le forum C
    Réponses: 2
    Dernier message: 12/01/2007, 16h17
  4. [MFC] Arreter execution d'une fonction
    Par ricky78 dans le forum MFC
    Réponses: 1
    Dernier message: 07/11/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo