Go Down

Topic: Utilisation Module ESP8266 ESP-12 Serveur Web (Read 1 time) previous topic - next topic

2gam

Bonjour a tous,

Voila, je voulais vous presenter un truc...
En fait, j'ai acheter sur AliExpresse un Module Wifi ESP8266 ESP-12 et en faite, c'est dur de trouver comment l'utiliser pour ce faire un petit serveur web  ::)

Mais bon, j'ai trouver, je sais plus ou sur un forum un programme que j'ai un peu améliorer (a mon sens).

Pour info, j'ai un Arduino MEGA 2560
la connexion du module est simple (4 picots)
- Gnd sur Ground  :P
- Vcc sur 3.3v
- Rx sur Tx Port 18
- Tx sur Rx Port 19

le programme donc :
Code: [Select]
/************************************
* ESP8266 Web server for Arduino
*/
int nb=0;
String data = "";
int ch; // channel ID
String AdresseIP="";
byte PortServer=80;                       // Port du Serveur
String SSIDWifi="Mon Wifi";               // Nom du Reseau Wifi
String PasswordWifi="Mon Password";  // Mot de Passe du Reseau Wifi

#define dbgSerial Serial // Debug monitor
#define espSerial Serial1

#define BUFFER_SIZE 512
char buffer[BUFFER_SIZE]; //buffer to store incoming messages

#define pinLED 13
boolean ledValue = 0; //off by default

/******************************************
* FUNCTION : void setup(void)
* PURPOSE : run only once to initialize
*           the system after HW reset
*******************************************/
void setup()
{
    dbgSerial.begin(9600); // starts serial link to monitor
    espSerial.begin(9600); // starts serial link to ESP
    dbgSerial.print("Reset du module ... ");
    dbgSerial.println(sendData("AT+RST\r\n",5000));
    dbgSerial.print("Configure en Mode Station/Point Acces ... ");
    dbgSerial.println(sendData("AT+CWMODE=1\r\n",2000));
    dbgSerial.print("Connexion au Wifi \""+SSIDWifi+"\" ... ");
    dbgSerial.println(sendData("AT+CWJAP=\""+SSIDWifi+"\",\""+PasswordWifi+"\"\r\n",10000));
    dbgSerial.print("Configure en Mode Multi Connexion ... ");
    dbgSerial.println(sendData("AT+CIPMUX=1\r\n",2000));
    dbgSerial.print("Demarrage du Serveur sur le Port "+String(PortServer)+" ... ");
    dbgSerial.println(sendData("AT+CIPSERVER=1,"+String(PortServer)+"\r\n",2000));
    sendData("AT+CIFSR\r\n",2000); // recupere l'Adresse IP
    dbgSerial.println();
    dbgSerial.println("Adresse IP : "+AdresseIP);
    dbgSerial.println("Serveur demarrer");
    
    pinMode(2, INPUT);
    pinMode(pinLED, OUTPUT); //define pin as output
}
  
/********************************************
* FUNCTION : void loop (void)
* PURPOSE : main loop
*********************************************/  
void loop()
{    
    int len; //  message length
    char *pb; // pointer inside the buffer
    String response = "";
    if(espSerial.available())
     {
       espSerial.readBytesUntil('\n', buffer, BUFFER_SIZE); //read until newline
     }
    // we expect a message like this "+IPD,ch,len:data"
    if(strncmp(buffer, "+IPD,", 5)==0) //check if message starts with +IPD
    {
      sscanf(buffer+5, "%d,%d", &ch, &len); //extract channel and length
      if (len > 0) // if message not empty
      {
        response=buffer;
        byte debparam=response.lastIndexOf("GET /");   // cherche la position de "GET /?" dans le string(data)
        if(debparam != 255)                           // si c'est different de 255, c'est trouver
        {
          byte finparam=response.lastIndexOf(" HTTP/");  // cherche la position de " HTTP/" dans le string(data)
          if(finparam != 255)                           // si c'est different de 255, c'est trouver
          {
            data=response.substring(debparam+6,finparam);  //extrait la chaine entre "GET /?" et " HTTP/" dans le string(data)
            ActionParametre(data);    // envoie l'action a effectuer a la sous routine ActionParametre
            data="";
          }
          response="";
          homepage(ch);   // Envoi la page Web
        }
      }
    }
    clearBuffer();
}

  
/****************************************************
* FUNCTION : boolean sendData(String command, int timeout)
* PURPOSE : sends command to ESP8266,
*           waits for response until timeout,
*           compares response from ESP with expected response
* PARAMETERS :
*          String command : command to be sent to the ESP
*          int timeout : number of milliseconds to wait
* RESULT :
*          boolean: true if response contains "OK"
*/
String sendData(String command, int timeout)
{
    String reponce="";
    const int respLen = 128;
    char response[respLen];
    int i;

    // erase the whole response buffer
    for (i=0;i<respLen;i++)
    {
        response[i]='\0';
    }
    espSerial.print(command); // send command to the esp8266
    i=0;
    long int time = millis();
    while( (time+timeout) > millis())
    {    
      while(espSerial.available() && (i < respLen-1)) // as long as we have something to read and the buffer is not full
      {
        // The esp has data so display its output to the serial window
        response[i] = espSerial.read(); // read the next character.
        i++; //increment number of characters
      }
    }
    response[i]=0; // always end the string with a null character
//   dbgSerial.println(response);
    reponce=response;
    byte debparam=reponce.lastIndexOf("STAIP,");   // cherche la position de "STAIP," dans le string(reponce)
    if(debparam != 255)                           // si c'est different de 255, c'est trouver
    {
      AdresseIP=reponce.substring(debparam+7,reponce.lastIndexOf("+CIFSR")-3);  //extrait l'adresse IP de la chaine
      reponce="";
    }
    
   if( strstr(response, "OK") || strstr(response,"no change" )) return "OK";
   else return "No OK";
  
}

/**************************************************************
* FUNCTION : void clearBuffer (void)
* PURPOSE : erases buffer to ensure no false readings
**************************************************************/
void clearBuffer (void)
{
   for (int i =0;i<BUFFER_SIZE;i++ )
   {
      buffer[i]=0;
   }
}
void ActionParametre(String command)
{
  dbgSerial.println(">>"+command);
  if(command=="LED=ON")
    ledValue=1;
    
  if(command=="LED=OFF")
    ledValue=0;
    
  if(ledValue==1) digitalWrite(pinLED,HIGH);
    else digitalWrite(pinLED, LOW);
}
/**************************************************************
* FUNCTION : void homepage(int id)
* PURPOSE : send a web page and close connection
***************************************************************/
void homepage(int id)
{
    
    String Content; // this is my HTML form

    Content =  "<HTML>";
    Content += "<HEAD><TITLE>Arduino + ESP8266 Webserver</TITLE>";
//    Content += "<meta http-equiv=\"refresh\" content=\"30\">";
    Content += "</HEAD>";
    Content += "<BODY bgcolor=\"#008080\">";
    Content += "<p align=\"center\">";
    Content += "<img border=\"0\" src=\"http://tpsecret.free.fr/Arduino/Logo.jpg\" width=\"232\" height=\"96\" align=\"middle\">";
    Content += "</p>";
    Content += "<H1>Nb = ";
    Content += String(nb);
    Content += "</H1>";
    Content += "<H1>LED = ";
    if(ledValue == 0) Content += "OFF";
    else Content += "ON";
    Content += "</H1><BR><FORM name=\"LED Form\" action=\"/\" method=get>";
    Content += "<input type=\"submit\" name=\"LED\" value=\"ON\"><BR>";
    Content += "<input type=\"submit\" name=\"LED\" value=\"OFF\">";
    Content += "</FORM></BODY></HTML>";
    

    String Header; // this is the header message before the page
    
    Header = "HTTP/1.1 200 OK\r\n";
    Header += "Content-Type: text/html; charset=UTF-8\r\n";
    Header += "Connection: close\r\n";
    //Header += "Refresh: 5\r\n";
    Header += "Content-Length: ";
    Header += (int)(Content.length());
    Header += "\r\n\r\n";

    espSerial.print("AT+CIPSEND=");
    espSerial.print(id);
    espSerial.print(",");
    espSerial.println(Header.length()+Content.length());
    delay(100);
    if (espSerial.find(">"))
    {
        espSerial.print(Header);
        espSerial.print(Content);
        delay(1000);
    }
    espSerial.print("AT+CIPCLOSE=");
    espSerial.print(id);
    espSerial.print("\r\n");
    nb++;
}


Ca c'est le "Debug", on voit ce qui ce passe  :o


La page Web du serveur, simple mais efficace.


"Nb" c'est le nombre de fois ou la page a été afficher.

Bon en faite, c'est assez simple d'ailleurs je remercie ceux et celles qui avais débuter ce programme.
Voila, si ça peut vous aider, tant mieux et si vous avez des questions n'hesiter pas.

J-M-L

Merci pour le partage - dans l'absolu sur les petits micros-contrôleurs il vaut mieux éviter d'utiliser la classe String pour éviter le morcellement de la mémoire (à chaque concaténation il y a allocation dynamique de buffers dans le tas et libération)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

trimarco232

Quote
Bon en fait, c'est assez simple
Quote
si vous avez des questions n'hésitez pas.
Bonjour,
merci pour le partage !
- donc tu pourrais expliquer le fonctionnement de chaque ligne du programme ?
- est-ce que cela fonctionne avec un uno ou nano ?

Go Up