Bonjour,
Je viens d'acheter un capteur LM393 H2010 pour réaliser des interruptions. Voir image en pièce jointe.
J'utilise le code le plus simple que j'ai trouvé et qui figure ci-dessous:
volatile int compteur = 0;
int anterieur = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(3), goutte, RISING);
}
void loop() {
if (anterieur != compteur){
Serial.println(compteur);
anterieur = compteur;
}
}
void goutte(){
compteur=compteur+1;
}
Dans le moniteur série, ce code est sensé afficher 1,2,3,4,.... à chaque fois qu'une interruption se produit (je fais passer la pointe d'un crayon au niveau du capteur). Au lieu de cela, j'obtiens un nombre à deux chiffres à chaque interruption, et ces nombres semblent être aléatoires.
Existe-t-il une erreur dans le code ?
Ce code n'est pas compatible avec le capteur utilisé ? Merci de votre aide.
merci de ne plus jamais poster d'image d'un texte, copiez collez le texte que vous voulez partager en utilisant les balises de code si c'est du code ou la sortie du moniteur série. Une image est inutilisable si on veut copier le texte, prend plein de place sur le serveur et de bande passante pour la télécharger et contribue donc à polluer la planète plus que de nécessaire... Faisons tous un petit effort...
il se peut que le capteur voit plein d'interruptions avant même que vous ne puissiez imprimer. donc la sortie n'est pas forcément séquentielle.
il faut rajouter un peu de code qui dit que si l'interruption survient x ms après la dernière alors il faut l'ignorer par exemple, la fonction d'interruption deviendrait alors
void goutte() {
static unsigned long chrono = -100;
unsigned long t0 = millis();
if (t0 - chrono >= 50) compteur++; // on ne compte pas l'interruption si la précédente était il y a moins de 50 ms
chrono = t0;
}
Bonjour,
Votre premier code donne un résultat identique au mien.
Par contre, si on applique la version plus sophistiquée que vous me proposez, cela marche impeccable. J'obtiens bien l'effet recherché. Je vous remercie pour l'aide apportée.
Une question cependant:
vous dites dans votre message "il se peut que le capteur voit plein d'interruptions avant même que vous ne puissiez l'imprimer". Comment cela peut-il se produire si le crayon (ou l'obstacle) ne coupe pas le faisceau lumineux de l'optocoupleur ? Faites-vous allusion aux éventuelles variations de luminosité dans la pièce dans laquelle l'expérience a lieu?
Merci par avance des explications complémentaires que vous pouvez apporter à ce sujet.
Non, les "nombres aléatoires" qui apparaissaient dans le moniteur série dans mon code initial, n'apparaissaient que lorsque le crayon coupait le faisceau lumineux de l'optocoupleur.