Partage
  • Partager sur Facebook
  • Partager sur Twitter

communication entre ESP8266 et 4DUINO ?

    19 avril 2017 à 18:18:43

    Bonjour,

    Je suis actuellement en stage mais étant étudiant en mécanique l'électronique et la programmation sont des domaines dont je n'ai que quelques base. 

     J'essaye actuellement d'envoyer l'information d'un capteur de température relié à un ESP8266 sur un 4DUINO pour qu'il affiche la température sur son display. 

    Mais je ne sais pas du tout comment m'y prendre, peut être en faisant en sorte que l'ESP8266 envoie les données du capteur sur un serveur que lui même à créer et que le 4DUINO peut récupérer ? 

    Pour information j'ai déjà réussis à envoyer les données du capteur sur un site pour avoir la température en temps réel. Donc, je pensais que le code serait presque identique mais après quelque recherche sur internet aucun code n'a pu m'aider pour avancé dans mon envoie de donnée.

    Deplus, les données doivent être envoyer directement c'est à dire que le 4Duino ne doit pas aller chercher les données du capteur sur un site internet il doit réussir à les prendre directement sur l'ESP8266. 

    Voilà, donc mon problème en espérant que vous puissiez m'aider à trouver comment démarrer mon code. 

    Cordialement 

    • Partager sur Facebook
    • Partager sur Twitter
      19 avril 2017 à 19:20:48

      Comme tu l'as évoqué, il te suffirait que l'ESP8266 envoie les données sur un serveur émulé par le 4DUINO plutôt que sur un vrai serveur WEB.

      Coté ESP8266, il te suffit de changer l'adresse du serveur WEB par l'adresse IP du 4DUINO.

      Coté 4DUINO, il te faut mettre en place l'émulation d'un serveur WEB.

      Cela consiste à ouvrir un serveur sur le port 80 et accepter toutes les communication entrante.

      Fais une petite recherche de WEB server arduino, ça te donnera pas mal d'éxemple.

      On trouve en entre autre beaucoup d'exemple pour émuler un serveur WEB permettant de piloter des LED, il te suffirait de te baser sur ce code et adapter à tes besoins ;)

      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2017 à 8:27:16

        Ah oui d'accord je voie. Et bien je vais faire mes petites recherches sur ce sujet et je te remercie de ton aide ! 

        -------------------------------------------------------------------------------------------------------------------------------------

        Je reviens car je n'arrive toujours pas à trouver de solution. 

        Premièrement voici mon code que j'utilise pour recevoir les informations de mon capteur de température sur ma carte ESP8266 : 

        // Librairies
        #include <ESP8266WiFi.h>
        
        // WiFi parameters
        const char* ssid = "*********";
        const char* password = "*********";
        
        // use Pin A0 to read temperature
        const int tempin = A0;
        
        //Host
        const char* host = "dweet.io";
        
        // Fonction setup(), appelée au démarrage de la carte Arduino
        void setup() {
        
          // Initialise la communication avec le PC
          Serial.begin(115200);
          delay(10);
        
          // conecting to a Wifi network
          Serial.println();
          Serial.println();
          Serial.println("connecting to ");
          Serial.println(ssid);
          WiFi.begin(ssid, password);
          while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
          }
          Serial.println("");
          Serial.println("WiFi connected");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
        }
        
        
        
        // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
        void loop() {
        
        
          Serial.print("Connecting to");
          Serial.println(host);
        
          //Use WiFiClient class to create ICP connections
          WiFiClient client;
          const int httpPort = 80;
          if (!client.connect(host, httpPort)) {
            Serial.println("connection failed");
            return;
          }
        
        
          // Mesure la tension sur la broche A0
          int valeur_brute = analogRead(tempin);
          float voltage = (valeur_brute / 1024.0) * 3.3;
        
          // Transforme la mesure (nombre entier) en température via un produit en croix
          float temperature_celcius = (voltage - .5) * 100;
        
          // Envoi la mesure au PC pour affichage et attends 250ms
          Serial.println(temperature_celcius);
          delay(250);
        
          client.print(String("GET /dweet/for/TestTemperature?temperature=") + String(temperature_celcius) + " HTTP/1.1\r\n" +
                       "Host: " + host + "\r\n" +
                       "Connection: close\r\n\r\n");
          delay(10);
        
          // Read all the lines of the reply from server and print them to serial
          while (client.available()) {
            String line = client.readStringUntil('\r');
            Serial.print(line);
          }
          Serial.println();
          Serial.println("closing connection");
        
          //Repeat every 10 seconds
          delay(10000);
        
        }

        Donc pour envoyer sur le 4Duino je n'aurais normalement à changer que l'IP en remplaçant "Dweet.io" par l'IP du 4DUINO.

        Mais en ce qui consiste de créer le serveur web sur le 4Duino, c'est très compliquer pour moi car les codes sur 4DUINO et sur Arduino sont différents. C'est à dire que le plus souvent les librairies ne marche pas sur 4DUINO et que pour coder le 4DUINO il faut souvent faire plein d'étapes antérieur, des routines, je crois . 

        Bref, je suis un peu perdus. J'ai réaliser plusieurs essais avec des programmes simple où seulement un mot doit s'envoyer juste pour voir si le contact entre les deux machines se fait mais à chaque fois aucun résultats. 

        Alors je me suis inspiré d'un code 4DUINO qui permet de recevoir des données d'un site web : 

        #define SSID        "*************"
        #define PASSWORD    "****************"
        
        #define ESP     "10.0.0.192"        // IP address ()
        #define HOST_PORT   80             // Designated Port (HTTP)
        
        
        // Define LOG_MESSAGES to a serial port to send SPE errors messages to. Do not use the same Serial port as SPE
        //#define LOG_MESSAGES Serial
        
        #define RESETLINE     30
        
        #define DisplaySerial Serial1
        
        
        #include "Picaso_Serial_4DLib.h"
        #include "Picaso_Const4D.h"
        
        Picaso_Serial_4DLib Display(&DisplaySerial);
        
        // Uncomment to use ESP8266
        #define ESPRESET 17
        #include <SoftwareSerial.h>
        #define ESPserial SerialS
        SoftwareSerial SerialS(8, 9) ;
        // Uncomment next 2 lines to use ESP8266 with ESP8266 library from https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
        #include "ESP8266.h"
        ESP8266 wifi(SerialS, 19200);
        
        
        // routine to handle Serial errors
        void mycallback(int ErrCode, unsigned char Errorbyte)
        {
        #ifdef LOG_MESSAGES
          const char *Error4DText[] = {"OK\0", "Timeout\0", "NAK\0", "Length\0", "Invalid\0"} ;
          LOG_MESSAGES.print(F("Serial 4D Library reports error ")) ;
          LOG_MESSAGES.print(Error4DText[ErrCode]) ;
          if (ErrCode == Err4D_NAK)
          {
            LOG_MESSAGES.print(F(" returned data= ")) ;
            LOG_MESSAGES.println(Errorbyte) ;
          }
          else
            LOG_MESSAGES.println(F("")) ;
          while (1) ; // you can return here, or you can loop
        #else
          // Pin 13 has an LED connected on most Arduino boards. Just give it a name
        #define led 13
          while (1)
          {
            digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
            delay(200);                // wait for a second
            digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
            delay(200);                // wait for a second
          }
        #endif
        }
        // end of routine to handle Serial errors
        
        void setup()
        {
          // Ucomment to use the Serial link to the PC for debugging
          //  Serial.begin(115200) ;        // serial to USB port
          // Note! The next statement will stop the sketch from running until the serial monitor is started
          //       If it is not present the monitor will be missing the initial writes
          //    while (!Serial) ;             // wait for serial to be established
        
          pinMode(RESETLINE, OUTPUT);        // Display reset pin
          digitalWrite(RESETLINE, 1);         // Reset Display, using shield
          delay(100);                      // wait for it to be recognised
          digitalWrite(RESETLINE, 0);       // Release Display Reset, using shield
          // Uncomment when using ESP8266
          pinMode(ESPRESET, OUTPUT);            // ESP reset pin
          digitalWrite(ESPRESET, 1);           // Reset ESP
          delay(100);                         // wait for it t
          digitalWrite(ESPRESET, 0);         // Release ESP reset
          delay(4000) ;                     // give display time to startup
        
          // now start display as Serial lines should have 'stabilised'
          DisplaySerial.begin(200000) ;      // Hardware serial to Display, same as SPE on display is set to
          Display.TimeLimit4D = 5000 ;      // 5 second timeout on all commands
          Display.Callback4D = mycallback ;
        
          // uncomment if using ESP8266
          ESPserial.begin(115200) ;             // assume esp set to 115200 baud, it's default setting
          // what we need to do is attempt to flip it to 19200
          // the maximum baud rate at which software serial actually works
          // if we run a program without resetting the ESP it will already be 19200
          // and hence the next command will not be understood or executed
          ESPserial.println("AT+UART_CUR=19200,8,1,0,0\r\n") ;
          ESPserial.end() ;
          delay(10) ;                           // Necessary to allow for baud rate changes
          ESPserial.begin(19200) ;             // start again at a resonable baud rate
          Display.gfx_ScreenMode(LANDSCAPE) ; // change manually if orientation change
          // put your setup code here, to run once:
          Display.print("setup begin\r\n");
        
          ESPserial.println("AT+CWDHCP_CUR=1,1\r\n") ;      // Activate the DHCP of 4DUINO , try to uncomment if router is already allocating DHCP
          delay(100);
          Display.print("FW Version: ");
          Display.println(wifi.getVersion().c_str());
        
        
          if (wifi.setOprToStation()) {
            Display.print("to station ok\r\n");
          } else {
            Display.print("to station err\r\n");
          }
        
        
          if (wifi.joinAP(SSID, PASSWORD)) {
            Display.print("Join AP success\r\n");
            Display.print("IP: ");
            Display.println(wifi.getLocalIP().c_str());
          } else {
            Display.print("Join AP failure\r\n");
          }
        
          if (wifi.disableMUX()) {
            Display.print("single ok\r\n");
          } else {
            Display.print("single err\r\n");
          }
        
          Display.print("setup end\r\n");
        } // end Setup **do not alter, remove or duplicate this line**
        
        void loop()
        {
          Display.txt_MoveCursor(7, 0) ;
          // put your main code here, to run repeatedly:
          uint8_t buffer[1024] = {0};
        
          if (wifi.createTCP(ESP, HOST_PORT)) {
            Display.print("create tcp ok\r\n");
          } else {
            Display.print("create tcp err\r\n");
          }
        
          char *hello = "GET / HTTP/1.0\r\nHost:1.1.1.1\r\n\r\n";
          wifi.send((const uint8_t*)hello, strlen(hello));
        
          Display.print("Reading...\r\n");
          Display.txt_MoveCursor(9, 0) ;
          Display.print("                                       ");
          Display.txt_MoveCursor(9, 0) ;
        
        
          if (ESPserial.find("temperature_celcius ")) //get the date line from the http header (for example)
          {
            int i;
            for (i = 0; i < 31; i++) //31 this should capture the 'Date: ' line from the header
            {
              if (ESPserial.available())  //new characters received?
              {
                char c = ESPserial.read(); //print to console
                Display.print(c);
              }
              else i--;  //if not, keep going round loop until we've got all the characters
            }
          }
        
          if (wifi.releaseTCP()) {
            Display.print("release tcp ok\r\n");
          } else {
            Display.print("release tcp err\r\n");
          }
        
        }

        Il y a dans ce code certaine choses que j'ai moi même essayer de changer ( adresse IP, variable envoyer ) mais ça ne fonctionne pas. 

        Alors, j'aimerais savoir comment je peut être sur, d'envoyer sur la bonne adresse IP, comment connaître l'adresse IP du 4DUINO et de l'ESP8266 ? 

        Et qu'est ce que je dois changer d'autre pour réussir à les faire communiquer entre elles ? 

        Merci d'avance pour vos réponses et votre temps passés à m'aider. 

        -
        Edité par fgfcitiz 20 avril 2017 à 13:31:39

        • Partager sur Facebook
        • Partager sur Twitter
          25 avril 2017 à 21:49:54

          Déjà pour connaitre les adresses ip tu peux regarder sur ta box (192.168.1.1 en général) et tu trouvera les adresses ip.
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2017 à 10:51:02

            Bonjour,

            je reviens car j'ai réussi à moitié à résoudre mon problème que j'avais laissé de coté pendant un petit moment.

            Alors, j'arrive à envoyer une donnée de l'ESP sur le 4Duino et le 4Duino l'affiche bien dans le serial.

            Mais maintenant je bloque un peu sur le fait de pouvoir recevoir plusieurs valeurs. 

            Exemples: ESP envoie la température et l'humidité, pour que le 4Duino reçoit 2 variable distinctes pour que je puisse me servir de ces variables afin d'afficher les valeurs dans des jauges sur l'écran du 4Duino.

            Voici les codes que j'ai pour l'instant: 

            CLIENT : ESP8266 

            /*
             *  This sketch sends a message to a TCP server
             *
             */
            
            #include <ESP8266WiFi.h>
            #include <ESP8266WiFiMulti.h>
            
            ESP8266WiFiMulti WiFiMulti;
            int ouf=22;
            int fou=66;
            
            void setup() {
                Serial.begin(115200);
                delay(10);
            
                // We start by connecting to a WiFi network
                WiFiMulti.addAP("NETGEAR73", "fancyumbrella798");
            
                Serial.println();
                Serial.println();
                Serial.print("Wait for WiFi... ");
            
                while(WiFiMulti.run() != WL_CONNECTED) {
                    Serial.print(".");
                    delay(500);
                }
            
                Serial.println("");
                Serial.println("WiFi connected");
                Serial.println("IP address: ");
                Serial.println(WiFi.localIP());
            
                delay(500);
            }
            
            
            void loop() {
                const uint16_t port = 8090;
                const char * host = "10.0.0.9"; // ip of the 4Duino server
            
                
                
                Serial.print("connecting to ");
                Serial.println(host);
            
                // Use WiFiClient class to create TCP connections
                WiFiClient client;
            
                if (!client.connect(host, port)) {
                    Serial.println("connection failed");
                    Serial.println("wait 5 sec...");
                    delay(5000);
                    return;
                }
            
                // This will send the request to the server
                //client.print("A:");
                client.print(ouf);
                //client.print("B:");
                client.print(fou);
            
                //read back one line from server
                String line = client.readStringUntil('\r');
                client.println(line);
            
                Serial.println("closing connection");
                client.stop();
                
                Serial.println("wait 5 sec...");
                delay(5000);
            }

            SERVER : 4DUINO

            #define SSID        "NETGEAR73"      //<==== Fix
            #define PASSWORD    "fancyumbrella798"  //<==== Fix
            
            int humiValue;
            String humiString;
            int tempValue;
            String tempString;
            
            
            void setup()
            {
             
            
              Serial.begin(9600);
              Serial.print("setup begin\r\n");
            
              Serial.print("FW Version:");
              Serial.println(wifi.getVersion().c_str());
            
              if (wifi.setOprToStationSoftAP()) {
                Serial.print("to station + softap ok\r\n");
              
              } else {
                Serial.print("to station + softap err\r\n");
             
              }
            
              while (!wifi.joinAP(SSID, PASSWORD));
            
            
              if (wifi.joinAP(SSID, PASSWORD)) {
                Serial.print("Join AP success\r\n");
                Serial.print("IP: ");
                Serial.println(wifi.getLocalIP().c_str());
            
            
              } else {
                Serial.print("Join AP failure\r\n");
                //Display.print("Join AP failure\r\n");
            
              }
            
              if (wifi.enableMUX()) {
                Serial.print("multiple ok\r\n");
              } else {
                Serial.print("multiple err\r\n");
              }
            
              if (wifi.startTCPServer(8090)) {
                Serial.print("start tcp server ok\r\n");
              } else {
                Serial.print("start tcp server err\r\n");
              }
            
              if (wifi.setTCPServerTimeout(10)) {
                Serial.print("set tcp server timout 10 seconds\r\n");
              } else {
                Serial.print("set tcp server timout err\r\n");
              }
            
              Serial.print("setup end\r\n");
            
            
            } 
            
            void loop()
            {
            
            
            
              uint8_t buffer[128] = {0};
              uint8_t mux_id;
              uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000);
              tempString = "";
              //humiString = "";
            
              if (len > 0) {
                Serial.print("Status:[");
                Serial.print(wifi.getIPStatus().c_str());
                Serial.println("]");
            
                Serial.print("Received from :");
                Serial.print(mux_id);
                Serial.println("[");
            
                for (uint32_t i = 0; i < len; i++) {
                  
                  tempString = tempString + char(buffer[i]);
                 // humiString = humiString + char(buffer[i]);
                }
                Serial.print("]\r\n");
            
                
                if (wifi.send(mux_id, buffer, len)) {
                  Serial.print("send back ok\r\n");
                
                } else {
            
                  Serial.print("send back err\r\n");
                 
                }
            
                if (wifi.releaseTCP(mux_id)) {
                  Serial.print("release tcp ");
                  Serial.print(mux_id);
                  Serial.println(" ok");
            
            
                } else {
                  Serial.print("release tcp");
                  Serial.print(mux_id);
                  Serial.println(" err");
            
                }
            
                Serial.print("Status:[");
                Serial.print(wifi.getIPStatus().c_str());
                Serial.println("]");
            
               
                Display.gfx_Cls();
                Display.txt_MoveCursor(0, 0);
            
              }
              tempValue = tempString.toInt();
              //humiValue = humiString.toInt();
              Serial.print(tempValue);
              //Serial.print(humiValue);
            
              
            }
            




            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2017 à 12:41:39

              Je te conseille de formater tes donner en ajoutant des délimiteurs ;)

              Par exemple, si tu veux une temperature de 25° et une humidité de 80%, tu pourrais envoyer : 25T80H

              Ce qui donne un code d'émission dans ce style :

              client.print(temperature);
              client.print('T');
              client.print(humidite);
              client.print('H');

              Coté réception, il te suffit de traiter caractère par caractère avec les règles suivantes :

              • Si c'est un chiffre, on l'ajoute dans un nombre en cours de réception
              • Si c'est un T, on stock le nombre en cours dans la température
              • Si c'est un H, on stock le nombre en cours dans l'humidité

              Ce qui donne un code de réception dans ce style :

              if ( client.available() ) {
              	char ch = client.read();
              	if ( ( ch >= '0' ) && ( ch <= '9' ) ) {
              		nbEnCours = ( ( nbEnCours * 10 ) + ( ch - '0' ) );
              	} else {
              		switch (ch) {
              			case 'T': temperature = nbEnCours; break;
              			case 'H': humdite = nbEnCours; break;
              		}
              		nbEnCours = 0;
              	}
              }





              -
              Edité par lorrio 23 mai 2017 à 12:42:16

              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2017 à 13:57:07

                Pour les délimiteurs j'y avait penser aussi, les A et B, qui sont dans mon code.

                Mais le problème c'est que le 4 Duino n'affiche que la première valeurs que j'envoie, par exemple si je met:

                client.print("A:");

                client.print(Temperature);

                Le 4Duino ne vas m'afficher que  " A: " et la valeur de la Temperature je ne la voie jamais s'afficher.

                J'ai essayé avec ton code mais dès que client.read(); apparait dans le code du 4Duino l'ESP ne se connecte plus au 4Duino et donc ne reçois pas les valeurs. 

                • Partager sur Facebook
                • Partager sur Twitter
                  23 mai 2017 à 16:48:33

                  Généralement, on met les délimiteur APRES la donnée.

                  Si tu mets le délimiteur avant, on ne sait pas forcément quand la donnée se termine.

                  Quand à client.read, il s'agissait uniquement d'un code d'exemple.

                  A voir rapidement ton code, c'est client.recv que tu dois utiliser.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  communication entre ESP8266 et 4DUINO ?

                  × 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