[Résolu]webserver I/O avec led temporiser help..

bonjour,
Voila je voudrais faire un webserver I/O mais avec des sorties temporiser
après plusieurs essaye et recherche sur le net ca n’existe pas,
Alors j ai commencé par le plus dur, faire un temporisation ça fonctionne plutot bien..
sauf que il faut que le client reste connecter pendant la procédure de la temporisation
Autrement la led reste allumer .
Alors comme faire pour quelle puisse finir la procédure et s’éteindre même si il n y a plus de client connecter?
Et comme je ne suis pas très doué dans la programmation, une aide serait la bienvenue
merci d’avance ANDRO
voila le code

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //physical mac address
byte ip[] = { 192, 168, 0, 116 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString; 
const int temporisation_A = 4000;//
int stringA;
int etat_A;
int const outputledport4 = 4;
unsigned long temps_A;
////////////////initialisation et configuration des entrées/sorties ///////////

void setup()
{
pinMode(outputledport4 , OUTPUT);

Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
}
void loop()
{
// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) 
{
if (client.available()) 
{
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string 
readString += c; 
//Serial.print(c);
} 

if (c == '\n') {
       
if(readString.indexOf('?') >=0) 
{
client.println("HTTP/1.1 204 xxx");
client.println();
client.println();  
}
else 
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Refresh: 5"); 
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>tempo I/O</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<H1>tempo I/O</H1>");
client.println("<a href=\"/?out4\" target=\"inlineframe\">ON TIMMER PORT4</a><p>"); 
client.println("<IFRAME name=inlineframe style=\"display:none\" >");          
client.println("</IFRAME>");
client.println("</BODY>");
client.println("</HTML>");
}
delay(1);
//stopping client
client.stop();

// Vérifie les String A pour savoir s'il faut allumer la led
stringA = readString.indexOf("out4");
if(stringA >0)
{
 temps_A = millis(); 
 etat_A = HIGH; //
digitalWrite(outputledport4, HIGH);//enclenche la led
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Vérifie la led A si il faut l'éteindre
if(etat_A == HIGH && ((millis() - temps_A) > temporisation_A))
{
etat_A = LOW;
digitalWrite(outputledport4, LOW);

}
//clearing string for next read
readString="";
}
}
}
}
}

Il faut que tu crées une fonction de comptage indépendante de ta boucle Ethernet.
Il faudrait que tu te serve de l'heure plutot que d'un compteur qui tourne et que tu détecte le passage.
Par exemple il est 16h00, sur ton interface tu sélectionne 10min de comptage.
Tu fait un test if sur la valeur 16h10 en scrutant le temps régulièrement et ça t'évite d'attendre?

Eventuellement tu peux ajouter un DS1307 pour avoir une base de temps

merci john_lenfr ,de me dirigier sur une voie ,malheureusement comme je debute sur arduino ca met très dificile d'avance,pas assez de notion mais je prends note ,déja une solution c est tout bon a prendre.

si personne ne trouve une autre solution plus facile , je me lancerai dans cette voie..

merci d'avance

Si tu peux essaye de décrire ton projet de façon plus détaillée pour savoir ce qu'il doit faire au final.
Et met un imprim écran de ta page internet pour voir le rendu.
:wink:

merci john_lenfr sympas de t'interessé au project

Enfaite après avoir scruté internet de long en large
Je me suis aperçu qu’il n y avait pas de web server qui gère les i/o Avec des temporisations (je sais pas si c est trop difficile ,ou personnes sinteresse au truc ).
Ex enclenche la lumière corridor (pin5) pendant x temps et après éteint toi toute seule
Sans utiliser la fonction delay, car si je veux pendant que la lumière corridor (pin5) finisse sont cycle
Enclencher la gâche électrique (pin4) ..
voila a quoi sa pourait ressemblé...

web server 192.168.x.xxx

digital pins

pin 1 on /off
pin 2 on/off
pin 3 on/off
pin 4 push ex 45 secondes gache électrique
pin 5 push ex 30 minutes lumière coridore

merci d'avance

3.jpg

Tu peux essayer de voir avec la librairie Time et créer une fonction Timer du type:

// Time interval [ms] for display updates:
const unsigned long DISPLAY_INTERVAL = 10000;  // in ms (200ms equals approximately 5 Hz)
static unsigned long lastTime=0;  // in ms
unsigned long time=millis();      // in ms

    // start timers for publication  
    time=millis();
// boucle de délai
    if (time-lastTime>DISPLAY_INTERVAL)  // if at least DISPLAY_INTERVAL ms have passed
    {
     // execute qqchose
    lastTime=time;
    }

Dans cette fonction, le "execute qqch" ne se lance pas tant que time-lastTime n'est pas égal à DISPLAY_INTERVAL
Il te suffit de définir DISPLAY_INTERVAL à 45s.

Pour 30min de délai je ne sais pas si la fonction millis suffira, mais au pire tu peux la remplacer par la fonction microsecond()

:wink:

ok merci je prends note ,je sais pas si je me suis mal exprimé,
d’après le code que j ai fourni la fonction temporisation en elle même fonctionne,
ce qui ne fonctionne pas c est qu’il faut que le client reste connecter pendant la procédure de la temporisation...
comme je suis novice je sais pas si c est lié..

Ok je comprends mieux.
Alors c'est simplement une histoire d'imbrication de tes fonctions.

Sors de ta boucle internet ta fonction de timer.

Essaie comme ça:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //physical mac address
byte ip[] = { 192, 168, 0, 116 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString; 
const int temporisation_A = 4000;//
int stringA;
int etat_A;
int const outputledport4 = 4;
unsigned long temps_A;
////////////////initialisation et configuration des entrées/sorties ///////////

void setup()
{  
pinMode(outputledport4 , OUTPUT);

Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
}
void loop()
{
// Create a client connection
EthernetClient client = server.available();
if (client) {
      while (client.connected()) 
      {
          if (client.available()) 
          {
                char c = client.read();
                
                //read char by char HTTP request
                if (readString.length() < 100) {
                
                //store characters to string 
                readString += c; 
                //Serial.print(c);
                } 
                
                if (c == '\n') {
                             
                          if(readString.indexOf('?') >=0) 
                              {
                              client.println("HTTP/1.1 204 xxx");
                              client.println();
                              client.println();  
                              }
                          else 
                              {
                              client.println("HTTP/1.1 200 OK");
                              client.println("Content-Type: text/html");
                              client.println("Refresh: 5"); 
                              client.println();
                              client.println("<HTML>");
                              client.println("<HEAD>");
                              client.println("<TITLE>tempo I/O</TITLE>");
                              client.println("</HEAD>");
                              client.println("<BODY>");
                              client.println("<H1>tempo I/O</H1>");
                              client.println("<a href=\"/?out4\" target=\"inlineframe\">ON TIMMER PORT4</a><p>"); 
                              client.println("<IFRAME name=inlineframe style=\"display:none\" >");          
                              client.println("</IFRAME>");
                              client.println("</BODY>");
                              client.println("</HTML>");
                              }
                          delay(1);
                          //stopping client
                      client.stop();
                      
                      // Vérifie les String A pour savoir s'il faut allumer la led
                      stringA = readString.indexOf("out4");
                      if(stringA >0)
                          {
                               temps_A = millis(); 
                               etat_A = HIGH; //
                              digitalWrite(outputledport4, HIGH);//enclenche la led
                          }
                      
                      //clearing string for next read
                      readString="";
                }
          }
      }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Vérifie la led A si il faut l'éteindre
if(etat_A == HIGH && ((millis() - temps_A) > temporisation_A))
{
etat_A = LOW;
digitalWrite(outputledport4, LOW);

}


}

:wink:

Yeaaa ,trop cool , fait plaisir , ca fonctionne a merveille il me semblait bien que c’était pas grand chose, mais sens toi j aurais pu chercher encore un moment ..
La prochaine fois je ferais attention a l’imbrication.

Encore grand merci de toute l’attention que tu as apporté a ce sujet.

De rien :wink:

Pour l'imbrication essaie d'utiliser l'indentation ça permet de rendre le code plus clair et tu vois d'un coup d'oeil l'imbrication de tes fonctions les unes par rapport aux autres.

N'oublies pas de mettre des commentaires dans ton code car si tu le reprends plus tard tu sauras plus qui fait quoi et comment!

EDIT: N'oublies pas de passer ton premier message en Résolu

Ok merci je prends note
tout bon week