temporisation

Bonjour dans le but de gestion de mon aquarium je veux envoyer du co2 pendant un temp precis defini par une varible a un interval de temp defini par une autre variable mais je n arrive que a bloquer l arduino quelqu un a t il une inde pour realiser des tempos sans bloquer l arduino ? Merci

bonjour,
un code?
millis() peut être

Avec l'utilisation d'un petit code de comptage?

Déclarations:

// for refresh time
const unsigned long DISPLAY_INTERVAL = 20000; // in ms ici correspond à 20s
static unsigned long lastTime=0;  // in ms
unsigned long time=millis();      // in ms
//unsigned long starting_time=millis();      // in ms

Dans le loop:

// envoi du co2 toutes les XX sec
  time=millis();
  if (time-lastTime>DISPLAY_INTERVAL)  // si DISPLAY_INTERVAL ms est passé
  {
    //envoyer du co2
    delay(2000);// durée d'envoi du CO2 (ici 2 sec)
   // fin d'envoi du co2
   
    lastTime=time;  // reset timer
  }

Dans cet exemple j'envoie du CO2 pendant 2s toutes les 20 sec

:wink:

Bonjour merci pour le code.
Delay ne provoque pas l arrêt du programme ?
Je vous poste le code que j ai essayé demain matin.
Mon probleme avec millis c est que les tempos pourront aller sur plusieurs heures.

Remplace les delay par un fonction avec millis()

Tu peux voir venir....

This number will overflow (go back to zero), after approximately 50 days.

Jean-François:
Tu peux voir venir....

This number will overflow (go back to zero), after approximately 50 days.

C'est infini même : j'avais posé la question il y a pas longtemps et fdufnews m'avait expliqué que l'overflow est pris en compte si on fait une différence. Donc RefTemps-millis() sera toujours valable, même si millis() overflow

c 'est quoi l'overflow ? (desole mais je debute dans l'arduino je suis plus alaise sur les api )

sinon voici le code que j'avais essaye

  //////////////////////////////////////////////////////////////////////test declenchement co2///////////////////////////////////////////////////////////////
  
  ////////////////////////////////////////////////////exemple de code////////////////////////////////////////
  // Attendre 5 minutes pour envoyer un message.
  // Comme loop est exécuté constamment, le message sera envoyé toutes les 5 minutes
  //function loop() {
  //  DateTime depart = RTC.now();
  // DateTime maintenant = RTC.now();
  // while( (maintenant.get() - depart.get()) < 300 ) {
  //   maintenant = RTC.now(); // Re-capturer l'heure
  // }
  //  Serial.println( "5 minutes viennent de passer" );

  ////////////////////////////////////////////////////a tester///////////////////////////////////////////////////////
   
  // envoi de co2
   if (debut6<fin6 && co2stat==2){if (timer>=debut6 && timer<fin6){plageco2=1;}} else {plageco2=0;}  //en base de minutes
     
   if(plageco2==1){  
   depart = now();
   maintenant = now();
   while((maintenant - depart) < ((interremp*60)/60) ){duree1=1;} 
   {maintenant = now();} // Re-capturer l'heure
}else {duree1=0;}
   
   if(duree1==1){  
   depart2 = now();
   maintenant2 = now();
   while((maintenant2 - depart2) < ((dureeco2*bt3)/60) ){duree2=1;} 
   {maintenant2 = now();} // Re-capturer l'heure
}else {duree2=0;}

interremp = temps entre deux remplissage (secondes)
dureeco2 = temp de remplissage (secondes)
debut6 = heure de debut de diffusion (minutes)
fin6 = heure de fin de diffusion (minutes)
co2stat==2 c'est le mode auto
duree1 =bit remplissage a 0
duree2 = bit remplissage a 1

donc quand duree2 passe a 1 j'active le relais mais sa bloque l arduino.

je vais tester avec millis et vous tiens au courant.

merci

azazel_28:
Mon probleme avec millis c est que les tempos pourront aller sur plusieurs heures.

Rien ne t'empèche d'initialiser DISPLAY_INTERVAL au temps que tu veux, les heures tu les transforment en secondes et les secondes en millisecondes, je ne te fais pas l'affront de te dire comment

bon j'ai adapté en ecrivant sa

time=millis();
  
  if (time-depart>(interremp*bt4*1000))  // si temp inter remplissage en ms est passé
  {{duree1=1;}
  
  if (duree1==1 && ((time-depart>((dureeco2*bt3*1000)+(interremp*bt4*100)))))  // si temp temps co2 en ms est passé
  {duree1=0;}
   
  
   // fin d'envoi du co2
   
    depart=time;  // reset timer

sa ne marche pas j'arrive a mettre la sortie a 1 uniquement si je mets le co2 a plus de 33secondes la je comprends pas j'ai du faire une erreur a un endroit mais je vois pas ou

Peux tu nous mettre le code complet avec les déclarations car là on comprends pas trop de qui se passe.

c'est bon ca marche par contre au dessus de 31s sa coince je passe en valeur negative (-3253) pour le temps travail et repos

le code

//definition bt3 et 4
  
            if (bt1==0){bt3=1;}     //secondes
            if (bt1==1){bt3=60;}    //minutes
            if (bt1==2){bt3=3600;}  //heures
            if (bt2==0){bt4=1;}     //secondes
            if (bt2==1){bt4=60;}    //minutes
            if (bt2==2){bt4=3600;}  //heures

tempsrepos=interremp*bt4*1000;//calcul temps entre deux recharges en ms
tempstravail=(dureeco2*bt3*1000)+(interremp*bt4*1000);//calcul temps repos+travail en ms

if (plageco2==1 && (time-departco2>tempsrepos)){duree1=1;} //temporisation repos en ms
if (duree1==1 && (time-departco2>tempstravail)){duree1=0;departco2=time;} // temporisation envoi co2 en ms

les declarations

// Co2
// heure de debut
int debut6;
// heure de fin
int fin6;

byte dureeco2;
byte interremp;
byte duree1;
byte duree2;
byte bt1;
byte bt2;
int bt3;
int bt4;
byte plageco2; ///plage envoi co2 
unsigned long departco2;
unsigned long tempstravail;
unsigned long tempsrepos;
int co2stat;
int departremp;
unsigned long time=millis();

je pense que le probleme vient du type de donne declare pour tempstravail et tempsrepos

c'est bon sa marche pour sa j'ai du declarer toutes mes variable bt3 4 interremp et dureeco2 en long

merci