Miért használják a kényszerfüggvényt a térképfüggvény után?

Olvasok néhány mintakódot, és ezt az IR-érzékelőkből származó adatok leképezésének módszerét használják:

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

Mi értelme a constrain itt használatának, ha a adj_1 már 0-255 értéket kap a map függvény?

Megjegyzések

  • s1_min és s1_max a nyers leolvasás garantált vagy várható korlátai? A map() nem korlátozza a kimenetét.
  • @EdgarBonet mit értesz rajta, hogy nem korlátozza a ' t a kimenetére? Megnyerte ' t, ha 0–255-ös értéket ad vissza?
  • Nem feltétlenül, ez csak lineáris leképezés.
  • Sajnálom, mit csinál ez jelent?
  • A lineáris függvény .

Válasz

a hivatalos Arduino webhelyről :

[A térképfunkció] nem korlátozza az értékeket a tartományba, mert a tartományon kívüli értékeket néha célszerűnek és hasznosnak tekinteni. A constrain () függvény használható a függvény előtt vagy után is, ha a tartományok korlátozására van szükség.

SZERKESZTÉS: Példa.

Ezt maga is kipróbálhatja ezzel a kóddal:

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

Bár az érték tartományának felső határát 10-re állította, Ön átment egy ennél nagyobb érték, és a függvény lineárisan leképezi ennek megfelelően, 200-as kimenetet eredményezve.

Válasz

Egy figyelmeztetés 0 és 1023 közötti bemenet feltérképezése esetén, mivel az Arduino nem képes olvasni ezen a tartományon kívül, nem kell korlátozni. Ezt ellenőrizheti úgy, hogy végigfuttatja az egyes iterációkat 0 és 1023 között, és kiadja a megfelelő leképezett értéket :

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

Természetesen, ha az érzékelő leolvasása 0 és 1023 között kisebb tartományt kínál, akkor a LoganBlade utasításainak megfelelően feltétlenül szükséges a constrain () függvény. példa. Ellenkező esetben nincs rá szükség, de mégis a bevált módszerek területére eshet.

A logika egyetlen csuklása az lenne, ha decimális értékekre térképezne fel (aminek nincs sok értelme, mivel a függvény amúgy is hosszú típust ad vissza), ebben az esetben az Arduino belső tipizálása lekerekíti a legalacsonyabb érték leképezést. Példa:

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

Ismételten a legjobb gyakorlat és a leképezési hiba megtalálásához elvesztegetett idő érdekében a constrain () használata jobb, mint az átugrása .

Megjegyzések

  • Egyes érzékelők nagy számot adnak ki, ha kívül esnek a szokásos működési tartományon, vagy ha valami más ki van kapcsolva. Az STM VLS30X hirtelen képes a 8190 kimenetére, miután például megmérte a 487 (mm) értéket. Ezért kötelezőnek kell lennie a kényszerítésnek. Lásd még a leképezési hiba megoldását, amely túl sok felhasználó jetmore.org/john/blog/2011/09/…

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük