샘플 코드를 읽고 있으며 IR 센서에서 데이터를 매핑하는이 방법을 사용합니다.
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
adj_1
가 이미 iv id에서 0-255 값을 얻는 경우 여기서 constrain
를 사용하는 이유는 무엇입니까? = “ee9c7017f7″>
함수?
댓글
답변
[지도 함수]는 범위를 벗어난 값이 때때로 의도되고 유용하기 때문에 값을 범위 내로 제한하지 않습니다. 범위 제한이 필요한 경우이 함수 앞이나 뒤에 constrain () 함수를 사용할 수 있습니다.
편집 : 예.
다음 코드를 사용하여 직접 시도 할 수 있습니다.
int val = 20; val = map(val, 0, 10, 0, 100);
값 범위의 상한을 10으로 설정했지만 그보다 높은 값을 사용하면 그에 따라 선형 적으로 매핑되어 출력이 200이됩니다.
Answer
한 가지주의 사항 0에서 1023 범위의 입력을 매핑 할 때 Arduino는이 범위를 벗어나는 읽기가 불가능하므로 제한 할 필요가 없습니다. 0에서 1023까지의 각 반복을 실행하고 해당 매핑 된 값을 출력하여이를 확인할 수 있습니다. :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
물론 센서 판독 값이 0에서 1023보다 작은 범위를 제공하는 경우 LoganBlade에 따라 constrain () 함수가 반드시 필요합니다. 예. 그렇지 않으면 필요하지 않지만 여전히 모범 사례 영역에 속할 수 있습니다.
이 논리에 대한 유일한 문제는 십진수 값에 매핑하는 경우입니다 (이는 그다지 의미가 없습니다. 함수는 어쨌든 긴 유형을 반환합니다),이 경우 Arduino의 내부 유형 변환은 가장 낮은 값 매핑을 반올림합니다. 예 :
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
다시 한 번, 모범 사례와 매핑 버그를 찾는 데 낭비되는 잠재적 인 시간을 위해 constrain ()을 사용하는 것이 건너 뛰는 것보다 낫습니다. .
설명
- 일부 센서는 정상적인 작동 범위를 벗어나거나 다른 것이 꺼져있을 때 높은 숫자를 출력합니다. STM VLS30X는 예를 들어 487 (mm)를 측정 한 후 갑자기 8190을 출력 할 수 있습니다. 따라서 제한은 필수입니다. 너무 많은 사용자가 만드는 매핑 오류에 대한 해결책도 참조하십시오. jetmore.org/john/blog/2011/09/ …
s1_min
및s1_max
원시 판독 값의 보장 또는 예상 한계입니까?map()
는 출력을 제한하지 않습니다.