Jeg leser noen eksempler på kode, og de bruker denne metoden for å kartlegge data fra IR-sensorer:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Hva er vitsen med å bruke constrain
her hvis adj_1
allerede får en verdi 0-255 fra map
-funksjon?
Kommentarer
- Er
s1_min
ogs1_max
de garanterte eller forventede grensene for råavlesningen?map()
begrenser ikke produksjonen. - @EdgarBonet hva mener du at den ikke ' t begrenser produksjonen? Vant ' t den returnerer verdien 0-255?
- Ikke nødvendigvis, det er bare en lineær kartlegging.
- Beklager, hva gjør det mener?
- A lineær funksjon .
Svar
Fra det offisielle Arduino-nettstedet :
[Kartfunksjonen] begrenser ikke verdiene til å ligge innenfor området, fordi verdier utenfor området noen ganger er ment og nyttige. Begrensningen () -funksjonen kan brukes enten før eller etter denne funksjonen, hvis det er ønsket grenser for områdene.
EDIT: Eksempel.
Du kan prøve dette selv med denne koden:
int val = 20; val = map(val, 0, 10, 0, 100);
Selv om du satte den øvre grensen for verdiområdet til 10, passerte du en høyere verdi enn det, og funksjonen vil linjere den tilsvarende, noe som resulterer i en effekt på 200.
Svar
En advarsel ville være når du kartlegger en inngang som strekker seg fra 0 til 1023, siden Arduino ikke er i stand til å lese utenfor dette området, vil det ikke være behov for å begrense. :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Hvis sensoravlesningen din har et område som er mindre enn 0 til 1023, er det absolutt nødvendig å begrense () -funksjonen, i henhold til LoganBlade eksempel. Ellers er det ikke nødvendig, men kan likevel falle inn i området for beste praksis.
Den eneste hikken til denne logikken vil være hvis du kartlegger til desimalverdier (som ikke gir mye mening siden funksjon vil returnere en lang type uansett), i hvilket tilfelle Arduinos interne typecasting vil runde ned den laveste verdikartleggingen din. Eksempel:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Igjen, for beste praksis og potensiell bortkastet tid på å finne en kartleggingsfeil, er det bedre å bruke begrensning () enn å hoppe over den .
Kommentarer
- Noen sensorer sender ut høye tall når de er utenfor sitt normale driftsområde, eller hvis noe annet er av. STM VLS30X kan plutselig sende 8190 etter for eksempel å ha målt 487 (mm). Derfor bør begrensning være et must. Se også en løsning på kartleggingsfeilen for mange brukere gjør jetmore.org/john/blog/2011/09/…