Comment incrementer une variable avec un interrupt en mode HIGH

Bonjour à tous,

J'ai un pluviometre connecté à ma pin A4.Qaudn cette pin passe HIGH, la fonction

void triggeredDropArrosage()
{
  if(digitalRead(pin_arrosage)==HIGH)
  {
    vcountDrops=vcountDrops+1;
    led_state = !led_state;
  }
  delayMicroseconds(100000);
}

est appellée grace a cette déclaration

pinMode(pin_arrosage, INPUT_PULLUP);
//attachInterrupt(digitalPinToInterrupt(pin_arrosage), triggeredDropArrosage, CHANGE);
attachInterrupt(digitalPinToInterrupt(pin_arrosage), triggeredDropArrosage, HIGH);

Je ne peux pas utilisé le mode CHANGE et je l'expliquerai après. Ca fonctionne bien avec CHANGE mais plus avec HIGH.

J'utilise aussi la librarire RTCZero pour mettre mon board en sleep mode.

Quand une goutte tombe dans le pluviometre, l'interrupt sur la pin A4 est déclanchée et la variable 'vcountDrops' doit incrémenté de 1

Le microcontrolleur ne peut pas etre réveiller si l'interrupt est en mode CHANGE. Par contre si je le met en mode HIGH, ca marche. J'ai testé et c'est bien le cas.

Donc le problème que j'ai constaté, si le balançoire de mon pluviometre bascule rapidement, l'interrupt est déclanché une fois. Mais si par exemple, l'interrupt bascule lentement, la variable 'vcountDrops' peut passer de 23 à 29.

Au exmple, si je bouge le balancoir avec mes doigts et je le laisse au niveau de l'aimant, là la pin A4 reste HIGH, donc la variable 'vcountDrop' peut passer de 23 à 100, ca depend du temps que je laisse le balancoir au milieu de course.

Je me demande comment, je pourrais m'assurer que ma variable 'cvountDrop' incrément que de 1 et ne puisse pas incrémenter tant que A4 ne passe pas à LOW.

Dans un ISR, on ne peut pas faire un loop, non?

Un ISR doit etre le plus court possible et le plus rapide.

Je pensais faire ceci, mais je ne suis pas convaincu

void triggeredDropArrosage()
{
  if(digitalRead(pin_arrosage)==HIGH)
  {
    vcountDrops=vcountDrops+1;
    led_state = !led_state;
  }
  //delayMicroseconds(100000);
  while(digitalRead(pin_arrosage)==HIGH){}
}

N'y aurait-il pas une autre solution plus fiable?

pierrot10:
...
Donc le problème que j'ai constaté, si le balançoire de mon pluviometre bascule rapidement, l'interrupt est déclanché une fois. Mais si par exemple, l'interrupt bascule lentement, la variable 'vcountDrops' peut passer de 23 à 29.

Au exmple, si je bouge le balancoir avec mes doigts et je le laisse au niveau de l'aimant, là la pin A4 reste HIGH, donc la variable 'vcountDrop' peut passer de 23 à 100, ca depend du temps que je laisse le balancoir au milieu de course.

N'y aurait-il pas une autre solution plus fiable?

:grin:

Bonsoir

Déjà découvrir ce que sont "les rebonds" et y adapter les meilleures solutions ?

Les ILS question "rebonds" sont des "excellents joueurs très facétieux" :wink:

Fais une recherche avec "arduino debouncing "

En mode HIGH l'interruption est appelée tant que l'état est maintenu donc c'est normal que ton compteur s'incrémente plusieurs fois.
D'après la datasheet de l'ATmega on doit pouvoir sortir du mode sleep aussi bien sur CHANGE que sur HIGH donc je ne comprends pas pourquoi ton processeur ne se réveille pas en mode CHANGE.

fdufnews:
En mode HIGH l’interruption est appelée tant que l’état est maintenu donc c’est normal que ton compteur s’incrémente plusieurs fois.
D’après la datasheet de l’ATmega on doit pouvoir sortir du mode sleep aussi bien sur CHANGE que sur HIGH donc je ne comprends pas pourquoi ton processeur ne se réveille pas en mode CHANGE.

Je ne sais paspourquoi ca ne se reveille qu’avec le mode HIGH ou LOW. J’ai trouvé des information allant dans ce sens comme celle-ci, en bas de page.
Je préfererais réveillé mon mcro controleur en mode CHANGE ou RISING mais mon soucis maintenant est de trouvé une solution pour que mon compteur de goute écrémente par 1 malgré le fait que l’interrupt est appelé tant que l’état est mainten HIGH.

A mon avis ce problème de réveille est probalement du à cause de la librairie RTCZero?
Si non, s’il y a autre moyen de mettre en mode sleep mon ATSAMD21G18A, je suis prenneur.
Ce qu’il y a d’intéressant dans la librarire RTCZero c’est que l’on peut définir une alarm qui va réveiller la microcontrolleur tous les 10 secondes, par exemple, sans untiliser un module RTC proprement dit, avec une pile…

Ce que je ne comprends pas aussi,
C’est que si mon etat reste HIGH pendant quelques micro seconde, ou le temps que je bascule dans l’autre position, mon bunket,
Si je mets cecis dans mon ISR

void triggeredDropArrosage()
{
  do{
  }while(digitalRead(pin_arrosage)==HIGH);
  vcountDrops=vcountDrops+1;
  led_state = !led_state;
}

Il ne devrait que incrémenté de 1, non?
Car tant que l’état est HIGH, il ne quitte plus mon ISR et une fois que mon bunket a basculé, il quitte de DO…WHILE et incrémente de 1, non?