Affichage de valeur de potentiomètre non voulu dans la moniteur série

Bonsoir
J'essai au cours de mon projet de subdiviser les étapes. Cette fois je souhaiterait dédier un potentiomètre qui fait varier un nombre entre 0 et 100 gouttes. une fois ceci fait 3 autres potentiomètres représentant 3 couleurs différentes font varier le nombre de goutte de chaque couleur sans dépasser le nombre fixé par le premier potentiomètre.

const byte pinPotQuantiteCouleur = A0;

const byte pinPotJaune = A1;
const byte pinPotRouge = A2;
const byte pinPotBleu  = A3;

const int minPotQuantiteCouleur = 0;
const int maxPotQuantiteCouleur = 1023;

const int minPotJaune = 0;
const int maxPotJaune = 1023;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

int ratio(int nb1, int nb2, int nb3, int nb4) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (nb1 * nb2) / (nb2 + nb3 + nb4);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  int quantiteCouleur = constrain(map(analogRead(pinPotQuantiteCouleur),minPotQuantiteCouleur,maxPotQuantiteCouleur,0,100),0,100);
  int jaune = constrain(map(analogRead(pinPotJaune), minPotJaune, maxPotJaune, 0, quantiteCouleur), 0, quantiteCouleur);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, quantiteCouleur), 0, quantiteCouleur);
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, quantiteCouleur), 0, quantiteCouleur);
  Serial.print("Nb de goutte(s): ");  Serial.print(quantiteCouleur);
  Serial.print(" jaune: ");  Serial.print(ratio(quantiteCouleur, jaune, rouge, bleu)); Serial.print(" goutte(s)");
  Serial.print(" rouge: ");  Serial.print(ratio(quantiteCouleur, rouge, jaune, bleu)); Serial.print(" goutte(s)");
  Serial.print(" bleu: ");  Serial.print(ratio(quantiteCouleur, bleu, rouge, jaune)); Serial.println(" goutte(s)");
  delay(700);
}

Le programme fonctionne presque comme voulu toutefois je suis confronté à deux désagréments: Le premier est que je me retrouve avec des "-1" partout lorsque je fait varier les potentiomètres dédiés aux couleurs au minimum alors que je devrait avoir des "0".
image

Et le deuxième est que je n'arrive pas à afficher des nombres dont la somme est égale à la valeur du potentiomètre dédié aux nombres de gouttes comme par exemple: 100=62+19+19
image

Par quels moyens pourrait je, si possible résoudre au moins le premier soucis ?

Cordialement

Tu calcules des rapports donc des valeurs potentiellement avec des décimales et tu fais lesdits calculs avec des entiers. Fatalement tu est victimes des arrondis de calcul.
Donc

  • tu peux faire les calculs avec des flottants, ce qui devrait limiter les dégats même si au final il y aura encore des arrondis puisque j'imagine que tu ne vas pas mettre des fractions de gouttes.
  • tu détermines l'une des couleurs en fonction des 2 autres pour toujours avoir 100%

Tu noteras aussi que tes map et constrain sur rouge, jaune, bleu ne servent à rien puisque tu recalcules ratio en multipliant la quantité par le rapport de la couleur courante sur la somme des couleurs. Ce n'est d'ailleurs plus un ratio mais une quantité.

J'ai renommé la fonction ratio en "qte". J'ai répété mes constrain et mes map car j'ai besoin dans la fonction en permanence que nb1 corresponde à quantiteCouleur mais nb2 doit changer. Désormais j'ai remplacé mes int par des float et le moniteur série m'affiche des "nan". J'ai également essayé de corriger la fonction en ajoutant des "&" mais cela n'a pas changer grand chose et les "nan" continuent de s'afficher dans le moniteur série.

const byte pinPotQuantiteCouleur = A0;

const byte pinPotJaune = A1;
const byte pinPotRouge = A2;
const byte pinPotBleu  = A3;

const float minPotQuantiteCouleur = 0;
const float maxPotQuantiteCouleur = 1023;

const float minPotJaune = 0;
const float maxPotJaune = 1023;

const float minPotRouge = 0;
const float maxPotRouge = 1023;

const float minPotBleu = 0;
const float maxPotBleu = 1023;

float qte(float nb1, float nb2, float nb3, float nb4) {
  if ((nb1 == 0) && (nb2 == 0) && (nb3 == 0) && (nb4 == 0)){
    return 0;
  }
  return (nb1 * nb2) / (nb2 + nb3 + nb4);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  float quantiteCouleur = constrain(map(analogRead(pinPotQuantiteCouleur),minPotQuantiteCouleur,maxPotQuantiteCouleur,0,100),0,100);
  Serial.print("Nb de goutte(s): ");  Serial.print(quantiteCouleur);
  float jaune = constrain(map(analogRead(pinPotJaune), minPotJaune, maxPotJaune, 0, quantiteCouleur), 0, quantiteCouleur);
  float rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, quantiteCouleur), 0, quantiteCouleur);
  float bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, quantiteCouleur), 0, quantiteCouleur);
  Serial.print(" jaune: ");  Serial.print(qte(quantiteCouleur, jaune, rouge, bleu)); Serial.print(" goutte(s)");
  Serial.print(" rouge: ");  Serial.print(qte(quantiteCouleur, rouge, jaune, bleu)); Serial.print(" goutte(s)");
  Serial.print(" bleu: ");  Serial.print(qte(quantiteCouleur, bleu, rouge, jaune)); Serial.println(" goutte(s)");
  delay(700);
}

image

Je reste ouvert à toute suggestion pour simplifier le code au cas ou j'aurai mal compris quelque chose

Cordialement

nan doit venir d'une division par 0 : vérifie les valeurs que tu envoies à ta fonction qte

Cela arrive en particulier si quantiteCouleur n'est pas nul mais que les trois autres si

ne retourne pas 0, mais nb2 + nb3 + nb4 est quand même nul.

Mettre alors

Tu ne peux pas entrer les 3 proportions et avoir le total toujours égale à 100% car alors la position des potentiomètres ne représente plus rien.
Par exemple, si les 3 potentiomètres sont à la même position quelque soit celle-ci tu auras toujours le même rapport entre les couleurs.

En fait ton problème c'est que tu surcontraints ton système.
Tu as une équation :
quantité = rouge + jaune + bleu
et tu veux entrer quantité, rouge jaune et bleu

Tu peux avoir en entrée la quantité et 2 proportions
Tu as alors

  • la quantité
  • la proportion pour 2 couleurs
  • tu détermines la proportion de la 3ème à partir de la quantité et des 2 couleurs précédentes

Tu peux avoir en entrée 3 quantités de couleurs
Tu as alors

  • 3 quantités
  • tu calcules le total

nan signifie "Not A Number"

Bonsoir
Merci à tous. Le programme fonctionne bien sans les nan.

Cordialement

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.