ESP8266 et arduino

Bonjour,

Ma première étape est de faire affiché une page web "hello world" sur mon téléphone depuis mon arduino connecté à un esp8266

J'utilise le code ci dessous

J'ai bien une communication que je vois sur mon "moniteur serie".Tout semble OK

Mais j'ai un timeout sur l'adresse indiqué (192.168.4.1)

:confused:

  #include <SoftwareSerial.h>
     
    #define DEBUG true     
    SoftwareSerial esp8266(11,10);

    void setup()
    {
      Serial.begin(115200);
      esp8266.begin(115200); // your esp's baud rate might be different
      sendData("AT+RST\r\n",2000,DEBUG); // reset module
      sendData("AT+CWMODE=2\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
    }
     
    void loop()
    {
      if(esp8266.available()) // check if the esp is sending a message 
      {
        while(esp8266.available())
        {
          // The esp has data so display its output to the serial window 
          char c = esp8266.read(); // read the next character.
          Serial.write(c);
        }
        
        if(esp8266.find("+IPD,"))
        {
         delay(1000);
     
         int connectionId = esp8266.read()-48; // subtract 48 because the read() function returns 
                                               // the ASCII decimal value and 0 (the first decimal number) starts at 48
         
         String webpage = "<h1>Hello</h1>&lth2>World!</h2><button>LED1</button>";
     
         String cipSend = "AT+CIPSEND=";
         cipSend += connectionId;
         cipSend += ",";
         cipSend +=webpage.length();
         cipSend +="\r\n";
         
         sendData(cipSend,1000,DEBUG);
         sendData(webpage,1000,DEBUG);
         
         webpage="<button>LED2</button>";
         
         cipSend = "AT+CIPSEND=";
         cipSend += connectionId;
         cipSend += ",";
         cipSend +=webpage.length();
         cipSend +="\r\n";
         
         sendData(cipSend,1000,DEBUG);
         sendData(webpage,1000,DEBUG);
     
         String closeCommand = "AT+CIPCLOSE="; 
         closeCommand+=connectionId; // append connection id
         closeCommand+="\r\n";
         
         sendData(closeCommand,3000,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;
    }

J'ai l'impression que quand je tape l'adresse 192.168.4.1, la connexion wifi ne voit pas l'appel fait page web

Ce qui m’étonne encore plus, je ne vois pas le point wifi dans ma liste de connexion

Bonsoir
d’après ce que j'en ai compris , tu utilise ton esp8266 en mode AT avc un arduino externe est pas directement
au travers de l'IDE arduino .

l'adresse IP 192.168.4.1 est celle attribué "par defaut " au mode soft AP dans le SDK "espressif"

tu a quoi de disponible comme reseau wifi autour de toi lorsque tu regarde avec un PC ou un autre équipement ?

Tu t'es basé sur quoi pour ton programme , parce que même en mode AT , il manque de la config.

Ici sur le forum arduino , les esp8266 sont plutôt utilisé directement

lire çà

C'est quoi exactement "ton esp8266" ?

Mon hello world fonctionne j’arrive à ma seconde difficulté
Je cherche à retourner le contenu d’une saisie après le get et là.....

Pouvez-vous me mettre sur la voie svp

l'usage de la classe String, la gestion du temps sous la forme de

while( (time+timeout) > millis())

, le software Serial à 115200 etc fait que de toutes façons ce ne sera pas très robuste...

Qu'est-ce qui ne vous plaisait pas dans le code de mon tuto Les Bases d'un Serveur Web sur ESP-01 en commande AT ?

EricRecifal33480:
Mon hello world fonctionne j’arrive à ma seconde difficulté
Je cherche à retourner le contenu d’une saisie après le get et là.....

Pouvez-vous me mettre sur la voie svp

c'est pour votre autre post ? (cf ma réponse)

Rien ne me déplaît dans le code juste que je suis pas allé au bout du tuto

EricRecifal33480:
Rien ne me déplaît dans le code juste que je suis pas allé au bout du tuto

li faut éviter la classe String

Je me pose une question avant de continuer mon projet
J’ai 8 boîtes de saisies html à faire dont les valeurs seront envoyées à l’appui sur un bouton envoyées. La méthode Get est elle vraiment judicieuse ?

EricRecifal33480:
Je me pose une question avant de continuer mon projet
J’ai 8 boîtes de saisies html à faire dont les valeurs seront envoyées à l’appui sur un bouton envoyées. La méthode Get est elle vraiment judicieuse ?

c'est plus une question HTML que Arduino... avez vous un seul bouton de soumission d'un formulaire? souhaitez vous un bouton par champs texte? etc...

Je me sais bien que la c’est plutôt un quizz html mais c’est le soft Arduino qui va devoir récupérer ces informations et les traiter

L’idée global c’est d’avoir 2 boutons on/off pour allumer manuellement des leds de puissance ( pas directement)

Et avoir 8 boites de saisie pour programmer des heures allumages et d'extinctions en assignant les saisies dans des variables ( ce qui veux dire décodage h min et conversion en une même unité). Un appui sur un bouton enregistrer envoi toutes ces valeurs par méthode get ou post je sais pas je bloque sur ce point et bien d’autres

Voilà l’idee générale

d'un point de vue code, si tout est dans un seul formulaire il faudra décoder les valeurs dans l'URL.. ce n'est pas sorcier vu que vous savez à quoi vous attendre - à peine plus compliquer que de décoder un seul paramètre

jetez un oeil au bout de code de mon exemple de serveur interactif (pour le shield ethernet) vous verrez l'usage de strtok() pour faire l'analyse de plusieurs paramètres dans l'URL

Petite question JML m’autorise tu à poster mon code quand j’aurais finit de faire fonctionner mon appli?sachant que le plus gros du code sera le tiens.

Bon je rencontre déjà des soucis, j’ai deux fonctions html. Une renvoi bien une requête avec des paramètres l’autres non. Alors que quand je l’envoie direct dans le navigateur sa fonctionne.
Le principe de la page web dans le .h est top

Bien sûr vous postez ce que vous voulez - l’idée c’est le partage :slight_smile:

Je bute sur un truc que je ne m'explique pas et je suis sur que c'est un truc bête.
Je suis en train d'essayer de décoder mon url du mode manuel
Je suis pas loin du truc mais je ne comprend pas
j'ai déclaré deux tableaux Param et Value. Dans la void Decodage_URL je réussit à faire un Serial.println du contenu des tableaux mais dans la loop c'est vide >:( .

C'est quoi l'explication?

char *item;
char *item1;
char *Param[4];
char *Value[4];
char *detect="EtatV1";
int i;
const char s[2] = "=";
char str[80] = "/?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50";   

void setup() {  
  Serial.begin(115200);
  //
}

void loop() {

  Decodage_URL();
i=1;
  Serial.println("Recap");
for ( i = 1; i = 4; ++i) 
{
  Serial.println(Param[i]);
  Serial.println(Value[i]);
}
delay(10000);
}

void Decodage_URL()
{  
  if (strcmp(detect, item)) 
{
   i=1;
   item = strtok(str, s);
   item1=strtok (NULL, "&");
   Param[i]=item;
   Value[i]=item1;

   while( item != NULL ) 
      {
        i=+1;
        printf( " %s\n", item );
        item = strtok(NULL, s);
        item1=strtok (NULL, "&");
        Param[i]=item;
        Serial.println(Param[i]);
        Value[i]=item1;
        Serial.println(Value[i]);
      }
   return(0);
  }
}

il y a plusieurs soucis:

  • ce test if (strcmp(detect, item)) veut dire si item est différent de detect. Comme item est null vous rentrez bien dans le if, mais il ne sert donc pas à grand chose

  • quand vous écrivez i = +1; vous n'incrémentez pas i... vous affectez juste la valeur 1.. je suppose qe vous vouliez faire i += 1;

  • ensuite attention aux index dans les tableaux, ils commencent à 0

Bonjour,

Tu as mis

for ( i = 1; i = 4; ++i)

ce devrait être

for ( i = 1; i <= 4; ++i)

D'autre part les indices dans le tableau vont de 0 à 3 et non de 1 à 4
il faut donc corriger

for ( i = 0; i < 4; i++)

Corriger aussi dans Decodage_URL()

Je continu de galérer avec mon tableau, sur le PARAM[0] suivant l'endroit ou je me trouve dans le code j'ai pas la même valeur.
Une idée du pourquoi ?
Je suis pas loin de ce que je cherche mais là.... mystère et boule de gomme

char *item;
char *item1;
char *Param[4];
char *Value[4];
char *detect="/?EtatV1";
int i;
const char s[2] = "=";
String sxr;
char urlCommand;
void setup() {  
  Serial.begin(9600);
  //
}

void loop()
{  
Decodage_URL_Manuel();

delay(10000);
}

void Decodage_URL_Manuel()
{ 
  char str[80] = "/?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50";    
  i=0;
  item = strtok(str, s);
  item1=strtok (NULL, "&"); 
  Param[0]=item;
  Value[0]=item1;
  Serial.println(Param[0]); // ---> RESULTAT : /?EtatV1
  while( item != NULL ) 
      {
        i+=1;
        printf( " %s\n", item );
        item = strtok(NULL, s);
        item1=strtok (NULL, "&");
        Param[i]=item;
        Value[i]=item1;
      }

//Action
Serial.println(Param[0]); // ---> RESULTAT : VIDE :(
Serial.println(Value[0]);
if (strcmp(Param[0],"/?EtatV1")==0)
  { 
    Serial.print("Pareil");
    if (strcmp(Param[0],"ON"))
    {
    Serial.print("Pareil ON");
    }
    else
    {Serial.print("Pareil OFF");
    }
  } 
else {Serial.print("Pas Pareil");} 
}

votre chaîne de caractère est en variable locale dans Decodage_URL_Manuel() donc la mémoire est libérée dès que vous sortez de la fonction, elle peut être ensuite utilisée pour tout autre chose...

comme vous faites 2 strtok() dans le code, idéalement au lieu de ne tester que itemwhile( item != NULL ) dans le while, vous devriez tester les 2

Je verrais donc plus un truc du genre

char monURL[] = "/?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50";

const byte maxParam = 10;
char *Param[maxParam];
char *Value[maxParam];
byte nbParam;

const char detect[] = "/?Etat";
const byte longeurDetect = sizeof(detect) - 1;
const char * egal = "=";
const char * esperluette = "&";


byte decode()
{
  byte paramEnCours = 0;
  char *debutAnalyse;
  char *ptr;

  if (!strncmp(monURL, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = monURL + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) Value[paramEnCours++] = ptr;
        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));

  return paramEnCours;

}


void setup() {
  Serial.begin(115200);

  Serial.print(F("Je decode: "));
  Serial.println(monURL);

  byte n = decode();

  for (byte i = 0; i < n; i++) {
    Serial.print(F("["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.println(F("]"));
  }
}

void loop() {}

la console série affichera alors:

[size=8pt][color=purple]
Je decode: /?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50
[V1] --> [OFF]
[PManuV1] --> [10]
[EtatV2] --> [ON]
[PManuV2] --> [50][/color]
[/size]

Bonsoir,

Mon projet avance tranquillement,

J’ai vraiment galéré avec le SoftwareSerial cette après-midi, j’ai dû pour des raisons d’utilisi des broches digitales de les déplacer en 13 et 12 et jamais l’appli n’a voulu fonctionner avec ces broches ! Je n’ai toujours pas trouvé pourquoi, auriez vous une idée ?

je bute mais je comprend pas mon nouveau problème

le souci :frowning:

Je n'arrive pas à avoir tout mes paramètres dans la requête GET je m'arrête à H2V2=

"0,CONNECT+IPD,0,726:GET /?H1V1=00%3A00&P1V1=100&H1V2=00%3A00&P1V2=100&H2V1=00%3A00&P2V1=100&H2V2="

Ce qui fait que je ne rafraichit pas le weebroot et je perd une partie de mes paramètres

J’ai modifié toutes les variables que j’ai trouvé qui me semblait agir sur la longueur de l’url mais je sêche

Y a t’il une limitation dans la longueur de l’url?

De plus je me suis rendu compte que pour récupérer les h et mn il y avait "%3A" comme séparateur sachant que le but sera d'avoir une variable ou tous sera en min.j'imagine que je doit faire un decodage de ce séparateur

Y a t'il une autres solutions que l'utilisation du strok() ?

Bonne fin de week end à tous