Valeurs incohérente de potentiomètre

Bonjour,

Montage extrêmement simple étant donné qu'il n'y a que deux potentiomètres.
Ils vont me servir à modifier en temps réel deux variables dans un calcul, sauf que les résultats sont parfaitement incohérents.

  int debitBuse = map(analogRead(PotDebitBuse), 0, 1023, 0, 3);
  int Temperature = map(analogRead(PotTemperature), 0, 1023, 10, 20); 

  float dutyBuse = (debitBuse * (45-Temperature) * 4183) / 60;   

Le truc c'est que quand je tourne le potentiomètre je me retrouve avec ces résultats là :




analogRead() et map() me retournent bien des valeurs allant de 0 à 1023 donc normalement je ne devrait avoir que des résultats positifs et proportionnelles sur dutyBuse. Sauf que là ça alterne entre du positif et du négatif.
Le problème semble survenir au moment où je fais le calcul. debitBuse et Temperature me renvoient de bonnes valeurs mais dès que je multiplie ou divise les valeurs issues de ces variables ça bug.

Merci de vos retours.

Le calcul est fait sur des entiers (-32768 à +32767) donc tu as des problèmes causés par le débordement de ton calcul lors de la multiplication par 4183.
Par exemple:

  • debitBuse = 3
  • Temperature = 20
    ==> 3 * (45 - 20) * 4183 / 60
    ==> 75 * 4183 = 313725 ==> débordement, tronqué à 16 bits ==> -13955
    ==> -13955 / 60 = -232

Il faut faire
float dutyBuse = (debitBuse * (45.0-Temperature) * 4183.0) / 60.0;

void setup() {
  Serial.begin(115200);
  int debitBuse = 3;
  int Temperature = 20; 

  float dutyBuse = (debitBuse * (45-Temperature) * 4183) / 60;   
  Serial.println(dutyBuse);
  dutyBuse = (debitBuse * (45.0-Temperature) * 4183.0) / 60.0;   
  Serial.println(dutyBuse);
}

void loop() {
  // put your main code here, to run repeatedly:

}

qui donne comme résultats

-232.00
5228.75

Super ! Problème réglé, je n'avais pas pensé à calculer l'amplitude de dutybuse et encore moins réfléchit au fait que ça dépasserait la valeur max toléré par int.

Est-ce que j'aurais pu utilisé long à la place de float d'ailleurs ?

Pourquoi tu n'essaies pas tout simplement?

Edit: eh oui bien sûr cela va fonctionner avec des long