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 ?
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) :
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);
}
}
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 !
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