Bonjour,
Je travaille avec une Arduino (une Controllino pour être exacte) et j’ai besoin de calculer régulièrement un débit d’eau. Le débimètre est relié à un pin d’interruption et envoie un signal tous les litres.
A plusieurs reprises, je suis tombé sur le code suivant (traduit d'ici):
byte sensorPin = 2;
volatile byte pulseCount = 0;
float flowRate;
unsigned long oldTime = 0;
void pulseCounter()
{
pulseCount++;
}
void setup()
{
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
attachInterrupt(digitalPinToInterrupt(sensorPin), pulseCounter, FALLING);
}
void loop()
{
if((millis() - oldTime) > 10000) // Calcule le débit toutes les 10 secondes environ
{
// Désactive les interruptions
detachInterrupt(digitalPinToInterrupt(sensorPin));
// 1 pulse = 1L
// L/min
flowRate = 60000.0 / (millis() - oldTime) * pulseCount;
oldTime = millis();
pulseCount = 0;
// Réactive les interruptions
attachInterrupt(digitalPinToInterrupt(sensorPin), pulseCounter, FALLING);
}
}
J’ai fait des tests et ça fonctionne bien. Seulement, désactiver les interruptions rend possibles ce genre de cas, avec un débit réel d’environ 1L/s :
t=8.00qqch
:pulseCount
vaut 8t=9.00qqch
:pulseCount
vaut 9t=10
: désactiver les interruptionst=10.00qqch
: le débitmètre envoie un signal non détecté- Calculer le débit
- Réactiver les interruptions
Si bien que des fois, un litre passe à la trappe, selon si on calcule le débit pendant que le débitmètre nous contacte.
Or je ne comprends pas tellement pourquoi on désactive les interruptions. J’ai l’intuition que ce n’est ps génial de potentiellement changer la valeur des variables pendant notre calcul de débit, mais je ne parviens pas à trouver d’exemple problématique concret.
Merci d’avance.
Merci.