Go Down

Topic: temporisation (Read 2315 times) previous topic - next topic

azazel_28

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

infobarquee

bonjour,
un code?
millis() peut être
AUCUNE AIDE PAR MP

john_lenfr

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

Déclarations:
Code: [Select]
// 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:
Code: [Select]

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

;)

azazel_28

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.

jfs

Remplace les delay par un fonction avec millis()

Tu peux voir venir....
Quote
This number will overflow (go back to zero), after approximately 50 days.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

B@tto


Tu peux voir venir....
Quote
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
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

azazel_28

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

Code: [Select]
  //////////////////////////////////////////////////////////////////////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

john_lenfr


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

azazel_28

bon j'ai adapté en ecrivant sa

Code: [Select]


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

john_lenfr

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

azazel_28

#10
Apr 11, 2014, 10:44 am Last Edit: Apr 11, 2014, 10:52 am by azazel_28 Reason: 1
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
Code: [Select]


//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
Code: [Select]


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

azazel_28

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

merci

Go Up