Action pendant 10 minutes

bonjour,

simple question, est il possible de faire une action durant un temps donnee ?

En faite je souhaite effectuer une action 1 lorsque celle-ci est terminee depuis moins de 10 minutes, j’effectue une action 2 puis apres une action 3.

une idee de boucle? un simple while(i< 600 000) ?

merci

Bonjour,

Soit tu utilises delay() si tu n'as rien d'autre à faire, soit (ce qui est nettement préférable) tu utilises millis().

Bonjour, Je ne vois pas trop comment utiliser milis() sachant que mon programme tournera de facon indéfinit et fonctionne sous forme de machine a état avec 3 etats Par exemple : Etat 1 : tant que vrai j'allume la led Etat 2 : pendant 10 minutes après l'etat 1 je fais clignoter la led Etat 2 : Après les 10 minutes j'eteins la led. Si vrai je retourne à l'etat 1

Une idée pour ce "delais" ?

merci

Edit :
Je crois avoir trouver, je ne comprenais pas vraiment de fonctionnement de milis()…

si je fais dans l’etat 2 :
DureeDebut = milis()
tant que milis() est différent de DureeDebut + 10 minutes
Action
Fin etape 2

on peut aussi faire : tant que 10 minutes différent de milis - DureeDebut

mais comment ajouter ces 10 minutes?

bonjour,
recherche millis()

Etat 1 : tant que vrai j’allume la led ===> top-depart = millis()
Etat 2 : pendant 10 minutes après l’etat 1 je fais clignoter la led ==> si millis() - top_depart< 10mn fonction clignotant
Etat 2 : Après les 10 minutes j’eteins la led. Si vrai je retourne à l’etat 1 ==> led, low

edit :
temps_action = 60000*10; // 10mn

Il ne faut pas faire un est d'égalité car si tu rates une mS ton test échoue. Il faut faire le test: tant que millis()-debut inférieur à 10 mn

Ok merci à vous deux, et derniere question, qui suit un peu ce sujet :

enum {1,2,3} state=1; switch(state){ case 1: digitalWrite(9, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); digitalWrite(9, LOW); state=2; break;

case 2: ....

Je ne passe jamais a l'etape 2, savez vous pk? merci en tout cas :)

oui :)

Merci Kamill ;)

Et pourquoi cela? :)

Je suppose que tu as déclaré state dans la loop, il est réinitialisé à chaque fois. Il faut soit que tu le déclare static

static int state=1;

(ton enum ne sert à rien)

Soit qu'il soit déclaré en global (en dehors d'une fonction)

Ok alors la je ne comprends pas tout ...

// the loop function runs over and over again forever void loop() { digitalWrite(13, HIGH); val= digitalRead(12); // read the input pin

switch(state){ case 1: if (val== 1){ digitalWrite(9, HIGH); // turn the LED on (HIGH is the voltage level) }else{ digitalWrite(9, LOW); state = 2; } break;

case 2: digitalWrite(8, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(8, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break;

Plusieurs question... Si je veux appeler mon etat = MARCHE je le declare en char ? string? Pourquoi pas d'enum? pas besoin en arduino?

Et derniers questions.. ^^ Avec ce système, la PIN met 7 secondes avant d'etre en off... Pourquoi? de plus je ne change toujours pas d'etat en declarant : static int state=1;

code entre balise code </>

où trouve tu la valeur de state dans ton loop?

void loop() {
  digitalWrite(13, HIGH);
  val= digitalRead(12);   // read the input pin

  switch(state){

mets ton code en entier pour comprendre

Justement l'intérêt de l'enum c'est de donner un nom parlant à des valeurs, dans ton cas un état Par exemple:

 static enum STATE {ARRET,MARCHE,ATTENTE} state=ARRET;
  switch (state)
  {
    case ARRET:
      // ...
      break;
    case MARCHE:
      // ...
      break;
    case ATTENTE:
      // ...
      break;
  }

Tu es sur de ta valeur de val? Je te conseille de l'afficher sur le moniteur série

alors voici mon code

code </> 
int val=0;
static enum STATE {MARCHE,ATTENTE,ARRET} state=ARRET;;
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);
  val = digitalRead(12);   // read the input pin
  Serial.begin(9600);
  Serial.print(val);
  switch(state){
    case MARCHE:
      if (val == 1){
        digitalWrite(9, HIGH);   // turn the LED on (HIGH is the voltage level)
      }else{
        digitalWrite(9, LOW);
        state = ATTENTE;
      }
    break;
    
    case ATTENTE:
      int i;
      for(i=0;i<10;i++){
        digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
        delay(1000);              // wait for a second
        digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
        delay(1000); // wait for a second
      }
      state = ARRET;
    break;
    
    case ARRET:
      digitalWrite(8, HIGH);
      if(val ==1){
        digitalWrite(8, LOW);
        state = MARCHE;
      }
    break;
    
  }

}
</>

Les problèmes sont les suivant…
Donc je commence je ne suis pas a l’etat ARRET (le dernier), c’est la PIN 9 qui est a l’etat HIGH Lorsque val vaut 1 j’ai ceci sur le monitor “UÓSÓÓÓSÓÅ” ?! bizarre…
Et du coup je ne peux pas changer d’etat …

Vérifies que la vitesse dans Serial.begin() et la vitesse dans le moniteur série soit la même

Mets le Serial.begin() dans le setup()

Alors ça marche déjà beaucoup cependant je ne comprend pas ceci :

le 1 signifie que le lis bien 1, je suis donc à etat 1 et subitement je passe à 00 sans rien faire du coup je change d'etat...

111100ETAT_2

j'ai l'impression que ce sont de la faute des connections... Je vais essayer de voir, merci en tout cas ! :)

Ce sont peut être des rebonds. Mets un delay de 10mS à la fin de loop()

Alors c’est bizarre …

Lorsque je ne branche rien, je suis bien a l’arrêt, (et encore des fois non) et quand je branche un cable sur le port de lecture (un cable non alimenter, juste un fils)
ca me change d’etat… Il n’y aurait pas un problème sur la fonction read ?

Tu as bien une résistance de pullup (externe ou interne) ou un pulldown sur l'entrée?

Juste une resistance en serie avec la LED pour le moment.. ce n'est pas suffisant?