Estoy leyendo un código de muestra y usan este método de mapeo de datos de sensores IR:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
¿Cuál es el punto de usar constrain
aquí si adj_1
ya está obteniendo un valor 0-255 del map
¿función?
Comentarios
Responder
Desde el sitio oficial de Arduino :
[La función de mapa] no restringe los valores dentro del rango, porque los valores fuera de rango a veces son intencionados y útiles. La función constrain () se puede utilizar antes o después de esta función, si se desean límites a los rangos.
EDIT: Ejemplo.
Puede probar esto usted mismo con este código:
int val = 20; val = map(val, 0, 10, 0, 100);
Aunque estableció el límite superior del rango del valor en 10, pasó un un valor más alto que ese y la función lo mapeará linealmente en consecuencia, lo que dará como resultado una salida de 200.
Respuesta
Una advertencia sería Al mapear una entrada que va de 0 a 1023, dado que Arduino es incapaz de leer fuera de este rango, no habría necesidad de restringir. Puede verificar esto ejecutando cada iteración de 0 a 1023 y generando el valor mapeado correspondiente :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Ciertamente, si la lectura de su sensor ofrece un rango menor de 0 a 1023, entonces definitivamente se requiere la función constrain (), según LoganBlade «s ejemplo. De lo contrario, no es necesario, pero aún puede caer en el ámbito de las mejores prácticas.
El único inconveniente de esta lógica sería si está mapeando valores decimales (lo cual no tiene mucho sentido ya que el La función devolverá un tipo largo de todos modos), en cuyo caso el encasillado interno de Arduino redondeará su mapeo de valor más bajo. Ejemplo:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Nuevamente, por el bien de las mejores prácticas y el tiempo potencial perdido tratando de encontrar un error de mapeo, usar la restricción () es mejor que omitirlo .
Comentarios
- Algunos sensores generan números altos cuando están fuera de su rango normal de operación o si algo más está apagado. El STM VLS30X puede generar repentinamente 8190 después de haber medido 487 (mm), por ejemplo. Por lo tanto, la restricción debería ser una necesidad. Ver también una solución al error de mapeo que muchos usuarios hacen jetmore.org/john/blog/2011/09/…
s1_min
ys1_max
los límites garantizados o esperados de la lectura sin procesar?map()
no restringe su salida.