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
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/…
s1_min
éss1_max
a nyers leolvasás garantált vagy várható korlátai? Amap()
nem korlátozza a kimenetét.