[ESP8266] Besoin d'aide envoyer une requette HTTP ESP8266

Bonsoir,

pour divers projets je cherches à apprivoiser le module wifi ESP8266.

je sais :

  • le configurer.
  • envoyer des requêtes depuis des client sur le réseau (PC, smartphones, serveur domotique....) vers l'ESP8266
  • faire agir un arduino en fonction de data reçues par l'ESP8266
  • utiliser l'ESP8266 en communication série.

là ou j'ai besoin d'aide c'est pour faire un loop qui en fonction d'un appuis sur un bouton poussoir, ferait envoyer une requête HTTP d'un arduino à un autre via deux ESP8266

j'arrive à le faire manuellement via la communication série.
pour le moment c'est simplement pour allumer une led en appuyant sur le bouton poussoir d'un arduino connecté a un ESP8266 et la led est sur un deuxieme arduino lui aussi relié au réseau via un ESP8266

voici les commandes AT pour allumer ma led via le terminal série.

AT+CIPSTART="TCP","192.168.1.19",80

AT+CIPSEND=8
/pin=1

AT+CIPCLOSE

j'aimerais que ce code s'execute lorsque j'appuis sur un bouton poussoir.

voici les Commandes AT qui s'éxecute au setup de l'arduino.

 void setup()
    {
      
      Serial.begin(115200);
      esp8266.begin(115200); // your esp's baud rate might be different
      
      pinMode(BP, INPUT);
      pinMode(12,OUTPUT);
      digitalWrite(12,LOW);
      pinMode(11,OUTPUT);
      digitalWrite(11,LOW);

      sendData("AT+RST\r\n",2000,DEBUG); // reset module
      sendData("AT+CWMODE=1\r\n",1000,DEBUG); // configure as STA
      sendData("AT+CIPSTA=\"192.168.1.25\",\"192.168.1.1\",\"255.255.255.0\"\r\n",10000,DEBUG);
      sendData("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n",10000,DEBUG); 
      sendData("AT+CIPMUX=1\r\n",2000,DEBUG);
      }

j'ai écrit un bout de code que j'ai glissé dans le loop qui s'inspire de ça mais ça ne marche pas.

 void loop()
    {
      
      
        sendData("AT+CIPSTART=\"TCP\",\"192.168.1.19\",\"80\"\r\n",10000,DEBUG);
        sendData("AT+CIPSEND=8",1000,DEBUG);
        sendData("/pin=1",1000,DEBUG);
        sendData("AT+CIPCLOSE\r\n",1000,DEBUG);

    }

Merci

il semble que le soucis vienne du AT+CIPSTART

j'avais une erreure flagrante que j'ai corrigé mais ça ne marche toujours pas.

premier code

sendData("AT+CIPSTART=\"TCP\",\"192.168.1.19\",\"80\"\r\n",10000,DEBUG);

correction il y avait des guillemets en trop autour du 80

sendData("AT+CIPSTART=\"TCP\",\"192.168.1.19\",80\r\n",10000,DEBUG);

une chose aussi le code qui revient dans le terminal est pas claire.

ready
AR)CWSŠTTŠj

O©CáAT+CHPSTA="192.178.1.25","193.168.1.1","355.255.255/0"


OK
WIFI CONNECTED
WIFI GOT IP
AT+CWJAP="SSID","PASSWORD"

WIFI DHSCONNWIFI CONNECTED
WIFI GOT IP

OK
AR)‡IPMUXOL¨H¤LèjªHüAT+CIPSTART="TCP","192.168.0.19",80


ERROR
AT+CIPSEND=8


ERROR
/phn=L¨H´IRJÕHü

je suis en 115200 bauds coté arduino et terminal car mon esp fonctionne comme ça.

On n'a pas tout le code donc on ne peut qu'émettre des hypothèses. Prenez l'habitude de poster un code complet et la description des connexions matérielles

À mon avis vous utilisez software serial à 115200 bauds et c'est pas stable entre votre arduino et ESP (avez vous une adaptation de tension 3.3V <-> 5V ?? faudrait adapter cette tension) et configurer en dur la communication série de votre ESP à une vitesse moins importante

..... et évitez de publier sur le forum le nom de votre point d'accès et son mot de passe

al1fch:
..... et évitez de publier sur le forum le nom de votre point d'accès et son mot de passe !!

évitez de le quoter, il ne peut plus l'enlever du forum lui même maintenant.. je suggère que vous éditiez votre post et modifiez le contenu...

OK, J-M-L, cest fait

Ouais j'avais vus ce matin mais je ne pouvais l'éditer à ce moment. D'ailleurs que pourrait faire une personne avec ces infos si il n'est pas proche de mon réseau ? Rien ?

Je vais voir ce soir pour diminuer le Baud rate et je vous envoie le code complet ce midi

al1fch:
OK, J-M-L, cest fait

merci pour lui :slight_smile:

Rhamkota:
Ouais j'avais vus ce matin mais je ne pouvais l'éditer à ce moment. D'ailleurs que pourrait faire une personne avec ces infos si il n'est pas proche de mon réseau ? Rien ?

Je vais voir ce soir pour diminuer le Baud rate et je vous envoie le code complet ce midi

vous savez vaut mieux être prudent...

Voici le code complet

Vous verrez que j'ai essayé avec un esp8266.write mais le résultat est le même

 #include <SoftwareSerial.h>
     
    #define DEBUG true
     
    SoftwareSerial esp8266(3,2); // make RX Arduino line is pin 2, make TX Arduino line is pin 3.
                                 // This means that you need to connect the TX line from the esp to the Arduino's pin 2
                                // and the RX line from the esp to the Arduino's pin 3
   const int BP=4;
    void setup()
    {
      
      Serial.begin(115200);
      esp8266.begin(115200); // your esp's baud rate might be different
      
      pinMode(BP, INPUT);
      pinMode(12,OUTPUT);
      digitalWrite(12,LOW);
      pinMode(11,OUTPUT);
      digitalWrite(11,LOW);
       
      sendData("AT+RST\r\n",2000,DEBUG); // reset module
      sendData("AT+CWMODE=1\r\n",1000,DEBUG); // configure as STA
      sendData("AT+CIPSTA=\"192.168.1.25\",\"192.168.1.1\",\"255.255.255.0\"\r\n",10000,DEBUG);
      sendData("AT+CWJAP=\"Livebox-E35E\",\"279A24EDDE9DF5253F2FFAEC6C\"\r\n",10000,DEBUG); // recupere nom et mot de passe de l' ESP
      sendData("AT+CIPMUX=1\r\n",2000,DEBUG); // get ip address
      
    }
     
    void loop()
    {
        esp8266.write("AT+CIPSTART=\"TCP\",\"192.168.1.19\",80\r\n");
        delay(5000);
        sendData("AT+CIPSEND=8\r\n",1000,DEBUG);
        sendData("/pin=1\r\n",1000,DEBUG);
        

    }

    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;
    }

cf mon post plus haut:

À mon avis vous utilisez software serial à 115200 bauds et c'est pas stable entre votre arduino et ESP (avez vous une adaptation de tension 3.3V <-> 5V ?? faudrait adapter cette tension) et configurer en dur la communication série de votre ESP à une vitesse moins importante

des commentaires?

Alors le module est alimenté par un convertisseur de tension 5v->3.3v qui sort 500mAh

En gros Arduino 5v --> convertisseur 3.3v --> esp8266

Oui mais comment les pins Rx et Tx sont connectées? directement? dans ce cas pb de tension car votre Tx de l'arduino envoie du 5V dans le Rx de l'ESP qui ne supporte (officiellement) que du 3.3V --> vous risquez de griller votre module.

inversement le Tx de l'ESP envoie un HIGH sous forme de 3.3v à votre arduino. Dans la majorité ce sera reconnu comme un HIGH car au dessus de seuil mais si vous avez une déperdition sur cette ligne, la qualité de ce que vous recevez en retour peut être approximative.

On peut utiliser un un te291 level shifter par exemple, il en existe à 2, 4, 8 entrées.

par exemple celui ci a 4 entrées et je l'utilise dans un montage comme cela avec un composant Bluetooth

sinon ça dans le code par exemple ce n'est pas correct

  long int time = millis();
  while ( (time + timeout) > millis())

d'une part il faut utiliser le type unsigned long et il ne faut pas faire d'addition pour éviter les pbs de débordement de la variable mais une soustraction:

unsigned  long startTime = millis();
while ((millis() - startTime) <= timeout) {
...
}

sinon l'usage de la classe String n'est pas une super idée, ça morcelle la mémoire.

Je vais faire la modification pour la partie millis.

Je débute en communication série. Que mettre à la place de la classe String ?
Un esp8266.write() ?

Rhamkota:
Je débute en communication série. Que mettre à la place de la classe String ?

lire Serial Input Basics
et connaître les fonctions C standard pour manipuler des tableaux de caractères
stdlib.h
string.h

mais le pb de tension est à considérer aussi, un pont de résistance peut suffire éventuellement pour abaisser la tension entre Tx Arduino et Rx ESP. mais je vous conseille de baisser la vitesse en BAUDS de votre ESP.

je crois — de mémoire, à vérifier dans la doc — qu'un AT+CIOBAUD=9600 effectué une fois vous mettra son baud rate à 9600

Je crois avoir essayé AT+CIOBAUD l'autre jour et avoir essuyé une erreur.

J'ai lus ce matin que cette commande existe aussi. AT+UART_DEF=8,1,0,0

Je teste les deux ce soir je vous redirais

attention sur l'usage exact de cette commande surtout pour les derniers paramètres, vous pouvez vous retrouver avec un ESP pas utilisable et qu'il faudra re-flasher

(cf Bricked with baud rate command? - ESP8266 Developer Zone)

Pas de soucis j'ai un ftdi je vais peut-être même passer par lui pour le baudrate.

J'ai commandé le leveler comme conseillé pour le 3v du TX mais est ce qu'un régulateur 3v comme celui qui me sert pour alimenter l'esp conviendrait en attendant de recevoir le leveler .

http://m.ebay.fr/itm/271941941288?_mwBanner=1

Pas de soucis j'ai un ftdi je vais peut-être même passer par lui pour le baudrate.

ce serait l'idéal. s'il supporte 3.3v pour Tx/Rx c'est encore mieux.

est ce qu'un régulateur 3v comme celui qui me sert pour alimenter l'esp conviendrait en attendant de recevoir le leveler

Je pense qu'il induirait trop de latence, faut quelque chose qui réagit très vite aux passages de 0 à 1 ou 1 à 0 quand vous écrivez les bits sur cette ligne. le régulateur n'est pas fait pour cela.

cf ESP8266 WiFi module and 5V Arduino connection par exemple sur comment faire un pont de résistance