Pourquoi la fonction de contrainte est-elle utilisée après la fonction de carte?

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

  • Sont s1_min et s1_max les limites garanties ou attendues de la lecture brute? map() ne contraint pas sa sortie.
  • @EdgarBonet que voulez-vous dire quil ne ' t contraint sa sortie? Est-ce que ' na pas renvoyé une valeur de 0 à 255?
  • Pas nécessairement, cest juste un mappage linéaire.
  • Désolé, quest-ce que cela signifie?
  • Une fonction linéaire .

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/…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *