Envoyer un fichier .html à un ESP8266 sans String

Bonjour
J'ai acquis un ESP8266, plus précisément un Wemos D1 mini. J'ai, en suivant beaucoup de tutoriels, réussi à afficher une page web codée en html sur un serveur hébergé sur mon ESP8266. Voici le code que j'ai utilisé pour cela :

#include <ESP8266WiFi.h> // bibliothèque qui gère le wifi
#include <ESP8266WebServer.h> // bibliothèque qui gère les serveurs web

// créer un objet serveur sur le port 80
ESP8266WebServer serveur(80);

const char* ssid = "****************";
const char* password = "****************";

void notFound() {
  serveur.send(404, "text/plain", "404: Page not found!");
}

void runPage01() {
  String page = "";
  page += "<!DOCTYPE html>";
  page += "<html lang='fr'>";
  page += "    <head>";
  page += "        <title>Mon serveur web ESP8266</title>";
  page += "        <!--rechargement de la page toutes les 69 secondes, largeur complet de l'écran, on utilise des accents'-->";
  page += "        <meta http-equiv='refresh' content='60' name='viewport' content='width=device-width, initial-scale=1' charset='UTF-8' />";
  page += "    </head>";

  page += "    <body>";
  page += "        <h1>Mon Serveur ESP8266</h1>";
  page += "        <p>Ce serveur est hébergé sur un ESP8266</p>";
  page += "        <i>Ceci est un test!</i>";
  page += "    </body>";
  page += "</html>";

  // envoyer la page
  serveur.send(200, "text/html", page);
}

void setup() {
	Serial.begin(115200);
	delay(1000);
	Serial.println("\n");
	
	WiFi.begin(ssid, password);
	Serial.print("Tentative de connexion...");
	
	while(WiFi.status() != WL_CONNECTED) {
		Serial.print(".");
		delay(100);
	}
	
	Serial.println("\n");
	Serial.println("Connexion etablie!");
	Serial.print("Adresse IP: ");
	Serial.println(WiFi.localIP());

  // "/" = page d'accueil.
  serveur.on ( "/", runPage01);
  // si le lien n'existe pas, appeler la fonction "notFound"
  serveur.onNotFound(notFound);
  // démarrer le serveur
  serveur.begin();
  Serial.println("Serveur actif !");
}

void loop() {
	serveur.handleClient();
}

Pour afficher la page html, j'ai utilisé la classe String, mais cette méthode n'est pas propre, ni optimisée.


Mon problème : Je voudrai trouver une autre méthode pour afficher le html (appeler un fichier index.html dans le code, par exemple, ou créer un tableau géant...).

Bonne journée

Cordialement
Pandaroux007

on utilise un raw string literal - souvent mis dans un .h à part pour ne pas impacter l'indentation dans l'IDE.

const char pageWeb[] PROGMEM = R"---(première ligne du contenu
ici le texte brut, sans séquence d'échappement, 
par exemple le guillemet se met directement "coucou"
avec des sauts de lignes si vous voulez
dernière ligne du contenu)---";

le partie ---( au début et )--- à la fin ne font pas partie de votre texte, c'est le délimiteur qui permet au compilateur de savoir où commence votre texte et où il fini. bien sûr il ne faut pas que ce délimiteur soit dans le texte, vous pouvez choisir autre chose que des tirets

par exemple

const char page[] PROGMEM = R"--8<--8<--(
XXX
)--8<--8<--";

ce qu'il faut c'est avoir le même truc avant la parenthèse ouvrante et après la fermante

➜ voici un exemple avec un .h séparé donc je fais un
#include "contenu.h"
au début de mon code pour que le texte soit importé

j'utilise PROGMEM pour mettre la string en mémoire flash, donc lors de l'impression il faut dire à la fonction print que le tableau est en mémoire flash en utilisant un cast (__FlashStringHelper*)

Serial.println((__FlashStringHelper*) page1);

pour économiser de la mémoire, ne mettez pas en forme votre HTML avec des tabulations, ça n'a aucune conséquence pour l'affichage de la page web... ➜ compactez au maximum

Bonjour @J-M-L
Merci beaucoup ! c'est exactement ce que je voulais ! je viens de le découvrir dans ce tuto, et votre réponse correspond parfaitement et complète ce que le tuto indiquait !


et en plus j'ai découvert également ceci grâce à vous :

Merci encore !

Bonne journée

Cordialement
Pandaroux007