Librairies pour gestion des Temporisation

Hello à tous !

Simple petite question:
Exits-il une librairie pour la gestion les temporisation ?

Je m'explique:
Lorsqu'on veut activer un relais durant 1sec, on utilise le delay(1000);
mais cette technique bloque le programme.
Comment faire pour que sa fonctionne un peu comme avec la fonction tone ?

Merci de votre aide !!!!!

Salut,

Hello

Intéressant, mais un peu compliqué, j''aurais pas mal de timer (relais ou LED ) à faire.

En librairie toute simple ça existerais ?

Merci de ta réponse !!!!!

Alors ceci :

Illustration :

simpleMinuteur minuteur;

void loop()
{
  if (condition_activation_relais)
  {
    activerRelais();
    minuteur.demarrer(1000);
  }

  if (minuteur.estTermine())
  {
    desactiverRelais();
  }

  ... autres fonctions parallèles
}

je vais guetter ça, merci !!

Une librairie ici aussi

Hello

J'ai enfin reçu mes relais, j'ai donc pus me pencher un peu plus sur les librairies.
Attention, les relais marche en inverse.
Sortie Arduino LOW -> relais collé
Sortie Arduino HIGH -> relais NON collé

Celle de Bricoleau marche presque nikel.

J'ai pu enlever mes delay dans mon programme pour les remplacer par ta librairie.

J'ai pris l'exemple 3.
J'ai un relais qui active un klaxon.
Ce klaxon j'ai besoin de l'activer durant une certaine durée et suivant les conditions, cette durée ne sera pas la même.

j'ai donc un switch case:
R9 étant ma sortie relais

    switch (value) {

   case Z1R:
                 digitalWrite(R9, LOW);               
                 Klaxon3000.demarrer();
               
        break;

   case Z1B:
                 digitalWrite(R9, LOW);               
                 Klaxon500.demarrer();
               
        break;

J'ai aussi crée un void pour l'action à faire à la fin de la tempo:
Ce void je l’appelle dans la même loop que mon Switch Case

void Tempo_relais(){
  
 
     if (Klaxon3000.estTermine())
  {
   digitalWrite(R9, HIGH);
   Klaxon3000.redemarrer();
  }
 
     if (Klaxon500.estTermine())
  {
   digitalWrite(R9, HIGH);
   Klaxon500.redemarrer();
  } 
                  
                 
  }//fin void tempo_relais

Sauf que sa ne fonctionne pas, j'ai bien mon relais qui s’active quand il faut, mais le délais avant de l’éteindre ne marche pas.

Merci de ton aide !!!!

Le code en entier STP, parce que là c’est trop partiel.

Hello

J'ai mis le code en entier sur mon dropbox:
Juste ici
Je tente de faire marcher la librairie dans l'onglet Domination pour le moment.

Le dropbox contient plusieurs ino, que mon smartphone refuse d'ouvrir de toute manière.
STP mets le code ici sur le forum, ce sera plus facile de te répondre en le modifiant

Oui, le code est asser long, et répartie sur plusieurs onglet.

Je te met la partie du code qui me pose problème:

#include <LiquidCrystal.h>
#include <RCSwitch.h>
#include <EEPROM.h>
#include "simpleMinuteur.h"

simpleMinuteur Klaxon500(500);
simpleMinuteur Klaxon300(300);
simpleMinuteur Klaxon3000(3000);

// Lcd + pinout
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
RCSwitch mySwitch = RCSwitch();

// 0= Neutre 1= Rouge 2= Vert
int Zone1 = 0;
int Zone2 = 0;
int Zone3 = 0;
int Zone4 = 0;
int Zone5 = 0;
int Zone6 = 0;

#define  AnalogBtnPin A0
int AnalogBtn =0; //Valeur entrée A0

int Counterminute = 0;
unsigned long TempsInit = 0;
unsigned long TempsReel = 0;
unsigned long Temps = 60;
unsigned long TempsSec = 01;
unsigned long TempsMil = 0;
unsigned long TempsMin = 0;

int Klaxon = 12;  
int R1 = 23; 
int R2 = 22;  
int R3 = 25;  
int R4 = 24;  
int R5 = 27;  
int R6 = 26;  
int R7 = 29;  
int R8 = 28; 
int R9 = 31; 
int R10 = 30;  
int R11 = 33;  
int R12 = 32;  
int R13 = 35;  
int R14 = 34;  
int R15 = 37;  
int R16 = 36; 

int Rouge = 1;
int Vert = 2;
int Z1 = 0;
int Z2 = 0;
int Z3 = 0;

//Code telecommande RF
#define Z1R 14505408
#define Z1V 14505219

#define Z2R 350144
#define Z2V 349955

#define Z3R 4211136
#define Z3V 4210947



void setup() {
  
   //Lecture valeur eeprom--> Counterminute
  Counterminute = EEPROM.read(1);
  pinMode(Klaxon, OUTPUT);
  
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  pinMode(R5, OUTPUT);
  pinMode(R6, OUTPUT);
  pinMode(R7, OUTPUT);
  pinMode(R8, OUTPUT);
  
  pinMode(R9, OUTPUT);
  pinMode(R10, OUTPUT);
  pinMode(R11, OUTPUT);
  pinMode(R12, OUTPUT);
  pinMode(R13, OUTPUT);
  pinMode(R14, OUTPUT);
  pinMode(R15, OUTPUT);
  pinMode(R16, OUTPUT);

digitalWrite(R1, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R4, HIGH);
digitalWrite(R5, HIGH);
digitalWrite(R6, HIGH);
digitalWrite(R7, HIGH);
digitalWrite(R8, HIGH);
digitalWrite(R9, HIGH);
digitalWrite(R10, HIGH);
digitalWrite(R11, HIGH);
digitalWrite(R12, HIGH);
digitalWrite(R13, HIGH);
digitalWrite(R14, HIGH);
digitalWrite(R15, HIGH);
digitalWrite(R16, HIGH);

      
  Serial.begin(9600);
  lcd.begin(16, 2);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
  lcd.setCursor(5, 0);
  lcd.print("CQB GS");
  lcd.setCursor(0, 1);
  lcd.print("  By  Naudnaud");
  delay(2000);
  lcd.clear();  
}

void loop() {
  
  lcd.setCursor(0, 0);
  lcd.print("Gauche Domination");
  lcd.setCursor(2, 1);
  lcd.print("Droite Timer");
  
while(1) {
    
   AnalogBtn = analogRead(AnalogBtnPin);
  
    // BP Gauche Domination
 if(AnalogBtn >= 399 &&  AnalogBtn <= 419) // Boutons Gauche
      {Domination(); }
 
 // BP droite Timer
 if(AnalogBtn >= 0 &&  AnalogBtn <= 10) // Boutons Droite
   {ReglageMin();}
  
  
  
  
}//fin while  
}//fin loop



-------------------------------------------------------------


void Domination(){

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Z1:");
  lcd.setCursor(5, 0);
  lcd.print("Z2:");
  lcd.setCursor(11, 0);
  lcd.print("Z3:");
  
  lcd.setCursor(3, 0);
  lcd.print("N");
  lcd.setCursor(9, 0);
  lcd.print("N");
  lcd.setCursor(15, 0);
  lcd.print("N");

while(1) {

   Tempo_relais();
  
  
    // Fin rouge
  if ( Zone1 == 1 && Zone2 == 1 && Zone3 == 1 )
      { lcd.clear();  
        digitalWrite(R9, LOW); 
        lcd.setCursor(2, 0);
        lcd.print("Fin du jeux");
        lcd.setCursor(2, 1);
        lcd.print("Rouge WIN !");
        delay(3000);
        digitalWrite(R9, HIGH);
        while(1) {
          //rien
        }
       };
  
    // Fin bleu
  if ( Zone1 == 2 && Zone2 == 2 && Zone3 == 2 )
      { lcd.clear();
        digitalWrite(R9, LOW);
        lcd.setCursor(2, 0);
        lcd.print("Fin du jeux");
        lcd.setCursor(3, 1);
        lcd.print("Vert WIN !");
        delay(3000);
        digitalWrite(R9, HIGH);
      while(1) {  
        //rien
       }
       };
  
  
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    
    switch (value) {
   case Z1R:
                 if ( Z1 == Rouge ) {break;}
   
                 Z1 = Rouge;
                 lcd.setCursor(3, 0);
                 lcd.print("R"); 
                 Zone1 = 1;
                 digitalWrite(R9, LOW);
                 Klaxon3000.demarrer();
                 digitalWrite(R1, LOW);
                 digitalWrite(R16, HIGH);                
        break;
        
   case Z1V:
                    if ( Z1 == Vert ) {break;}
   
                 Z1 = Vert;
                lcd.setCursor(3, 0);
                lcd.print("V");
                Zone1 = 2; 
                digitalWrite(R9, LOW);
                 Klaxon3000.demarrer(); 
                 digitalWrite(R16, LOW);
                 digitalWrite(R1, HIGH);                
        break;
        
   case Z2R: 
                       if ( Z2 == Rouge ) {break;}
   
                 Z2 = Rouge;
                lcd.setCursor(9, 0);
                lcd.print("R");
                Zone2 = 1;
                digitalWrite(R9, LOW);
                Klaxon3000.demarrer(); 
                 digitalWrite(R2, LOW);
                 digitalWrite(R15, HIGH);
        break;
     
   case Z2V:
                       if ( Z2 == Vert ) {break;}
   
                 Z2 = Vert;
                lcd.setCursor(9, 0);
                lcd.print("V");
                Zone2 = 2;
                digitalWrite(R9, LOW);
                Klaxon3000.demarrer(); 
                 digitalWrite(R15, LOW);
                 digitalWrite(R2, HIGH); 
        break; 
 
   case Z3R:
                       if ( Z3 == Rouge ) {break;}
   
                 Z3 = Rouge;
                lcd.setCursor(15, 0);
                lcd.print("R");
                Zone3 = 1;
                digitalWrite(R9, LOW);
                Klaxon500.demarrer(); 
                  digitalWrite(R3, LOW);
                 digitalWrite(R14, HIGH);               
        break;
        
   case Z3V:
                       if ( Z3 == Vert ) {break;}
   
                 Z3 = Vert;
                lcd.setCursor(15, 0);
                lcd.print("V"); 
                Zone3 = 2;
                digitalWrite(R9, LOW);
                Klaxon500.demarrer(); 
                 digitalWrite(R14, LOW);
                 digitalWrite(R3, HIGH);       
        break;       
      default:
                 lcd.setCursor(3, 0);
                 lcd.print("?"); 
        break;
    }

     mySwitch.resetAvailable();
  }
  
  
  
  }//fin While
  }//fin void domination






-------------------------------------------------


void Tempo_relais(){
  
    if (Klaxon3000.estTermine())
  {
    digitalWrite(R9, HIGH);
    Klaxon3000.redemarrer();
  }
 
     if (Klaxon300.estTermine())
  {
   digitalWrite(R9, HIGH);
   Klaxon300.redemarrer();
  }
 
     if (Klaxon500.estTermine())
  {
   digitalWrite(R9, HIGH);
   Klaxon500.redemarrer();
  } 
                  
                 
  }//fin void tempo_relais

Utiliser plusieurs minuteurs différents n'est nécessaire que pour gérer en parallèle plusieurs temporisations.
Pour avoir un cycle de fonctionnement avec des durées variables, un seul minuteur est suffisant.

simpleMinuteur Klaxon;

...
    digitalWrite(R9, LOW);
    klaxon.demarrer(500);
...
    digitalWrite(R9, LOW);
    klaxon.demarrer(300);
...
    digitalWrite(R9, LOW);
    klaxon.demarrer(3000);
...

void Tempo_relais(){
  
    if (Klaxon.estTermine())
  {
    digitalWrite(R9, HIGH);
  }
 }//fin void tempo_relais

ah mince tu as déjà une variable int Klaxon définie par ailleurs. Trouve un autre nom pour le minuteur

Parfait !!!!!!!!!!!

J'ai piger comment sa fonctionne !!!!!!

Un grand merci !!!!!! Ta librairie correspond à 3000% à ce que je recherchais !!
Ultra simple d'utilisation, performante et diaboliquement efficace !!!!!

Hello

Je reviens vers vous pour un peu d’aide.

Je suis sur un nouveau projet, et j’utilise encor cette belle librairies !!!

Mais je me retrouve avec un problème… bizarre:

Lorsque je verse ce code dans mon arduino UNO:

#include <simpleMinuteur.h>
int test=0;

simpleMinuteur TIMEOUT;
simpleMinuteur Doublette;

void setup() {
 Serial.begin(9600);


}

void loop() {
 
Tempo();
Serial.println(test);
delay(1000);
test++;

}

void Tempo() {

    if (TIMEOUT.estTermine())
       {Serial.println("Temps OUT"); 
         }

       if (Doublette.estTermine())
          { Serial.println("Temps depasser");
           }

}//fin void tempo

Le moniteur série me donne ça:

Temps OUT
Temps depasser
0
Temps OUT
Temps depasser
1
Temps OUT
Temps depasser
2
Temps OUT
Temps depasser
3
Temps OUT
Temps depasser
4
Temps OUT
Temps depasser
5
Temps OUT
Temps depasser
6

Hors, je n’arrive pas a comprendre pourquoi. Normalement vu que je n’appelle pas la temporisation, rien ne devrait s’activé ?

Merci de votre aide !!!

Bonjour

Le minuteur ne gère pas l'état du système. Il décompte seulement le temps qui passe.

Si je transpose ton programme en image culinaire, c'est comme si tu cuisinais sans commencer par remonter le minuteur. Il est donc à zéro. Et après tu lui demandes si le temps est écoulé : il te répond toujours oui.

Tu doit ajouter dans ton programme des variables d'état de ton système.

Hello

Oui, javais bien compris, ce que mon programme montre, c’est que les deux void “estTermine” sont actif tout le temps.

Normalement, il faut que j’utilise : TIMEOUT.demarrer(5000); Pour que le Void “estTermine” TIMEOUT soit lu une fois 5sec après.

Ou je me trompe ?

Merci de ton aide !

EDIT: Dans cette exemple, le moniteur série me marque Pas POCK toute les cinq secondes, alors que je touche à rien du tout.

#include <simpleMinuteur.h>
int test=0;

simpleMinuteur TIMEOUT(5000);
int THRESHOLD = 100;
int knock = 1;  

void setup() {
 Serial.begin(9600);
 TIMEOUT.demarrer();
 
}

void loop() {

Tempo();

  if (analogRead(knock) >= THRESHOLD) {
       Serial.println("POCK");
       TIMEOUT.demarrer();
       delay(150);}
}

void Tempo() {

    if (TIMEOUT)
       {Serial.println("Pas POCK"); }

}//fin void tempo

EDIT: trompé de boutons

Tout ceci est normal

Par défaut tous les minuteurs démarrent au lancement du programme.

Quand tu déclares simpleMinuteur Doublette; sans préciser de durée, celle-ci est initialisée à zéro.
Donc après, si tu ne codes aucun Doublette.demarrer(...) pour préciser la durée du minuteur, celle-ci reste à zéro et donc Doublette.estTermine() renvoie toujours true;

Dans ton dernier exemple, ton minuteur TIMEOUT est initialisé avec une durée à 5000.
Par la suite, tu testes

if (TIMEOUT)
{
  ...
}

Ce qui revient exactement au même que d'écrire

if (TIMEOUT.estTermine())
{
  TIMEOUT.redemarrer();
  ...
}