Me acabo de quedar sorprendida y no soy capaz de salir del lio.
Estoy trasteando con un dispositivo analogico, y pretendo pasar los valores que me da su escala desde 70 como mínimo hasta 965 como máximo a unos hipoteticos porcentajes que oscilan desde 5% a 95%
Funciona bien, menos en los rangos inferiores.
Para un valor de 102 en su entrada analogica me saca una medida del 80%, y para un valor de 118 -90%
Luego y a partir de aqui funciona bien. Para un valor de 124 saca una medida de 10%
El código que uso es este:
for(int i = 0; i < 20; i++){
int value =
measure += analogRead(pinHall);
}
measure /= 20;
measure=analogRead(pinHall);
porcentaje=map(measure,70,965,5,95);
¿Sabeis como es la fórmula que emplea map, para poder llegar a la conculsión de porque tengo esos resultados?
Buscando he encontrado esta fórmula, pero resolveindola no optengo el resultado que indica
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
(118-70)x((95-5)
---------------------- = +/- 5 5 no es igual a 80
(965-70)+5
¿Donde tengo el error?
En esta formula que escribes
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
El 5 no va donde lo pones
(118-70)x((95-5)
(965-70)+5
Sino aquí
(118-70)x((95-5)
---------------------- + +5
(965-70)
Ya me pareció que ese +5 no estaba bien del todo.
En teoría lo que hace la función map es interpolar entre valores.
70 -------- 5
118 -------X
965 ------ 95
(118-70) (X-5)
---------- = ------- X= 9,8
(965-70) (95-5)
El problema que tengo es que a veces, y cuando quiere, a pesar que el valor de map, esté introducido bien map(measure,70,965,5,95);
La solución que me da para un valor de measure de 118, es 90, cuando según la fórmula debería de ser 10.
¿Hay alguna explicación, para estas lecturas analógicas tan locas?
En teoría lo que hace la función map es interpolar entre valores.
No es en teoría, si no que es lo que realmente hace,
En tu código
1)haces 20 lecturas y las sumas.
-
haces la media.
-
Vuelves a hacer otra lectura
Porqué ?
También afirmas que :
La solución que me da para un valor de measure de 118, es 90, cuando según la fórmula debería de ser 10.
No es cierto, para 118 tu formula da 9.8 y no 10.
No muestras la declaración de variables, no muestras el código real. El 90 en vez de 9.8 ya es sospechoso....
Te aconsejo, que releas con calma tu código, y siempre pienses que el error es tuyo y no de las funciones.
Consejos:
haz un programa similar a esto para demostrarte a ti misma que map() si que funciona.
float resultado =0
for(int lectura = 70; lectura < 966; lectura++){
resultado = map(lectura,70,965,5,95)
print lectura ----> resultado
}
y luego
Lee la referencia de map() y utiliza constraint() como aconsejan.
Para hacer una media, normalmente se hace en un lapso de tiempo, tu lo haces a la velocidad del procesador.
y si presupones que tendrás errores en la medición de los sensores, puedes mejorar la lectura media desechando la medida más alta y la más baja antes de hacer la media.