Potentiometre angulaire ne fait que augmenter

Salut,

je suis en train de me faire un compteur pour mesurer du fil et me donner une alerte lorsque que la valeur d'enroulement est atteinte.

Je rencontre un problème avec le Potentiomètre Angulaire qui n'incrémente et/ou décrémente la valeur que bizarrement, très souvent elle augmente plus qu'elle ne réduit ...

Puis mon buzzer maintient un bip continu une fois qu'il à joué une fois ...

Quelqu'un peut il m'aider ?

/*
    Compteur bobine
*/

#include <Wire.h>
#include "rgb_lcd.h"
#include "pitches.h"

rgb_lcd lcd;

const int colorR = 45;
const int colorG = 100;
const int colorB = 21;

//potentiometre
 int outputA = 2;
 int outputB = 3;
 int aState;
 int aLastState;  
 int PinSW = 4;


//compteur
 long metrage = 0;
 long compteur = 0;
 long compVal = 0;
 int PinCapteur = 6;

//buzzer
const int buzPin = 5;

void setup() {

     pinMode (outputA,INPUT_PULLUP);
     pinMode (outputB,INPUT_PULLUP);
     aLastState = digitalRead(outputA);  

     pinMode (PinCapteur, INPUT);
     pinMode (PinSW, INPUT_PULLUP);
     metrage = 10;

     digitalWrite(buzPin, LOW);
    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    Serial.begin(9600);
    
}

void loop() {

    resetCompteur();

    compteurAFF();
    
    ValMetrage();
  
    lcd.setCursor(0, 0);
    lcd.print("Long : ");
    lcd.print(metrage);
    lcd.setCursor(0, 1);
    lcd.print(compteur);

     delay(20);
     
    if (compteur >= metrage){
      
      playFailed();
      lcd.setRGB(255, 0, 0);
      } 
}

void playPassed() { /* function playPassed */
  ////Play 'ON' Sound
  int melodyOn[] = {NOTE_C5, NOTE_C6, NOTE_D5, NOTE_A6};
  int durationOn = 200;
  for (int thisNote = 0; thisNote < 4; thisNote++) {
    tone(buzPin, melodyOn[thisNote], durationOn);
    delay(200);
  }
}

void playFailed() { /* function playFailed */
  ////Play 'OFF' Sound
  int melodyOff[] = {NOTE_C3, NOTE_D3};
  int durationOff = 200;
  for (int thisNote = 0; thisNote < 2; thisNote++) {
    tone(buzPin, melodyOff[thisNote], durationOff);
    delay(200);
  }
}

void resetCompteur(){
  
  if (!(digitalRead(PinSW))) {      // Reset la position si on appui sur le potentiomètre
     compteur = 0;
     lcd.clear();
     lcd.setRGB(colorR, colorG, colorB);
     playPassed();
     delay(1000);
     
         }
  }

void compteurAFF(){
  
  if (digitalRead(PinCapteur) == LOW){
      compteur++;
      }
  }

void ValMetrage(){
  
  aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       metrage --;
     } else {
       metrage ++;
     }
     Serial.print("Position: ");
     Serial.println(metrage);
   }
    aLastState = aState;
  }
/*********************************************************************************************************
    END FILE
*********************************************************************************************************/

Bonjour AnTeBiOs

Si j'ai bien compris, la bobine entraîne ton potentiomètre angulaire?
Si oui, tu as tout intérêt à utiliser une bibliothèque comme Encoder.h, pour "lire" ton potentiomètre angulaire, ça te facilitera nettement le programme.

Cordialement
jpbbricole

Non, le potard sert à fixer une valeur en mètres. Le capteur va compter le nombre de tours de la bobine et dès que le nombre de tours aura depassé la valeur fixée elle fait sonner le buzzer ...
J'ai lu le topic auquel tu as répondu sur le forum usinage a propos du compte tours de diiity je pensais y trouver mon bonheur mais je ne suis pas très à l'aise avec le codage ... j'apprends n core ...

Pour clarifier les choses, ce que tu appelles "potentiomètre angulaire" se nomme codeur incrémental.
Comme le suggère @jpbbricole il y a des librairies pour gérer ce genre de composants.

Merci pour vos réponses, grâce à cette librairie j'ai pu m'en sortir. Il ne me reste plus qu'à gérer le buzzer qui produit un son en permanence ...

Ceci devrait t'aider

https://www.arduino.cc/reference/en/language/functions/advanced-io/notone/

Hummmm,

ni le noTone() ni digitalWrite(buzPin, LOW); peu importe ou je les place dans le code loop ou fonction j'ai toujours ce léger bruit qui semble être parasite ...
une fois dans la boucle je n'arrive plus a descendre à LOW le D5 ?!

Bonsoir AnTeBiOs

Un petit conseil, pour ton codeur rotatif tu utilises

 int outputA = 2;
 int outputB = 3;

Ce sont les 2 seules entrées avec interruption du UNO. Or pour ta cellule de comptage, actuellement sur D6 serait mieux sur D3 et pourrait travailler en interruption, ce qui est nettement plus efficace.
Ainsi tu pourrais mettre:

 int outputA = 2;
 int outputB = 6;

et connecter ta cellule sur 3

Cordialement
jpbbricole

Merci pour vos conseils avisés :slight_smile:
j'avance pas mal du coup !

Voici à quoi ressemble mon code :

/*
    Compteur bobine
*/

#include <Wire.h>
#include "rgb_lcd.h"
#include "pitches.h"
#include <Encoder.h>

rgb_lcd lcd;

const int colorR = 45;
const int colorG = 100;
const int colorB = 21;

//potentiometre
 Encoder myEnc(2, 6);
 int PinSW = 4;


//compteur
 long metrage = 0;
 long compteur = 0;
 long compVal = 0;
 int PinCapteur = 3;

//buzzer
int buzPin = 5;

void setup() {

    // pinMode (outputA,INPUT_PULLUP);
    // pinMode (outputB,INPUT_PULLUP);
    // aLastState = digitalRead(outputA);  

     pinMode (PinCapteur, INPUT);
     pinMode (buzPin, INPUT_PULLUP);
     metrage = 10;
     myEnc.write(1);
     pinMode (PinSW, INPUT_PULLUP);

     digitalWrite(buzPin, LOW);
    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    Serial.begin(9600);
    
}

void loop() {

    resetCompteur();

    compteurAFF();
    
    ValMetrage();
  
    lcd.setCursor(0, 0);
    lcd.print("Long : ");
    lcd.print(metrage);
    lcd.setCursor(0, 1);
    lcd.print(compteur);

     delay(20);
     
    if (compteur >= metrage){
      
      playFailed();
      lcd.setRGB(255, 0, 0);
      } 
}

void playPassed() { /* function playPassed */
  ////Play 'ON' Sound
  int melodyOn[] = {NOTE_C5, NOTE_C6, NOTE_D5, NOTE_A6};
  int durationOn = 200;
  for (int thisNote = 0; thisNote < 4; thisNote++) {
    tone(buzPin, melodyOn[thisNote], durationOn);
    delay(200);
  }
 
}

void playFailed() { /* function playFailed */
  ////Play 'OFF' Sound
  int melodyOff[] = {NOTE_C3, NOTE_D3};
  int durationOff = 200;
  for (int thisNote = 0; thisNote < 2; thisNote++) {
    tone(buzPin, melodyOff[thisNote], durationOff);
    delay(200);
  }
}

void resetCompteur(){
  
  if (!(digitalRead(PinSW))) {      // Reset la position si on appui sur le potentiomètre
     compteur = 0;
     lcd.clear();
     lcd.setRGB(colorR, colorG, colorB);
     playPassed();
     
     delay(1000);
     
         }
  }

void compteurAFF(){
  
  if (digitalRead(PinCapteur) == LOW){
      compteur++;
      }
  }

void ValMetrage(){
  
  metrage = myEnc.read();
  }
/*********************************************************************************************************
    END FILE
*********************************************************************************************************/

Tant que cette conditon est satisfaite, le buzzer sonne

Or, la condition est satisfaite

  • au départ, metrage = 0 et compteur = 0 , et tant que tu n'as pas spécifié un métrage.
  • une fois la valeur atteinte, tant que tu ne remets pas le compteur à zéro.

Pour remettre mon compteur à 0 j'utilise la fonction resetCompteur(); qui me remet bien mon compteur à 0 donc le buzzer devrait se couper, j'ai essayé de placer le noTone() dans cette fonction ou bien de set la pin 5 du buzzer à LOW rien n'y fait j'ai toujours un très leger bip parasite ...

j'arrive à m'en débarrasser dans le setup avec digitalWrite(buzPin, LOW); mais ça ne tiens que jusqu'à ce que je joue du buzzer, après plus moyen de m'en débarrasser ...

Le noTone() devrait être placé à la fin de playFailed().
Et il ne devrait plus y avoir de son si tu ne rentres plus dans playFailed()
Et il faut faire la même chose avec playPassed() évidemment.

Slt

BUZpin ne devrait pas être en output?

Après un bon re-câblage le bruit parasite est parti... les joies des breadboard ... en tous vas merci :slight_smile: