Estou lendo um código de amostra e eles usam este método de mapeamento de dados de sensores IV:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Qual é o sentido de usar constrain
aqui se adj_1
já está recebendo um valor 0-255 de map
função?
Comentários
Resposta
[A função do mapa] não restringe os valores para dentro do intervalo, porque valores fora do intervalo às vezes são intencionais e úteis. A função constrain () pode ser usada antes ou depois desta função, se os limites dos intervalos forem desejados.
EDITAR: Exemplo.
Você pode tentar fazer isso sozinho com este código:
int val = 20; val = map(val, 0, 10, 0, 100);
Embora tenha definido o limite superior do intervalo do valor para 10, você passou um valor mais alto do que esse e a função irá mapeá-lo linearmente de acordo, resultando em uma saída de 200.
Resposta
Uma advertência seria ser ao mapear uma entrada que varia de 0 a 1023, uma vez que o Arduino é incapaz de ler fora dessa faixa, não haveria necessidade de restringir. Você pode verificar isso executando cada iteração de 0 a 1023 e gerando o valor mapeado correspondente :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Certamente, se a leitura do seu sensor oferece um intervalo menor que 0 a 1023, então a função constrain () é definitivamente necessária, de acordo com LoganBlade “s exemplo. Caso contrário, não é necessário, mas ainda pode cair no reino das melhores práticas.
O único problema com essa lógica seria se você estivesse mapeando para valores decimais (o que não faz muito sentido, pois o retornará um tipo longo de qualquer maneira), caso em que o typecasting interno do Arduino arredondará para baixo seu mapeamento de valor mais baixo. Exemplo:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Mais uma vez, por uma questão de prática recomendada e do tempo potencial perdido tentando encontrar um bug de mapeamento, usar constrain () é melhor do que ignorá-lo .
Comentários
- Alguns sensores geram números altos quando estão fora de sua faixa normal de operação ou se alguma outra coisa está desligada. O STM VLS30X pode produzir 8190 repentinamente após ter medido 487 (mm), por exemplo. Portanto, a restrição deve ser uma obrigação. Veja também uma solução para o erro de mapeamento que muitos usuários cometem jetmore.org/john/blog/2011/09/…
s1_min
es1_max
os limites garantidos ou esperados da leitura bruta?map()
não restringe sua saída.