réaliser une temporisation

Bonjour

j'ai un petit souci au niveau des tempo

je suis en train de réaliser un prog et je souhaiterai utiliser une fonction qui me parait basique ( pour l'automaticien que je suis ) une temporisation L-Li c'est a dire une tempo retard marche et retard a l’arrêt

pour faire simple quand j'ai ma condition j'attends un certain temps ( appelé t1) puis je déclenche pendant un certain temps ( t2)

j'arrive a le faire avec la fonction delay , mais je souhaiterai que ces tempo soient modifiables ( via mon écran tactile )

la gestion sur écran tactile ce fait par des bouton + et -

et la ça coince je ne vois pas du tout comment faire ?

avez vous une idée ? existe t'il une fonction autre que delay ?

merci par avance

Bonjour,

Avec une fonction de tempo non bloquante peut être ? Exemple: http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Et Barbudor a fait une jolie petite lib sympa qui peut être utile pour ce type d'application. http://arduino.cc/forum/index.php/topic,101814.0.html

haaaa ben voila une lib qui m'aurait simplifié la vie si je l'avais vue avant le début de mon projet de groupe automatique :P J'étais venu voir ce sujet en me disant que j'allais proposer ma fonction de tempo non bloquante, mais finalement...

Bon, bah finalement, je la donne, elle est très simple, ça peut peut-être servir quand même :

byte tempoMS(unsigned long duree) {
  //comme son nom l'indique... fournit une temporisation en ms
  
  //le premier appel avec "duree" lance la tempo, retourne false
  //ensuite retourne false si "duree" (en ms) n'est pas écoulée, puis true lors de son 
  //premier appel après écoulement de la durée "duree"
  //l'appel suivant relance la tempo.
  
  //un appel avec "duree" à 0 termine la tempo et retourne true.


  //TODO idée pour simplifier : virer le reset auto quand le temps est écoulé,
  //uniquement reset manuel -> permet des appels avec temps différents depuis le même état de la machine
  
  static unsigned long temps_debut = 0;
  static boolean tempo = false;
    
  if (!duree) {    tempo = false;
        return true; }
     
  if (!tempo) {    tempo = true;
        temps_debut = temps_courant;
        return false; }
  else 
    if (temps_courant > (temps_debut + duree)) {
      tempo = false;                 //remet à 0 le flag tempo si durée écoulée pour permettre le lancement suivant
      return true;
    }
    else return false;
}

Par exemple dans ton cas, en utilisant ma fonction, tu aurais un truc dans le genre :

static boolean flag=0,flag2=0;
static unsigned long T1=valeur_init,T2=valeur_init2;


//ici dans ton code tu modifie T1 ou T2 si besoin.


if (condition)
  flag = true;

if (flag)
{
  if (tempoMS(T1,O) { flag2=true;
              digitalWrite(ta_sortie, true); }
  
  if (flag2)
    if (tempoMS(T2,0) { flag = flag2 = false;
            digitalWrite(ta_sortie, false); }
}

ce code est à mettre dans une fonction qui sera appelée depuis la fonction loop(), ou directement dans loop(), selon ton programme. Comme il n'est pas bloquant, tu peux continuer à faire autrechose (par exemple lire T1 et T2 depuis ton interface graphique) à chaque passage dans loop(), à condition que cet autrechose ne soit pas bloquant non plus, sinon les temps T1 et T2 ne seront pas respectés.

merci bien pour la fonction , ca me dépanne carrément :)

je regarderai ca des ce soir mais je pense que ca devrait le faire

pardon, employé comme ça, ça ne va pas marcher !! il faut pour que ça marche avoir une variable globale temps_courant de type unsigned long, à mettre à jour au début de ta fonction loop, avec la ligne suivante :

unsigned long temps_courant; //variable globale, à déclarer en haut de ton fichier

loop() {
temps_courant = millis(); //mise à jour de la valeur à chaque passage dans loop()

etc;
etc;
etc;
etc;
}

il aurait été possible d'utiliser millis() directement dans la fonction tempoMS, mais j'ai procédé de la sorte car dans mon programme j'utilise plusieurs fois la fonction, à des endroits différents, et il me fallait avoir à chaque passage dans la boucle la même origine des tempos.

Cela dit, cette fonction est extrêmement basique, sans doute ferait-tu meilleur usage de la librairie de Barbudor.

Sans vouloir dénigrer le travail de bricofoy , la librairie de barbudor est bien plus poussé / fiable. Surtout que j'ai l'impression qu'il manque de parenthèses dans ton code d'exemple (au niveaux des if) ;)

ha ça c'est certain, et je n'ai jamais prétendu le contraire :P :P

et tu as parfaitement raison, il manque une fermeture de parenthèse dans chaque if