Code et Capteur LM393 H2010

Bonjour,
Je viens d'acheter un capteur LM393 H2010 pour réaliser des interruptions. Voir image en pièce jointe.
images

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.

avoid posting images they are difficult to read and impossible to copy code from
post your code as text using code tags </>

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

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...

essayez un code comme cela avec le capteur alimenté par la pin 5V et GND de votre arduino et la pin OUT connectée à la pin 3

const byte pinCapteur = 3;
volatile uint32_t compteur = 0;
uint32_t ancienCompteur = 0;

void goutte() {compteur++;}

void setup() {
  pinMode(pinCapteur, INPUT);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(pinCapteur), goutte, RISING);
}

void loop() {
  // accès à la variable en section critique
  noInterrupts();
  uint32_t copieCompteur = compteur;
  interrupts();

  if (copieCompteur != ancienCompteur) {
    Serial.println(copieCompteur);
    ancienCompteur = copieCompteur;
  }
}

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.

Voyez vous le compte changer si vous n’approchera pas le crayon?

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.

Pas si aléatoires que ça.
Le compteur s'incrémente, donc il y a plusieurs interruptions, en moyenne 5, pour un passage.

Ce sont des rebonds

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.