Encoder problema di rimbalzo

Ciao a tutti ho montato un encoder che andrà a controllare un display 7 segmenti (tm1637).
L’obbiettivo è quello di regolare le prime due decine e le seconde due decine (minuti e secondi).
Il problema è che quando vado a ruotare l’encoder il campionamento dei valori non è sempre lineare…
Ho rilevato un secondo problema, quando aziono il pulsante di switch mi va a scalare il valore di un unità.
Credo siano problemi Hardware visto che il software sembra giri correttamente.

#include <TM1637Display.h>

 #define CLK 2
#define DIO 3
 
 #define outputA 7
 #define outputB 8

 const int ledPin = 13;

 
 const int buttonPin =  6;

 int ledState = 1;
 int buttonState; 
 int lastButtonState = 0;

 unsigned long lastDebounceTime = 0;
 unsigned long debounceDelay = 50;

 int click = 0;
 int clickState;
 
 int secondi = 0; 
 int minuti = 0;
 int aState;
 int aLastState;  
 int aState_;
 int aLastState_;


TM1637Display display(CLK, DIO);
 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   pinMode (buttonPin, INPUT_PULLUP);
   pinMode(ledPin, OUTPUT);
   
   Serial.begin (9600);
   aLastState = digitalRead(outputA);
   aLastState_ = digitalRead(outputA);      
 } 

 void loop() { 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
     if (reading != buttonState) {
      buttonState = reading;
     if (buttonState == 0) {
        ledState = !ledState;
      }
     }
  }
      digitalWrite(ledPin, ledState);
  if(ledState == 1){
    click = 1;
  }else{
    click = 0;
  }
     
     

  lastButtonState = reading;
  
  switch(click){
    case 0:
      seconds();
      break;
    case 1:
      minutes();
      break;  
  }

 }


 void seconds(){
    display.setBrightness(7, true);
    display.showNumberDec(secondi, true, 2, 2);
    aState = digitalRead(outputA);
    if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       secondi ++;
       if(secondi > 59){
        secondi = 0;
       }
     } else {
       secondi --;
       if(secondi < 0){
        secondi = 59;       
        }
     }
     Serial.print("SECONDI: ");
     Serial.println(secondi);
   } 
   aLastState = aState;
 }

 void minutes(){
  display.setBrightness(7, true);
   display.showNumberDec(minuti, true, 2, 0);
  aState_ = digitalRead(outputA);
    if (aState_ != aLastState_){     
     if (digitalRead(outputB) != aState_) { 
       minuti ++;
       if(minuti > 99){
        minuti = 0;
       }
     } else {
       minuti --;
       if(minuti < 0){
        minuti = 99;
       }
     }
     Serial.print("MINUTI: ");
     Serial.println(minuti);
   } 
   aLastState_ = aState_;
 }

Questo mi è sembrato interessante e ci trovi anche il link alla libreria da usare.

Però forse sarà meglio che implementi anche il circuito di debounce.
Poi anche la qualità degli encoder fa la usa parte :slight_smile:

qualcuno ha qualcun'altra idea?

Usa questo per il debounce dell'encoder.

ma il problema ce l'ho al momento del push del pulsante che mi cambia valore

Il problema è che quando vado a ruotare l’encoder il campionamento dei valori non è sempre lineare…

risolvi con il circuito anti debounce che ti ho postato prima.

Ho rilevato un secondo problema, quando aziono il pulsante di switch mi va a scalare il valore di un unità.

possono essere diverse le cause.
la prima può essere dovuta alla posizione dell’asse dell’encoder vicino al prossimo step che nel momento della pressione effettivamente termina la corsa e causa il problema.
la seconda può essere a dei disturbi causati dal debounce del pulsante che causa una falsa lettura dell’interrupt. quindi circuiti il pulsante con un altro anti debounce…

Il problema persiste anche se uso un pulsante diverso da quello dell'encoder

ma quante discussioni ci sono con lo stesso argomento?

davides98:
Il problema persiste anche se uso un pulsante diverso da quello dell'encoder

hai realizzato il circuito anti debounce? hai tolto la parte correttiva a livello codice per eliminare il debounce via software? occhio a non incappare nella mia firma... :smiley:
PS: non l'ho detta io quell'affermazione riportata in firma, ma un tale che si faceva chiamare Albert Einstein... Non sai quante volte me la ripeto da solo... :smiley: