Por que a função de restrição é usada após a função de mapa?

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

  • São s1_min e s1_max os limites garantidos ou esperados da leitura bruta? map() não restringe sua saída.
  • @EdgarBonet o que você quer dizer com não ' t restringe sua saída? Será que ' retornará um valor 0-255?
  • Não necessariamente, é apenas um mapeamento linear.
  • Desculpe, o que isso significa significa?
  • Uma função linear .

Resposta

Do site oficial do Arduino :

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *