KY 040 probleme comptage code

bonjour a tous,

je suis entrain a cet heure si de realiser un controleur pour mon hydrometrie dans la serre familiale.

le systeme est simple :
recuperation des Températures et Humidité par le Capteur AM2320, puis avec un relais 1 canal on ouvre le relais lorsque l’hydrométrie descend en dessous d’une valeur fixé !
pour parfaire j’ai rajouter 2 potentiomètres KY040 pour la valeur max et la valeur min que je souhaite. ( c’est bizarre mais j’ai une évolution du système dans quelque temps c’est le premier essai)

le problème est que lorsque je tourne l’un ou l’autre des potentiomètres j’ai que la descente d’une incrémentation de 1 , donc je pense de 50 a 49 puis 48 puis 47 peu importe dans quel sens je tourne …

je me sens perdu pourtant j’ai vérifier et vérifier le code je ne vois pas ou j’ai pu me tromper

en vous remerciant par avance

include <Wire.h>
#include <AM2320.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN     13
#define I2C_ADDR    0x03F // <<----- Add your address here.  Find it from I2C Scanner
#define BACKLIGHT_PIN     3 // ecran pin
#define En_pin  2  // ecran pin
#define Rw_pin  1  // ecran pin
#define Rs_pin  0  // ecran pin
#define D4_pin  4  // ecran pin
#define D5_pin  5  // ecran pin
#define D6_pin  6  // ecran pin
#define D7_pin  7  // ecran pin
int n = 1;
LiquidCrystal_I2C  lcd (I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

AM2320 th;
int VALEURHUMIDITE = th.h;
int VALEURTEMPERATURE = th.t;
const int Relay1 = 2; //pin du relay
const int LedActif = 3;
const int LedInActif = 4;
//declaration potentiometre i2c Humidite Min
const int CLKMin = 5;
const int DTMin = 6;
int RotPositionMin = 50;
int RotationMin;
int ValueMin;
boolean LeftRightMin;
//declaration potentiometre i2c Humidite Max
const int CLKMax = 7;
const int DTMax = 8;
int RotPositionMax = 80;
int RotationMax;
int ValueMax;
boolean LeftRightMax;

void setup() {
  lcd.begin (16, 2); //  dimension du LCD
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); // Pin de lumiere arriere
  lcd.setBacklight(HIGH); // activation de la lumiere du LCD
  lcd.home (); // go home
  lcd.print(" LCD OK ");
  delay(1000);
  lcd.clear();
  lcd.print(" Capteur Init ");
  delay(1000);
  lcd.clear();
  Wire.begin();
  switch (th.Read()) {
    case 2:
      lcd.print(" CRC failed");
      delay(5000);
      break;
    case 1:
      lcd.print(" Capteur off");
      delay(5000);
      break;
    case 0:
      lcd.print(" Capteur OK ");
      delay(2000);
      break;
  }
  delay(1000);
  lcd.clear();
  lcd.print(" Leds Init ");
  delay(1000);
  pinMode(LedActif, OUTPUT);
  digitalWrite(LedActif, LOW);
  pinMode(LedInActif, OUTPUT);
  digitalWrite(LedInActif, LOW);
  lcd.clear();
  lcd.print(" Leds OK ");
  lcd.clear();
  lcd.print(" Relay Init ");
  delay(1000);
  pinMode(Relay1, OUTPUT);
  digitalWrite(Relay1, LOW);
  lcd.clear();
  lcd.print(" Relay OK ");
  delay(1000);
  lcd.clear();
  lcd.print(" Encodeur Init");
  delay(1000);
  //initialise l'encodeur rotatif
  pinMode (CLKMin, INPUT);
  pinMode (DTMin, INPUT);
  RotationMin = digitalRead(CLKMin);
  //initialise l'encodeur rotatif
  pinMode (CLKMax, INPUT);
  pinMode (DTMax, INPUT);
  RotationMax = digitalRead(CLKMax);
  lcd.clear();
  lcd.print("HumMin : 50");
  lcd.setCursor(0, 1);
  lcd.print("HumMax : 80");
  delay(2000);
  lcd.clear();
  lcd.print(" Encodeur OK");
  delay(1000);
  lcd.clear();
  lcd.print("*CHARGEMENT*");
  delay(2000);
  lcd.clear();
}
void loop() {

  ValueMin = digitalRead(CLKMin);
  if (ValueMin != RotationMin) { 
    if (digitalRead(DTMin) != ValueMin) {  
      RotPositionMin ++;
      LeftRightMin = true;
    } else { //Counterclockwise
      LeftRightMin = false;
      RotPositionMin--;
    }
    lcd.clear();
    lcd.home();
    lcd.print("Valeur H Min");
    lcd.setCursor(0, 1);
    lcd.print(RotPositionMin);
    delay(500);
    lcd.clear();
  }
  RotationMin = ValueMin;

    ValueMax = digitalRead(CLKMax);
  if (ValueMax != RotationMax) { 
    if (digitalRead(DTMax) != ValueMax) { 
      RotPositionMax ++;
      LeftRightMax = true;
    } else { //Counterclockwise
      LeftRightMax = false;
      RotPositionMax--;
    }
    lcd.clear();
    lcd.home();
    lcd.print("Valeur H Max");
    lcd.setCursor(0, 1);
    lcd.print(RotPositionMax);
    delay(500);
    lcd.clear();
  }
  RotationMax = ValueMax;
  
  lcd.home();
  lcd.print("Hum:  ");
  lcd.print(VALEURHUMIDITE);
  lcd.print("  %");
  lcd.setCursor(0, 1);
  lcd.print("Temp:  ");
  lcd.print(VALEURTEMPERATURE);
  lcd.print("  °C");

  if ( RotPositionMin >= VALEURHUMIDITE) {
    digitalWrite(Relay1, HIGH);
    digitalWrite(LedActif, HIGH);
    digitalWrite(LedInActif, LOW);
  }
  else if ( RotPositionMin <= VALEURHUMIDITE && VALEURHUMIDITE <= RotPositionMax) {
    digitalWrite(Relay1, HIGH);
    digitalWrite(LedActif, HIGH);
    digitalWrite(LedInActif, LOW);
  }
  else {
    digitalWrite(Relay1, LOW);
    digitalWrite(LedActif, LOW);
    digitalWrite(LedInActif, HIGH);
  }
  delay(200);
}

pour moi sa doit marcher non ?

  ValueMin = digitalRead(CLKMin);
  if (ValueMin != RotationMin) { 
    if (digitalRead(DTMin) != ValueMin) {  
      RotPositionMin ++;
      LeftRightMin = true;
    } else { //Counterclockwise
      LeftRightMin = false;
      RotPositionMin--;
    }
    lcd.clear();
    lcd.home();
    lcd.print("Valeur H Min");
    lcd.setCursor(0, 1);
    lcd.print(RotPositionMin);
    delay(500);
    lcd.clear();
  }
  RotationMin = ValueMin;

    ValueMax = digitalRead(CLKMax);
  if (ValueMax != RotationMax) { 
    if (digitalRead(DTMax) != ValueMax) { 
      RotPositionMax ++;
      LeftRightMax = true;
    } else { //Counterclockwise
      LeftRightMax = false;
      RotPositionMax--;
    }
    lcd.clear();
    lcd.home();
    lcd.print("Valeur H Max");
    lcd.setCursor(0, 1);
    lcd.print(RotPositionMax);
    delay(500);
    lcd.clear();
  }
  RotationMax = ValueMax;

Salut

Je n'ai pas regardé le code en détail mais Le KY-040 est un Encodeur rotatif mécanique à différence de phases avec résistances intégrées (ou encodeur à quadrature), pas vraiment un potentiomètre. Il faut lire et comparer la progression des 2 sorties pour voir dans quel sens on tourne.

Il y a plus d'infos ici par exemple - on peut aussi les lire sans les interruptions si la boucle tourne assez rapidement (mais attention les afficheurs lcd sont lents)