Rail motorisé pour la macrophotographie et déclencheur d’appareil photo et de flash

Système motorisé pour la prise de photos en vue d’un empilement en fonction de la mise au point (focus stacking). En macrophotographie, la zone de netteté couvre souvent qu’une petite partie du sujet. Plusieurs clichés sont requis pour couvrir le sujet au complet. Les photos capturées sont combinées pour obtenir une photo finale dont l’ensemble du sujet est au foyer. Le circuit comprend le déclencheur de l’appareil photo. Un flash peut aussi être déclenché simultanément.

Le système est composé :

  • D’un rail motorisé avec un moteur pas à pas
  • D’une carte pilote DRV8825
  • D’un module de contrôle monté avec un circuit ESP32

Le rail motorisé

Le rail motorisé a 270mm de long pour un déplacement utile de 100mm. L’entrainement est constitué d’une vis sans fin avec billes dont le déplacement par pas est de 0,02mm.

Ce rail est disponible chez Banggood.com (j’ai payé 19,47$ CAD de frais de douane)


Le pilote DRV8825

Le DRV8825 est une carte opto-isolée pour piloter un moteur pas à pas bipolaire

DRV8825 Stepper Motor Driver Carrier, High Current

DRV8825 (fr)



Module de contrôle

Le module de contrôle est monté avec un circuit de développement «ESP32 DEVKIT V1 DOIT».

Le ESP32 intègre l’interface Wifi. Le système se commande avec un navigateur standard.


Le schéma électronique


L’interface WEB

L’interface utilisateur est développée pour être compatible aux navigateurs des différentes plateformes.

L’utilisateur a le choix de déplacer manuellement l’appareil photo selon 3 écarts de déplacement; court, moyen et long. Il peut déclencher l’appareil photo avec le bouton «PhotoClic». La capture des photos est lancée par la sélection d’un des boutons «Capture». Le bouton «Actualiser» rafraîchi la page pour afficher le suivi d’avancement des captures.

L’utilisateur peut configurer la capture automatisée en fonction du pas, de la distance ou selon des points de repère qu’il fixera.

La «résolution du rail» définie de combien de mm se déplace le rail suite à une commande de déplacement d’un pas.

Le «délai avant déclenchement» débute à la fin d’un déplacement. À l’expiration du délai, une commande de déclenchement de l’appareil photo est envoyée. Cette pause a pour but de laisser le temps à l’appareil photo de se stabiliser afin d’éviter le flou de bouger. Un temps de 2 à 3 secondes est requis.

Le «délai après déclenchement» permet de s’assurer de ne pas envoyer une commande de déclenchement avant la fin du temps d’exposition configurer sur l’appareil photo. Ce temps doit aussi tenir compte du temps de traitement du bruit numérique pour les longues expositions, selon le modèle d’appareil photo. Ce qui est normalement égal au temps d’exposition. En général, ce traitement est actif pour des temps d’obturation plus grands que 1 seconde.

Délai après déclenchement > Temps d’obturation + temps de réduction de bruit numérique


Affichage des paramètres entrés

Fixation des points de repères

L’utilisateur déplace le rail à la position de départ de la capture et clique sur le bouton «A»

L’utilisateur déplace le rail à la position de fin de capture et clique sur le bouton «B»

Pour l’étape suivante, l’utilisateur configure la distance entre les captures dans la fenêtre «PARAMÈTRES VERSUS REPÈRES» et clique sur le bouton «Soumettre»

Il ne reste plus qu’à cliquer sur le bouton «Capture» selon la direction requise pour la prise de photos.


Déclenchement d’appareil photo et de flashs


Le programme

Le programme est divisé en huit fichiers. Ils doivent être placés dans le même répertoire nommé «Pilote_Rail_Macro_et_Declencheur_00»

Téléchargement

https://github.com/rcepmorel/Pilote_Rail_Macro_et_Declencheur



Détails des fichiers

Pilote_Rail_Macro_et_Declencheur_00.ino

/*      Pilote_Rail_Macro_et_Declencheur
* 
* Auteur : Richard Morel
*     2019-02-05
* 
* Modification
*     
*     
* Remarques :     
* 
* Si l'application ne réussit pas à se connecter sur un réseau Wifi, 
* elle configurera le circuit comme un point d'accès réseau Wifi
* Son adresse IP sera alors 192.168.4.1.
* DEL : Vert  -> Brancher sur le réseau WiFi défini dans le programme
* DEL : Rouge -> Point d'accès WiFi
* 
* do_Web_1_Colonne.h  -> Affichage plus adapté aux petits écrans 
*                        comme ceux des téléphones intelligents
* 
* do_Web_2_Colonnes.h -> Pour les autres dimensions d'écrans
* 
* 
*/  
// ----------------------------------------------------------------------------- 
//             Importation des fichiers et définition des variables
// ----------------------------------------------------------------------------- 
#include "configuration.h"
#include "do_Conversion_calcul.h"
#include "do_Commandes.h"

//******  WIFI *********************
#include "connect_id_Wifi.h"
#include <WiFi.h>
WiFiServer server(80);

const char* chStatusWifi[] ={"WL_IDLE_STATUS", "WL_NO_SSID_AVAIL", "-", 
                       "WL_CONNECTED ", "WL_CONNECT_FAILED ", "-",
                       "WL_DISCONNECTED"};

String stWifiConnectionNetwork = "Connecté";

//#include "do_Web_1_Colonne.h" // Affichage plus adapté aux petits écrans 
                                // comme ceux des téléphones intelligents
#include "do_Web_2_Colonnes.h"
#include "actions.h"

// -------------------------------------------------------------------------------
// FONCTION     FONCTION     FONCTION    FONCTION     FONCTION     FONCTION
// ------------------------------------------------------------------------------- 

//*****  Activation de la DEL   *****************
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
  // calculate duty, 8191 from 2 ^ 13 - 1
  if (value > valueMax){value = valueMax;}
  uint32_t duty = (8191 / valueMax) * value;
  
  // write duty to LEDC
  ledcWrite(channel, duty);
}


//*****  Choix d'affichage de la couleur de la DEL *******
void AfficheVertCWRougePA(){
   if (stWifiConnectionNetwork=="Non connecté au réseau") {
      byBrightnessVert  = 0 ;
      byBrightnessRouge = 255 ;
      // set the brightness on LEDC channel 0
      ledcAnalogWrite(LEDC_CHANNEL_0_VERT, byBrightnessVert);
      // set the brightness on LEDC channel 1
      ledcAnalogWrite(LEDC_CHANNEL_1_ROUGE,byBrightnessRouge);
  }
  else  
  {
      byBrightnessVert  = 255;
      byBrightnessRouge = 0 ;
      ledcAnalogWrite(LEDC_CHANNEL_0_VERT, byBrightnessVert);
      ledcAnalogWrite(LEDC_CHANNEL_1_ROUGE,byBrightnessRouge);
  }
}


//*********** Exécution des commandes reçues *********
void do_ExecCommande(){ 
  if (boExecDeclencheApp){
     boExecDeclencheApp = false;
     strDirectionRef="";
     declencheApp();  
  }
  if (boExecAvanceLente){
     boExecAvanceLente = false;
     go_AvanceLente();  
     }    
  if (boExecAvanceRapide) {
     boExecAvanceRapide = false;
     go_AvanceRapide();     
  } 
  if (boExecAvanceTresRapide) {
     boExecAvanceTresRapide = false; 
     go_AvanceTresRapide(); 
  }       
  if (boExecStop) {
     boExecStop = false;
     compteur = intNbreDeBoucle;
     stop_Stop();  
  }
  if (boExecReculeLente) {
     boExecReculeLente = false;
     go_ReculeLente();    
  }    
  if (boExecReculeRapide) {
     boExecReculeRapide = false;
     go_ReculeRapide();   
  } 
  if (boExecReculeTresRapide) {
     boExecReculeTresRapide = false;
     go_ReculeTresRapide();   
  } 
  if (boExecRepereA) {
     boExecRepereA = false;
     intCompteurdePasRef = 0;
     strDirectionRef=""; 
  } 
  if (boExecRepereB) {
     boExecRepereB = false;
     strDirectionRef="";
  } 
  if (boExecAvanceCapture) {
     boExecAvanceCapture = false;
     go_AvanceCapture();  
  }
  if (boExecReculeCapture) {
     boExecReculeCapture = false;
     go_ReculeCapture();   
   }
}

// -------------------------------------------------------------------------------
// SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP
// ------------------------------------------------------------------------------- 
void setup() {
  Serial.begin(115200);
  Serial.println("INITIALISATION EN COURS");

  //**********  ENTRÉES - SORTIES *************
  pinMode( pinEnable8825,     OUTPUT );
  pinMode( pinDir8825,        OUTPUT );
  pinMode( pinStep8825,       OUTPUT );
  pinMode( PIN_ACTIVE_RELAIS, OUTPUT );
  pinMode( PinIntFinAVNC,     INPUT_PULLUP ); // détecteur de fin de rail
  pinMode( PinIntFinRCL,      INPUT_PULLUP ); // détecteur de fin de rail

  digitalWrite( PIN_ACTIVE_RELAIS, LOW);
 
  // *********** WIFI ****************************
  
  // ** Configuration d'une adresse IP statique **
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("STA Impossible de configurer");
  }
  
  WiFi.begin(ssid, password);
  delay(1000);
  uint8_t retries = 15;
 
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print("..");
      Serial.print(WiFi.status());
      Serial.print("-");
      Serial.println(retries);
      retries--;
      if (retries == 0) {
        int intStatus = WiFi.status();
        if (intStatus==255){intStatus=2;}
        Serial.print("..");
        Serial.print(WiFi.status());
        Serial.print("-");
        Serial.println(retries);
        Serial.print("WiFi status :");
        Serial.print(WiFi.status());
        Serial.print("->");
        Serial.println(chStatusWifi[intStatus]); 
        stWifiConnectionNetwork = "Non connecté au réseau";
        break;
      }
  }

    Serial.println(stWifiConnectionNetwork);
  // ** Si Non connecté : Démarrage en mode POINT D'ACCÈS **
  if (stWifiConnectionNetwork=="Non connecté au réseau") {
     Serial.println("- * Activation du point d'accès Wifi * - ");
     WiFi.softAP(ssid_AP, password_AP);
     IPAddress myIP = WiFi.softAPIP();
     Serial.print("AP IP address: ");
     Serial.println(myIP);
  }
  else{
  Serial.print("WiFi status :");
  Serial.println(WiFi.status());
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  }
    
   server.begin();

    
  //**********  DEL *************
  // Configurer la minuterie et attacher la minuterie à la DEL
  ledcSetup(LEDC_CHANNEL_0_VERT, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
  ledcAttachPin(DELVERTE, LEDC_CHANNEL_0_VERT);
  ledcSetup(LEDC_CHANNEL_1_ROUGE, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
  ledcAttachPin(DELROUGE, LEDC_CHANNEL_1_ROUGE);

  AfficheVertCWRougePA();
  
  Serial.println("PRÊT");
}

// ------------------------------------------------------------------------------- 
// LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP 
// ------------------------------------------------------------------------------- 
void loop() {   
  do_Web();
  do_ExecCommande();
  compteur = 0;
}

configuration.h

//******* Affichage DEL ********
// Afin d'ajuster au besoin l'intensité et la couleur de la DEL, le programme
// fait appel une fonction (ledcWrite) qui module la sortie PWM des broches
// selon la valeur fournie à la fonction
#define LEDC_CHANNEL_0_VERT     0
#define LEDC_CHANNEL_1_ROUGE    1

// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT  13

// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ     5000

#define DELROUGE  12 // DEL rouge reliée au GPIO12
#define DELVERTE  13 // DEL verte reliée au GPIO13

byte byBrightnessVert;
byte byBrightnessRouge;


#define PIN_ACTIVE_RELAIS           32   // Déclenche l'appareil photo+flashs

#define pinDir8825                  14   // Direction
#define pinStep8825                 27   // Signal de PAS (avancement) PWM
#define pinEnable8825               25   // Activation du driver/pilote
#define PinIntFinRCL                26   // Détecteur de fin de rail
#define PinIntFinAVNC               33   // Détecteur de fin de rail

// **** DRV8825 et Nema 17 17HD48002H-22B V sur le potentiomètre ajusté à 0,585V ***
// microseconde (minimum 600 pour Nema 17, plus rapide, moins bruyant)
// microseconde (minimum 900 pour le rail DBX1204-100, plus rapide, moins bruyant)
int timePulseStep                 = 900; 
int i                             = 0;   // Compteur pour la boucle NbreDePasEntreArret
int compteur                      = 0;   // Compteur pour la boucle NbreDeBoucle
int intPasAccompli                = 0;

int intDelaiAvantDeclenchement    = 1000;  // milliseconde ( 1 seconde d'arrêt puis déclenche )

int intNbreDePasEntreArrets       = 500;   // 100 pour 1 mm pour le nema 17 , le DBX1204-100 2 mm
int intNbreDeBoucle               = 4;
int intDelaiApresDeclenchement    = 1000;

int intNbreDePasEntreArretsB      = 0;
int intNbreDeBoucleB              = 0;
int intDelaiInterBoucleB          = 0;

float fltDistParPas               = 0.020; // mm, 10 um pour 1 pas Nema 17 plus vis
float fltDistanceEntreCapture     = 0;     // distance fonction du nombre de pas, dimension d'une tranche
float fltDeplacementTotal         = 0;     // distance totale parcourue selon le nombre de pas et de boucle
float fltNbreDePasEntreArrets     = 0;     // Nombre de pas par boucle

String strDistParPas              = "0.02";
String strNbreDePasEntreArrets    = "-";
String strNbreDeBoucle            = "-";
String strDelaiApresDeclenchement = "-";
String strDelaiAvantDeclenchement = "-";
String strDeplacementTotal        = "-";

String strDistanceEntreCaptureVD  = "-";

String strDistanceEntreCaptureVR  = "-";

int intRetourAuto                 = 1;    // Retour automatique au point de départ après une capture
int intDesacMotPauseBcl           = 1;    // Désactive le moteur entre chaque boucle
int intStopFinBoucles             = 1;    // Désactive le moteur à la fin des boucles


int intCompteurdePasRef           = 0;
String strDirectionRef            = "";

String currentLine                = "";    // Variable de type String pour contenir
                                           // les données entrantes du client
bool bolSetParametreRepere        = false;
bool boExecDeclencheApp           = false;
bool boExecAvanceLente            = false;
bool boExecAvanceRapide           = false;
bool boExecAvanceTresRapide       = false; 
bool boExecStop                   = false;
bool boExecReculeLente            = false;
bool boExecReculeRapide           = false;
bool boExecReculeTresRapide       = false;
bool boExecRepereA                = false;
bool boExecRepereB                = false;
bool boExecAvanceCapture          = false;
bool boExecReculeCapture          = false;


connect_id_Wifi.h

const char* ssid     = "Votre nom de réseau WiFi"; // Réseau à accéder
const char* password = "Mot de passe du réseau WiFi";

const char* ssid_AP = "PointDAccesRail"; // Point d'accès 
const char* password_AP = "aVotreGuise";


// Configuration adresse IP statique
IPAddress local_IP(192, 168, 1, 141);
// Adresse IP de votre Passerelle
IPAddress gateway(192, 168, 1, 1);

IPAddress subnet(255, 255, 0, 0);

actions.h

//*************   Avancement - Chariot en fin de course ***************
void test_FinAVNC()                    
{
  if (digitalRead(PinIntFinAVNC) == HIGH) {
    digitalWrite(pinEnable8825, LOW);  // Active la sortie moteur
  } else {
    digitalWrite(pinEnable8825, HIGH); // Désactive la sortie moteur
    Serial.print( "RENDU EN FIN DE COURSE - " );
    intNbreDePasEntreArretsB = 0;
    intNbreDeBoucleB         = 0;
    intDelaiInterBoucleB     = 0; 
  }
}

//*************  Recul - Chariot en fin de course *********************
void test_FinRCL()                     
{
  if (digitalRead(PinIntFinRCL) == HIGH) {
    digitalWrite(pinEnable8825, LOW);   // Active la sortie moteur
  } else {
    digitalWrite(pinEnable8825, HIGH);  // Désactive la sortie moteur
    Serial.print( "RENDU EN FIN DE COURSE - " );
    intNbreDePasEntreArretsB = 0;
    intNbreDeBoucleB         = 0;
    intDelaiInterBoucleB     = 0;
  }
}


//*****************   Déclenche l'appareil photo   ********************
void declencheApp(){                  
  Serial.println( "CLICK " );
  digitalWrite( PIN_ACTIVE_RELAIS, HIGH);           
  delay(100);
  digitalWrite( PIN_ACTIVE_RELAIS, LOW);
  delay(intDelaiApresDeclenchement);  // Délai après déclenchement
  
  } 

//*****************   Exécute le déplacement vers l'avant   ********************
void execDeplacementAvance(){ 
  // intCompteurdePasRef -> sert pour accumuler le nombre de pas 
  // entre la référence A et la référence B
  // Si intCompteurdePasRef == 0 , on établi la direction
  // d'incrémentation du calcul de pas 
                     
  if ((intCompteurdePasRef == 0)&&( strDirectionRef==""))
    {
      strDirectionRef = "Avance";
    }
  for ( compteur = 0; compteur < intNbreDeBoucleB; compteur++) {
    // Avance de X pas
    for ( i = 0; i < intNbreDePasEntreArretsB; i++) {
      test_FinAVNC();
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
      if (strDirectionRef == "Avance")
        {
          intCompteurdePasRef++;
        }
        else
        {
          intCompteurdePasRef --;
        }
    }
    if (intDesacMotPauseBcl== 1){digitalWrite( pinEnable8825, HIGH );}
    delay(intDelaiInterBoucleB); 
  }
  if (intStopFinBoucles == 1){digitalWrite( pinEnable8825, HIGH );}
}

//*****************   Exécute le déplacement vers l'arrière   ********************
void execDeplacementRecule(){ 
    if ((intCompteurdePasRef == 0)&&( strDirectionRef==""))
    {
      strDirectionRef = "Recule";
    }
  for ( compteur = 0; compteur < intNbreDeBoucleB; compteur++) {
    // Avance de X pas
    for ( i = 0; i < intNbreDePasEntreArretsB; i++) {
      test_FinRCL();
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
      if (strDirectionRef == "Recule")
        {
          intCompteurdePasRef++;
        }
        else 
        {
          intCompteurdePasRef --;
        }      
    }
    if (intDesacMotPauseBcl== 1){digitalWrite( pinEnable8825, HIGH );} 
    delay(intDelaiInterBoucleB);      // attente
  }
  if (intStopFinBoucles == 1){digitalWrite( pinEnable8825, HIGH );}
}
  
//*****************   Avance très rapide   *****************************
void go_AvanceTresRapide()            
{
  digitalWrite( pinDir8825,    HIGH); // Direction avant
  digitalWrite( pinStep8825,   LOW);  // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW ); // Active la sortie moteur
  intNbreDePasEntreArretsB   = 200;   // 200 * 0.02mm -> 4mm
  intNbreDeBoucleB           = 10;    // 10*4mm -> 40 mm -> 4cm
  intDelaiInterBoucleB       = 25; 
  execDeplacementAvance();
  Serial.println( "Avance très rapide terminée" );
}

//*****************   Avance rapide   *****************************
void go_AvanceRapide()               
{
  digitalWrite( pinDir8825,    HIGH); // Direction avant
  digitalWrite( pinStep8825,   LOW);  // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW ); // Active la sortie moteur
  intNbreDePasEntreArretsB   = 200;   // 200 * 0.02mm -> 4mm
  intNbreDeBoucleB           = 3;     // 3*4mm -> 12 mm -> 1.2cm
  intDelaiInterBoucleB       = 25; 
  execDeplacementAvance();
  Serial.println( "Avance rapide terminée" );
}

//*****************   Avance lente   *****************************
void go_AvanceLente()                 // Avance lente
{
  digitalWrite( pinDir8825,    HIGH); // Direction avant
  digitalWrite( pinStep8825,   LOW);  // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW ); // Active la sortie moteur
  intNbreDePasEntreArretsB   = 25;    // 25 * 0.02mm -> 0.5mm
  intNbreDeBoucleB           = 1;     
  intDelaiInterBoucleB       = 0;
  execDeplacementAvance();
  Serial.println( "Avance lente terminée" );
}

//******************   Arrêt du moteur  ********************************
void stop_Stop()  //Arrêt du moteur
{
  digitalWrite( pinEnable8825, HIGH ); // Désactive la sortie moteur
  Serial.println( "STOP" );
}

//*******************  Recule lente  ************************************
void go_ReculeLente()                  
{
  digitalWrite( pinDir8825,    LOW);   // Direction recule
  digitalWrite( pinStep8825,   LOW);   // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW );  // Active la sortie moteur
  intNbreDePasEntreArretsB   = 25;     // 25 * 0.02mm -> 0.5mm
  intNbreDeBoucleB           = 1;      
  intDelaiInterBoucleB       = 0;
  execDeplacementRecule();
  Serial.println( "Recule terminée" );
}

//*******************  Recule rapide  ***********************************
void go_ReculeRapide()                
{
  digitalWrite( pinDir8825,    LOW);  // Direction recule
  digitalWrite( pinStep8825,   LOW);  // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW ); // Active la sortie moteur
  intNbreDePasEntreArretsB   = 200;   // 200 * 0.02mm -> 4mm
  intNbreDeBoucleB           = 3;     // 3*4mm -> 12 mm -> 1.2cm
  intDelaiInterBoucleB       = 25;
  execDeplacementRecule();
  Serial.println( "Recule rapide terminée" );
}

//*******************  Recule très rapide  *****************************
void go_ReculeTresRapide()        
{
  digitalWrite( pinDir8825,    LOW);  // Direction recule
  digitalWrite( pinStep8825,   LOW);  // Initialisation de la broche step
  digitalWrite( pinEnable8825, LOW ); // Active la sortie moteur
  intNbreDePasEntreArretsB   = 200;   // 200 * 0.02mm -> 4mm
  intNbreDeBoucleB           = 10;    // 10*4mm -> 40 mm -> 4cm
  intDelaiInterBoucleB       = 25;    
  execDeplacementRecule();
  Serial.println( "Recule très rapide terminée" );
}

//-------------------- AVANCE CAPTURE ------------------------------- 
void go_AvanceCapture()                        // Avance et capture la photo
{
  digitalWrite( pinDir8825,  HIGH);            // Direction avant
  digitalWrite( pinStep8825, LOW);             // Initialisation de la broche step
  intPasAccompli = 0;
  for ( compteur = 0; compteur < intNbreDeBoucle; compteur++) {
    declencheApp();                            // Déclenche l'appareil photo 
    digitalWrite( pinEnable8825, LOW );        // Active la sortie moteur
    // Avance de X pas
    for ( i = 0; i < intNbreDePasEntreArrets; i++) {
      test_FinAVNC();                          // Vérifie si arrivé à la fin du rail
      if (digitalRead(PinIntFinAVNC) == LOW) {
        i = intNbreDePasEntreArrets;
        compteur  = intNbreDeBoucle;
      }
      intPasAccompli++;
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
    }
    if (intDesacMotPauseBcl== 1){digitalWrite( pinEnable8825, HIGH );}
          
    //******** Attention : éviter serial.println ici, cela fait planter l'application android
    do_Web();                                  // Attention : ajoute un délai
    if (boExecStop) {
       boExecStop = false;
       compteur   = intNbreDeBoucle;
       stop_Stop();  
    }
    delay(intDelaiAvantDeclenchement);         // attente stabilité puis pose
   Serial.println( String(compteur+1) + "/" + String(intNbreDeBoucle)+ " " );   
  }
  declencheApp();                              // déclenche l'appareil photo 
  Serial.println( "Avance et capture terminée" );
  if (intRetourAuto == 1)                      // retour au point de départ
  {
    digitalWrite( pinDir8825,    LOW );        // inverse la direction
    digitalWrite( pinEnable8825, LOW );        // Active la sortie moteur
    for ( i = 0; i < intPasAccompli; i++) {
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
      test_FinRCL();   // ne devrait pas arriver sauf par une erreur de manipulation
      if (digitalRead(PinIntFinRCL) == LOW) {
        i = intPasAccompli;
      }
    }
  }
  if (intStopFinBoucles == 1){digitalWrite( pinEnable8825, HIGH );}
}
//----------------- RECULE CAPTURE --------------------------------------- 
void go_ReculeCapture()                        // Recule et capture la photo
{
  digitalWrite( pinDir8825,      LOW );        // Direction recule
  digitalWrite( pinStep8825,     LOW ); 
  
  intPasAccompli=0;
  for ( compteur = 0; compteur < intNbreDeBoucle; compteur++) {
    declencheApp();                            // déclenche l'appareil photo 
    digitalWrite( pinEnable8825, LOW );        // Active la sortie moteur    
    // Avance de X pas
    for ( i = 0; i < intNbreDePasEntreArrets; i++) {
      test_FinRCL();                           // Vérifie si arrivé à la fin du rail
       if (digitalRead(PinIntFinRCL) == LOW) {
        i = intNbreDePasEntreArrets;
        compteur  = intNbreDeBoucle;
      }
      intPasAccompli++; // Accumule le nombre de pas accompli
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
    }
    if (intDesacMotPauseBcl== 1){digitalWrite( pinEnable8825, HIGH );}
      
    //******** Attention: éviter serial.println ici, cela fait planter l'application android
    do_Web();                                 // Attention : ajoute un délai
    if (boExecStop) {
       boExecStop = false;
       compteur = intNbreDeBoucle;
       stop_Stop();  
    }
    Serial.println( String(compteur+1) + "/" + String(intNbreDeBoucle)+ " " );
    delay(intDelaiAvantDeclenchement);         // attente stabilité puis pose
  } // fin de for ( compteur = 0; compteur < intNbreDeBoucle; compteur++)
  
  declencheApp();                              // déclenche l'appareil photo 
  Serial.println( "Recule et capture terminée" );
  if (intRetourAuto == 1)                      // retour au point de départ
  {
    digitalWrite( pinDir8825   , HIGH);        // inverse la direction
    digitalWrite( pinEnable8825, LOW );        // Active le moteur
    for ( i = 0; i < intPasAccompli; i++) {
      digitalWrite( pinStep8825, HIGH );
      delayMicroseconds(timePulseStep);
      digitalWrite( pinStep8825, LOW );
      delayMicroseconds(timePulseStep);
      test_FinAVNC();
       if (digitalRead(PinIntFinAVNC) == LOW) {
        i = intPasAccompli;
      }
    }
  }
  if (intStopFinBoucles == 1){digitalWrite( pinEnable8825, HIGH );}
}

do_Commandes.h

// ------------------------------------------------------------------------------- 
//                 Exécution des commandes reçues
// ------------------------------------------------------------------------------- 

void do_Commandes(){
          
         if (currentLine.startsWith("GET /action_page.php?")){
         // Trouver la position du début de la donnée de chaque variable et lire cette donnée
         int intPosResolutionDuRail = currentLine.indexOf("ResolutionDuRail=");
         int intPosDelaiAvantDeclenchement = currentLine.indexOf("DelaiAvantDeclenchement=");
         int intPosDelaiApresDeclenchement = currentLine.indexOf("DelaiApresDeclenchement=");
         int intPosDistanceEntreCaptureVR = currentLine.indexOf("DistanceEntreCaptureVR=");
         int intPosNbreDePasEntreArrets = currentLine.indexOf("NbreDePasEntreArrets=");
         int intPosNbreDeBoucle = currentLine.indexOf("NbreDeBoucle=");
         int intPosDistanceEntreCaptureVD = currentLine.indexOf("DistanceEntreCaptureVD=");
         int intPosDeplacementTotal = currentLine.indexOf("DeplacementTotal=");
         int intPosHTTP = currentLine.indexOf("HTTP");
           if (intPosResolutionDuRail >0) { 
             Serial.println("");
             Serial.println("***" );
             Serial.print(intPosResolutionDuRail);
             Serial.println(" position de ResolutionDuRail" );
             Serial.print(intPosDelaiAvantDeclenchement);
             Serial.println(" position de DelaiAvantDeclenchement" );
             Serial.print(intPosDelaiApresDeclenchement);
             Serial.println(" position de DelaiApresDeclenchement" );
             Serial.print(intPosDistanceEntreCaptureVR);
             Serial.println(" position de DistanceEntreCaptureVR" );
             Serial.print(intPosNbreDePasEntreArrets);
             Serial.println(" position de NbreDePasEntreArrets" );
             Serial.print(intPosNbreDeBoucle);
             Serial.println(" position de NbreDeBoucle" );
             Serial.print(intPosDistanceEntreCaptureVD);
             Serial.println(" position de DistanceEntreCaptureVD" );
             Serial.print(intPosDeplacementTotal);
             Serial.println(" position de DeplacementTotal" );
             //Serial.println(currentLine);

             strDistParPas = currentLine.substring(intPosResolutionDuRail+17,intPosDelaiAvantDeclenchement-1);
             strDelaiAvantDeclenchement = currentLine.substring(intPosDelaiAvantDeclenchement+24,intPosDelaiApresDeclenchement-1);
             strDelaiApresDeclenchement = currentLine.substring(intPosDelaiApresDeclenchement+24,intPosDistanceEntreCaptureVR-1);
             strDistanceEntreCaptureVR = currentLine.substring(intPosDistanceEntreCaptureVR+23,intPosNbreDePasEntreArrets-1);
             strNbreDePasEntreArrets = currentLine.substring(intPosNbreDePasEntreArrets+21,intPosNbreDeBoucle-1);
             strNbreDeBoucle = currentLine.substring(intPosNbreDeBoucle+13,intPosDistanceEntreCaptureVD-1);
             strDistanceEntreCaptureVD = currentLine.substring(intPosDistanceEntreCaptureVD+23,intPosDeplacementTotal-1);
             strDeplacementTotal = currentLine.substring(intPosDeplacementTotal+17,intPosHTTP-1);
                
             do_Conversion_calcul();
             bolSetParametreRepere = false;
           }                // fin du if (intPosResolutionDuRail >0) { 
        }                   // fin du if (currentLine.startsWith("GET /action_page.php?")){
           
        if (currentLine.endsWith("GET /PhotoClic HTTP/1.1")) {
           boExecDeclencheApp = true; 
        }
        
        if (currentLine.endsWith("GET /AvanceLente HTTP/1.1")) {
           boExecAvanceLente = true;  
        }    
        if (currentLine.endsWith("GET /AvanceRapide HTTP/1.1")) {
           boExecAvanceRapide = true; 
        } 
        if (currentLine.endsWith("GET /AvanceTresRapide HTTP/1.1")) {
           boExecAvanceTresRapide = true; 
        }       
        if (currentLine.endsWith("GET /STOP HTTP/1.1")) {
           boExecStop = true;;  
        }
        if (currentLine.endsWith("GET /ReculeLente HTTP/1.1")) {
           boExecReculeLente = true;  
        }    
        if (currentLine.endsWith("GET /ReculeRapide HTTP/1.1")) {
           boExecReculeRapide = true;
        } 
        if (currentLine.endsWith("GET /ReculeTresRapide HTTP/1.1")) {
           boExecReculeTresRapide = true;  
        } 
        if (currentLine.endsWith("GET /RepereA HTTP/1.1")) {
           boExecRepereA = true;    
        } 
        if (currentLine.endsWith("GET /RepereB HTTP/1.1")) {
           boExecRepereB = true; 
           bolSetParametreRepere = true;
        } 
        if (currentLine.endsWith("GET /ACapture HTTP/1.1")) {
           boExecAvanceCapture = true;    
        }
        if (currentLine.endsWith("GET /RCapture HTTP/1.1")) {
           boExecReculeCapture = true;   
        }

}

do_Conversion_Calcul.h

// ------------------------------------------------------------------------------- 
//                 Conversion et calcul selon les paramètres reçus
// ------------------------------------------------------------------------------- 

void do_Conversion_calcul(){

      Serial.println(strDistParPas);  
      Serial.println(strDelaiAvantDeclenchement);
      Serial.println(strDelaiApresDeclenchement);
      Serial.println(strDistanceEntreCaptureVR);
      Serial.println(strNbreDePasEntreArrets);
      Serial.println(strNbreDeBoucle);
      Serial.println(strDistanceEntreCaptureVD);
      Serial.println(strDeplacementTotal);
      
                      
      if (strDistParPas !=""){
          fltDistParPas = strDistParPas.toFloat();
      }
      if (strDelaiAvantDeclenchement !=""){
         intDelaiAvantDeclenchement = strDelaiAvantDeclenchement.toInt();
      }              
      if (strDelaiApresDeclenchement !=""){
         intDelaiApresDeclenchement = strDelaiApresDeclenchement.toInt();
      }          
      if (strNbreDePasEntreArrets !=""){
         fltNbreDePasEntreArrets    = strNbreDePasEntreArrets.toFloat();
      }         
      if (strNbreDeBoucle !=""){
         intNbreDeBoucle = strNbreDeBoucle.toInt();
         fltDistanceEntreCapture    = fltNbreDePasEntreArrets * fltDistParPas;
         fltDeplacementTotal        = fltDistanceEntreCapture * intNbreDeBoucle;
      }                    
      if (strDistanceEntreCaptureVD !=""){
         fltDistanceEntreCapture    = strDistanceEntreCaptureVD.toFloat();
      }            
      if (strDeplacementTotal !=""){
         fltDeplacementTotal       = strDeplacementTotal.toFloat();
         fltNbreDePasEntreArrets   = fltDistanceEntreCapture / fltDistParPas;
         intNbreDePasEntreArrets   = fltNbreDePasEntreArrets;
         intNbreDeBoucle           = fltDeplacementTotal / fltDistanceEntreCapture;
      }          
     
      if (strDistanceEntreCaptureVR !=""){
         fltDistanceEntreCapture   = strDistanceEntreCaptureVR.toFloat();
         fltNbreDePasEntreArrets   = fltDistanceEntreCapture / fltDistParPas;
         intNbreDePasEntreArrets   = fltNbreDePasEntreArrets;
         fltDeplacementTotal       = intCompteurdePasRef * fltDistParPas;
         intNbreDeBoucle           = fltDeplacementTotal / fltDistanceEntreCapture;
      }          
      
  }
 

do_Web_1_Colonne.h

// ------------------------------------------------------------------------------- 
//   serveur WEB    serveur WEB     serveur WEB      serveur WEB      serveur WEB 
// ------------------------------------------------------------------------------- 

void do_Web(){
   WiFiClient client = server.available(); // Écouter les clients entrants

  if (client) {                            // si vous avez un client,
    Serial.println("Nouveau Client!");     // imprimer un message sur le port série
    int inChronoDebutConnexion= millis();   

    while (client.connected()) {           // boucle alors que le client est connecté

      if ((millis() - inChronoDebutConnexion) > 1000){ // Déconnecte les fureteurs qui restent
          client.stop();                                // connecter sans avoir d'échange à
          inChronoDebutConnexion= millis();             // faire comme Chrome                           
       }   
       
      if (client.available()) {           // s'il y a des octets à lire du client,
         char c = client.read();          // lire un octet, puis
         //Serial.write(c);               // Imprimez sur le moniteur série
         if (c == '\n') {                 // si l'octet est un caractère
                                          // de nouvelle ligne

           // si la ligne en cours est vide, vous avez
           // deux caractères de nouvelle ligne consécutifs.
           // c'est la fin de la requête HTTP du client,
           // alors envoyez une réponse:
           if (currentLine.length() == 0) {
             client.println("HTTP/1.1 200 OK");
             client.println("Content-Type: text/html\n");


client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<head>");
client.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");
client.println("<title>CTRL - Rail Macrophotographie</title>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");

client.println("<style type=\"text/css\">");      
client.println("html {");
client.println("font-family: Helvetica;");
client.println("display: inline-block;");
client.println("max-width: 500px;");
client.println("margin: auto;");
client.println("text-align: center;");
client.println("}");
client.println("h1{");
client.println("color: #0F3376;");
client.println("padding: 2vh;");
client.println("}");
client.println("h2{");
client.println("color: #0F3376;");
client.println("font-size: 1.0em;");
client.println("margin-top: 0.67em;");
client.println("margin-bottom: 0.67em;");
client.println("margin-left: 0;");
client.println("margin-right: 0;");
client.println("font-weight: bold;");
client.println("font-style: italic;");
client.println("}");
client.println("h3{");
client.println("color: #ff0000;");
client.println("font-size: 1.0em;");
client.println("margin-top: 0.67em;");
client.println("margin-bottom: 0.67em;");
client.println("margin-left: 0;");
client.println("margin-right: 0;");
client.println("font-weight: bold;");
client.println("font-style: italic;");
client.println("}");
client.println("p{");
client.println("font-size: 1.5rem;");
client.println("}");
client.println(".button {");
client.println("display: inline-block;");
client.println("background-color: #008CBA;");
client.println("border: none;");
client.println("border-radius: 4px;");
client.println("color: white;");
client.println("padding: 16px 40px;");
client.println("text-decoration: none;");
client.println("font-size: 30px;");
client.println("margin: 2px;");
client.println("cursor: pointer;");
client.println("}");
client.println(".button2 {");
client.println("background-color: #555555;");
client.println("}");
client.println("table.Type_A{");
client.println("width: 1000px;");
client.println("padding: 30px;");
client.println("border: 0px solid red;"); 
client.println("background-color: #ffffff;");  
client.println("}");

client.println("table.Type_B{");
client.println("width: 450px;");
client.println("height: 200px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("table.Type_C{");
client.println("width: 450px;");
client.println("height: 130px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("table.Type_D{");
client.println("width: 450px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("</style>");

client.println("</head>");
client.println("<body>");
client.println("<h2>- Contrôleur - Rail Macrophotographie -</h2>");
if (bolSetParametreRepere){
client.println("<h3>- Configurez PARAMETRES VERSUS REPÈRES -</h3>");
}

//-----------------------  CONTRÔLE DE L'ACTION   -----------------------------------------------------------//


//****DÉPLACEMENT ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>DÉPLACEMENT</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td>AVANCE</td>");
client.println("<td>STOP</td>");
client.println("<td>RECULE</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceLente\"><button class=\"button\"><</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeLente\"><button class=\"button\">></button></a></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceRapide\"><button class=\"button\"><<</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeRapide\"><button class=\"button\">>></button></a></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceTresRapide\"><button class=\"button\"><<<</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeTresRapide\"><button class=\"button\">>>></button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");
client.println("<table class=\"Type_C\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>Suivi de capture</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"width: 450px;\" ><h2>");
client.println(String(compteur) + "/" + String(intNbreDeBoucle));
client.println("</h2></td>");
client.println("<td><a href=\"/Actualiser\"><button class=\"button button2\">Actualiser</button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");

//****FIXE LES REPÈRES ****
client.println("<table class=\"Type_C\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>FIXE LES REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/RepereA\"><button class=\"button\">A</button></a></td>");
client.println("<td><a href=\"/RepereB\"><button class=\"button\">B</button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");



//****CAPTURE ****
client.println("<table class=\"Type_D\">");

client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/ACapture\"><button class=\"button button2\"><Capture</button></a></td>");
client.println("<td><a href=\"/RCapture\"><button class=\"button button2\">Capture></button></a></td>");
client.println("</tr>");

client.println("</table>");


//****PHOTOCLIC ****
client.println("<table class=\"Type_D\">");

client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/PhotoClic\"><button class=\"button button2\">PhotoClic</button></a></td>");
client.println("</tr>");

client.println("</table>");



//-----------------------  AFFICHAGE -----------------------------------------------------------//
client.println("<br><br>");
client.println("<hr>");
client.println("<br><br>");



//****PARAMÈTRES GÉNÉRAUX ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" style=\"height: 20px;\" bgcolor=\"#aaaaaa\"><h2>PARAMÈTRES GÉNÉRAUX</h2></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px; width: 250px;\" ><b>Résolution du rail</b></td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistParPas)+"</td>");
client.println("<td style=\"text-align: left;\"> <i>mm</i></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Délai avant déclenchement</b><br>");
client.println("</td>");
client.println("<td>"+String(intDelaiAvantDeclenchement)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\"> <i>milliseconde</i><br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px; width: 250px;\" ><b> Délai après déclenchement</b></td>");
client.println("<td>"+String(intDelaiApresDeclenchement)+"</td>");
client.println("<td style=\"text-align: left;\"> <i>milliseconde</i>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");

//****PARAMÈTRES VERSUS REPÈRES ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistanceEntreCapture)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");


//****PARAMÈTRES VERSUS PAS ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS PAS</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Nombre de pas entre les arrêts</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltNbreDePasEntreArrets)+"<br>");
client.println("</td>");
client.println("<td style=\"width: 110px;\">-<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Nombre de boucle</b><br>");
client.println("</td>");
client.println("<td>"+String(intNbreDeBoucle)+"<br>");
client.println("</td>");
client.println("<td>-<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");

//****PARAMÈTRES VERSUS DISTANCE ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS DISTANCE</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistanceEntreCapture)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Déplacement total</b><br>");
client.println("</td>");
client.println("<td>"+String(fltDeplacementTotal)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left;\"> <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


//--------------------  ENTRÉE DES DONNÉES  -------------------------------------------------//
client.println("<br><br>");
client.println("<hr>");
client.println("<br><br>");
client.println("<form action=\"/action_page.php\">");



//****PARAMÈTRES GÉNÉRAUX ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" style=\"height: 20px;\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES GÉNÉRAUX</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; width: 250px;\"><b>Résolution du rail</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\"><input name=\"ResolutionDuRail\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px; padding: 10px;\">mm<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Délai avant déclenchement</b><br>");
client.println("</td>");
client.println("<td><input name=\"DelaiAvantDeclenchement\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; padding: 10px;\">milliseconde<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; width: 250px;\"><b>  Délai après déclenchement</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\"><input name=\"DelaiApresDeclenchement\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; padding: 10px;\">milliseconde<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");

//****PARAMÈTRES VERSUS REPÈRES ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td><input name=\"DistanceEntreCaptureVR\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > mm<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("<br>");
client.println("<input value=\"Soumettre\" type=\"submit\"><br>");
client.println("<br>");



//****PARAMÈTRES VERSUS PAS ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS PAS</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Nombre de pas entre les arrêts</b><br>");
client.println("</td>");
client.println("<td><input name=\"NbreDePasEntreArrets\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"width: 110px;\">-<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Nombre de boucle</b><br>");
client.println("</td>");
client.println("<td><input name=\"NbreDeBoucle\" type=\"number\"><br>");
client.println("</td>");
client.println("<td>-<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");

//****PARAMÈTRES VERSUS DISTANCE ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS DISTANCE</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td><input name=\"DistanceEntreCaptureVD\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\"> mm<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Déplacement total</b><br>");
client.println("</td>");
client.println("<td><input name=\"DeplacementTotal\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left;\"> mm<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("<br>");
client.println("<input value=\"Soumettre\" type=\"submit\"><br>");
client.println("<br>");

client.println("</form>");

client.println("</body>");
client.println("</html>");

             break;  // break out of the while loop
           }         // fin du if (currentLine.length() == 0) 
           else {    // currentLine.length() != 0 et c == '\n' (nouvelle ligne)
            // Une ligne de commandes est reçue
            do_Commandes();
            currentLine = "";  // si vous avez un caractère de nouvelle ligne, effacez currentLine:
           }                   // fin du else { // currentLine.length() != 0
         }                     // fin du if (c == '\n')  
  
         else if (c != '\r') 
         {  // si vous avez autre chose qu'un caractère de retour de chariot,
          currentLine += c;    // l'ajouter à la fin de la currentLine
         // Serial.println(currentLine);
         }
       }                       // # if (client.available())
     }                         // # fin du while (client.connected())
     client.stop();            // close the connection:
     Serial.println("Client Déconnecté");
  } // # fin du if (client) 
}
 

do_Web_2_Colonnes.h

// ------------------------------------------------------------------------------- 
//   serveur WEB    serveur WEB     serveur WEB      serveur WEB      serveur WEB 
// ------------------------------------------------------------------------------- 

void do_Web(){
   WiFiClient client = server.available(); // Écouter les clients entrants

  if (client) {                            // si vous avez un client,
    Serial.println("Nouveau Client!");     // imprimer un message sur le port série
    int inChronoDebutConnexion= millis();   

    while (client.connected()) {           // boucle alors que le client est connecté

      if ((millis() - inChronoDebutConnexion) > 1000){  // Déconnecte les fureteurs qui restent
          client.stop();                                // connecter sans avoir d'échange à
          inChronoDebutConnexion= millis();             // faire comme Chrome                           
       }   
       
      if (client.available()) {           // s'il y a des octets à lire du client,
         char c = client.read();          // lire un octet, puis
         //Serial.write(c);               // Imprimez sur le moniteur série
         if (c == '\n') {                 // si l'octet est un caractère
                                          // de nouvelle ligne

           // si la ligne en cours est vide, vous avez
           // deux caractères de nouvelle ligne consécutifs.
           // c'est la fin de la requête HTTP du client,
           // alors envoyez une réponse:
           if (currentLine.length() == 0) {
             client.println("HTTP/1.1 200 OK");
             client.println("Content-Type: text/html\n");


client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<head>");
client.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");
client.println("<title>CTRL - Rail Macrophotographie</title>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");

client.println("<style type=\"text/css\">");      
client.println("html {");
client.println("font-family: Helvetica;");
client.println("display: inline-block;");
client.println("max-width: 1000px;");
client.println("margin: auto;");
client.println("text-align: center;");
client.println("}");
client.println("h1{");
client.println("color: #0F3376;");
client.println("padding: 2vh;");
client.println("}");
client.println("h2{");
client.println("color: #0F3376;");
client.println("font-size: 1.0em;");
client.println("margin-top: 0.67em;");
client.println("margin-bottom: 0.67em;");
client.println("margin-left: 0;");
client.println("margin-right: 0;");
client.println("font-weight: bold;");
client.println("font-style: italic;");
client.println("}");
client.println("h3{");
client.println("color: #ff0000;");
client.println("font-size: 1.0em;");
client.println("margin-top: 0.67em;");
client.println("margin-bottom: 0.67em;");
client.println("margin-left: 0;");
client.println("margin-right: 0;");
client.println("font-weight: bold;");
client.println("font-style: italic;");
client.println("}");
client.println("p{");
client.println("font-size: 1.5rem;");
client.println("}");
client.println(".button {");
client.println("display: inline-block;");
client.println("background-color: #008CBA;");
client.println("border: none;");
client.println("border-radius: 4px;");
client.println("color: white;");
client.println("padding: 16px 40px;");
client.println("text-decoration: none;");
client.println("font-size: 30px;");
client.println("margin: 2px;");
client.println("cursor: pointer;");
client.println("}");
client.println(".button2 {");
client.println("background-color: #555555;");
client.println("}");
client.println("table.Type_A{");
client.println("width: 1000px;");
client.println("padding: 30px;");
client.println("border: 0px solid red;"); 
client.println("background-color: #ffffff;");  
client.println("}");

client.println("table.Type_B{");
client.println("width: 450px;");
client.println("height: 200px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("table.Type_C{");
client.println("width: 450px;");
client.println("height: 130px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("table.Type_D{");
client.println("width: 450px;");
client.println("border: 1px solid black;"); 
client.println("background-color: #888888;");  
client.println("}");

client.println("</style>");

client.println("</head>");
client.println("<body>");
client.println("<h2>- Contrôleur - Rail Macrophotographie -</h2>");
if (bolSetParametreRepere){
client.println("<h3>- Configurez PARAMETRES VERSUS REPÈRES -</h3>");
}

//-----------------------  CONTRÔLE DE L'ACTION   -----------------------------------------------------------//

client.println("<table class=\"Type_A\">");
client.println("<tr valign=\"center\">");
client.println("<td>");


//****DÉPLACEMENT ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>DÉPLACEMENT</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td>AVANCE</td>");
client.println("<td>STOP</td>");
client.println("<td>RECULE</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceLente\"><button class=\"button\"><</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeLente\"><button class=\"button\">></button></a></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceRapide\"><button class=\"button\"><<</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeRapide\"><button class=\"button\">>></button></a></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/AvanceTresRapide\"><button class=\"button\"><<<</button></a></td>");
client.println("<td><a href=\"/STOP\"><button class=\"button\">||</button></a></td>");
client.println("<td><a href=\"/ReculeTresRapide\"><button class=\"button\">>>></button></a></td>");
client.println("</tr>");

client.println("</table>");



client.println("</td>");
client.println("<td>");

//****FIXE LES REPÈRES ****
client.println("<table class=\"Type_C\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>FIXE LES REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/RepereA\"><button class=\"button\">A</button></a></td>");
client.println("<td><a href=\"/RepereB\"><button class=\"button\">B</button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("<br><br>");

client.println("<table class=\"Type_C\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>Suivi de capture</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"width: 450px;\" ><h2>");
client.println(String(compteur) + "/" + String(intNbreDeBoucle));
client.println("</h2></td>");
client.println("<td><a href=\"/Actualiser\"><button class=\"button button2\">Actualiser</button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("</td>");
client.println("</tr>");
client.println("</table>");

client.println("<br>");

client.println("<table class=\"Type_A\">");
client.println("<tr>");
client.println("<td>");


//****CAPTURE ****
client.println("<table class=\"Type_D\">");

client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/ACapture\"><button class=\"button button2\"><Capture</button></a></td>");
client.println("<td><a href=\"/RCapture\"><button class=\"button button2\">Capture></button></a></td>");
client.println("</tr>");

client.println("</table>");

client.println("</td>");
client.println("<td>");

//****PHOTOCLIC ****
client.println("<table class=\"Type_D\">");

client.println("<tr bgcolor=\"#888888\">");
client.println("<td><a href=\"/PhotoClic\"><button class=\"button button2\">PhotoClic</button></a></td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("</tr>");
client.println("</table>");


//-----------------------  AFFICHAGE -----------------------------------------------------------//
client.println("<br><br>");
client.println("<hr>");
client.println("<br><br>");

client.println("<table class=\"Type_A\">");
client.println("<tr>");
client.println("<td>");


//****PARAMÈTRES GÉNÉRAUX ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" style=\"height: 20px;\" bgcolor=\"#aaaaaa\"><h2>PARAMÈTRES GÉNÉRAUX</h2></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px; width: 250px;\" ><b>Résolution du rail</b></td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistParPas)+"</td>");
client.println("<td style=\"text-align: left;\"> <i>mm</i></td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Délai avant déclenchement</b><br>");
client.println("</td>");
client.println("<td>"+String(intDelaiAvantDeclenchement)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\"> <i>milliseconde</i><br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px; width: 250px;\" ><b> Délai après déclenchement</b></td>");
client.println("<td>"+String(intDelaiApresDeclenchement)+"</td>");
client.println("<td style=\"text-align: left;\"> <i>milliseconde</i>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("<td>");


//****PARAMÈTRES VERSUS REPÈRES ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistanceEntreCapture)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("</tr>");
client.println("</table>");

client.println("<br>");

client.println("<table class=\"Type_A\">");
client.println("<tr>");
client.println("<td>");


//****PARAMÈTRES VERSUS PAS ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS PAS</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Nombre de pas entre les arrêts</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltNbreDePasEntreArrets)+"<br>");
client.println("</td>");
client.println("<td style=\"width: 110px;\">-<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\" ><b>Nombre de boucle</b><br>");
client.println("</td>");
client.println("<td>"+String(intNbreDeBoucle)+"<br>");
client.println("</td>");
client.println("<td>-<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");

client.println("</td>");
client.println("<td>");

//****PARAMÈTRES VERSUS DISTANCE ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS DISTANCE</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\">"+String(fltDistanceEntreCapture)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Déplacement total</b><br>");
client.println("</td>");
client.println("<td>"+String(fltDeplacementTotal)+"<br>");
client.println("</td>");
client.println("<td style=\"text-align: left;\"> <i>mm</i><br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("</tr>");
client.println("</table>");


//--------------------  ENTRÉE DES DONNÉES  -------------------------------------------------//
client.println("<br><br>");
client.println("<hr>");
client.println("<br><br>");
client.println("<form action=\"/action_page.php\">");

client.println("<table class=\"Type_A\">");
client.println("<tr>");
client.println("<td>");

//****PARAMÈTRES GÉNÉRAUX ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" style=\"height: 20px;\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES GÉNÉRAUX</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; width: 250px;\"><b>Résolution du rail</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\"><input name=\"ResolutionDuRail\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px; padding: 10px;\">mm<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Délai avant déclenchement</b><br>");
client.println("</td>");
client.println("<td><input name=\"DelaiAvantDeclenchement\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; padding: 10px;\">milliseconde<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; width: 250px;\"><b>  Délai après déclenchement</b><br>");
client.println("</td>");
client.println("<td style=\"width: 100px;\"><input name=\"DelaiApresDeclenchement\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; padding: 10px;\">milliseconde<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("<td>");


//****PARAMÈTRES VERSUS REPÈRES ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS REPÈRES</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td><input name=\"DistanceEntreCaptureVR\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\" > mm<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("</tr>");
client.println("</table>");

client.println("<br>");
client.println("<input value=\"Soumettre\" type=\"submit\"><br>");
client.println("<br>");


client.println("<table class=\"Type_A\">");
client.println("<tr>");
client.println("<td>");

//****PARAMÈTRES VERSUS PAS ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS PAS</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Nombre de pas entre les arrêts</b><br>");
client.println("</td>");
client.println("<td><input name=\"NbreDePasEntreArrets\" type=\"number\"><br>");
client.println("</td>");
client.println("<td style=\"width: 110px;\">-<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Nombre de boucle</b><br>");
client.println("</td>");
client.println("<td><input name=\"NbreDeBoucle\" type=\"number\"><br>");
client.println("</td>");
client.println("<td>-<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("<td>");


//****PARAMÈTRES VERSUS DISTANCE ****
client.println("<table class=\"Type_B\">");

client.println("<tr>");
client.println("<td colspan=\"3\" bgcolor=\"#aaaaaa\">");
client.println("<h2>PARAMÈTRES VERSUS DISTANCE</h2>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Distance entre les captures</b><br>");
client.println("</td>");
client.println("<td><input name=\"DistanceEntreCaptureVD\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left; width: 110px;\"> mm<br>");
client.println("</td>");
client.println("</tr>");
client.println("<tr bgcolor=\"#888888\">");
client.println("<td style=\"text-align: right; padding: 10px;\"><b>Déplacement total</b><br>");
client.println("</td>");
client.println("<td><input name=\"DeplacementTotal\" type=\"number\" step=\"0.01\"><br>");
client.println("</td>");
client.println("<td style=\"text-align: left;\"> mm<br>");
client.println("</td>");
client.println("</tr>");

client.println("</table>");


client.println("</td>");
client.println("</tr>");
client.println("</table>");



client.println("<br>");
client.println("<input value=\"Soumettre\" type=\"submit\"><br>");
client.println("<br>");

client.println("</form>");

client.println("</body>");
client.println("</html>");

             break;  // break out of the while loop
           }         // fin du if (currentLine.length() == 0) 
           else {    // currentLine.length() != 0 et c == '\n' (nouvelle ligne)
            // Une ligne de commandes est reçue
            do_Commandes();
            currentLine = "";  // si vous avez un caractère de nouvelle ligne, effacez currentLine:
           }                   // fin du else { // currentLine.length() != 0
         }                     // fin du if (c == '\n')  
  
         else if (c != '\r') 
         {  // si vous avez autre chose qu'un caractère de retour de chariot,
          currentLine += c;    // l'ajouter à la fin de la currentLine
         // Serial.println(currentLine);
         }
       }                       // # if (client.available())
     }                         // # fin du while (client.connected())
     client.stop();            // close the connection:
     Serial.println("Client Déconnecté");
  } // # fin du if (client) 
}