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) }