bouton codeur rotatif

bonjour,
je cherche a incrémenter plus ou moins rapidement via un codeur rotatif. J'arrive a le faire avec un pas de 1 voir plus selon l'incrément mais c'est fixe. Y a t'il un moyen d'incrémenter par exemple doucement si on tourne doucement et plus fort si on tourne plus vite. j'ai essayer avec millis() mais sans succès. j'ai tenté aussi en changent le taux d'incrémentation avec des appuis sur Switch (un appui pour X 1 deux pour X par 10 etc...) mais je n'y arrive pas non plus.

Quel Arduino utilises-tu ?
Quelle est la référence de ton codeur ?
Comment est-il connecté ?
Comment fais-tu la lecture de ses valeurs ?

Le code fourni fonctionne! Et celui qui n'est pas fourni est difficile à deviner....

houla oui en effet désolé ça manque de précision tout ça. :-[

le bouton rotatif: module WayinTop KY 040 360 , le capteur de pression: AZDelivery GY-BMP280
j'aimerai faire un tableau de bord pour mon ulm, avec plusieurs indicateurs, dont l'altimetre.
le code de test avec calibrage du QNH (valeur de référence pour l'altitude) fonctionne, mais selon le taux d'incrémentation ou décrémentation: c'est rapide peut de tour, mais pas précis ou précis, mais très lent et beaucoup de tours ( pas possible en vol) d'ou ma question pour adapter la valeur selon la vitesse ou l'on tourne le bouton.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // I2C

int buttonState = 0;

/****************** bouton rotatif ***********************/
#define PinA 2    //  codeur 
#define PinB 3    //  codeur

volatile boolean mouvement;
volatile boolean up;
float valeur = 1013; // QNH niveau de la mer 1013.25
int etat = 0; 

// routine déclanchée quand le signal A passe de haut a bas
void routineInterruption ()  {     
  if (digitalRead(PinA))
    up = digitalRead(PinB);
  else
    up = !digitalRead(PinB);   
     mouvement = true;
}

/**********************************************************/

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
                  
/******************************* bouton rotatif **************************/
  pinMode(PinA,INPUT);
  pinMode(PinB,INPUT); 

  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant
    
  Serial.begin (9600); 

/**************************************************************************/                   
}

void loop() {
 
/****************************** boutob rotatif ******************************/  
  if (mouvement)  {   
    
    if (up)
    
      valeur = valeur + 1;
    else
      valeur = valeur - 1;
      
    mouvement= false; 
       
  }

    Serial.print ("valeur = ");
    Serial.println (valeur);

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx    altitude = "));
    Serial.print(bmp.readAltitude(valeur)); // valeur pour ajuster le QNH
    Serial.println(" m");

    Serial.println();
    delay(500);
}

Il manque attachInterrupt pour la pin 3 ? ? ?

EDIT : mais cela peut se faire aussi avec une seule interruption.
J'ai plus l'habitude de ceci : Improved-Arduino-Rotary-Encoder-Reading

Au sujet de ton problème il suffit de mesurer le temps entre deux interruptions avec millis() ou micros() et de modifier la valeur d'une variable incrément dans l'interruption.
Ensuite :

    if (up)
      valeur = valeur + increment;
    else
      valeur = valeur - increment;

merci , ça marche avec millis mais faut pas tourner trop vite sinon ca perd des pas. Entre temps j'ai tester avec un potar multi tours et je prefère avec ce potentiomètre c'est plus agréable a tourner :slight_smile:

encore merci pour votre aide.

il existe plusieurs bibliothèques supportant l'accélération, par exemple celle ci

son principal inconvénient est de monopoliser un timer (qui par défaut va consulter l'encodeur 1000 fois par seconde) plutôt que d'utiliser des interruptions