Go Down

Topic: [Résolu]webserver I/O avec led temporiser help.. (Read 3290 times) previous topic - next topic

androstorm

Jan 07, 2014, 11:40 pm Last Edit: Jan 11, 2014, 11:12 am by androstorm Reason: 1

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

Code: [Select]
#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="";
}
}
}
}
}

john_lenfr

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

androstorm

#2
Jan 08, 2014, 06:11 pm Last Edit: Jan 08, 2014, 08:06 pm by androstorm Reason: 1
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

john_lenfr

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.
;)

androstorm

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

john_lenfr

#5
Jan 10, 2014, 07:30 am Last Edit: Jan 10, 2014, 07:32 am by john_lenfr Reason: 1
Tu peux essayer de voir avec la librairie Time et créer une fonction Timer du type:

Code: [Select]

// 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()

;)

androstorm

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é..

john_lenfr

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:

Code: [Select]
#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);

}


}


;)

androstorm

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.

john_lenfr

#9
Jan 10, 2014, 10:27 pm Last Edit: Jan 11, 2014, 08:26 am by john_lenfr Reason: 1
De rien ;)

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

androstorm

#10
Jan 11, 2014, 09:31 am Last Edit: Jan 11, 2014, 11:09 am by androstorm Reason: 1
Ok merci je prends note
tout bon week

Go Up