Restreindre une valeur

Bonjour à tous !

J'ai un projet où l'utilisateur pourrait interagir avec le système afin de régler quelques paramètres.
J'ai une variable à régler pour qu'elle soit comprise uniquement entre 2 et 10.
J'affiche ensuite cette valeur sur un écran LCD.

Pour cela, j'ai utilisé des fonctions d'Arduino : constrain() / min() et max() mais aucune ne fait réellement ce que j'attendais.

Imaginons que je bloque les valeurs entre 2 et 10 de la façon suivante : sensVal = constrain(sensVal, 2, 10);
Et bien, la valeur pourra prendre comme intervalle [1;11] ce qui n'est pas très logique d'ailleurs. Ceci arrive lorsque j'utilise ces trois fonctions citées précédemment.

En délimitant entre 3 et 9 pour suivre cette logique, il m'est possible d'arriver à 2 et 10 mais deux problème surviennent lorsque l'on est aux extrêmes :
-Si je suis à 2 et que je souhaite remonter : la valeur passe directement de 2 à 4 sans passer par 3.
-Si je suis à 10 et que je souhaite descendre : la valeur passe directement de 10 à 8 sans passer par 9.

Je me suis donc dit que les fonctions ne fonctionnaient pas dans mon cas, alors j'ai déterminé les limites manuellement avec des if(...){} mais les même problème persistent.

Je transmets mon code au cas où (je n'ai pas inclus les délimitations dans ce code) :

#include <LiquidCrystal.h> // on importe la bibliothèque
LiquidCrystal monEcran(12,11,6,5,4,3); // on crée l'objet écran

int switchState =0;
int nombreDeParts = 2;
int switchState2 = 0;

void setup() {
  pinMode(2,INPUT);
  pinMode(10,INPUT);
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.print("Parts :"); // on écrit la valeur
  monEcran.setCursor(0,1); //on passe à la ligne suivante
  monEcran.print(nombreDeParts); // on écrit la valeur de la distance
  Serial.begin(9600);

}
void loop() {
  //analogRead pour lire une valeur de capteur
  
  switchState2 = digitalRead(10);
  switchState = digitalRead(2);
  if(switchState == HIGH)
  {
      nombreDeParts++;
      monEcran.clear();
      monEcran.print("Parts :");
      monEcran.print(nombreDeParts);
      delay(375);
   }
  if(switchState2 == HIGH){
    nombreDeParts--;
    monEcran.clear();
    monEcran.print("Parts :");
    monEcran.print(nombreDeParts);
    delay(375);
    }
  }

Comment faire pour que mes variables soient correctement limitées ?

Merci pour votre aide !

Vous avez peut être un soucis de rebond du bouton - comment est-ce câblé ?

Bonjour,
je ne vois pas l'utilisation de "constrain"!

Une manière simple est de faire :

nombreDeParts++;
if (nombreDeParts>10) nombreDeParts=10;

ou

nombreDeParts--;
if (nombreDeParts<2) nombreDeParts=2;

Bonne bidouille.

J'ai oublié de préciser que lorsque je ne délimite pas ma valeur, tout fonctionne très bien, il n'y a pas de saut de valeur ni autre problèmes.
Mais voici un schéma à l'identique de mon câblage (en espérant que le câblage soit clair malgré le nombre de câbles apparents) :

Votre câblage

J’avais pas vu le délai de 375ms, il gommera les rebonds

constrain(x, a, b) contraint bien x entre [a,b] - vous avez les extrêmes possibles - donc je ne sais pas trop ce que vous faites dans votre code qui bug... c’est celui là qu’il faut poster, pas un code qui fonctionne..

Le code est pratiquement le même à l'exception du constrain()

Le problème est toujours le même.

#include <LiquidCrystal.h> // on importe la bibliothèque
LiquidCrystal monEcran(12,11,6,5,4,3); // on crée l'objet écran

int switchState =0;
int nombreDeParts = 2;
int switchState2 = 0;

void setup() {
  pinMode(2,INPUT);
  pinMode(10,INPUT);
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.print("Parts :"); // on écrit la valeur
  monEcran.setCursor(0,1); //on passe à la ligne suivante
  monEcran.print(nombreDeParts); // on écrit la valeur de la distance
  Serial.begin(9600);

}
void loop() {

  nombreDeParts = constrain(nombreDeParts,2,10); 

  switchState2 = digitalRead(10);
  switchState = digitalRead(2);
  if(switchState == HIGH)
  {
      nombreDeParts++;
      monEcran.clear();
      monEcran.print("Parts :");
      monEcran.print(nombreDeParts);
      delay(375);
   }
  if(switchState2 == HIGH){
    nombreDeParts--;
    monEcran.clear();
    monEcran.print("Parts :");
    monEcran.print(nombreDeParts);
    delay(375);
    }
  }

nombreDeParts = constrain(nombreDeParts,2,10);

cette ligne de code doit être mis après chaque modification de nombreDeParts.

nombreDeParts ++;
nombreDeParts = constrain(nombreDeParts,2,10);

et

nombreDeParts --;
nombreDeParts = constrain(nombreDeParts,2,10);

en effet, avec ton cod actuel, si par exemple Switchstate=HIGH et nombreDeparts=10
la valeur de nombreDePrts passera à 11 et sera affiché ainsi.

La solution donné à mon premier message résou aussi ce problème.

Merci !

J'oublie toujours que les commandes se suivent et ne s'exécutent pas tous en même temps. En même temps c'est logique !
cela fonctionne maintenant. Encore merci !

Fabounch:
Merci !

J'oublie toujours que les commandes se suivent et ne s'exécutent pas tous en même temps. En même temps c'est logique !
cela fonctionne maintenant. Encore merci !

ben oui, vous n'êtes pas sous excel ou en programmation par contraintes :slight_smile: