Help su Rotary

Salve a tutti

Ho bisogno di una aiuto , sto utilizzando il codice che ho messo sotto , il mio problema e che non riesco avere un incremento singolo numerico ma doppio, cerco di spiegarmi , quando faccio uno scatto il risultato che ottengo e che il contatore mi fa sempre un incremento o decremento di due passi ( 10-11 ), (12-13 ) o (9-10) , (7-8) , io avrei bisogno avere ogni scatto un solo incremento (1),(2),(3) ecc.

come posso ottenere questo ?

Grazie

 /*
  Rotary Encoder Demo
  rot-encode-demo.ino
  Demonstrates operation of Rotary Encoder
  Displays results on Serial Monitor
  DroneBot Workshop 2019
  https://dronebotworkshop.com
*/
 
 // Rotary Encoder Inputs
 #define inputCLK 4
 #define inputDT 5
 
 // LED Outputs
 #define ledCW 8
 #define ledCCW 9
 
 int counter = 0;  
 int currentStateCLK;
 int previousStateCLK; 
 
 String encdir ="";
 
 void setup() { 
   
   // Set encoder pins as inputs  
   pinMode (inputCLK,INPUT);
   pinMode (inputDT,INPUT);
   
   // Set LED pins as outputs
   pinMode (ledCW,OUTPUT);
   pinMode (ledCCW,OUTPUT);
   
   // Setup Serial Monitor
   Serial.begin (9600);
   
   // Read the initial state of inputCLK
   // Assign to previousStateCLK variable
   previousStateCLK = digitalRead(inputCLK);
 
 } 
 
 void loop() { 
  
  // Read the current state of inputCLK
   currentStateCLK = digitalRead(inputCLK);
    // delay(100);
   // Se lo stato precedente e quello corrente dell'ingressoCLK sono diversi, si è verificato un impulso
   if (currentStateCLK != previousStateCLK )
        { 
       
           // Se lo stato inputDT è diverso dallo stato inputCLK, allora
           // l'encoder ruota in senso antiorario
            if (digitalRead(inputDT) != currentStateCLK)
            { 
              
                         counter --;
                         encdir ="CCW";
                        digitalWrite(ledCW, LOW);
                         digitalWrite(ledCCW, HIGH);
                         
           }
     else 
        {
             // L'encoder ruota in senso orario
           counter ++;          
           encdir ="CW";
           digitalWrite(ledCW, HIGH);
           digitalWrite(ledCCW, LOW);
       
       }
              Serial.print("Direction: ");
              Serial.print(encdir);
              Serial.print(" -- Value: ");
              Serial.println(counter);
      } 
        //Aggiorna previousStateCLK con lo stato corrente
          previousStateCLK = currentStateCLK; 
 }

/*
Rotary Encoder Demo

Se per ogni passo che fai hai un incremento di 2 la variabile vale il doppio di quanto desiderato. Di conseguenza per ottenere il valore desiderato sarå sufficiente dimezzare il valore della variabile. Non é cosí facile?

Secondo me’ (anche se come programmatore non valgo molto :P), quel codice e’ un po cannato (termine tecnico per dire che non funziona correttamente :stuck_out_tongue: :D) … no, seriamente, se si fa un confronto del solo stato di CLK, senza ricordarsi che sugli encoder rotativi ad impulsi, ogni pin cambia stato due volte per ogni passo meccanico, credo sia abbastanza normale trovarsi con due incrementi (o decrementi) per ogni click …

O si legge la sola salita, o si legge la sola discesa, non il semplice cambio di stato … :wink:

EDIT: occhio che per rotazioni veloci, non credo funzionerebbe correttamente quel sistema, meglio usare una ISR per il RISING (o FALLING) del CLK, controllando nella ISR lo stato dell’altro pin …

Grazie a tutti e due !!

Mi piace l'idea di Tesla di controllare un solo stato per incrementarlo !!

Un Buon Fine e Inizio Anno a Tutti !!!

Ciao Ragazzi !!!