html / string trop grand ... autre solution ?

Bonsoir,

Je ne trouve pas de solution pour ma page html qui utilise "string"
Je suis arrivé a un point ou visiblement le string est trop long = la page ne s'affiche plus.

Y a t'il une autre déclaration possible afin de ne pas être bloqué par la taille svp ?

Merci

#include <RTClib.h>
RTC_DS1307 RTC;
int test = 123;

int tempbac = test;
int temprampe = test;
int pwmblanc1 = test;
int pwmblanc2 = test;
int pwmbleu1 = test;
int pwmbleu2 = test;
int LEVER = test;
int COUCHER = test;


void setup() {
  Serial.begin(115200); // Start de seriele monitor op 9600 baud.
  Serial2.begin(115200); // Start de software monitor op 9600 baud.
  RTC.begin();
 
  // WiFi instellingen SSID en wachtwoord.
  String SSIDstring = ("ssid");
  String PASSstring = ("pass");
  
   Serial.println("\r\n----- [ RESET DE MODULE (RST) ] -----");  
  sendData("AT+RST\r\n", 1000, true); // Reset de ESP module.
 
  Serial.println("\r\n----- [ ZET ESP IN STATION MODE (CWMODE) ] -----");  
  sendData("AT+CWMODE=1\r\n", 500, true); // Configureer de ESP in "station mode" (1=Station, 2=AP, 3=Station+AP).
 
  Serial.println("\r\n----- [ INLOGGEN OP WIFI (CWJAP) ] -----");
  sendData("AT+CWJAP=" + SSIDstring + "," + PASSstring, 6000, true); // Inloggen op de WiFi met wachtwoord.
 
  Serial.println("\r\n----- [ DUMMY REGEL OM DE ERROR OP TE VANGEN ] -----");
  sendData("AT+CIPSTATUS\r\n", 500, true); // Alles wat na de bovenste regel komt geeft "ERROR", vandaar deze dummy regel!
 
  Serial.println("\r\n----- [ MULTIPLEX MODE OP MULTIPLE CONNECTIES ZETTEN (CIPMUX) ] -----");
  // Zet multiplex in "multiple mode, zo kan de server meerdere verbindingen accepteren, dit is nodig om de server te starten.
  sendData("AT+CIPMUX=1\r\n", 500, true);
 
  Serial.println("\r\n----- [ SERVER STARTEN (CIPSERVER) ] -----"); 
  sendData("AT+CIPSERVER=1,80\r\n", 500, true); // Zet de server actief op poort 80.
  
  Serial.println("\r\n----- [IP ADRES] -----");
  sendData("AT+CIFSR\r\n", 500, true); // Geef het verkregen IP adres weer.
  
 
}
 
void loop() {

  DateTime now = RTC.now();
  
if(Serial2.available()) { // Controleer op de ESP een bericht stuurt.
    if(Serial2.find("+IPD,")) {
      delay(1000);
      int connectionId = Serial2.read() - 48;
 
      // ----- pageweb -----
      
String pageweb ="<!DOCTYPE html>";
pageweb +="<html>";
pageweb +="<head>";
pageweb +="<title>AQUABOUN'S</title>";
pageweb +="<style>body{background-color: LightBlue ;color: MediumBlue ;font-family: Comic Sans MS;font-size: 35px;}";
pageweb +="h1{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 100px; text-shadow: 5px 4px DodgerBlue ;border: 2px solid red;}";
pageweb +="h2{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 60px; text-shadow: 3px 2px DodgerBlue ;}";
pageweb +=".button {display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;background-color:mediumBlue;color: white;border-radius:20px;}";
pageweb +=".button:active {background-color: Blue;}";
pageweb +=".button2 {background-color:FireBrick;display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;color: white;border-radius:20px;}";
pageweb +=".button2:active {background-color:red;}";
pageweb +="</style>";
pageweb +="</head>";
pageweb +="<body>";
pageweb +="<h1>AQUABOUN'S</h1>";
pageweb +="
";
pageweb += "<FONT size= 35px>";
pageweb += "<text-align: left>";
pageweb +="<p>Heure : ";
pageweb += "<FONT color= red>";
pageweb += now.hour();
pageweb += "<FONT color= MediumBlue >";
pageweb += "H";
pageweb += "<FONT color= red>";
if (now.minute()<10){ 
pageweb += "0";
}
pageweb += now.minute();
pageweb += "<FONT color= MediumBlue >";
pageweb += " ";
pageweb += "<FONT size= 3px>";
pageweb += "<FONT color= red>";
pageweb += now.second();
pageweb += "<FONT color= MediumBlue >";
pageweb += "s";
pageweb +="
";
pageweb += "<FONT size= 35px>";
pageweb +="<p>Temperature aquarium : ";
pageweb += "<FONT color= red>";
pageweb += tempbac;
pageweb +="&deg";
pageweb +="
";
pageweb += "<FONT color= MediumBlue >";
pageweb +="<p>Temperature rampe : ";
pageweb += "<FONT color= red>";
pageweb += temprampe;
pageweb +="&deg";
pageweb +="
";
pageweb += "<FONT color= MediumBlue >";
pageweb +="<p>PH: ";
pageweb += "<FONT color= red>";
pageweb += "sonde ph non instalee";
pageweb +="
";
pageweb +="
";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>puissance blanc : ";
pageweb +="<FONT color= red>";
pageweb +=(((pwmblanc1+pwmblanc2)/2)/2.55);
pageweb +="%  ";
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>puissance bleu : ";
pageweb +="<FONT color= red>";
pageweb +=(((pwmbleu1+pwmbleu2)/2)/2.55);
pageweb +="%  ";
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>Soleil au zénith a partir de  : ";
pageweb +="<FONT color= red>";
pageweb +=LEVER;
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>Soleil au zénith jusque a : ";
pageweb +="<FONT color= red>";
pageweb +=COUCHER;
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="</body>";
pageweb +="</html>";


sendData("AT+CIPSEND=" + String(connectionId) + "," + pageweb.length() + "\r\n", 500, true);
sendData(pageweb, 1000, true); // Stuur de pageweb door.
sendData("AT+CIPCLOSE=" + String(connectionId) + "\r\n", 1000, true); // Sluit de connectie.
    }
  }
}
String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  Serial2.print(command); // Stuur een "lees" karakter naar de ESP.
  long int time = millis();
  while( (time+timeout) > millis()) {
    while(Serial2.available()) { // De ESP heeft data om weer te geven, laat het zien in de serial monitor. 
      char c = Serial2.read(); // Lees het volgende karakter.
      response+=c;
    }
  }
  if(debug) { Serial.print(response); } 
  return response;
}

Hey man !!!
T'es pas sur un PC avec des Go de Ram à disposition!!!

La mémoire d'un Arduino c'est quelques malheureux Ko et c'est pas vraiment adapté à stocker du code html à rallonge.

De plus les variables de type string sont plutôt gourmandes en ressources mémoire

La première solution c'est de basculer les constantes texte en zone programme (voir progmem et fonctionnalités associées)
La seconde c'est de stocker ton code html sur une carte SD

Bonsoir alain,

Je dispose déjà d'une carte SD installé, donc pour le stockage de la page html, pas de problème.
Pour programme je vais voir ... sa a pas l'air simple :confused:

Merci

Vous avez jeté un œil au tuto que j’ai posté. Si vous ne voulez pas passer tout de suite à la carte SD j’y montre comment mettre votre code en mémoire programme assez simplement

(Et Comme on en a déjà discuté il ne faut pas vouloir tout balancer d’un Coup dans une grosse chaîne de caractères)

Bonsoir JML

J'ai lu toute la première partie (juste avant le code)
Le tuto est dans mes favori et quand mes yeux seront plus réveiller, je poursuivrait :slight_smile:

La carte SD ne me gaine pas (et c'est peut être plus simple ?) surtout que je n'est jamais toucher a une commande "progmem" ou "epromm"

ça vous a marqué mes gros STRING lol j'ai changé depuis :slight_smile:
je fais plein de petite ligne (ou alors j'ai pas compris ?!)

Bon, je vais aller rêver 4h et je lit tout ça demain (tu rajoute plus de page hein ... )

Bonjour

Ah les String... :slight_smile:

Quand vous faites

String pageweb ="<!DOCTYPE html>";
pageweb +="<html>";
pageweb +="<head>";
pageweb += ......

Votre variable pageweb grandit à chaque ligne pour mémoriser l’ensemble de la page web - en faisant au passage plein de trous dans la mémoire. Au bout d’un moment votre Arduino n’a plus de mémoire et l’ajout de contenu n’est pas pris en compte.

Il faut envoyer la page petit bouts par petits bouts

J-M-L:
Il faut envoyer la page petit bouts par petits bouts

Bonsoir,

Donc je n'avais pas compris...
Je pensait que votre "réflexion" portait sur cette enorme ligne "string" de 300 caractères que j'avais fait dans mon premier code.
Du coup, comme vous le constater, j'ai fait de petit bout ... lol, visiblement j'ai mal interprété votre message, (incompréhension ... quand tu nous tient ...)

Donc je suppose que vous parler d’écrire plusieurs string ? et de les mettre bout a bout ? (string1, sting2, string3, ect...)
Si ces le cas, mes essaie ont été infructueux.

Non toujours pas :slight_smile:

Le problème c’est de vouloir mettre en RAM toute la page HTML dun seul coup, que ce soit en une chaîne ou plusieurs vous vous retrouvez à saturer la mémoire de votre Arduino

Ce qu’il faut faire c’est lire une PETITE chaine et l’envoyer, ce qui libère la mémoire pour re-lire une nouvelle petite chaîne et l’envoyer, etc....

—> côté navigateur web vous recevez la page bout par bout comme je l’explique dans mon tuto

J-M-L:
Non toujours pas :slight_smile:

A ...

Avant de revenir vous embêter, j'ai donc été finir de lire ton poste (partie codage), 2 fois pour être exacte.
Pour être tout a fait franc (surtout avec moi même), je pense être arrivé au maximum de ma compréhension.
Pourtant, tout est vraiment détaillé mais il m'est impossible d'adapter un code que je ne comprend pas.

J'ai donc fouiller sur le net pour trouver des codes "exemple", sans réel avancé.
Je me suis penché également sur le client.print, avec deux méthodes :
Ligne par ligne dans le code = affichage de la page OK mais mots par mots (~3 mots seconde).
En HTML dans un fichier texte sur la carte SD = affichage de la page OK mais mots par mots (~3 seconde par mots !!!).
D'un point de vu pratique, le deuxième solution est plus simple car elle n'encombre pas le code et elle permet d’écrire en HTML sans avoir a ajouter client.print ou string :slight_smile:

Donc je regarde coté progmem comme l'indiquait Alain mais sans réel compréhension (encore :frowning: )

L’idéal, dans un cas comme dans l'autre serait de trouvé une de ces méthodes utilisé dans un bout de code pour une page HTML afin que je puisse analyser (comprendre) et l'adapter. Cela éviteras également de vous sollicité.( de trop :slight_smile: )

Si vous avez ça qui traîne ...

Merci

Vous laissez tomber le pilotage par commandes AT et vous voulez utiliser la librairie ? dans ce cas mon petit bout d'exemple que j'avais pointé (qui fonctionne avec la carte Ethernet mais c'est équivalent en WiFi) devrait vous mettre sur la voie.

Si vous conservez les commandes AT alors je n'ai pas mieux à vous proposer que le long tuto que j'ai posté...

Je ne laisse rien tombé puisque il va falloir que ça marche ! :slight_smile:
Les commande AT me plaisait bien de par le résultat ... jusque a être bloqué.
La librairie, plus simple mais Gros problème d'affichage.

Peu importe qu'elle méthode employé du moment que j'arrive a la faire fonctionné.
Votre tuto est tres bien et je vous garantie que j'y met du mien ...

:confused: :confused:

postez votre code avec la librairie

:roll_eyes:

Voici celui pour mes test que j'adapterait une fois parfaitement fonctionnel dans mon code de gestion d'aquarium.

Merci :confused:

#include <RTClib.h>

RTC_DS1307 RTC;

int test = 123;
int tempbac = test;
int temprampe = test;
int pwmblanc1 = test;
int pwmblanc2 = test;
int pwmbleu1 = test;
int pwmbleu2 = test;
int LEVER = test;
int COUCHER = test;


void setup() {
  Serial.begin(115200); // Start de seriele monitor op 9600 baud.
  Serial2.begin(115200); // Start de software monitor op 9600 baud.


  String SSIDstring = ("box");
  String PASSstring = ("pass");



delay(1000);
   

  Serial.println("\r\n----- [ RESET DE MODULE (RST) ] -----");  
  sendData("AT+RST\r\n", 1000, true); // Reset de ESP module.
 
  Serial.println("\r\n----- [ ZET ESP IN STATION MODE (CWMODE) ] -----");  
  sendData("AT+CWMODE=1\r\n", 500, true); // Configureer de ESP in "station mode" (1=Station, 2=AP, 3=Station+AP).
 
  Serial.println("\r\n----- [ INLOGGEN OP WIFI (CWJAP) ] -----");
  sendData("AT+CWJAP=" + SSIDstring + "," + PASSstring, 6000, true); // Inloggen op de WiFi met wachtwoord.
 
  Serial.println("\r\n----- [ DUMMY REGEL OM DE ERROR OP TE VANGEN ] -----");
  sendData("AT+CIPSTATUS\r\n", 500, true); // Alles wat na de bovenste regel komt geeft "ERROR", vandaar deze dummy regel!
 
  Serial.println("\r\n----- [ MULTIPLEX MODE OP MULTIPLE CONNECTIES ZETTEN (CIPMUX) ] -----");
  // Zet multiplex in "multiple mode, zo kan de server meerdere verbindingen accepteren, dit is nodig om de server te starten.
  sendData("AT+CIPMUX=1\r\n", 500, true);
 
  Serial.println("\r\n----- [ SERVER STARTEN (CIPSERVER) ] -----"); 
  sendData("AT+CIPSERVER=1,80\r\n", 500, true); // Zet de server actief op poort 80.
  
  Serial.println("\r\n----- [IP ADRES] -----");
  sendData("AT+CIFSR\r\n", 500, true); // Geef het verkregen IP adres weer.
}

 
void loop() {

  DateTime now = RTC.now();
  if(Serial2.available()) { // Controleer op de ESP een bericht stuurt.
    if(Serial2.find("+IPD,")) {
      delay(1000);
      int connectionId = Serial2.read() - 48;



      // ----- pageweb -----

String pageweb ="<!DOCTYPE html>";
pageweb +="<html>";
pageweb +="<head>";
pageweb +="<title>AQUABOUN'S</title>";
pageweb +="<style>body{background-color: LightBlue ;color: MediumBlue ;font-family: Comic Sans MS;font-size: 35px;}";
pageweb +="h1{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 100px; text-shadow: 5px 4px DodgerBlue ;border: 2px solid red;}";
pageweb +="h2{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 60px; text-shadow: 3px 2px DodgerBlue ;}";
pageweb +=".button {display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;background-color:mediumBlue;color: white;border-radius:20px;}";
pageweb +=".button:active {background-color: Blue;}";
pageweb +=".button2 {background-color:FireBrick;display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;color: white;border-radius:20px;}";
pageweb +=".button2:active {background-color:red;}";
pageweb +="</style>";
pageweb +="</head>";
pageweb +="<body>";
pageweb +="<h1>AQUABOUN'S</h1>";
pageweb +="
";
pageweb += "<FONT size= 35px>";
pageweb += "<text-align: left>";
pageweb +="<p>Heure : ";
pageweb += "<FONT color= red>";
pageweb += now.hour();
pageweb += "<FONT color= MediumBlue >";
pageweb += "H";
pageweb += "<FONT color= red>";
if (now.minute()<10){ 
pageweb += "0";
}
pageweb += now.minute();
pageweb += "<FONT color= MediumBlue >";
pageweb += " ";
pageweb += "<FONT size= 3px>";
pageweb += "<FONT color= red>";
pageweb += now.second();
pageweb += "<FONT color= MediumBlue >";
pageweb += "s";
pageweb +="
";
pageweb += "<FONT size= 35px>";
pageweb +="<p>Temperature aquarium : ";
pageweb += "<FONT color= red>";
pageweb += tempbac;
pageweb +="&deg";
pageweb +="
";
pageweb += "<FONT color= MediumBlue >";
pageweb +="<p>Temperature rampe : ";
pageweb += "<FONT color= red>";
pageweb += temprampe;
pageweb +="&deg";
pageweb +="
";
pageweb += "<FONT color= MediumBlue >";
pageweb +="<p>PH: ";
pageweb += "<FONT color= red>";
pageweb += "sonde ph non instalee";
pageweb +="
";
pageweb +="
";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>puissance blanc : ";
pageweb +="<FONT color= red>";
pageweb +=(((pwmblanc1+pwmblanc2)/2)/2.55);
pageweb +="%  ";
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>puissance bleu : ";
pageweb +="<FONT color= red>";
pageweb +=(((pwmbleu1+pwmbleu2)/2)/2.55);
pageweb +="%  ";
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";
pageweb +="<FONT color= MediumBlue >";
pageweb +="<p>Soleil au zénith a partir de  : ";
pageweb +="<FONT color= red>";
pageweb +=LEVER;
pageweb +="
";
pageweb +="<button class=button>-</button>";
pageweb +="<button class=button>+</button>";
pageweb +="<button class=button2>Valider</button></p>";

pageweb +="</body>";
pageweb +="</html>";




  sendData("AT+CIPSEND=" + String(connectionId) + "," + pageweb.length() + "\r\n", 500, true);
      sendData(pageweb, 1000, true); // Stuur de pageweb door.
      sendData("AT+CIPCLOSE=" + String(connectionId) + "\r\n", 1000, true); // Sluit de connectie.
    }
  }
  }

String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  Serial2.print(command); // Stuur een "lees" karakter naar de ESP.
  long int time = millis();
  while( (time+timeout) > millis()) {
    while(Serial2.available()) { // De ESP heeft data om weer te geven, laat het zien in de serial monitor. 
      char c = Serial2.read(); // Lees het volgende karakter.
      response+=c;
    }
  }
  if(debug) { Serial.print(response); } 
  return response;
}

RTClib.zip (45.3 KB)

mais vous avez toujours votre String pageweb gigantesque...

une vois que vous avez reçu une demande de connexion vous faites un delay(1000);.. Comme vous faites un find ensuite qui a un timeout de une seconde, c'est déjà assez pénible comme cela faut pas en rajouter...

Comme vous l'avez vu dans mon tuto, pour envoyer une réponse il faut envoyer la commande

AT+CIPSEND=<linkID>,<taille>\r\n

ensuite il faut balancer octets en vrac
puis terminer la connexion en faisant AT+CIPCLOSE=<linkID>\r\n

il y a une contrainte, c'est que taille doit faire moins de 2 kilo-octets...
Je ne sais pas la taille de votre page finale, mais tant que vous ne changerez votre approche et que la page peut être longue vous aurez un problème (outre le problème mémoire lié à l'usage de la classe String).

Comme expliqué dans le tuto, rien ne vous empêche de faire plusieurs AT+CIPSEND=<linkID>,<taille>\r\n tant que vous n'avez pas fait close, à condition de laisser au moins 20ms entre deux CIPSEND

Donc premier essai pour tenter d'améliorer la situation, envoyez par petits bouts (cf ci dessous).

Ensuite votre fonction sendData n'est pas bonne dans la durée, millis() c'est un [b]unsigned[/b] long et pour gérer le temps il faut faire des soustraction, pas des additions sinon on risque de déborder et revenir à zéro. j'ai donc corrigé aussi cette fonction en conséquence

--> suite dans le prochain post car trop long

essayez avec ça (mais ça me donne des frissons dans le dos toutes ces Strings :grin: :smiling_imp: :stuck_out_tongue_closed_eyes: ...)

#include <RTClib.h>

RTC_DS1307 RTC;

int test = 123;
int tempbac = test;
int temprampe = test;
int pwmblanc1 = test;
int pwmblanc2 = test;
int pwmbleu1 = test;
int pwmbleu2 = test;
int LEVER = test;
int COUCHER = test;


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


  String SSIDstring = ("box");
  String PASSstring = ("pass");



  delay(1000);


  Serial.println(F("\r\n----- [ RESET ] -----"));
  sendData("AT+RST\r\n", 1000, true); // Reset de ESP module.

  Serial.println(F("\r\n----- [ STATION MODE (CWMODE) ] -----"));
  sendData("AT+CWMODE=1\r\n", 500, true); // Configureer de ESP in "station mode" (1=Station, 2=AP, 3=Station+AP).

  Serial.println(F("\r\n----- [ WIFI (CWJAP) ] -----"));
  sendData("AT+CWJAP=" + SSIDstring + "," + PASSstring, 6000, true); // Inloggen op de WiFi met wachtwoord.

  Serial.println(F("\r\n----- [ DUMMY REGEL OM DE ERROR OP TE VANGEN ] -----"));
  sendData("AT+CIPSTATUS\r\n", 500, true); // Alles wat na de bovenste regel komt geeft "ERROR", vandaar deze dummy regel!

  Serial.println(F("\r\n----- [ MULTIPLEX MODE OP MULTIPLE CONNECTIES ZETTEN (CIPMUX) ] -----"));
  // Zet multiplex in "multiple mode, zo kan de server meerdere verbindingen accepteren, dit is nodig om de server te starten.
  sendData("AT+CIPMUX=1\r\n", 500, true);

  Serial.println(F("\r\n----- [ SERVER STARTEN (CIPSERVER) ] -----"));
  sendData("AT+CIPSERVER=1,80\r\n", 500, true); // Zet de server actief op poort 80.

  Serial.println(F("\r\n----- [IP ADRES] -----"));
  sendData("AT+CIFSR\r\n", 500, true); // Geef het verkregen IP adres weer.
}


void loop() {

  DateTime now = RTC.now();
  if (Serial2.available()) { // Controleer op de ESP een bericht stuurt.
    if (Serial2.find((char *) "+IPD,")) {
      byte connectionId = Serial2.read() - '0';
      // ----- pageweb -----

      String pageweb = "<!DOCTYPE html>";
      pageweb += "<html>";
      pageweb += "<head>";
      pageweb += "<title>AQUABOUN'S</title>";
      pageweb += "<style>body{background-color: LightBlue ;color: MediumBlue ;font-family: Comic Sans MS;font-size: 35px;}";
      pageweb += "h1{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 100px; text-shadow: 5px 4px DodgerBlue ;border: 2px solid red;}";
      pageweb += "h2{color: MediumBlue ;text-align: center;font-family: Comic Sans MS;font-size: 60px; text-shadow: 3px 2px DodgerBlue ;}";
      pageweb += ".button {display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;background-color:mediumBlue;color: white;border-radius:20px;}";
      pageweb += ".button:active {background-color: Blue;}";
      pageweb += ".button2 {background-color:FireBrick;display: inline-block;padding: 5px 40px;font-size: 25px;cursor: pointer;text-align: center;color: white;border-radius:20px;}";
      pageweb += ".button2:active {background-color:red;}";

      // *********************** ENVOI DE CE QU'ON A DEJA *******************************
      sendData("AT+CIPSEND=" + String(connectionId) + "," + pageweb.length() + "\r\n", 1000, true);
      sendData(pageweb, 2000, true); // Stuur de pageweb door.
      pageweb = "";
      delay(20);
      // ********************************************************************************

      pageweb += "</style>";
      pageweb += "</head>";
      pageweb += "<body>";
      pageweb += "<h1>AQUABOUN'S</h1>";
      pageweb += "
";
      pageweb += "<FONT size= 35px>";
      pageweb += "<text-align: left>";
      pageweb += "<p>Heure : ";
      pageweb += "<FONT color= red>";
      pageweb += now.hour();
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "H";
      pageweb += "<FONT color= red>";
      if (now.minute() < 10) {
        pageweb += "0";
      }
      pageweb += now.minute();
      pageweb += "<FONT color= MediumBlue >";
      pageweb += " ";
      pageweb += "<FONT size= 3px>";
      pageweb += "<FONT color= red>";
      pageweb += now.second();
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "s";
      pageweb += "
";
      pageweb += "<FONT size= 35px>";
      pageweb += "<p>Temperature aquarium : ";
      pageweb += "<FONT color= red>";
      pageweb += tempbac;
      pageweb += "&deg";
      pageweb += "
";


      // *********************** ENVOI DE CE QU'ON A DEJA *******************************
      sendData("AT+CIPSEND=" + String(connectionId) + "," + pageweb.length() + "\r\n", 1000, true);
      sendData(pageweb, 2000, true); // Stuur de pageweb door.
      pageweb = "";
      delay(20);
      // ********************************************************************************


      pageweb += "<FONT color= MediumBlue >";
      pageweb += "<p>Temperature rampe : ";
      pageweb += "<FONT color= red>";
      pageweb += temprampe;
      pageweb += "&deg";
      pageweb += "
";
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "<p>PH: ";
      pageweb += "<FONT color= red>";
      pageweb += "sonde ph non instalee";
      pageweb += "
";
      pageweb += "
";
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "<p>puissance blanc : ";
      pageweb += "<FONT color= red>";
      pageweb += (((pwmblanc1 + pwmblanc2) / 2) / 2.55);
      pageweb += "%  ";
      pageweb += "
";
      pageweb += "<button class=button>-</button>";
      pageweb += "<button class=button>+</button>";
      pageweb += "<button class=button2>Valider</button></p>";
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "<p>puissance bleu : ";
      pageweb += "<FONT color= red>";
      pageweb += (((pwmbleu1 + pwmbleu2) / 2) / 2.55);
      pageweb += "%  ";
      pageweb += "
";
      pageweb += "<button class=button>-</button>";
      pageweb += "<button class=button>+</button>";
      pageweb += "<button class=button2>Valider</button></p>";
      pageweb += "<FONT color= MediumBlue >";
      pageweb += "<p>Soleil au zénith a partir de  : ";
      pageweb += "<FONT color= red>";
      pageweb += LEVER;
      pageweb += "
";
      pageweb += "<button class=button>-</button>";
      pageweb += "<button class=button>+</button>";
      pageweb += "<button class=button2>Valider</button></p>";

      pageweb += "</body>";
      pageweb += "</html>";


      // *********************** ENVOI DE CE QU'ON A DEJA *******************************
      sendData("AT+CIPSEND=" + String(connectionId) + "," + pageweb.length() + "\r\n", 1000, true);
      sendData(pageweb, 2000, true); // Stuur de pageweb door.
      pageweb = "";
      delay(20);
      // ********************************************************************************

      sendData("AT+CIPCLOSE=" + String(connectionId) + "\r\n", 1000, true); // Sluit de connectie.
    }
  }
}

String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  Serial2.print(command); // Stuur een "lees" karakter naar de ESP.
  unsigned long int chrono = millis();
  while ( millis() - chrono <= timeout) {
    while (Serial2.available()) { // De ESP heeft data om weer te geven, laat het zien in de serial monitor.
      char c = Serial2.read(); // Lees het volgende karakter.
      response += c;
    }
  }
  if (debug) {
    Serial.print(response);
  }
  return response;
}

Merci, je vais essayer.
Mais j'ai du mal a te comprendre :

J-M-L:
essayez avec ça (mais ça me donne des frissons dans le dos toutes ces Strings :grin: :smiling_imp: :stuck_out_tongue_closed_eyes: ...)

Si tu m'explique cette méthode est quelle est fonctionnel, pourquoi dire ça ?
Au vu de la taille de ma page, faut il que j'abandonne définitivement cette méthode ? (pour client.print?)

Parce que la classe String morcelle votre mémoire et petit à petit ça va devenir de plus en plus difficile de trouver des morceaux contigus assez grands pour stocker le texte à chaque fois que vous faites une concaténation (ajouter un bout de texte à la chaîne avec le +) . à ce moment là - plus ou moins aléatoire en fonction de votre usage, la String va retourner plus rien du tout et votre code ne plus marcher et c’est impossible à débugger. ça se dégrade dans le temps, après faut rebooter.

Si vous ne lisez pas l’anglais, lisez le tuto MCHobby en français et le « kaboom » qu’ils décrivent (en suivant les liens de la table des matières dans le rectangle vert en haut à droite de la page)


(Source originale: Memories of an Arduino. Crédit AdaFruit Industries.)

Dans mon tuto je vous montre un exemple de comment mettre le code html en mémoire flash et le lire pour l’envoyer par petits bouts... faites pareil... sincèrement l’ensemble de vos String peut être enlevé sans problème

Tenez, cadeau du dimanche soir :slight_smile:

j'ai changé votre exemple:

  • intégré la page web en mémoire flash avec la technique expliquée dans le tuto (elle est donc dans le second onglet). Dans cette page toutes les valeurs dynamiques sont remplacées par $$$.

  • dans la fonction de génération de la page web, si je trouve une ligne $$$, je la remplace par une chaîne de caractères préparée en début de fonction, séquentiellement. il faut donc bien sûr déclarer le tableau de variables dans le bon ordre.

  • modifié votre fonction sendData pour n'accepter que des c-Strings et pas ces horribles Strings

  • modifié votre fonction sendData pour qu'elle ne lise pas le port série si on n'est pas en mode debug (de toutes façons vous ne faisiez rien de la String renvoyée) et attende simplement le délai, sinon en mode debug attend et imprime directement mais ne met pas en mémoire. (Si vous voulez mieux et vraiment lire ce qui revient cf mon tuto ou on attend soit un timeout, soit le « OK » de la commande (votre fonction telle que codée écoute juste le port série pendant longtemps ce qui fait que plusieurs appels séquentiels d’envoi de données est super long!)

  • rajouté un #define pour le port série de l'ESP

Voilà - je mets ça en PJ parce qu'il y a deux fichiers, le programme principal et le second onglet pour la déclaration de la page web.

je n'ai pas votre environnement alors je n'ai pas pu tester, je sais que ça compile mais c'est tout... dites moi si ça fonctionne !

sansString.zip (3.67 KB)

Bonjour JML,

...

a oui ... j'avais beau lire tout se que je veut, je n'aurais jamais abouti a ça !
Merci.Merci.Merci.

Oui ça compile et téléversé sans problème.
Une fois lancé, la connexion WIFI ne se fait pas (j'ai l'impression que le programme continu avec d'avoir eu la réponse a la connexion)
J'ai donc augmenté de 6 >10 seconde mais toujours pareil.
J'ai donc vérifier et écrivant manuellement les commande dans le moniteur et j'ai bien une réponse et adresse ip.:

ah c'est tout bête

j'ai juste oublié le \r\n à la fin de la commande

const char * CWJAPCommand = "AT+CWJAP=\"SSID_BOX\",\"MOT_DE_PASSE\"[color=red]\r\n[/color]";

ce qui fait qu'elle n'est pas exécutée par l'ESP