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?