Hvorfor bruges begrænsningsfunktionen efter kortfunktionen?

Jeg læser nogle prøvekoder, og de bruger denne metode til kortlægning af data fra IR-sensorer:

 sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255); 

Hvad er meningen med at bruge constrain her, hvis adj_1 allerede får en værdi 0-255 fra map -funktion?

Kommentarer

  • Er s1_min og s1_max de garanterede eller forventede grænser for den rå læsning? map() begrænser ikke dets output.
  • @EdgarBonet hvad mener du, at det ikke ' t begrænser dets output? Vandt ' t det returnerer en værdi 0-255?
  • Ikke nødvendigvis, det er bare en lineær kortlægning.
  • Undskyld, hvad betyder det betyder?
  • A lineær funktion .

Svar

Fra det officielle Arduino-websted :

[Kortfunktionen] begrænser ikke værdier inden for området, fordi værdier uden for området undertiden er beregnet og nyttige. Funktionen constrain () kan bruges enten før eller efter denne funktion, hvis der ønskes grænser for intervallerne.

EDIT: Eksempel.

Du kan prøve dette selv med denne kode:

int val = 20; val = map(val, 0, 10, 0, 100); 

Selvom du indstiller den øvre grænse for værdiens interval til 10, har du passeret en højere værdi end det, og funktionen kortlægger den lineært i overensstemmelse hermed, hvilket resulterer i en output på 200.

Svar

En advarsel ville være ved kortlægning af en input, der spænder fra 0 til 1023, da Arduino ikke er i stand til at læse uden for dette interval, ville der ikke være behov for at begrænse. Du kan kontrollere dette ved at køre igennem hver iteration fra 0 til 1023 og udsende den tilsvarende kortlagte værdi :

for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); } 

Bestemt, hvis din sensoraflæsning tilbyder et område, der er mindre end 0 til 1023, er constrain () -funktionen bestemt nødvendig i henhold til LoganBlades eksempel. Ellers er det ikke nødvendigt, men kan stadig falde inden for den bedste praksis.

Den eneste hikke til denne logik ville være, hvis du kortlægger til decimalværdier (hvilket ikke giver meget mening siden funktion returnerer alligevel en lang type), i hvilket tilfælde Arduinos interne typecasting afrunder din kortlægning af den laveste værdi. Eksempel:

map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61 

Igen, af hensyn til bedste praksis og den spildte potentielle tid på at finde en kortlægningsfejl, er det bedre at bruge constrain () end at springe over det .

Kommentarer

  • Nogle sensorer udsender høje tal, når de er uden for deres normale funktionsområde, eller hvis noget andet er slukket. STM VLS30X kan pludselig sende 8190 efter at have målt f.eks. 487 (mm). Derfor bør begrænsning være et must. Se også en løsning på kortlægningsfejlen for mange brugere gør jetmore.org/john/blog/2011/09/…

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *