Aforador o boya con una resistencia . Calcular de 0 a 5 V para entrada arduino

Hola:

Tengo un aforador de combustible sumergible de un vehículo de gasolina. Tiene una resistencia que varía de 23 a 278 Óhmios. Es muy pequeña. Como puedes ver, solo tiene dos polos, no los típicos potenciómetros de tres polos. Ahí está mi problema.

Este es el aforador.

Ver vídeo.

Estaba con divisores de tensión, algo parecido a esto, pero no me sale una cosa.

Con esa boya o resistencia del aforador, que son de 23 a 278 Óhmios, conseguir de 0 a 5 V para conectarlo en la entrada analógica A1 de Arduino UNO. Con l aLCD, ya me encargaré de poner los valores en Litros.

¿Algún consejo?

Saludos.

Y cual es la R que debemos suponer varia la de 470 o la otra?

Buenas:

La resistencia de ese esquema que puse arriba es un ejemplo que encontré. En una de las dos tiene que tener como la máxima que es 278 Óhmios, que es la regulable. De 23 a 278 Óhmios.

Lo más básico para Arduino es un potenciómetro o reistencia ajustable de tres polos como este y es muy fácil.

Abajo con una LDR, vamos a suponer que es la resistencia del aforador, que es de 23 a 278 Óhmios.

Desde ahí, tengo que conseguir sea como sea, para la entrada de Arduino señal de 0 a 5 V que no se como hacerlo ni a la de tres.

Ver cálculos.

Saludos.

No vas a poder conseguir 0 a 5V. Es imposible

Para lograrlo requieres electronica. Un AO que agregue algo de ganancia para asi entonces llegar a los 5V
Y un offset que descuente lo que tienes cuando estas con el tanque vacío.

Entonces el enfoque es.. dejas tu sensor resistivo entre 23 y 278 ohms
Bueno no puedes poner cualquier cosa porque si es un tanque de combustible no puede circular mucha corriente.
Entonces una R de 1000 ohms en la parte superior esta bien

Con 23 ohms tendras 0.27V que indican tu 0 de nivel
Con 278 ohms tendras 2.61V que será tu 100% de nivel.
Ahora tienes dos caminos.

Aca esta la calculador de divisores resistivos, hay muchas link

Un camino es que lo dejes asi y dijgas: bueno para 0.27 será mi 0 y 2.61 será mi 100%
Otro camino es usar un divisor resistivo en configuración diferencial tal que restes 0.27V y eso te de un 0
Entonces cuando estes al máximo tendras 2.61 - 0.27 = 2.34V que para que se lean como 5V requieren de una ganancia de 5.00V/2.34V = 2.1367.

No es para enloquecerse. Usas un potenciometro y lo ajutas.

Ahora analicemos lo que tienes, si no le agregas nada, transformar 0.27 en 0% es facil con software
2.34V son casi 510 pasos y no me parece tan malo, asi que sacrificando rango de lectura un código simple sería asi

#define OFFSET 0.27f
#define FULL              2.61f
#define KVOLTIOS      0.00488758f
float valor;

void setup() {

}

void loop(){

   valor = (KVOLTIOS*analogRead(A0)-OFFSET)*100.0f/2.61f;

   
}

la f es para indicar que son valores flotantes.
Cuando el valor leido en Voltios -0.27 = 2.61 entonces es porque llegas al 100%.
Cuando analogRead() x la constante = 0.27 entonces eso sera un 0%

Hola:

Por lo que cuentas, y me haz dado ideas. Sin tener que usar mucho electrónica. Lo alimento desde Arduino a 5V. Me da como media de 0 a 2.5 V.

Encontes de 0 a 2.5 V se me pone el porcentaje en el LCD de 0 a 50 %.

Si puedo regular de 0 a 2.5 V y que en la pantalla me muestre de 0 a 100 %, entonces estoy de buenas.

Luego hacer la resta esa que dices de los 23 a 278 Óhmios. En cada aforador, aunque el modelo sea idéntico y misma fecha de fabricación, puede tener otros rangos diferentes, similares pero no iguales. Ahor estoy con este específico.

Cuando ya tenga todo hecho, ya sabré la cantidad de combustible que tendré en ese depósito de 35 L.

Saludos.

Edito:
Como 5 Voltios son en la entrada analógica 1023, se queda en 512 si usa 2.5 V.

Voltaje del potenciómetro = Valor del potenciómetro * (5.0/1023.0)

Como en mi caso nunca llega a 5 V. si no a 2.5 V. La cuestión es.

¿Cómo hago que me muestre en el LCD de 0% a 100%?

:wink:

Pero si cuando esta en 0 de nivel tienes 23 ohms, siemrpe te dará una lectura aunque baja, que nunca será 0.
Ya te hice las cuentas, inventa lo que quieras pero no vas a evitar que 0.01A x 23 te de un valor bajo pero un valor al fin.

Cuando no haya liquido medirá 0.20V que es bajo pero no es 0V.

En 5.00 eso son 14 o 15 cuentas del ADC.

Como dije es bajo pero no es 0.

¿Cómo hago que me muestre en el LCD de 0% a 100%?

Ya te lo expliqué

Lo del cerca de cero ya inventaré.

Si pone del ADC 512 que son 2.5 V. Lo multiplicaré por 2.

Ya me llegará a 100 %.

Lo de cerca de cero indicaré depósito vacío.

Te di un código Metaconta, qué parte no entiendes?
No comprendo, lo que estas prenguntando.
Escribes códigos en muchos lenguajes no entiendo como esto te ha dejado bloqueado.

La lectura inferior tiene un valor en voltios. Pues se lo restas siempre a todo lo que leas con analogRead(A0). Entonces ya tienes tu 0%.
La lectura superior tal como esta, terminará en algo, lo que sea.
Es decir, te falta un multiplicador que lleve eso al 100% de tanque completo.

Llamemos a OFFSET como el valor no cero inferior y K el valor del multiplicador

valor = (K*analogRead(A0)-OFFSET)*100.0/2.5;

Te aclaro que no será 2.5 será el valor que mides en voltios cuando el tanque tiene los 278 ohms.

Me quedé bloqueado. Gracias por todo.

Lo hice pero raro. Como curiosidad lo muestro.

ADC = de 0 a 512, porque será de 2.5 V. ya que será de 5 V el total del divisor de tensión.

El número 2 es para multiplicar por dos, los valores del ADC.

   ((ADC * 2) * 2.5 V)     ((512 * 2) * 2.5V)    1024 * 2.5 V       2560
V =------------------ = ------------------ = ------------- = --------- = 5 V.
              512                       512                       512              512

V = 5 V.

Lo hice de 0 V o cerca de 0V a los 2.5 V como máximo.

#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
const byte LuzFondo = 10;

int valorPot = 0;
float voltajePot = 0;
float Porcentaje = 0;

void setup()
{
  Serial.begin(115200);     // Puerto serie 115200 baudios.
  lcd.begin(16, 2);         // Formato de pantalla.
  lcd.clear();      // Borra la pantalla y su posición superior izquierda.
  lcd.print("      FIAT      ");
  delay(2000);
  lcd.clear();
}

void loop()
{

  //voltajePot = valorPot * (5.0 / 1023.0);
  //Porcentaje = valorPot * (100.0 / 1023.0);

  //voltajePot = (valorPot * 2.5) * (2.5 / 512);

  valorPot = analogRead(1);

  lcd.setCursor(0, 0);
  Serial.print("P1 ");
  Serial.print(voltajePot);
  Serial.print(" V. ");
  lcd.setCursor(0, 1);
  Serial.print(Porcentaje);
  Serial.print(" % ");
  Serial.println(valorPot);
  delay(100);
}

El código no me sale o no muestra nada en pantalla.

Puede que sea esto:

valorPot = analogRead(1); // Yo pondria A1.

Luego simplificaría la creación del objeto lcd:

//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

¿Por qué no haces un calibrado del depósito? Montas un divisor resistivo, vacias el deposito y mides el valor de la entrada analógica, ese será el mínimo. Luego llenas el depósito, vuelve a tomar el valor y ese será el máximo.

Cuando tienes el valor minimo y máximo, usas la función map:

int minimo;  // calculados los valores.
int maximo;

void setup() {
}

void loop() {
   valor = analogRead(A1);
   porcentaje = map(valor, minimo, maximo, 0, 100);
}

Aunque estoy de acuerdo con Surbyte, no me gusta meter mucha corriente en ese circuito si tenemos un combustible como la gasolina o el diesel.

victorjam:
Puede que sea esto:

valorPot = analogRead(1); // Yo pondria A1.

En un libro me dice 1, 2, 3.... Pues sí, me gusta más el A1, A2, A3..... Lo haré. Gracias.

victorjam:
Luego simplificaría la creación del objeto lcd:

//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Lo había puesto al revés.

victorjam:
¿Por qué no haces un calibrado del depósito? Montas un divisor resistivo, vacias el deposito y mides el valor de la entrada analógica, ese será el mínimo. Luego llenas el depósito, vuelve a tomar el valor y ese será el máximo.

Porque el propietario y jefe taller no quiere. Es gastar dinero cuando hay clientes esperando. No estoy en una casa, sino en cuna casa oficial de vehículos. No puedo hacer lo que me de la gana, solo lo que hay y joderme.

victorjam:
Cuando tienes el valor minimo y máximo, usas la función map:

int minimo;  // calculados los valores.

int maximo;

void setup() {
}

void loop() {
  valor = analogRead(A1);
  porcentaje = map(valor, minimo, maximo, 0, 100);
}

Lo tengo claro y lo comento en un libro, lo que el map no usa los coma flotantes, solo enteros, por eso no he usado el map.

victorjam:
Aunque estoy de acuerdo con Surbyte, no me gusta meter mucha corriente en ese circuito si tenemos un combustible como la gasolina o el diesel.

También estoy de acuerdo.

Sigo con el proyecto... Mostraré más avances...

Porque el propietario y jefe taller no quiere. Es gaster dinero cuando hay lientes esperando. No estoy en una casa, sino en cuna casa oficial de vehículos. No puedo hacer lo que me de la gana, solo lo que hay y joderme.

Esos jefes asi me matan..., bueno, espero que solo tengas que hacer un aforador... si tienes que hacer más ten en cuenta que no hay dos aforadores iguales, para este la resistencia es de 23 a 278, pero para otro puede ser otro valor y todos se CALIBRAN desde casa del fabricante del vehículo.

Me acabo de dar cuenta de otra cosa, dices que no usas map por que no usa float. Eso en realidad no importa tu entrada analogica te devuelve un entero que luego haces la operación A1*5.0/1023.0, pero puedes obviar eso, si el AD te da de minimo por ejemplo 20 y de maximo 410 (por decir, me he inventado los numeros) cuando hagas el map:

porcentaje=map(valorAD, 20, 410, 0, 100);

te va a dar un resultado entero entre 0 y 100, tampoco creo que sea necesario que te diga 48.45 por ejemplo.

De todas formas:

float mapfloat(long x, long in_min, long in_max, long out_min, long out_max)
{
 return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

Hay tienes la función para float sacada de este mismo foro.