Pourquoi Arduino ne me retourne pas la meme valeur que ma calculatrice

Bonjour à tous,

Je suis en train de revoir une partie de mon code qui va indiquer a direction du vent avec un anemometre DAVIS.

J'ai une equation que je cherche à comprendre et étonnamment, elle me retourne une valeur qui ne correspond pas à la valeur que me donne ma calculatrice!!!

Voici les détails de ma fonction:

Premièrement, je déclare du variables et je stocke la valeur analogique qui est lue sur ma broche

int analogInput;
  int windDirection;
  analogInput = analogRead(_read_pin_wind_direction);

Voici le tableau de référence (valeur analogiuqe| degre)

      /*
      int WDdirection[18] {
        // Analog value, direction direction (° degre)
        0,    0,    // N
        500,  45,   // NE
        1000,  90,   // E
        1390,  135,  // ES
        1860,  180,  // S
        2350,  225,  // SW
        2800,  270,  // W
        3400,  315,  // WN
        4095,  360,  // N
      }; 
      */

NB: Le but de ce tableau est de pouvoir calibrer la sonde de manière à avoir la valeur analogique tous les 45°. J'ai constaté qu'avec une autre sonde, les valeurs ne sont pas exactement les mêmes)

Ici, je parcours les valeurs paires de mon tableau que je compare avec ma valeur analogique. Les valeurs impaires sont les degrés. Si la valeur analogique se trouve dans un range, je continue

for (int i = 0; i < 18; i = i + 2)
  {
    if ((analogInput >= WDdirection[i]) && (analogInput <= WDdirection[i + 2]))
    {

Dans ce qui suit, je considère une valeur analogique de 750.

Je débug les valeurs qui vont être utilisées dans mon équations

Serial.print("WDdirection[i + 1] : "); Serial.println(WDdirection[i + 1]); // 45
      Serial.print("WDdirection[i + 3] : "); Serial.println(WDdirection[i + 3]); // 90
      Serial.print("analogInput : "); Serial.println(analogInput); //750
      Serial.print("WDdirection[i] : "); Serial.println(WDdirection[i]); // 500
      Serial.print("WDdirection[i + 2] : "); Serial.println(WDdirection[i + 2]); // 100

et voici mon équation:
(PS: pour voir tout mon code, vous le trouver ici)

windDirection = WDdirection[i + 1] - ((WDdirection[i + 1] - WDdirection[i + 3]) * ((analogInput - WDdirection[i]) / (WDdirection[i + 2] - WDdirection[i])));

Si maintenant, je remplace les valeurs données plus haut, ca donne ceci:

windDirection = 45 - ((45 - 90) * ((750 - 500 / (1000 - 500)));

Si je passe ceci, dans ma calculatrice, le résultat est -67.5
Bon la valeur devrait être positive, mais ce n'est pas grave pour le moment. En dehors du fait que cette valeur est négative, elle est cohérente, car la valeur analogique se trouve à mi-chemin de 500 et 1000, tout comme 67.5° est à min-chemin de 45° et 90°.

Maintenant, je fais tourner mon code avec mon board, et je fait tourner mon vane, ceci

Serial.println( WDdirection[i + 1] - ((WDdirection[i + 1] - WDdirection[i + 3]) * ((analogInput - WDdirection[i]) / (WDdirection[i + 2] - WDdirection[i]))) );
Serial.print(windDirection);

m'affiche uniquement 45, 90, 135, 180, 225, 270, 315.

Pourtant, si je tourne mon vane pour que la valeur analogique soit 750, serial.println(windDirection) doit m'afficher une valeur proche de 67. Et dans tous les cas, je devrais voir des valeurs qui incrément, mais pas des valeurs qui font "des bonds" de 45 , 90, 135, etc.

J'ai donc du mal à comprendre ce comportement!!

Est-ce que j'ai zapé un truc!!!!

hello
tu n'utilises pas la meme formule

le dernier 500 correspond à i-1 et non à i

bonsoir,
tu travailles avec des entiers :

la division donnera systématiquement zéro puisque le dénominateur est supérieur au numérateur.

Hello, en effet.j'ai mal recopié mon code dans ce poste. Il manque une parentère
windDirection = 45 - ((45 - 90) * ((750 - 500) / (1000 - 500)));

Par contre, je me suis pas d'accord avec ca
le dernier 500 correspond à i-1 et non à i

Si ma valeur analogique est de 750, donc i est égal à 2
Ligne 54 et 56
donc WDdirection[i] est bien égal à 500

/*
      int WDdirection[18] {
        // Analog value, direction direction (° degre)
        0,    0,    // N
        500,  45,   // NE
        1000,  90,   // E
        1390,  135,  // ES
        1860,  180,  // S
        2350,  225,  // SW
        2800,  270,  // W
        3400,  315,  // WN
        4095,  360,  // N
      }; 
      */

tu travailles avec des entiers

D'accord, ca c'est intéressant. J'ai essayé ceci:

Si je fais ca

float numerateur = analogInput - WDdirection[i];
      float denominateur = WDdirection[i + 2] - WDdirection[i];
      Serial.println(WDdirection[i + 1] - ((WDdirection[i + 1] - WDdirection[i + 3]) * (numerateur / denominateur)));

ca change a donne et le résultat est maintenant cohérent!!

Merci!!

bonjour,

même avec les parenthèses, on a toujours (750-500)/(1000-500), soit (en valeur absolue) 250/500 = 0,5 donc 0 en division euclidienne.

ta calculette travaille avec des nombres à virgule (float) tandis que tes valeurs sont des nombres entiers (int) : il faut forcer le compilateur à
effectuer le calcul en float, même si le résultat final sera stocké sous forme d'int (tu ne perdras que les chiffres après la virgule).


j'étais en train de rédiger ma réponse quand j'ai vu ton post précédent s'afficher : je la laisse quand même ...
bravo en tout cas pour avoir trouvé la (l'une des) solution(s).

Merci @5_cylindres

@pierrot10
pas de quoi, c'était un plaisir

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