Erreur de division sur MAI

Bonsoir
J'aimerai développer, sur MIT app inventor, une application qui fait varier des valeurs affichés dans une zone de texte à l'aide de sliders:
fichier MIT app inventor: Plusieurs_sliders.zip (78,4 Ko)
image
image
Dans cette application se trouve deux sliders sans importance dans le contexte de la difficulté que je rencontre: L'un fait varier une valeur entre 0 et 100 et l'autre entre 0 et 1000.

Les sliders avec lesquels j'ai un problèmes sont un groupe de 5 sliders représentants des couleurs et 7 sliders représentants des ingrédients. Lorsque l'on fait varier un sliders de couleurs on fait varier la valeur affichée dans la zone de texte correspondante qui représente un ratio en relation avec les autres couleurs dont le total de la somme donne 100%. Par exemple si l'on fait varier la couleur rouge et que l'on garde les autres à 0 alors la valeur affiché à coté de la valeur rouge est 100. Puis si l'on fait varier la couleur bleu au même niveau, les valeurs affichées à coté du slider rouge et bleu seront 50 tandis que les autres valeurs des autres couleurs seront à 0. Les sliders des ingrédients font la même chose que ceux des couleurs mais en étant au nombre de 7.

Le problème est qu'un message d'erreur s'affiche sûrement en rapport avec une division par 0:

Cette application est destiné à être un morceaux d'une application plus grande qui doit envoyer les valeurs dans la zone de texte à un arduino via un hc-05 mais je suppose qu'il est préférable de solutionner ce problème avant de passer aux étapes suivantes.
Comment fait-on sur MAI pour signifier à l'application "affiche "0" si les dénominateurs sont à 0" ?

Cordialement

C’est le forum arduino ici… on parle C++ :wink:

Bon cela dit je suppose que vous avez un bout de code pour chaque curseur qui modifie les autres valeurs. C’est dans ce code qu’il faut faire un test avec 0 avant le calcul

Le but est de digitaliser ce code qui fonctionne avec des potentiomètres en les substituant par des sliders:

const byte pinPotQuantiteCouleur = A0;
const byte pinPotQuantiteIngredient = A1;

const byte pinPotRouge = A2;
const byte pinPotBleu  = A3;
const byte pinPotJaune  = A4;
const byte pinPotViolet  = A5;
const byte pinPotGris  = A6;

const byte pinPotIngredient1  = A7;
const byte pinPotIngredient2  = A8;
const byte pinPotIngredient3  = A9;
const byte pinPotIngredient4  = A10;
const byte pinPotIngredient5  = A11;
const byte pinPotIngredient6  = A12;
const byte pinPotIngredient7  = A13;

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

const int minPotQuantiteIngredient = 0;
const int maxPotQuantiteIngredient = 1023;

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

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

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

const int minPotViolet = 0;
const int maxPotViolet = 1023;

const int minPotGris = 0;
const int maxPotGris = 1023;

const int minPotIngredient1 = 0;
const int maxPotIngredient1 = 1023;

const int minPotIngredient2 = 0;
const int maxPotIngredient2 = 1023;

const int minPotIngredient3 = 0;
const int maxPotIngredient3 = 1023;

const int minPotIngredient4 = 0;
const int maxPotIngredient4 = 1023;

const int minPotIngredient5 = 0;
const int maxPotIngredient5 = 1023;

const int minPotIngredient6 = 0;
const int maxPotIngredient6 = 1023;

const int minPotIngredient7 = 0;
const int maxPotIngredient7 = 1023;

float ratio2(float nb3, float nb4,float nb5, float nb6, float nb7) {
  if ((nb3 == 0) && (nb4 == 0) && (nb5 == 0) && (nb6 == 0) && (nb7 == 0)) return 0;
  return (100.0 * nb3) / (nb3 + nb4 + nb5 + nb6 + nb7);
}

int ratio3(int nb8, int nb9, int nb10, int nb11, int nb12, int nb13, int nb14) {
  if ((nb8 == 0) && (nb9 == 0)&& (nb10 == 0)&& (nb11 == 0)&& (nb12 == 0)&& (nb13 == 0)&& (nb14 == 0)) return 0;
  return (100.0 * nb8) / (nb8 + nb9 + nb10 + nb11 + nb12 + nb13 + nb14);
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  int quantiteCouleur = constrain(map(analogRead(pinPotQuantiteCouleur),minPotQuantiteCouleur,maxPotQuantiteCouleur,0,90),0,90);
  int quantiteIngredient = constrain(map(analogRead(pinPotQuantiteIngredient),minPotQuantiteIngredient,maxPotQuantiteIngredient,0,1000),0,1000);
  float rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge,  0, quantiteCouleur), 0, 100);
  float bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, quantiteCouleur), 0, 100);
  float jaune = constrain(map(analogRead(pinPotJaune), minPotJaune, maxPotJaune,  0, quantiteCouleur), 0, 100);
  float violet = constrain(map(analogRead(pinPotViolet), minPotViolet, maxPotViolet,  0, quantiteCouleur), 0, 100);
  float gris = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge,  0, quantiteCouleur), 0, 100);
  int ingredient1 = constrain(map(analogRead(pinPotIngredient1), minPotIngredient1, maxPotIngredient1,  0, quantiteIngredient), 0, 100);
  int ingredient2 = constrain(map(analogRead(pinPotIngredient2), minPotIngredient2, maxPotIngredient2,  0, quantiteIngredient), 0, 100);
  int ingredient3 = constrain(map(analogRead(pinPotIngredient3), minPotIngredient3, maxPotIngredient3,  0, quantiteIngredient), 0, 100);
  int ingredient4 = constrain(map(analogRead(pinPotIngredient4), minPotIngredient4, maxPotIngredient4,  0, quantiteIngredient), 0, 100);
  int ingredient5 = constrain(map(analogRead(pinPotIngredient5), minPotIngredient5, maxPotIngredient5,  0, quantiteIngredient), 0, 100);
  int ingredient6 = constrain(map(analogRead(pinPotIngredient6), minPotIngredient6, maxPotIngredient6,  0, quantiteIngredient), 0, 100);
  int ingredient7 = constrain(map(analogRead(pinPotIngredient7), minPotIngredient7, maxPotIngredient7,  0, quantiteIngredient), 0, 100);
  Serial.print("Qte couleur:"); Serial.print(quantiteCouleur);  Serial.print(" gouttes ");
  Serial.print("Qte ingredient:");  Serial.print(quantiteIngredient); Serial.print("ml ");
  Serial.print("rouge:");  Serial.print(ratio2(rouge, bleu, jaune, violet, gris)); Serial.print("% ");
  Serial.print("bleu:");  Serial.print(ratio2(bleu, rouge, jaune, violet, gris)); Serial.print("% ");
  Serial.print("jaune:");  Serial.print(ratio2(jaune, bleu, rouge, violet, gris)); Serial.print("% ");
  Serial.print("violet:");  Serial.print(ratio2(violet, bleu, jaune, rouge, gris)); Serial.print("% ");
  Serial.print("gris:");  Serial.print(ratio2(gris, bleu, jaune, violet, rouge)); Serial.print("% ");
  Serial.print("ingredient1:");  Serial.print(ratio3(ingredient1, ingredient2, ingredient3, ingredient4, ingredient5, ingredient6, ingredient7)); Serial.print("% ");
  Serial.print("ingredient2:");  Serial.print(ratio3(ingredient2, ingredient1, ingredient3, ingredient4, ingredient5, ingredient6, ingredient7)); Serial.println("% ");
  Serial.print("ingredient3:");  Serial.print(ratio3(ingredient3, ingredient2, ingredient1, ingredient4, ingredient5, ingredient6, ingredient7)); Serial.print("% ");
  Serial.print("ingredient4:");  Serial.print(ratio3(ingredient4, ingredient2, ingredient3, ingredient1, ingredient5, ingredient6, ingredient7)); Serial.print("% ");
  Serial.print("ingredient5:");  Serial.print(ratio3(ingredient5, ingredient2, ingredient3, ingredient4, ingredient1, ingredient6, ingredient7)); Serial.print("% ");
  Serial.print("ingredient6:");  Serial.print(ratio3(ingredient6, ingredient2, ingredient3, ingredient4, ingredient5, ingredient1, ingredient7)); Serial.print("% ");
  Serial.print("ingredient7:");  Serial.print(ratio3(ingredient7, ingredient2, ingredient3, ingredient4, ingredient5, ingredient6, ingredient1)); Serial.println("% ");
  delay(1000);
}

Je pourrais envisager de faire en sorte que le calcul des ratios se fasse au niveau de l'arduino mais à ce moment l'utilisateur ne verrai pas le ratio de couleur et d'ingrédient qu'il initialise. Le réglage doit être visible sur l'appli car l'arduino est destiné à la fin à être débranché du PC définitivement et donc séparé du moniteur série

Cordialement

Bonsoir enash

Avant de chercher cette division par 0, il faut que ton programme soit "propre".
Affiches les erreurs:
image

Ton erreur division par 0 provient, certainement, du fait que ton block Bluetooth est incomplet (warning) + une erreur.
image
et tu as encore une erreur ici
image

Tes erreurs et warnings doivent être ainsi
image
avant toute autre considération.

Cordialement
jpbbricole

1 Like

Rebonsoir enash

Le doublon
image
est caché derrière le block
image

Super MAI :wink:
A+
Cordialement
jpbbricole

1 Like

Bonsoir enash

C'est assez juste de faire les calculs au niveau de MAI, mais il m'a semblé que tu avais beaucoup de répétitions, j'ai essayé de simplifier ton montage, pas sûre que ça soit tout juste :wink:
Le programme passerai de

ä

image

Je te mets le AIA en PJ.
Plusieurs_sliders_C.zip (62.0 KB)

Cordialement
jpbbricole

1 Like

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