tension de trabajo sonda entre 0,5 y 4,5, pero que 0,5 marque 0

#1
Buenas a todos, estoy intentando hacer una automatizacion de un presostato mecanico a uno con arduino. Tengo esta una sonda de presion, que el foro no me deja insertar por ser nuevo, pero la compré en banggood y podeis verla si escribis
5V 0-1.2 MPa Pressure Transducer Sensor Oil Fuel Diesel Gas Water Air Sensor

el "problema" es que cuando no hay presion marca 0,5 voltios y cuando esté a maxima presion (sobre 12 bar y lo digo de memoria) llega a 4,5v. Me gustaria si sabeis algun truco, que no sea estilo de mostrar en display

Código:
if value<0,5 then value=0
esta parte la inicié asi
Código:
 presion_actual=analogRead(presion_actual_sonda)/90.00;
y luego, de una pagina de internet he probado este de abajo

Código:
  float sensorVoltage = analogRead(presion_actual_sonda);   // read the sensor voltage
  presion_actual2 = ((sensorVoltage-95)/210)*50;
    presion_actual=(presion_actual2/14.7058)-0.5;//convierte PSI en BAR y resta 0,5 para compensar error de cero
pero claro, si le quito el 0,5 depues me marca de menos siempre.
para poder explicarlo de fora más entendible, seria, si no recuerdo mal, una especie de offset, que la lectura fuera de 0,5 a 4,5, valor 0 y máximo respectivamente, y ahí me encallo. La verdad es que no es para nada importante este fallo o error, solo es que me gusatria que quedara lo máximo de bien y real.
Espero haber posteado bien, saludos y gracias. ...
 
#2
tiene algún código de referencia el sensor? por que sin saber los valores de transferencia no podría darte solución, solo se me ocurre que elimines el voltaje de offset usando
float sensorVoltage = analogRead(presion_actual_sonda) - 102;
102 en el ADC de 10bits a 5V corresponde a 498,5mV que seria lo mas cercano, si lo que quieres es ajustar Min =0=0.5V Max = 4,5V podrías usar map, nota que eso opera con enteros, tendrías que hacerlo usando el valor entero del analogRead para cambiarlo y luego ya realizas las otras operaciones.
 
Última edición:
#3
gracias por responder. He encontrado eso que adjunto del foro de banggood, nada más y no creo que sriva de mucho, excepto confirmar lo que ya he indicado, que el margen de trabajo va de 0,5 a 4,5. Ya digo no es muy importante, solo es por cuestión de estetica, no sé si te puede ayudar. mañana probaré lo que indicas, de programación no sé mucho.
gracias de nuevo
 

Adjuntos

Última edición:
#5
hola, ¿cual es el problema de la imagen que he subido? en el primer mensaje queria insertar un link, concretamente el de banggood donde habia la sonda, pero al saltarme la "alarma" de que no me está permitido por tener pocos mensajes, no ha quedado bien escrito. Entiendo que es por la cita que muestras, y que corresponde al primer mensaje que no tenia estos datos, pues yo veo la imagen bien insertada:unsure::rolleyes:
gracias
 
#6
Hola, antes de seguir, indicar si voy bien por este camino. Googleando he encontrado lo del map y el problema de decimales, y he aplicado lo que hacian muchos, que expongo a continuacion (dejando aparte los nombres y tema espacios display).
entiendo por el map que significa (valor minimo in, valor maximo in, valor minimo out, valor maximo out) , ahora uso un potenciometro, pues es mas facil hacer las pruebas, luego entiendo que deberá ir
102,920,0,12

Código:
presion_actual=analogRead(presion_actual_sonda);//ejemplo de medida presion_actual=4,51
 
  presion_actualB = map(presion_actual*100, 0, 1020, 0, 12);  // debe ir  102,920,0,12
  
  entero=presion_actualB/100;
  decimal_floa=presion_actualB/100-entero;
  decimal=decimal_floa*100;
//----------------------------
 lcd.setCursor(12, 2);
  lcd.print(entero);  
  lcd.setCursor(14, 2);
  lcd.print(",");
  lcd.print(decimal);
irian por aqui los tiros?
gacias
 
Última edición:
#7
Yo usaría dos veces la función map, la primera ves para pasar el valor del ADC a mV y la segunda ves para pasa de mV a KPa, si usas mV y KPa no tendrás problemas trabajando solo con enteros.
 
Última edición:
#8
hola, gracias por la respuesta. Ahora no sé proque, pero no me parece funcionar, no sé si antes lo he mirado mal o que......
ahora ya lo dejo, he estado haciendo muchas pruebas y con decimales no me sale, solo con entero parece que sí. Mañana sigo, o si veis y podeis decir qué tengo mal, se agradecerá. Gracias

Código:
  presion_actual = map(analogRead(presion_actual_sonda),0, 910, 0, 12);
   
  presion_actualB=presion_actual*100;
  presion_actualB = map(presion_actualB,102, 900, 0, 12);
  
  entero=presion_actualB;//100;
  decimal_floa=presion_actual-entero;
  decimal=decimal_floa;//*100;
//----------  
  lcd.print(entero);  
  lcd.print(",");
  lcd.print(decimal);
 
#9
No me quedo claro lo que trataste de hacer en tu código, lo que yo propongo es algo como esto:
Código:
presion_ADC=analogRead(presion_actual_sonda);//leo ADC, rango de 0 a 1023
presion_mV = map(presion_ADC,0, 1023, 0, 5000);//transformo a mV, rango de 0 a 5000mV(=5V)
presion_KPa = map(presion_mV,500, 4500, 0, 1200);//transformo a KPa, rango de 0 a 1200KPa(=1.2MPa)
 
#10
muchas gracias, ahora sí que funciona

lo que tenia mal basicamente eran los números de máximos y mínimos, esta función ni sabía que existia y los ejemplos que encontré eran para salida a 255 para encender un led por salida pwm

una vez ya tengo la presion en kilopascales ya divido por 100 con (float) presion_KPa

Código:
 lcd.print(presion_KPa/100);
Yo estaba emperrado en trabajar con BAR, y por eso multipilicaba por 100 y despues dividia y sacaba dos numeros (copiado de ejemplos de temperatura con el mismo fin) en vez de poner 1200 como has puesto:oops: ni se me habia pasado por la cabeza:LOL:
Muchisimas gracias:apreton:(y)

se puede cerrar el tema
 

Temas similares

Arriba