Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino, Problème envoi de données serveur Web

    21 décembre 2013 à 9:06:41

    Bonjour, 
    je possède un Arduino MEGA depuis près de 1 an avec un Ethernet Shield, ils fonctionnaient à merveille 24h/24. Jusqu'à se que j'implémente mes entrées analogiques.
    Mon projet consiste à récupérer  les informations de mon Arduino sur un site Web que j'ai créé en PHP. A l'aide d'un socket je récupère ma trame sur le site. 
    Au début le fonctionnement est normal, je récupère ma trame normalement, mais au bout d'un certain temps je reçois n'importe quoi, aussi bien la trame dans le désordre, aussi bien des caractères totalement fou...
    voici le code de l'arduino
    #include <SPI.h>
    #include <Ethernet.h>
    
    byte mac[] = {0xde, 0xde, 0xbe, 0xef, 0xac, 0xed}; 
    IPAddress ip(192, 168, 2, 100 );
    EthernetServer server =  EthernetServer(1234);
    
    
    //Declaration des E/S
    const int ES13  =  13;
    const int BILLE =  22;
    const int PIR   =  23;
    const int BUZZ  =  8; //PWM OUT
    const int TMP   =  0;
    const int LUM   =  1;
    
    //declaration et initialisation variable temperature
    float mesure = 0;
    float tension = 0;
    float temperature = 0;
    float tmp_max = 0;
    float tmp_min = 100;
    float luminosite = 0;
    
    int chaine = 0;  
    boolean intrus = false;
    String state1 = "ALARM OFF";
    String state13 = "D13 OFF";
    String temp = "0";
    
    void alarme()
    {
      analogWrite(BUZZ,255);
      delay(1000);
    
      analogWrite(BUZZ,200);
      //delay(1000);
    
    }
    
    void setup()   
    { 
      
      Ethernet.begin(mac, ip);
      server.begin();
      
      Serial.begin(19200);
      
      // initialize the LED pin as an output:
      pinMode(ES13, OUTPUT); 
      pinMode(PIR, INPUT);  
      pinMode(BILLE, INPUT); 
      pinMode(BUZZ, OUTPUT);
      
      analogReference(INTERNAL1V1);
    
    } 
    
    void loop()
    { 
      
      Get_Alarme();
      
      Get_lumiere();
      
      WebClient();
      
      //affichage_serial();
      
      delay(1000);
       
    } 
    
    void WebClient(void){
     EthernetClient client = server.available();
    
        
      if (client && client.connected()) {
        affichage_serveur();
       Serial.println("client connected");
        // si le client nous envoie quelque chose
        if (client.available() > 0) {
          chaine = client.read();
          if (chaine == 48)
            chaine = '0';
          else if (chaine == 49)
            chaine = '1';
          else if (chaine == 50)
            chaine = '2';
          else if (chaine == 51)
            chaine = '3';
          Serial.println(chaine);
          // On regarde ce que le client nous demande
          switch(chaine){
          case '0': // allumer la led
            digitalWrite(ES13, HIGH);
            state13 = "D13 ON";
            break;
          case '1': // éteindre la led
            digitalWrite(ES13, LOW);
            state13 = "D13 OFF";
            break;
          case '2': // allumer l'alarme
            state1 = "ALARM ON";
            break;
          case '3': // éteindre l'alarme
            state1 = "ALARM OFF";
            break;
            
          }
        }
        
      }
      client.flush();
      client.stop(); 
      
    }
    
    void Get_Alarme(void){
      if(state1 == "ALARM ON" || intrus == true)
      {     
        if(digitalRead(BILLE) == LOW || intrus == true || digitalRead(PIR) == HIGH){
            alarme();
            intrus = true;
        }    
      }
      
      if(state1 == "ALARM OFF") {
          analogWrite(BUZZ,0);
          intrus = false;
      }
    }
    
    void Get_lumiere(void){
      luminosite = analogRead(LUM); 
      
      mesure = analogRead(TMP);
      tension = mesure * 1.1 / 1024;
      
      temperature = tension * 100;
    
    }
    
    void affichage_serveur (void){
      server.print("DEBUT ");
      
      server.print(state13);
      server.print(" ");
      server.print(state1);
      server.print(" TEMPERATURE ");
      server.print(temperature);
      server.print(" INTRUSION ");
      server.print(intrus);
      server.print(" LUMINOSITE ");
      server.print(luminosite);
      
      server.println(" FIN");
    }
    
    void affichage_serial (void){
      Serial.print("DEBUT ");
      
      Serial.print(state13);
      Serial.print(" "); 
      Serial.print(state1);
      Serial.print(" TEMPERATURE "); 
      Serial.print(temperature);
      Serial.print(" INTRUSION "); 
      Serial.print(intrus);
      Serial.print(" LUMINOSITE "); 
      Serial.print(luminosite);
      
      Serial.println(" FIN");
      Serial.flush();
    }
    et le schéma 
    je reçois se genre de message : DEBU TEMPNIO 0 INDEBU TEM0.4 FI.DERATUREIN ...
    je pense a un dépassement de mémoire ou un buffer plein mais ce ne sont que des hypothèses

    -
    Edité par zarzak12 21 décembre 2013 à 10:06:54

    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2013 à 11:42:47

      Je ne connais pas trop comment fonctionne le serveur sur arduino mais as tu pense a un problème de gestion d'interruption ? Tu peux dans un premier temps rajouter des délais entre chacun des server.print pour essayer de debugger.
      • Partager sur Facebook
      • Partager sur Twitter
      Oalley.fr une carte intelligente pour se déplacer et se retrouver !
        21 décembre 2013 à 13:47:41

        J'ai un delay de 1 sec entre chaque envoie, sachant aussi que j'ai un cron qui vient reccuperer les données de l'Arduino toutes les minutes
        • Partager sur Facebook
        • Partager sur Twitter
          26 décembre 2013 à 8:02:00

          est ce qu'il est possible d'utiliser une autre méthode pour récupérer les infos envoyées par l'Arduino, depuis un serveur web? car j'ai remarqué que la com série continue à envoyer les infos normalement ...
          • Partager sur Facebook
          • Partager sur Twitter

          Arduino, Problème envoi de données serveur Web

          × 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