Miksi rajoitusfunktiota käytetään karttatoiminnon jälkeen?

Luen esimerkkikoodia, ja he käyttävät tätä menetelmää infrapunatunnistimien tietojen kartoittamiseen:

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

Mikä on järkevää käyttää constrain täällä, jos adj_1 saa jo arvon 0-255 map -toiminto?

Kommentit

  • Ovatko s1_min ja s1_max raakalukeman taattu vai odotettu raja? map() ei rajoita sen lähtöä.
  • @EdgarBonet mitä tarkoitat, että se ei rajoita ' t ulostuloa? Voitti ' t, jos se palautti arvon 0-255?
  • Ei välttämättä, se on vain lineaarinen kartoitus.
  • Anteeksi, mitä se tekee tarkoittaa?
  • A lineaarinen funktio .

Vastaa

Arduinon viralliselta sivustolta :

[Karttatoiminto] ei rajoita arvoja alueen sisäpuolelle, koska alueen ulkopuolella olevat arvot ovat joskus tarkoitettuja ja hyödyllisiä. Rajoitus () -funktiota voidaan käyttää joko ennen tätä toimintoa tai sen jälkeen, jos halutaan rajoja alueille.

MUOKKAA: Esimerkki.

Voit kokeilla tätä itse tällä koodilla:

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

Vaikka asetit arvon arvon ylärajaksi 10, olet läpäissyt suurempi arvo ja funktio kartoittaa sen lineaarisesti vastaavasti, jolloin tulos on 200.

Vastaus

Yksi varoitus Kun kartoit tuloa, joka vaihtelee välillä 0-1023, koska Arduino ei kykene lukemaan tämän alueen ulkopuolella, ei tarvitse rajoittaa. Voit tarkistaa tämän suorittamalla jokaisen iteraation välillä 0-1023 ja antamalla vastaava yhdistetty arvo :

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

Jos anturilukema tarjoaa alueen, joka on pienempi kuin 0 – 1023, rajoitustoiminto () vaaditaan ehdottomasti LoganBladen mukaisesti esimerkki. Muuten sitä ei tarvita, mutta se voi silti kuulua parhaiden käytäntöjen piiriin.

Ainoa hikka tämän logiikan kohdalla olisi, jos kartoitetaan desimaaliarvoihin (jolla ei ole mitään järkeä, koska -toiminto palauttaa joka tapauksessa pitkän tyypin), jolloin Arduinon sisäinen tyyppimerkintä pyöristää pienimmän arvon kartoituksen. Esimerkki:

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

Parhaan käytännön ja kartoitusvirheen löytämiseen hukkaan kuluvan ajan vuoksi on parempi käyttää constrain (): ta kuin ohittaa se .

Kommentit

  • Jotkut anturit tuottavat suuria lukuja, kun ne ovat normaalin toiminta-alueen ulkopuolella tai jos jokin muu on poissa käytöstä. STM VLS30X voi yhtäkkiä tuottaa 8190, kun se on esimerkiksi mitannut 487 (mm). Siksi rajoituksen tulisi olla välttämätöntä. Katso myös ratkaisu kartoitusvirheeseen, koska liian monet käyttäjät tekevät jetmore.org/john/blog/2011/09/…

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *