Dlaczego funkcja ograniczenia jest używana po funkcji mapy?

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

  • Czy s1_min i s1_max gwarantowane czy oczekiwane ograniczenia odczytu nieprzetworzonego? map() nie ogranicza wyjścia.
  • @EdgarBonet co masz na myśli, że nie ' t ogranicza swoje dane wyjściowe? Wygrał ' czy zwróciło wartość 0-255?
  • Niekoniecznie, to tylko liniowe odwzorowanie.
  • Przepraszamy, co to oznacza znaczy?
  • funkcja liniowa .

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/…

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *