Interpréter AnalogRead en facteur [RESOLU]

Bonjour à toutes et tous,

je suis en train de fabriquer un petit tableau électronique pour mes filles, je récupère via
analogRead, une valeur de tension sur la A0

//tension de référence de 1.1V
  analogReference(INTERNAL);

}

void loop() {
  //on convertit en nombre binaire la tension lue
valeurLue = analogRead(lambda);
    
  //Valeur brute en tension
tension = valeurLue * 1.1 / 1023;

tout ce passe bien, j'affiche la tension sur l'I2c, mais ma question est la suivante, je souhaiterai afficher à la place de la tension un "facteur"
0V ==>0
0.1v==>1
0.2V==>2
.
.
1V==>10

que mes filles puisse via un potard trouver le chiffre demander.

comment faire svp? je bloque complétement.

d'avance merci

map fait ça très bien

facteur = map(valeurLue, 0, 1023, 0, 10);

Il est possible que valeurLue ne couvre pas complètement la fourchette 0 à 1023, auquel cas il faudrait adapter ces 2 valeurs dans map.

1 Like

Merci beaucoup pour la réponse clair, et rapide, je vais tester ça tout à l'heure :wink:

Salut @oddvar08
si tu veux voir comment ça marche en réel :

#include pinLED1 12
#include pinLED2 11
#include pinLED3 10
#include pinPOTENTIOMETRE A0

int VALpotentiometre = 0;
int ValPotenConvert = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println("demarage");
  pinMode(pinLED1, OUTPUT);
  pinMode(pinLED2, OUTPUT);
  pinMode(pinLED3, OUTPUT);
}
void loop()
{
  VALpotentiometre = analogRead (pinPOTENTIOMETRE);
  ValPotenConvert = map(VALpotentiometre, 0, 1023, 0, 3);
  Serial.println("Lecture valeur et convertion du potentiometre...");

  if (ValPotenConvert == 1)
   {
     digitalWrite(pinLED1, HIGH);
     digitalWrite(pinLED2, LOW);
     digitalWrite(pinLED3, LOW);
     Serial.println("Led n 1 ");
  }
else if(ValPotenConvert == 2)
  {
     digitalWrite(pinLED1, LOW);
     digitalWrite(pinLED2, HIGH);
     digitalWrite(pinLED3, LOW);
     Serial.println("Led n 2 ");
  }
else if(ValPotenConvert == 3)
  {
     digitalWrite(pinLED1, LOW);
     digitalWrite(pinLED2, LOW);
     digitalWrite(pinLED3, HIGH);
     Serial.println("Led n 3 ");
  }
}

en espérant que cela t'aideras :wink:
Pour faire ton animation, il te suffit de convertir la valeur du potard ( donc 0 - 1023 ) vers le nombre de led ( mais ça peut être ce que tu veut, c'est mieux de commencer par 10 leds ) et de mettre toutes les leds avec if ( valeur du potentiomètre convertie == la led X)
alors allumer la led X ).

merci beaucoup, quelle efficacité mais surtout quelle fonction dont j'ignorai complétement l'éxistence. :grin:

C'est effectivement un truc pas mal, surtout que faire un truc avec une valeur 0 - 1023, c'est pas facile :grin:

j'ai tester et ça fonctionne parfaitement bien :smiley: je me suis renseigner et j'ai vu qu'il existais une fonction float a map, ca fonctionne toujours, et comment l'utiliser? car le compilateur de ne veut pas de ma float data = mapf(val, 0, 1023, 0, 5);

utiliser une valeur float avec map, ça je n'ai jamais fais, je ne pense pas que je pourrai t'aider sur ce point, mais je vais chercher, promi :grin:

le vilain.
on va le forcer un peu!

float data = map( (float) val, 0, 1023, 0.0, 5.0);

ou encore:

float data = (float) map( val, 0, 1023, 0.0, 5.0);
mais je ne suis pas assez bon pour dire lequel est le mieux.

Salut @GrandPete :grin:

pourquoi data ? C'est le nom de la valeur ?
la deuxième version j'ai pas compris :wink:

là oui absolument. mais tout autre nom aurait suffit.
je pense que le souci, c'est d'instancier la valeur en float, et d'obtenir le résultat d'un calcul qui est fait par la carte en utilisant des entiers. ça perturbe toujours un peu au début, mais heureusement on peut "forcer" la carte à prendre en compte le nombre à virgule.

un exemple classique avec les détecteurs à ultrasons:
tu reçois un temps en millisecondes (la durée de l'aller-retour du signal) qui sera toujours un entier (pas de 0,5 millisecondes sur nos cartes).
donc:
int temps_aller_retour;

au moment de le convertir en une distance, je divise par 2 puis par la vitesse du son dans l'air (environ 300m/s)

float distance = temps_aller_retour/1000; // là déjà j'ai perdu la virgule
distance = temps_aller_retour / 2 / 300; // je continue un calcul avec une valeur erronée (tronquée de temps_aller_retour)

la solution généralement proposée:

float distance = temps_aller_retour/1000.0 // j'introduis un chiffre à décimale ce qui force le calcul en décimale, mon temps_aller_retour n'est pas tronqué.
sinon:
float distance = (float) temps_aller_retour / 1000; // je force le calcul à utiliser des nombres à virgule.

quand on commence le code, c'est rarement inutile de faire afficher serial.print(); les étapes intermédiaires de calculs, ça évite les mauvaises surprises!

1 Like

merci à tous pour vos réponses plus que rapides, j'ai trouver la solution, il y a une bibliothèque à installer pour pour utiliser la fonction mapf je le met là pour ceux que ça intéresserai

fonction mapf

Merci à tous pour vos messages, qui sont clairs, rapides, et chaleureux ça fait plaisir.

De rien, @oddvar08 , ça fait plaisir de t'aider :grin:
N'oublie pas de mettre le sujet comme résolue ! :slightly_smiling_face:

Cordialement
Pandaroux007 :fox_face:

1 Like

salut, merci pour le retour.
c'est clairement le genre de fonction qui manquent jusqu'à ce que qu'on les connaissent, ensuite on les oublie plus jamais!

pour les fous dans mon genre qui se font un honneur de pas utiliser les bibliothèques parce que c'est tellement plus compliqué de s'en passer, la fonction map() (je ne connais pas la mapf()) est un bon vieux produit en croix des familles, donc on peut aussi se la coder à la main.
Et petite subtilité, elle prend aussi les valeurs "à l'envers": si tu préfères avoir une note de 5 à 0 plutôt que de 0 à 5 (ça arrive!), il suffit de:

map(data, 0,1023,5,0);

la référence arduino
(dont on me dit qu'elle a déjà été fournie précédemment)

1 Like

Aucun n'est le mieux, map() est défini comme ça:

long map(long x, long in_min, long in_max, long out_min, long out_max)

donc le calcul se fera sur des entiers. Tu n'auras qu'une conversion à la fin ce qui n'apporte rien au final.

bonsoir,

de toute façon, la demande initiale portait sur un résultat entier (de 0 à 10) qui permettrait un joli switch...case, bien plus lisible et facile à maintenir qu'une suite d'if...else if.

Si on regarde d'un peu plus près map ce n'est pas autre chose que l'application de la formule (assez connue) : y = mx +b

Avec m = (y2-y1) / (x2-x1) et b = y1 -mx1
in_max c'est x2 ; in_min c'est x1 : out_min c'est y1 et out_max c'est y2

Après on choisi si x , y , x1 , x2 , y1, y2, sont des entiers ou des float.

Il y a juste un truc que je comprend pas, c'est dans ton projet, je ne vois ou tu peux avoir besoin d'une valeur float ?

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