Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Detection de Mouvement + Ethernet Shield

    23 novembre 2018 à 14:01:17

    Bonjour, je suis en terminale STI2D SIN, on a un projet de ruche automatisée ou je m'occupe du traitement des donnés. Cela veut dire :

     - Affichage des donnés des differents capteurs sur un site internet a l'aide d'Arduino + Un Shield Ethernet.

     - Donnés sauvegardé dans un fichier .txt permettant de faire des statistiques  (sur une journée par exemple)

    Ayant jamais utilisé le shield Ethernet , j'essaye de prendre les différents capteurs un par un et faire afficher sur un site internet. 

    J'ai un problème avec le capteur de mouvement  ( mon capteur : https://i.imgur.com/uj5K0w8.jpg ) . Mon capteur ne détecte pas quand je fais un mouvement donc sur le site reste tous le temps sur " Pas de mouvement detectéee " . Je ne sais pas d'ou sa viens . Aussi il y a rien d'afficher dans le moniteur serie alors que j'ai un Serial.begin(9600) + des serial.println)

    Voici mon programme  :

    #include <Ethernet.h>
    #include <SPI.h>
    
    int pirstat = 7;
    byte mac[]= {0x90, 0xA2, 0xDA, 0x80, 0x0A, 0x9C };
    IPAddress ip(192,168,21,11);
    EthernetServer server(80);
    
    void setup() {
    Serial.begin(9600);  
    pinMode (pirstat, INPUT);
    Ethernet.begin(mac, ip);
    server.begin();
    }
    
    void loop() {
    boolean lirepir = digitalRead(pirstat);
    EthernetClient client = server.available();
     if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            if (c == '\n' && currentLineIsBlank) {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/html");
              client.println("Connection: fermée");  
        client.println("Rafraichissement: 5");
              client.println();
            
              client.println("<!DOCTYPE HTML>");
              client.println("<html>");
              client.println("<title>Detection de Mouvement </title>");
              client.println("<div align=center>"); 
              client.println("<h2>Detection de Mouvement Arduino+Ethernet Shield</h2>");
              client.println("<tr><td><hr size=4 color=#0099FF> </td></tr>");
            }
             
             if (lirepir == 1){
                Serial.println("Alerte : Mouvement detéctée");
                client.print("<h3>Alerte : Mouvement detectée</h3>");
                    }
                 else { 
               Serial.println("Pas de mouvement detectée");  
               client.print("<h3>Pas de mouvement detectée</h3>"); 
                 }
                {
                client.println("<br/>");
              client.println("</div>");
              client.println("</html>");
              break;
            } 
          }
        } //close while loop
        client.stop();
      delay(5000);       
    }
    }

    Voila, merci d'avance de vos reponses :)

    -
    Edité par Goldorage 23 novembre 2018 à 14:03:21

    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2018 à 11:46:46

      Avec un code bien indenté, c'est beaucoup mieux car on voit tout de suite le problème ;)

      void loop() {
          boolean lirepir = digitalRead(pirstat);
          EthernetClient client = server.available();
          if (client) {
              boolean currentLineIsBlank = true;
              while (client.connected()) {
                  if (client.available()) {
                      char c = client.read();
                      if (c == '\n' && currentLineIsBlank) {
                          client.println("HTTP/1.1 200 OK");
                          client.println("Content-Type: text/html");
                          client.println("Connection: fermée");
                          client.println("Rafraichissement: 5");
                          client.println();
      
                          client.println("<!DOCTYPE HTML>");
                          client.println("<html>");
                          client.println("<title>Detection de Mouvement </title>");
                          client.println("<div align=center>");
                          client.println("<h2>Detection de Mouvement Arduino+Ethernet Shield</h2>");
                          client.println("<tr><td><hr size=4 color=#0099FF> </td></tr>");
                      }
      
                      if (lirepir == 1) {
                          Serial.println("Alerte : Mouvement detéctée");
                          client.print("<h3>Alerte : Mouvement detectée</h3>");
                      } else {
                          Serial.println("Pas de mouvement detectée");
                          client.print("<h3>Pas de mouvement detectée</h3>");
                      }
                      {
                          client.println("<br/>");
                          client.println("</div>");
                          client.println("</html>");
                          break;
                      }
                  }
              } //close while loop
              client.stop();
              delay(5000);
          }
      }

      Voici ce qu'il se passe :

      Imaginons qu'un client se connecte, il est récupéré ligne 3 et on rentre dans le if de la ligne 4.

      A ce stade, il est fort probable que le client est encore connecté dans on rentre dans le while de la ligne 6.

      Le client n'a peut-être pas encore envoyé sa demande donc on ne rentre pas forcément dans le if de la ligne 7, mais ce n'est pas grave car on test ce if en boucle grâce au while.

      Dès que le client envoie le premier caractère du header HTTP, on rentre dans le if de la ligne 7 pour lire ce caractère ligne 8.

      Vu que le header HTTP est composé de multitude de caractère, on devrait théoriquement rentrer une multitude de fois dans ce if ligne 7.

      Sauf que problème... le programme continu de s'exécuter... ligne 24, ton programme va envoyer des données alors qu'il n'est même pas encore rentré dans le if de la ligne 9 envoyant le header.

      Et plus grave encore, ton programme exécute aussi les ligne 31 à 36, et donc ce "break" de la ligne 36 vient couper la boucle while.

      Donc on final, on n'attend même pas que le client ai tout envoyé, on coupe la boucle while dès le premier caractère reçu, puis on le dégage aussitôt  avec le client.stop de la ligne 39.

      Tu devrais plutôt avoir ce code :

      void loop() {
          boolean lirepir = digitalRead(pirstat);
          EthernetClient client = server.available();
          if (client) {
              boolean currentLineIsBlank = true;
              while (client.connected()) {
                  if (client.available()) {
                      char c = client.read();
                      if (c == '\n' && currentLineIsBlank) {
                          
                          client.println("HTTP/1.1 200 OK");
                          client.println("Content-Type: text/html");
                          client.println("Connection: fermée");
                          client.println("Rafraichissement: 5");
                          client.println();
      
                          client.println("<!DOCTYPE HTML>");
                          client.println("<html>");
                          client.println("<title>Detection de Mouvement </title>");
                          client.println("<div align=center>");
                          client.println("<h2>Detection de Mouvement Arduino+Ethernet Shield</h2>");
                          client.println("<tr><td><hr size=4 color=#0099FF> </td></tr>");
      
                          if (lirepir == 1) {
                              Serial.println("Alerte : Mouvement detéctée");
                              client.print("<h3>Alerte : Mouvement detectée</h3>");
                          } else {
                              Serial.println("Pas de mouvement detectée");
                              client.print("<h3>Pas de mouvement detectée</h3>");
                          }
                          
                          client.println("<br/>");
                          client.println("</div>");
                          client.println("</html>");
                          break;
                          
                      }
                  }
              }
              delay(1000); // Un petit delay avant le stop
              client.stop();
          }
      }



      -
      Edité par lorrio 25 novembre 2018 à 11:47:18

      • Partager sur Facebook
      • Partager sur Twitter
        25 novembre 2018 à 17:01:55

        Merci , je test sa des que je peux . Comme un con , j'ai pas pris le matériel pour travailler chez moi
        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2018 à 14:24:00

          Le programme marche en modifiant le void loop() que tu m'a passé par contre au bout de 5 secondes : Le serveur à l’adresse X met trop de temps à répondre.

          EDIT : problème réglée je crois que sa viens d'un problème d'IP car en changeant l'IP par une adresse aléatoire cela marche

          -
          Edité par Goldorage 29 novembre 2018 à 14:56:10

          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2019 à 14:48:15

            Bonjour, je suis de retour 2 mois après. J'ai bien avancé sur ma partie du projet . j'ai les 4 capteurs qui marchent seul avec affichage sur site internet . Maintenant, je dois faire fonctionner les 4 capteurs en même temps. Mais avant cela j'ai quelque questions : 

            - Est ce qu'une Arduino Uno est suffisante ? L'alimentation 5v est elle suffisante?

            - Faut-il changer de carte pour utiliser une Méga par exemple ?

            - Est ce que je peux brancher les 4 capteurs directement sur la Carte sans utiliser de plaque d'essai ou cela est obligatoire?

            Merci de votre reponse

            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2019 à 16:26:39

              Un capteur PIR renvoie une donnée numérique tout ou rien : soit HIGH, soit LOW.

              L'arduino UNO n'aura donc aucun mal à gérer 4 capteurs en simultanées, voir même beaucoup plus.

              En revanche, il faut vérifier si cela passe au niveau consommation sur le 5V.

              Pour cela, il nous faudrait la référence de ton capteur, ainsi que la façon dont tu alimentes ton arduino (par USB ? par alim 9V ou 12V ? par alim 5V ? autre ?)

              • Partager sur Facebook
              • Partager sur Twitter
                25 janvier 2019 à 13:23:19

                Bonjour ,

                J'ai pas précisé j'ai pas 4 fois le même capteur mais 4 capteurs différents qui permet d'avoir différentes informations sur la ruche

                - 1 capteur de poids

                - 1 DHT11 

                - 1 Photorésistance

                - 1 Détecteur de mouvement

                Vu que pour l'instant je travaillais sur les capteurs un par un , l'USB suffisait . Mais depuis que j'essaye de faire fonctionner plusieurs capteurs en même temps, le prof ma donné une prise jack ( http://duinoedu.com/store1/alimentations-pour-arduino/365-ujp1.html?live_edit&liveToken=468b43f2f9d64dbc01a97f482befaab1&ad=admin5375&id_shop=&id_employee=1 ) mais je sais pas trop comment sa marche, je suppose que on doit le relié a une alim non?

                -
                Edité par Goldorage 25 janvier 2019 à 13:26:13

                • Partager sur Facebook
                • Partager sur Twitter
                  25 janvier 2019 à 16:42:55

                  La consommation des 4 capteurs que tu sites est négligeable par rapport à la consommation de l'Arduino et du shield ethernet.

                  Donc il n'y aura aucun problème à les connecter tous les 4 à l'arduino sur USB.

                  Si tu tiens à utiliser ta prise Jack, il te faut une alimentation 9V ou 12V à brancher dessus en faisant attention à la polarité.

                  Sinon, tu peux aussi utiliser un chargeur de téléphone branché en USB à l'arduino.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 janvier 2019 à 16:55:40

                    Merci pour les réponses, moi aussi au début je me suis dis que l’alimentation USB allait suffire mais bon je me suis dis si mon prof me l'a donné c'est pour une bonne raison. Vu que vous avez confirmé ce que je pensais, je vais rester sur l'USB.

                    Je vais pouvoir commencer a travailler

                    -
                    Edité par Goldorage 25 janvier 2019 à 16:56:10

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mars 2019 à 13:59:11

                      Bonjour, je suis de retour et j'ai un problème en essayant de mettre les capteurs en un seul programme. J'ai un programme qui me trouve aucun erreur . Mais j'ai un problème : mon site affiche uniquement le titre et aucun valeur. Donc je me demandais, programme pas bon ou mauvais branchement ?

                      Programme : 

                      #include <Ethernet.h>
                      #include <SPI.h>
                      int pirstat = 7;
                      int valeur;
                      int capteur = A0;
                      byte mac[] = {0x90, 0xA2, 0xDA, 0x80, 0x0A, 0x9C };
                      IPAddress ip(192,168,21,11);
                      EthernetServer server(80);
                      EthernetClient client ;
                      boolean lirepir = digitalRead(pirstat);
                      
                      void setup() {
                        Serial.begin(9600);
                        Ethernet.begin(mac, ip);
                        server.begin();  
                        pinMode (pirstat, INPUT);
                      }
                      
                      void loop() {
                        ini();
                        pr();
                        mouvement();
                         }
                      
                      void pr() {
                      valeur = analogRead(capteur);  
                      client.println(valeur);
                      }
                      
                      void mouvement(){
                       if (lirepir == 1){
                      client.print("<h3>Alerte : Mouvement detectée</h3>");
                                      }
                                   else 
                                   {
                       client.print("<h3>Pas de mouvement detectée</h3>");
                                   }  
                      }
                      void ini(){
                         client = server.available();
                        if (client) {
                          boolean currentLineIsBlank = true;
                          while (client.connected()) {
                            if (client.available()) {
                              char c = client.read();
                              if (c == '\n' && currentLineIsBlank) {
                                
                                client.println("<!DOCTYPE HTML>");
                                client.println("<html>");
                                client.println("<title>Detection de Mouvement </title>");
                                client.println("<div align=center>");
                                client.println("<h2>Detection de Mouvement Arduino+Ethernet Shield</h2>");
                                client.println("<tr><td><hr size=4 color=#0099FF> </td></tr>");
                                client.println("<br/>");
                                client.println("</div>");
                                client.println("</html>");
                                client.stop();
                                delay(1); 
                                break;
                              } 
                            }
                           }
                        }
                      }




                      Branchement : https://i.imgur.com/pFw5jFE.jpg

                      -
                      Edité par Goldorage 8 mars 2019 à 14:00:17

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2019 à 22:18:46

                        C'est plutôt logique qu'il n'y ai rien qui s'affiche.

                        En effet, ta fonction loop est découpée en 3 fonctions : ini, pr puis mouvement.

                        Du coup, le programme exécute d'abord ini, qui se charge de vérifier si un client est là et si il y en a un, alors elle envoie toute la page HTML (ligne 48 à 56) puis elle coupe la connexion avec client.stop de la ligne 57.

                        Vient ensuite la fonction pr qui se charge de lire une valeur et de l'envoyé au client.

                        Sauf que se client a déjà été déconnecté par la fonction ini donc il ne recevra pas grand chose...

                        Puis on termine avec la fonction mouvement qui va elle aussi tenter d'envoyer des données à un client qui est déconnecté.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 mars 2019 à 15:12:17

                          Ah oui effectivement sa marche mieux sans le client.stop!! Merci de l'aide
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Arduino] Detection de Mouvement + Ethernet Shield

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown