Je lis un exemple de code et ils utilisent cette méthode de cartographie des données des capteurs infrarouges:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Quel est lintérêt dutiliser constrain
ici si adj_1
obtient déjà une valeur 0-255 à partir de map
function?
Commentaires
Réponse
Depuis le site officiel Arduino :
[La fonction de carte] ne contraint pas les valeurs à lintérieur de la plage, car les valeurs hors plage sont parfois voulues et utiles. La fonction constrain () peut être utilisée avant ou après cette fonction, si des limites aux plages sont souhaitées.
EDIT: Exemple.
Vous pouvez essayer cela par vous-même avec ce code:
int val = 20; val = map(val, 0, 10, 0, 100);
Bien que vous ayez défini la limite supérieure de la plage de valeur sur 10, vous avez passé un valeur supérieure à cela et la fonction la mappera linéairement en conséquence, ce qui donnera une sortie de 200.
Réponse
Une mise en garde serait être lors du mappage dune entrée comprise entre 0 et 1023, puisque lArduino est incapable de lire en dehors de cette plage, il ne serait pas nécessaire de contraindre. Vous pouvez vérifier cela en parcourant chaque itération de 0 à 1023 et en sortant la valeur mappée correspondante :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Certes, si la lecture de votre capteur offre une plage inférieure à 0 à 1023, alors la fonction constrain () est définitivement nécessaire, selon LoganBlade « s Exemple. Sinon, ce nest pas nécessaire, mais peut toujours tomber dans le domaine des meilleures pratiques.
Le seul hic de cette logique serait si vous mappez à des valeurs décimales (ce qui na pas beaucoup de sens puisque le retourne de toute façon un type long), auquel cas le typage interne de lArduino arrondira votre mappage de valeur la plus basse. Exemple:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Encore une fois, par souci de bonnes pratiques et du temps potentiel perdu à essayer de trouver un bogue de mappage, il vaut mieux utiliser constrain () que lignorer .
Commentaires
- Certains capteurs émettent des nombres élevés lorsquils sont hors de leur plage normale de fonctionnement ou si quelque chose dautre est désactivé. Le STM VLS30X peut brusquement sortir 8190 après avoir mesuré 487 (mm) par exemple. Par conséquent, la contrainte devrait être un must. Voir aussi une solution à lerreur de mappage que trop dutilisateurs font jetmore.org/john/blog/2011/09/…
s1_min
ets1_max
les limites garanties ou attendues de la lecture brute?map()
ne contraint pas sa sortie.