Čtu nějaký ukázkový kód a používají tuto metodu mapování dat z IR senzorů:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Jaký je smysl použití constrain
zde, pokud adj_1
již z map
funkce?
Komentáře
Odpověď
[Funkce mapy] neomezuje hodnoty na rozsah, protože hodnoty mimo rozsah jsou někdy zamýšlené a užitečné. Funkci constrain () lze použít před nebo po této funkci, pokud jsou požadovány limity rozsahů.
EDIT: Příklad.
Můžete to sami vyzkoušet pomocí tohoto kódu:
int val = 20; val = map(val, 0, 10, 0, 100);
Ačkoli jste nastavili horní hranici rozsahu hodnoty na 10, předali jste vyšší hodnota a funkce ji odpovídajícím způsobem lineárně namapuje, což povede k výstupu 200.
Odpověď
Jedna výhrada by při mapování vstupu v rozmezí od 0 do 1023, protože Arduino není schopno číst mimo tento rozsah, není třeba se omezovat. Můžete to zkontrolovat spuštěním každé iterace od 0 do 1023 a výstupem odpovídající mapované hodnoty :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Jistě, pokud vaše čtení senzoru nabízí rozsah menší než 0 až 1023, pak je funkce constrain () rozhodně vyžadována, podle LoganBlade příklad. Jinak to není nutné, ale stále může spadat do oblasti osvědčených postupů.
Jediným škytnutím této logiky by bylo, pokud mapujete na desítkové hodnoty (což nedává velký smysl, protože Funkce vrátí dlouhý typ), v takovém případě internícastování Arduina zaokrouhlí vaše nejnižší hodnoty mapování. Příklad:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Z důvodu osvědčených postupů a potenciálního promarněného času při hledání chyby mapování je použití constrain () lepší než přeskočení .
Komentáře
- Některá čidla vysílají vysoká čísla, když jsou mimo normální provozní rozsah nebo pokud je vypnuto něco jiného. STM VLS30X může najednou vydat 8190, například po změření 487 (mm). Omezení by proto mělo být nutností. Viz také řešení chyby mapování, kterou příliš mnoho uživatelů provádí jetmore.org/john/blog/2011/09/…
s1_min
as1_max
zaručené nebo očekávané limity hrubého čtení?map()
neomezuje jeho výstup.