Techniques "avancées" de serveur web sur ESP8266 - Tuto J.M.L.

Bonjour à tous,

J'ai suivi avec grand intérêt le tuto de J.M.L. indiqué ci dessus en Sujet à cette adresse :

https://forum.arduino.cc/index.php?topic=511147.0

Tout fonctionne sauf le rendu avec Canvas. L'aiguille reste désespérément à zéro. sur l'affichage html.

Je teste avec une d1 mini pro

  • Le code html est un copié - collé pur et simple,

  • le code Ino est identique sauf une petite modif pour amplifier la valeur lue sur A0 qui se situe entre 1 et 10 : analogVal = ((analogRead(A0)) * 100);

Pouvez vous m'aider ?

Merci.

Ci dessous mon code ino :

#include "FS.h" // pour le SPIFFS
const char * nomDeFichier = "/jauges.html";

const byte pinBouton = D3;


// provient de https://github.com/esp8266/Arduino
// télécharger et installer à la main la dernière version
#include <ESP8266WiFi.h>

const char* ssid = "Livebox-BF7E";
const char* password = "xxxxx";

const uint16_t HTTPPort = 80;
WiFiServer serveurWeb(HTTPPort); // crée un serveur sur le port HTTP standard

const byte maxHTTPLine = 100;
char httpLine[maxHTTPLine + 1]; // +1 pour avoir la place du '\0'

const byte maxURL = 50;
char urlRequest[maxURL + 1]; // +1 pour avoir la place du '\0'
int analogVal = ((analogRead(A0)) * 100);

void printHTTPServerInfo()
{
  Serial.print(F("Site web http://")); Serial.print(WiFi.localIP());
  if (HTTPPort != 80) {
    Serial.print(F(":"));
    Serial.print(HTTPPort);
  }
  Serial.println();
}

void envoyerVariables(WiFiClient &cl)
{
  analogVal = ((analogRead(A0)) * 100);
  Serial.println (analogVal);
  // On envoie un en tête de réponse HTTP de type XML et le XML

  // l'en-tête doit être comme cela

  // ----------------------------------
  //  HTTP/1.1 200 OK
  //  Content-Type: text/xml
  //  Connection: keep-alive
  //                    <-- une ligne vide ici
  // ----------------------------------

  //  et le XML doit ressembler à cela avec bien sûr les bonnes valeurs insérées dans les balises

  // ----------------------------------
  //  <?xml version = "1.0" ?>
  //  <variables>
  //    <bouton>xxx</bouton>
  //    <digital1>yyy</digital1>
  //    <analog1>zzz</analog1>
  //  </variables>
  // ----------------------------------

  cl.print(F("HTTP/1.1 200 OK\r\n"
             "Content-Type: text/xml\r\n"
             "Connection: keep-alive\r\n\r\n"
             "<?xml version = \"1.0\" ?>"
             "<variables><bouton>"));

  if (digitalRead(pinBouton) == LOW) cl.print(F("actif"));
  else cl.print(F("inactif"));

  cl.print(F("</bouton><digital1>"));
  cl.print(digitalRead(D4));
  cl.print(F("</digital1><analog1>"));
  cl.print(analogVal);
  //  cl.print(analogRead(A0));
  cl.print(F("</analog1></variables>"));
}

boolean testRequeteWeb()
{
  boolean requeteHTTPRecue = false;
  byte indexMessage = 0;
  char * ptrGET, *ptrEspace;

  WiFiClient client = serveurWeb.available();
  if (!client) return requeteHTTPRecue; // pas de client connecté
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n' && currentLineIsBlank) { // une requête HTTP se termine par une ligne vide

        // ON GENERE LA PAGE WEB
        if (strcmp(urlRequest, "/favicon.ico")) { // si ce n'est pas pour le favicon
          requeteHTTPRecue = true;

          // on regarde si on a une requete qui continet /reqEtatBouton ( sinon on renvoie toute la page)
          if (strstr(urlRequest, "/reqEtatVariables")) { // http://www.cplusplus.com/reference/cstring/strstr/?kw=strstr
            // on va lire l'état du bouton et on renvoie l'information correctement
            envoyerVariables(client);
          } else { // on envoie la page web par défaut
            if (SPIFFS.exists(nomDeFichier)) {
              // On envoie un en tête de réponse HTTP standard de type HTML
              client.println("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: keep-alive\r\n");
              File pageWeb = SPIFFS.open(nomDeFichier, "r");
              client.write(pageWeb);
              pageWeb.close();
            } else {
              Serial.println(F("Erreur de fichier"));
            }
          }
        }
        break; // on sort du while et termine la requête
      } // fin de génération de la réponse HTTP

      if (c == '\n') {
        currentLineIsBlank = true;
        httpLine[indexMessage] = '\0'; // on termine la ligne correctement (c-string)
        indexMessage = 0; // on se reprépre pour la prochaine ligne
        if (ptrGET = strstr(httpLine, "GET")) {
          // c'est la requête GET, la ligne continent "GET /URL HTTP/1.1", on extrait l'URL
          ptrEspace = strstr(ptrGET + 4, " ");
          *ptrEspace = '\0';
          strncpy(urlRequest, ptrGET + 4, maxURL);
          urlRequest[maxURL] = '\0'; // par précaution si URL trop longue
        }
      } else if (c != '\r') {
        currentLineIsBlank = false;
        if (indexMessage <= maxHTTPLine - 1) {
          httpLine[indexMessage++] =  c; // sinon on ignore le reste de la ligne
        }
      }
    } // end if available
  } // end while
  delay(1);
  client.stop(); // termine la connexion
  return requeteHTTPRecue;
}


void setup() {

  pinMode(pinBouton, INPUT_PULLUP);
  pinMode(D4, INPUT);
  pinMode(A0, INPUT);

  Serial.begin(74880); // parce que mon Wemos et par défaut à peu près à cette vitesse, évite les caractères bizarre au boot
  Serial.println("\n\nTest SPIFFS\n");

  // on démarre le SPIFSS
  if (!SPIFFS.begin()) {
    Serial.println("erreur SPIFFS");
    while (true); // on ne va pas plus loin
  }

  WiFi.begin(ssid, password);

  Serial.println();
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.write('.');
  }
  Serial.println();

  // on démarre le serveur
  serveurWeb.begin();
  printHTTPServerInfo();

}

void loop() {
  testRequeteWeb();

}