Czytam przykładowy kod i używają tej metody mapowania danych z czujników podczerwieni:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Jaki jest sens używania constrain
tutaj, jeśli adj_1
otrzymuje już wartość 0-255 z map
?
Komentarze
Odpowiedź
Z oficjalnej witryny Arduino :
[Funkcja mapy] nie ogranicza wartości do zakresu, ponieważ wartości spoza zakresu są czasami zamierzone i przydatne. Funkcji constrain () można użyć przed lub po tej funkcji, jeśli wymagane są ograniczenia zakresów.
EDYCJA: Przykład.
Możesz spróbować samemu z tym kodem:
int val = 20; val = map(val, 0, 10, 0, 100);
Chociaż ustawiłeś górną granicę zakresu wartości na 10, przekazałeś wyższą wartość niż ta, a funkcja odpowiednio ją odwzoruje liniowo, dając wynik 200.
Odpowiedź
Jedno zastrzeżenie podczas mapowania wejścia z zakresu od 0 do 1023, ponieważ Arduino nie jest w stanie odczytać poza tym zakresem, nie byłoby potrzeby ograniczania. Możesz to sprawdzić, przechodząc przez każdą iterację od 0 do 1023 i wysyłając odpowiednią zmapowaną wartość :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Z pewnością, jeśli odczyt czujnika oferuje zakres mniejszy niż 0 do 1023, to funkcja constrain () jest zdecydowanie wymagana, zgodnie z LoganBlade „s przykład. W przeciwnym razie nie jest to potrzebne, ale może nadal należeć do sfery najlepszych praktyk.
Jedyną przeszkodą w tej logice byłoby mapowanie na wartości dziesiętne (co nie ma większego sensu, ponieważ funkcja i tak zwróci długi typ), w którym to przypadku wewnętrzne rzutowanie Arduino zaokrągli w dół mapowanie najniższej wartości. Przykład:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Ponownie, ze względu na najlepsze praktyki i potencjalny czas stracony na szukanie błędu mapowania, użycie constrain () jest lepsze niż jego pominięcie .
Komentarze
- Niektóre czujniki wyświetlają wysokie wartości, gdy są poza swoim normalnym zakresem działania lub gdy coś innego jest wyłączone. STM VLS30X może nagle wyprowadzić 8190 po zmierzeniu na przykład 487 (mm). Dlatego ograniczenie powinno być koniecznością. Zobacz też rozwiązanie błędu mapowania, które powoduje zbyt wielu użytkowników jetmore.org/john/blog/2011/09/…
s1_min
is1_max
gwarantowane czy oczekiwane ograniczenia odczytu nieprzetworzonego?map()
nie ogranicza wyjścia.