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.
en espérant que cela t'aideras
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 ).
j'ai tester et ça fonctionne parfaitement bien 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);
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!
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
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)
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.