Variaciones bruscas lecturas map

Hola, es en relación al tema mejor circuito para lectura 4-20ma a entrada analogica arduino-Solucionado- - #3 by efect2000 , ha estado parado mucho tiempo por diversas causas.

tengo de un cabalimetro una lectura con entrada 4-20 a traves de un modulo HW-685. Lo curioso para mi es que a su salida la tensión que entrega es super estable (dos decimales), pero lo que muestra el display varía mucho, oscila entre de 33 y 37. Lo más curioso es que si pongo la tensión proveniente de una fuente directamente a la entrada analogica, la lectura en display es estable, en cambio si pongo un generador de 4-20 a la entrada del HW ya no es estable, pero la tensión que entrega sí. Poniendo un condensador en la salida del HW ya es más estable, pero no creo que sea la manera de solucionarlo. Adjunto parte del codigo que creo puede servir, o bien para ver si está bien o no. Debe medir un caudal de +- 35m3.

float caudal_actual_map;
float caudal_lee_caudalimetro;
float caudal_actual_sistema;
 caudal_lee_caudalimetro = analogRead(lectura_caudal_caudalimetro); 
    caudal_actual_map = map(caudal_lee_caudalimetro, 0 , 1023, 0, 5000); 
    caudal_actual_sistema = map(caudal_actual_map, 0, 30, 0 , 40);// a veces pongo 3000, 4000, pero los números fluctuan siempre

lcd.print(caudal_actual_sistema /100 );// para sacar decimales. 

la idea es limitar la medida entre 30 y 40, es decir, que si el caudal es 0 marque 30, lo puse así porque creo recordar que era menos "disparatado" los valores que indicaba el display

gracias

map esta definida en los enteros largos con signo no en float ver tutorial de @victorjam

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;
}

Si quieres usarla con float debes hacer un fmap por decirlo de algun modo. O sea una función que tenga sentido con los float.

tu debes concentrar la información que entrega el ADC y limitarla entre 0 y 5000
esto pero no como lo hiciste sino asi.

long valor = analogRead(lectura_caudal_caudalimetro);
long caudal_actual_map = map(analogRead(valor, 0 , 1023, 0, 5000);

Ahora si lo que quieres e slimitar la medida entre 30 y 40 usa constrain()

long caudal_actual_sistema = constrain(caudal_actual_map , 30, 40);    // limits range of sensor values to between 10 and 150

Mira como funciona constrain()

Sintaxis
constrain(x, a, b)

Parámetros

  • x: el número a limitar, todos los tipos de datos.
  • a: el límite inferior del rango, todos los tipos de datos.
  • b: el límite superior del rango, todos los tipos de datos.

Retorna

  • x: si x está entre a y b.
  • a: si x es menor que a.
  • b: si x es mayor que b.
1 Like