Aquaboun's /// gestion d'aquarium recifal

Je vient vers vous pour exposer mon projet et peut être recevoir votre aide.

Ma passion a moi , ce n'est pas l'arduino.
Je suis aquariophile depuis tout petit et tournée depuis 6 ans vers le récifal.
Cette passion, tout comme vous, je la partage sur un forum (récifal France) et a chaque étape/projet que j'ai réalisé, j'en est profité pour partager la réalisation avec les autres membres.
Mon bac actuel :

Un des premier projet arduin :

Et mon dernier avec le montage d'un ackduino :
Peut etre avez vous déjà entendu parler de l'ackduino ? si non, pour faire cours, c'est un programme sur arduino afin de gérer tout les éléments essentiel d'un bac récifal

Comme vous, je prend du temps pour partager et aider les autre dans le domaine que je "maîtrise"
Je me suis lancé dans l'arduino a cause du prix de ma passion, les appareil du commerce son hors de prix (exemple, l'aquatronica de base a 750€ Osmolateurs pour aquarium - Aqua Store)
jetait donc content d'avoir réalisé pour ~80€ des pompe de dosage, car a cette époque le premier prix était dans les 250€ et la distribution de produit en récifal était vraiment la base.
J'etait encore plus content de le partagé et de voir d'autre passionné enthousiasmé (qui devait être dans la situation budgétaire)

Mon projet en cours est en remplacement de cette ackduino (ackduino a été crée par plusieurs personne qui on chacune ajouté leur touche au fur et a mesure puis "abandonné" par les createur au depent d'un projet sur raspbery.
A moyen terme, j'ai personnellement eu le droit a des bug régulier puis a un débordement du bac + une pompe bloqué en marche a vide = cramé + disjoncté ...) bref ...
Dans le but de d'avoir un outil plus fiable pour nos bac, je me suis donc lancé dans ce projet.
(depuis juin).

Je pense avoir bien avancé seul dans un premier temps coté programme :
Levée couchée soleil
Puissance brassage
Oscillateur
Distribution nourriture
Affichage sur écran 3.2 (volonté du non tactil)
Divers alarme et securité

Mais aussi coté hardware avec le dessin et création d'un circuit imprimé (première fois pour moi), le but étant de n'avoir qu'a brancher sonde et autres ... la simplicité pour tous !

C'est sur les fonctionne plus complexe du programme que j'arrive sur le forum arduino.com ...
Je vient tout juste d'intégré dans le programme la gestion des SMS en cas de dépassement température ou de coupure edf.
Oufff :slight_smile:

Mais voila ...
Je coince sur la partie WEB qui doit avoir pour but de voir les paramètres actuel du bac mais également de pouvoir faire les réglages des paramètres.
j'en apprend tout les jours avec l'arduino mais cette fonction nécessite un niveau de compétence qui me dépasse malgré mon implication. html / string trop grand ... autre solution ? - Français - Arduino Forum

Je cherche a être épauler afin de finir ce dernier chapitre et finaliser tout ça, je pourrait ensuite, a mon tour, partager et apporté mon aide dans mon domaine, sur le forum recifal france (je ne manquerait pas de préciser les personne aillant participé)

Je comprendrait tout a fait que cela n'intéresse pas puisque il n'y a pas d'intérêt pour vous dans tout ça (a par si vous êtes aquariophile également :)).

Ci joint les fichier du projet :

Toute petite pierre a l'édifice est bien venu :slight_smile:

Quoi qu'il en soit , je vous remercie d'avoir pris le temps de me lire jusque la.

Les premiers question me viennent de JML :

pourquoi vous obstiner à travailler au niveau de la commande AT et ne pas utiliser des libraries et mon petit hack PROGMEM pour balancer les réponses?
Tout simplement parce que malgré des heures de recherche sur le net, toute bibliothèque trouvé utilise des pin digital via SoftwareSerial Library au lieu des pin RX/TX

pourquoi un esp-01 en mode série? plutôt que des puces plus puissantes genre un wemos D1 mini pro par exemple qui va embarquer la couche wifi directement?
J’essaie de prendre des composant pour les quelle je pense (ou pansait pour celui ci) maîtrisé leur utilisation seul, le plus simplement possible (pour moi simplicité = fiabilité) faire embarqué la couche wifi me semble être compliqué a faire vu mon niveau

est-ce un arduino dédié à l'interface web parlant à d'autres arduino pour collecter les données à représenter où est-ce un seul arduino pilotant tout été devant aussi fournir une interface web? Quels so les éléments connectés et que font-ils
Oui, un arduino seul, toujours pour des raison de codage. ces donc ce seul arduino qui collecte et envoie les info sur la page web.
Je détaillerais tout les éléments connecté dans le post suivant.

Aussi Quelles sont les raisons qu'on président aux choix des composants ou de l'usage direct des commandes AT etc - y-a-t-il une flexibilité sur ce point là? Il doit y avoir à peine 1 ou 2 euros d'ecart Entre un ESP-01et un ESP-12 ou ESP-32 (ESP-8266EX) du Wemos
Il n'y a aucun blocage pour changer de composant si celui ci utilise un port RX/TX. Le circuit imprimé étant deja fait, il serait préférable que les composant changer, quel qu’il soit, puisse se brancher a dans l'emplacement prévu. J’étudierais dans le cas contraire si il y a vraiment un grand bénéfice a changer le CI pour ce composant.

En détails, voici les composants relié au CI :

1 sonde lm35 pour prise de température de la rampe d’éclairage

1 buzzer pour l'alarme

1 sonde ds18b20 pour température du bac

4 sortie pour le PWM de l’éclairage, driver meanwell



3 sortie pour le PWM des oscillateur, futaba s3003

3 sortie Pour le PWM des pompe de brassage ( jebao rw15) il faut ajouter une petite carte a l'interieur du boitier afin de le relier a l'arduino :


sda/scl pour ds1307

rx/tx1 pour gsm sim900

rx/tx2 pour esp-01

7 sorties A pour boutons via C.I additionnel (5 utilisés pour le moment donc 1 pour la coupure EDF)

8 sorties A pour relais (commutable car certain relais seront utilisé sans l'arduino si besoin) Les relais sont dans le tableau électrique afin qu'il n'y est JAMAIS de 220v hors du tableau (et des prise :slight_smile: :slight_smile: :slight_smile: )

1 sortie A pour sonde PH

sorties de 22 a 54 pour hx8357c (écran + sd) (avec se que j'ai trouvé sur le net les sortie 42+43+44+45+46+47+49 ne serait pas utilisé)


Il seras déporté de 10/15 cm via un nappe.

Le détails des fonctions déjà codé:

l’éclairage, levée et couché progressif en fonctionne d'un horaire de début et de fin, chaque canal et décalé d'un temps donné. niveau maximum réglable

Brassage, associé au levée couché du soleil avec un minimum et maximum réglable.

Oscillateur, angle mini et maxi pour chaque oscillateur avec un temps de mouvement réglable (mais identique pour les 3).

température rampe, déclenchement des ventilateur en cas de dépassement de la température maximum réglée

température bac, déclenchement des ventilateur en cas de dépassement de la température maximum réglée puis alarme, envoie sms, coupure chauffage en cas de dépassement d'une température critique.

GSM, pour envoie de toute anomalie + coupure edf (relais situé dans le tableau électrique et alimenté en continu (relais fermé = bouton non appuyé) qui fait un retour sur un pin bouton de l'arduino, si bouton appuyé (relais ouvert = plus alimenté = bouton appuyé) envoyé d'un SMS (l'arduino est alimenté par une batterie de secours en 5v)

Wifi, pour visualisé les paramètre du bac a tout moment et aussi une partie "réglage" des paramètre

PH, mesure le PH (simplement :slight_smile: ) mais possibilité par la suite de l'associer a un relais pour gestion d'un RAC par exemple (Réacteur A Calcaire, c'est un tube remplis d'aragonite dans le quelle une faible partie de l'eau de l'aquarium passe, on y injecte du CO2 afin de descendre le PH se qui dissous l'aragonite, l'eau qui en sort est donc chargé en calcium en KH et compense la consommation des coraux, le CO2 est régulé par un PH-mètre réglé a un PH précis qui active un électrovanne)

écran pour afficher les paramètre ( a voir si possibilité de mise en veille )

Fonction tempête, met le brassage au max durant un laps de temps paramétrable.

Nourrissage, 1 fonction automatique a heure fixe qui actionne un relais qui active un distributeur et baisse/coupure brassage / pompe remonté ... 2eme fonction manuel pour couper les pompe via un bouton durant un laps de temps paramétrable pour nourrire manuellement (cube de congelé par exemple)

djbouns:
pourquoi vous obstiner à travailler au niveau de la commande AT et ne pas utiliser des libraries et mon petit hack PROGMEM pour balancer les réponses?
Tout simplement parce que malgré des heures de recherche sur le net, toute bibliothèque trouvé utilise des pin digital via SoftwareSerial Library au lieu des pin RX/TX

avez vous regardé cette librairie.

Si vous regardez le code d'un des exemple fourni (WebServer.ino), vous verrez qu'il commence comme ceci:

#include "WiFiEsp.h"
// Emulate Serial1 on pins 6/7 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif

Le code teste (avec le #ifndef HAVE_HWSERIAL1) si la carte Arduino sur laquelle on est a un port Serial1 en matériel et si oui c'est ce qui sera utilisé pour piloter les commandes AT de l'ESP, sinon il instancie une connexion SoftwareSerial qu'il appelle Serial1 et dans le setup il initialise la configuration en passant le port Série sur lequel il travaillera

  // initialize ESP module
  WiFi.init(&Serial1);

si j'ai un peu de temps dans l'après midi je vous poste un petit exemple

J-M-L:
si j'ai un peu de temps dans l'après midi je vous poste un petit exemple

Inutile, c'est effectivement la seul que j'ai trouvé et en parallèle de mon code utilisant AT, j'ai travaillé dessus.
Il fonctionne mais j'ai le problème d'affichage, mot par mot dans la page web, suite au conseil sur un autre poste, j'ai essayer de stocker sur carte SD et c'est pire, il doit encore y avoir une histoire de mémoire la dedans ... et c'est ce qui complique tout pour moi.
je retrouve le code ou j'en était et vous poste.

djbouns:
Inutile, c'est effectivement la seul que j'ai trouvé et en parallèle de mon code utilisant AT, j'ai travaillé dessus.
Il fonctionne mais j'ai le problème d'affichage, mot par mot dans la page web, suite au conseil sur un autre poste

Oui mais comme vous utilisez une librairie qui gère le stockage en mémoire FLASH, ça ne va pas manger toute votre RAM et il n'y a pas besoin de la classe String. ça a l'avantage de simplifier l'insertion de valeur dynamique dans la page aux bons endroits sans avoir à analyser la ligne et gérer un truc un peu compliqué d'accès aux variables comme j'avais fait avec le tableau de variables dans l'autre post (en trouvant des lignes contenant juste $$$)

essayez ce code par exemple (esp-01 connecté sur Serial2)

si vous tapez l'URL - http://192.168.1.28 chez moi - ça vous dit bonjour et affiche des infos dynamiques
si vous tapez http://192.168.1.28/admin ça vous affiche une autre page et si vous tapez http://192.168.1.28/AutreChose alors vous aurez une page d'erreur

/* exemple d'utilisation de la librairie "WiFiEsp.h"  // https://github.com/bportaluri/WiFiEsp */

#include "WiFiEsp.h"  // https://github.com/bportaluri/WiFiEsp

#define ESPSEPRIAL Serial2
const byte hardRestPIN = 7; // la pin de l'arduino connectée au reset du module

char ssid[]       = "*****"; // Nom du réseau (SSID). Mériterait d’être const mais warning à la compilation car librairie mal pensée sur ce point
char modDePasse[] = "*****"; // mot de passe du réseau. (pourrait être const char *)
int status = WL_IDLE_STATUS; // l'état de la radio

const uint16_t HTTPPort = 80;
WiFiEspServer server(HTTPPort);   // serveur sur le port 80

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

const byte maxURL = 20;
char urlRequest[maxURL + 1]; // +1 pour avoir la place du '\0'


// **************************************************
// LA GESTION DU WEB
// **************************************************


void envoyerPageWeb(WiFiEspClient &client, const char * urlRequest)
{
  // On envoie un en tête de réponse HTTP standard
  client.print(
    "HTTP/1.1 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Connection: close\r\n" // la connexion sera close par le navigateur à la fin de la réponse
    "\r\n");                // une ligne vide marque la fin du header HTTP
  client.print(F("<!DOCTYPE HTML>\r\n"));
  client.print(F("<html><head>\r\n"));
  client.print(F("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n"));
  client.print(F("<title>AQUABOUN</title>\r\n"));

  if (!strcmp(urlRequest, "/")) {   // on vérifie quelle page est demandée
    // On envoie la page web
    static int reqCount = 0;
    client.print(F("<style type=\"text/css\">\r\n"));
    client.print(F("body {background-color: #00979c}\r\n")); // couleur arduino
    client.print(F("</style></head>\r\n"));
    client.print(F("<body>\r\n"));
    client.print(F("<h1>Salut djbouns !</h1>\r\n"));
    client.print(F("Nb de demandes ="));
    client.print(++reqCount);
    client.print(F("
\r\n"));
    client.print(F("Valeur lue sur A0: "));
    client.print(analogRead(0));
    client.print(F("
\r\n"));
    client.print(F("</body>"));
  } else if (!strcmp(urlRequest, "/admin")) {  // on vérifie quelle page est demandée
    // On envoie la page web d'admin
    client.print(F("<title>ADMIN</title>\r\n"));
    client.print(F("<style type=\"text/css\">\r\n"));
    client.print(F("body {background-color: #89C8F3}\r\n")); // bleu clair
    client.print(F("</style></head>\r\n"));
    client.print(F("<body>\r\n"));
    client.print(F("<h1>Salut djbouns !</h1>\r\n"));
    client.print(F("Page d'administration
\r\n"));
    client.print(F("</body>"));
  } else {
    // On envoie la page web d'erreyr
    client.print(F("<title>ADMIN</title>\r\n"));
    client.print(F("<style type=\"text/css\">\r\n"));
    client.print(F("body {background-color: #FF0000}\r\n")); // rouge
    client.print(F("</style></head>\r\n"));
    client.print(F("<body>\r\n"));
    client.print(F("<h1>ERREUR</h1>\r\n"));
    client.print(F("</body>"));
  }

  client.print(F("</html>\r\n"));

  // un peu d'attente pour que le module ESP ait fini de tout envoyer
  delay(10);
}

// **************************************************

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

void setup() {
  Serial.begin(115200);     // pour le debug

  //reset du esp-01
  pinMode(hardRestPIN, OUTPUT);
  digitalWrite(hardRestPIN, LOW);
  delay(100);
  digitalWrite(hardRestPIN, HIGH);
  delay(1000); // on attend le reboot

  ESPSEPRIAL.begin(115200);    // l'ESP-01 a été pré-configuré à 115200 bauds
  WiFi.init(&ESPSEPRIAL);      // initialisation de la librairie et du module ESP

  // on vérifie l'état
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println(F("Composant wifi ne répond pas"));
    while (true); // on meurt ici
  }

  // on essaye de se connecter au réseau
  while ( status != WL_CONNECTED) {
    Serial.print(F("."));
    status = WiFi.begin(ssid, modDePasse);
  }
  Serial.println();
  printHTTPServerInfo();

  // démarre le serveur web sur le port HTTPPort
  server.begin();
}



void loop() {
  WiFiEspClient client;
  boolean currentLineIsBlank = true;
  byte indexMessage = 0;
  char * ptrGET, *ptrEspace;

  // on attend de recevoir une connexion
  if (client = server.available()) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        switch (c) {
          case '\r': // on l'ignore
            break;

          case '\n':
            httpLine[indexMessage] = '\0'; // on termine la ligne correctement (c-string)
            indexMessage = 0; // on se reprépre pour la prochaine ligne
            currentLineIsBlank = true;
            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
            }
            break;

          default:
            currentLineIsBlank = false;
            if (indexMessage <= maxHTTPLine - 1) {
              httpLine[indexMessage++] =  c; // sinon on ignore le reste de la ligne
            }
            break;
        }

        if (c == '\n' && currentLineIsBlank) { // une requête HTTP se termine par une ligne vide
          envoyerPageWeb(client, urlRequest);
          break;
        }
      }
    }
    client.stop(); // termine la connexion
  }
}

voila

#include "WiFiEsp.h"

WiFiEspServer server(80);

char ssid[] = "***";            // your network SSID (name)
char pass[] = "***";       // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status




void setup() {
  Serial.begin(115200);
Serial2.begin(115200); 
WiFi.init(&Serial2);
  if (WiFi.status() == WL_NO_SHIELD) {
    while (true);
  }
  while ( status != WL_CONNECTED) {
    status = WiFi.begin(ssid, pass);
  }
  server.begin();

}

void loop() {
WiFiEspClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {





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

client.println( "<FONT color= MediumBlue >");
client.println( "H");
client.println( "<FONT color= red>");
client.println( "0");
client.println( "<FONT color= MediumBlue >");
client.println( " ");
client.println( "<FONT size= 3px>");
client.println( "<FONT color= red>");

client.println( "<FONT color= MediumBlue >");
client.println( "s");
client.println("
");
client.println( "<FONT size= 35px>");
client.println("<p>Temperature aquarium : ");
client.println( "<FONT color= red>");

client.println("&deg");
client.println("
");
client.println( "<FONT color= MediumBlue >");
client.println("<p>Temperature rampe : ");
client.println( "<FONT color= red>");

client.println("&deg");
client.println("
");
client.println( "<FONT color= MediumBlue >");
client.println("<p>PH: ");
client.println( "<FONT color= red>");
client.println( "sonde ph non instalee");
client.println("
");
client.println("
");
client.println("<FONT color= MediumBlue >");
client.println("<p>puissance blanc : ");
client.println("<FONT color= red>");

client.println("%  ");
client.println("
");
client.println("<button class=button>-</button>");
client.println("<button class=button>+</button>");
client.println("<button class=button2>Valider</button></p>");
client.println("<FONT color= MediumBlue >");
client.println("<p>puissance bleu : ");
client.println("<FONT color= red>");

client.println("%  ");
client.println("
");
client.println("<button class=button>-</button>");
client.println("<button class=button>+</button>");
client.println("<button class=button2>Valider</button></p>");




         break;
        }
        if (c == '\n') {
       
         currentLineIsBlank = true;
        }
        else if (c != '\r') {
    
          currentLineIsBlank = false;
        }
   }
}

    delay(10);


    client.stop();
    }
  }

Chez moi 24 seconde par avoir la page afficher entièrement

J-M-L:

/* exemple d'utilisation de la librairie "WiFiEsp.h"  // https://github.com/bportaluri/WiFiEsp */

#include "WiFiEsp.h"  // GitHub - bportaluri/WiFiEsp: Arduino WiFi library for ESP8266 modules

#define ESPSEPRIAL Serial2
const byte hardRestPIN = 7; // la pin de l'arduino connectée au reset du module

char ssid[]      = "ddd";  // Nom du réseau (SSID)
char modDePasse[] = "ddd";        // mot de passe du réseau
int status = WL_IDLE_STATUS;              // l'état de la radio

const uint16_t HTTPPort = 80;
WiFiEspServer server(HTTPPort);  // serveur sur le port 80

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

const byte maxURL = 20;
char urlRequest[maxURL + 1]; // +1 pour avoir la place du '\0'

// **************************************************
// LA GESTION DU WEB
// **************************************************

void envoyerPageWeb(WiFiEspClient &client, const char * urlRequestL)
{
  // On envoie un en tête de réponse HTTP standard
  client.print(
    "HTTP/1.1 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Connection: close\r\n" // la connexion sera close par le navigateur à la fin de la réponse
    "\r\n");                // une ligne vide marque la fin du header HTTP
  client.print(F("\r\n"));
  client.print(F("\r\n"));
  client.print(F("<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r\n"));
  client.print(F("AQUABOUN\r\n"));

if (!strcmp(urlRequest, "/")) {  // on vérifie quelle page est demandée
    // On envoie la page web
    static int reqCount = 0;
    client.print(F("<style type="text/css">\r\n"));
    client.print(F("body {background-color: #00979c}\r\n")); // couleur arduino
    client.print(F("\r\n"));
    client.print(F("\r\n"));
    client.print(F("

Salut djbouns !

\r\n"));
    client.print(F("Nb de demandes ="));
    client.print(++reqCount);
    client.print(F("
\r\n"));
    client.print(F("Valeur lue sur A0: "));
    client.print(analogRead(0));
    client.print(F("
\r\n"));
    client.print(F(""));
  } else if (!strcmp(urlRequest, "/admin")) {  // on vérifie quelle page est demandée
    // On envoie la page web d'admin
    client.print(F("ADMIN\r\n"));
    client.print(F("<style type="text/css">\r\n"));
    client.print(F("body {background-color: #89C8F3}\r\n")); // bleu clair
    client.print(F("\r\n"));
    client.print(F("\r\n"));
    client.print(F("

Salut djbouns !

\r\n"));
    client.print(F("Page d'administration
\r\n"));
    client.print(F(""));
  } else {
    // On envoie la page web d'erreyr
    client.print(F("ADMIN\r\n"));
    client.print(F("<style type="text/css">\r\n"));
    client.print(F("body {background-color: #FF0000}\r\n")); // rouge
    client.print(F("\r\n"));
    client.print(F("\r\n"));
    client.print(F("

ERREUR

\r\n"));
    client.print(F(""));
  }

client.print(F("\r\n"));

// un peu d'attente pour que le module ESP ait fini de tout envoyer
  delay(10);
}

// **************************************************

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

void setup() {
  Serial.begin(115200);    // pour le debug

//reset du esp-01
  pinMode(hardRestPIN, OUTPUT);
  digitalWrite(hardRestPIN, LOW);
  delay(100);
  digitalWrite(hardRestPIN, HIGH);
  delay(1000); // on attend le reboot

ESPSEPRIAL.begin(115200);    // l'ESP-01 a été pré-configuré à 115200 bauds
  WiFi.init(&ESPSEPRIAL);      // initialisation de la librairie et du module ESP

// on vérifie l'état
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println(F("Composant wifi ne répond pas"));
    while (true); // on meurt ici
  }

// on essaye de se connecter au réseau
  while ( status != WL_CONNECTED) {
    Serial.print(F("."));
    status = WiFi.begin(ssid, modDePasse);
  }
  Serial.println();
  printHTTPServerInfo();

// démarre le serveur web sur le port HTTPPort
  server.begin();
}

void loop() {
  WiFiEspClient client;
  boolean currentLineIsBlank = true;
  byte indexMessage = 0;
  char * ptrGET, *ptrEspace;

// on attend de recevoir une connexion
  if (client = server.available()) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        switch (c) {
          case '\r': // on l'ignore
            break;

case '\n':
            httpLine[indexMessage] = '\0'; // on termine la ligne correctement (c-string)
            indexMessage = 0; // on se reprépre pour la prochaine ligne
            currentLineIsBlank = true;
            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
            }
            break;

default:
            currentLineIsBlank = false;
            if (indexMessage <= maxHTTPLine - 1) {
              httpLine[indexMessage++] =  c; // sinon on ignore le reste de la ligne
            }
            break;
        }

if (c == '\n' && currentLineIsBlank) { // une requête HTTP se termine par une ligne vide
          envoyerPageWeb(client, urlRequest);
          break;
        }
      }
    }
    client.stop(); // termine la connexion
  }
}

P**** c'est génial ça !!!

Vous avez peut-être un soucis WiFi...

Chez moi ça prend environ 1 seconde

et il faudrait - pour ne pas tuer la mémoire vive - changer tous les

client.println("xxxxx");

en

client.println([color=red]F([/color]"xxxxx"[color=red])[/color]);

histoire de stocker les chaînes en mémoire flash directement et passer le pointeur sur cette mémoire plutôt que de les emmener en mémoire vive

djbouns:
P**** c'est génial ça !!!

est-ce que ça répond plus vite ?

et sinon bravo pour tout votre "bricolage" - y'a des heures de boulot !

J-M-L:
est-ce que ça répond plus vite ?

et sinon bravo pour tout votre "bricolage" - y'a des heures de boulot !

Mon exclamation était sur le fait d'avoir 2 page possible, donc une pour le paramétrage qui seras, en quelque sorte, caché.

Et oui ... des heures ... ou plutôt des jour ... quoi qu'on doit être a des semaine maintenant lol car certaine nuit son très courte quand on est dans le codage ... lol

Merci a vous

J-M-L:
Vous avez peut-être un soucis WiFi...

Chez moi ça prend environ 1 seconde

a ... un problème de plus a résoudre alors :frowning:

j'ai mis ma page html dans votre code et ca me fait pareil ... affichage mot par mot

vous utilisez quel navigateur?

oui j'imagine effectivement que c'est bcp de temps !!

google chrome ...
et ...
bon pronostique puisque c'est quasi instantanée dans IE ... !

en fait je pense que Chrome va balancer des requêtes supplémentaires pour d'autres choses et que vous retournez votre page plusieurs fois... en générant des erreurs au passage sur requête multiples vers votre ESP

J'ai testé avec mon téléphone avec l'adresse IP a distance et ça marche, sa s'affiche un peu moins vite que d'autre page internet mais c'est minime.
Je vais donc poursuivre cette voix.
J'ai l'impression que c'est un grand pas en avant
je vous tient au courant

voila :slight_smile:

J'suis content.
petite question,je n'ai pas de PIN pour le hardRestPIN = 7
Je peut envoyer un at+rst a la place ?

Je doit a présent affecté les bouton a une fonction et sauvegarder ... connaissez vous un tuto bien fait a lire ?

wifi_client_double_page_adapte.ino (19.1 KB)

Le AT+RST est envoyé sans doute à l’initialisation, donc pas la peine à mon avis (à vérifier dans le code source). le reset hardware est physique, ça veut dire que si pour une raison quelconque l’interpretteur De commandes AT ne répond pas ça force un vrai reset matériel

Pourquoi pas de pin reset? vous n’en n’avez plus de dispo?

Pour les pin dispo j'attend de recevoir mon dernier CI pour vérifier que les 7pin mentionné plus haut, normalement pris par l’écran son dispo.
sinon, non plus de dispo :confused:

Pour le reset physique ... j'utilise un adaptateur