Hvorfor brukes begrensningsfunksjonen etter kartfunksjonen?

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *