Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connexion Arduino UNO avec ESP8266

    16 mai 2018 à 16:14:50

    Bonjour,

    J'essaie de connecter une arduino UNO avec un module Esp8266.

    Mon but est de recevoir des données d'une page web sur la carte arduino.

    Cela fonctionne une fois sur 3, je ne comprend pas pourquoi, voici-mon code :

    #include <SoftwareSerial.h>
     
    #define DEBUG true
     
    SoftwareSerial esp8266(1,0,true);
    
    void setup()
    {
      //INITIALISATION  
      Serial.begin(9600);
      esp8266.begin(9600);
    
      //LED TOGGLE
      pinMode(13,OUTPUT);
      pinMode(10,OUTPUT);
      pinMode(11,OUTPUT);
      pinMode(12,OUTPUT);
      digitalWrite(13,HIGH);
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,HIGH);
      
    
      sendData("AT+RST\r\n",2000,DEBUG); // reset module
      sendData("AT+CWMODE=3\r\n",1000,DEBUG); // configure as access point
      sendData("AT+CIFSR\r\n",1000,DEBUG); // get ip address
      sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
      sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // turn on server on port 80
      sendData("AT+CIOBAUD=9600\r\n",1000,DEBUG);
      Serial.println("CONNEXION TERMINE");
    }
     
    void loop()
    {
      if(esp8266.available())
      {
        if(esp8266.find("+IPD,"))
        {
          Serial.println("MSG TROUVE");
          delay(1000);
          
          int connectionId = esp8266.read()-48;   
          esp8266.find("pin="); // advance cursor to "pin="
    
          int pinNumber = (esp8266.read()-48)*10; // get first number i.e. if the pin 13 then the 1st number is 1, then multiply to get 10
          pinNumber += (esp8266.read()-48); // get second number, i.e. if the pin number is 13 then the 2nd number is 3, then add to the first number
         
          //DEMARRAGE DU MOTEUR
          digitalWrite(pinNumber, LOW);
          Serial.println("MARCHE");
          delay(5000);
          digitalWrite(pinNumber, HIGH);
    
          //Close command
          String closeCommand = "AT+CIPCLOSE="; 
          closeCommand+=connectionId; // append connection id
          closeCommand+="\r\n";
          sendData(closeCommand,1000,DEBUG); // close connection
        }
      }
    }
    
     
    /*
    * Name: sendData
    * Description: Function used to send data to ESP8266.
    * Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no)
    * Returns: The response from the esp8266 (if there is a reponse)
    */
    String sendData(String command, const int timeout, boolean debug)
    {
        String response = "";
        
        esp8266.print(command); // send the read character to the esp8266
        
        long int time = millis();
        
        while( (time+timeout) > millis())
        {
          while(esp8266.available())
          {
            
            // The esp has data so display its output to the serial window 
            char c = esp8266.read(); // read the next character.
            response+=c;
          }  
        }
        
        if(debug)
        {
          Serial.print(response);
          
        }
        
        return response;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2018 à 18:06:52

      Bonjour,

      Ce n'est peut être pas ça, parce que ça dépend de la longueur de la requête effectivement envoyée par le navigateur (une requête simple semble faire plus de 500 octets), mais à 9600 bauds, l'esp va t'envoyer 1200 octets par secondes, le buffer de réception de SoftwareSerial n'est que de 64 octets (par défaut), donc si tu fais des pauses avec des delay pendant la réception, le buffer risque d'être écrasé par les nouvelles données avant que tu ais eu le temps de les lire.

      Essaye de supprimer tous les delay pour voir si ça corrige le problème.

      PS: L'esp8266 peut aussi directement héberger un serveur web, il a assez de mémoire et des bibliothèques pour le gérer facilement.

      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2018 à 18:43:59

        Les pins 0 et 1 de l'arduino correspondent aux pins Tx/Rx utilisée par le Serial pour dialoguer avec le PC.

        Tu ne peux donc pas utiliser ces pins pour dialoguer avec l'EPS au travers d'un SoftwareSerial, ça va forcément faire un conflit entre le Serial et le SoftwareSerial qui vont utiliser les mêmes pins.

        Deux solutions possibles :

        • Soit tu utilises les pins 0 et 1 avec le Serial pour dialoguer avec l'EPS (dans ce cas, c'est le Serial que tu utilises pour envoyer tes ATCommand et tu ne peux plus l'utiliser pour envoyer des messages de debug au PC)
        • Soit tu utilises d'autres pins que 0 et 1 pour le SoftwareSerial dialoguant avec l'EPS (dans ce cas, tu peux garder le Serial pour le debug et le SoftwareSerial pour les ATCommand du EPS)

        ==========

        Petite précision par rapport au message de alexisdm : une communication par liaison série envoie les données sur 8 bits en ajoutant un bit de start et un bit de stop.

        Du coup, chaque octet est envoyé au travers de 10 bits, ce qui fait 960 octets/secondes à 9600bauds et non 1200 ;)

        -
        Edité par lorrio 16 mai 2018 à 18:46:05

        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2018 à 19:27:45

          Salut merci beaucoup pour vos réponses je vais essayer ce que vous m'avez dit.

          @Alexisdm : J'ai essayer avec l'esp8266 de faire un webserver mais j'arrivais pas à intégrer la librairie sur l'Arduino Uno (j'arrive à importer les librairies, les cartes liées mais ça me mettait des erreurs)

          @lorrio : Ouai mais ducoup pour les pins il faut bien que je mette l'ESP8266 sur Tx et Rx (qui sont en 0 et 1) ducoup je fais comment ? 

          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2018 à 20:02:32

            Si tu utilises le Serial, la pin Tx de l'EPS doit être reliée à la pin Rx de l'arduino et vise versa (TxEPS<=>RxArduino, RxEPS<=>TxArduino)

            Si tu utilises le SoftwareSerial, le Tx et Rx de l'EPS doivent être reliée aux pins Tx/Rx émulée que tu auras définie comme argument du SoftwareSerial.

            Beaucoup d'exemple utilisent les pins 10 et 11 pour le SoftwareSerial mais tu es libres d'en utiliser d'autres.

            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2018 à 22:19:10

              Jack126 a écrit:

              @Alexisdm : J'ai essayer avec l'esp8266 de faire un webserver mais j'arrivais pas à intégrer la librairie sur l'Arduino Uno (j'arrive à importer les librairies, les cartes liées mais ça me mettait des erreurs)

              La bibliothèque en question doit être utilisée sur l'esp par sur l'uno, donc en écrasant le firmware d'origine (celui qui fournit les commandes AT) et cette opération est réversible. L'arduino Uno en mode reset peut servir à uploader le firmware si tu n'as pas de clé USB/série (cp210x, ch340, ftdi...).

              • Partager sur Facebook
              • Partager sur Twitter

              Connexion Arduino UNO avec ESP8266

              × 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