desktop

¿Acondicionar señal del potenciometro de combustible?

El depósito de combustible tiene generalmente la forma que encuentra el fabricante para que colocandolo en el lugar donde lo ubican tenga la capacidad que necesita el diseño del automóvil para tener una autonomía que considera aceptable.

Suelen ser con molduras y formas que no es fácil de calcular mediante una fórmula la capacidad vs. nivel aunque el flotante y su parte electrónica tenga un desplazamiento totalmente lineal o ajustable matemáticamente por eso la solución ya se dio aquí y es aforar mediante volúmenes conocido lo desconocido.( lease tabla capacidad/nivel del flotante).

Eso no se compensa desde "afuera" con la implementación ni de un divisor resistivo, ni con un AO en el modo que quieras.

PD:nos cruzamos con Scooter en el concepto a mostrar
 
Ciertamente los aforadores de los depósitos nunca han sido lineales, recuerdo que el primer cuarto me duraba x km el segundo cuarto y km etc, en su día me lo sabía y ya está.
La cuestión es que como ahora se puede ir ajustanto mejor, pues eso.

Se puede hacer también una "calibración de manos limpias" que por otra parte sería mejor:
Llenas a tope el depósito y apuntas, en el mismo arduino con una función específica 0km
Cada cuando te apetezca con el coche parado y estabilizado copias los km que llevas y se anotan con la lectura del conversor.
Eso lo haces todas las veces que quieras y tienes una relación lectura km...
Lo malo es que para aforar la parte final debarías de esperar a que se pare y eso en según que coche puede ser muy conflictivo; purgar la bomba y cosas así.
De este modo tendrías una relación de consumos interesante. Habría que hacerlo en diferentes modos de conducción, claro.

Mira, proyecto extendido, que otro pin del arduino reciba pulsos de cuenta km.
 
Buenas de nuevo:

Les había comentado hace siglos, que haría una prueba en Visual C#.

En una aforadora, bomba de combustible, tiene una resistencia de 23 a 278 Óhmios. En la pantalla, tiene que demostrar porcentaje del 0 % al 100 %.

matem%C3%A1ticas-jpg.318941


Como cada aforadora o bomba de combustible el mínimo y el máximo varía según su tolerancia, pues se mide con el tester, y se introduce aquí los datos. Dejo el código completo aquí abajo hecho con Visual Studio Community 2022 .Net 8.0

Código C#.
C#:
namespace Bomba_combustible_adoradora_.NET_8._0___01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        double a, b, c, d, porcentaje100, resultado;
        private void button_Resultado_Click(object sender, EventArgs e)
        {
            
            a = Convert.ToDouble(textBox_a.Text);
            b = Convert.ToDouble(textBox_b.Text);
            c = Convert.ToDouble(textBox_c.Text);
            d = Convert.ToDouble(textBox_d.Text);
            porcentaje100 = Convert.ToDouble(textBox_100.Text);

            resultado = (a - b) / (c - d) * porcentaje100;

            label_Resultado.Text = resultado.ToString("0.00") + " %";
        }
    }
}

Sabiendo esto, ya se podrá añadir una buena barra en el LCD de Arduino y que por fin muestre de 0 al 100 %, ya que aquí en este tema, hay gente que se creía que no era posible y si lo es.

Sigo experimentando.
 

Adjuntos

  • Matemáticas.jpg
    Matemáticas.jpg
    23 KB · Visitas: 43
En Arduino es así:
Código:
#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;
float valorOhmicoMinimo = 23;   // Valor óhmico mínimo.
float valorOhmicoMaximo = 278;  // Valor óhmico máximo.
float valorMinimo = 23;   // Valor mínimo.
float porcentaje100 = 100;
float resultado  = 0;
float resultadoFinal = 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("      HOLA      ");
  delay(2000);
}

void loop()
{
valorPot = analogRead(1);
  //voltajePot = valorPot * (5.0 / 1023.0);
  //porcentaje = valorPot * (100.0 / 1023.0);

resultado = (valorPot - valorOhmicoMinimo) / (valorOhmicoMaximo - valorMinimo) * porcentaje100;
resultadoFinal = porcentaje100 - resultado;

lcd.setCursor(0, 0);
lcd.print("Gasolina ");
//lcd.setCursor(10, 0);
lcd.print(resultadoFinal);

}

Como la gente se estalla y cambian de coche. En Arduino por el serial monitor quiero de la mejor manera que te pida estos mensajes desde que lo inicies.


Introduce el valor mínimo de la resistencia: 23
Introduce el valor máximo de la resistencia: 278

Se guarda en memoria EEPROM estos dos valores, 23 y 278. Acto seguido, ya empieza a funcionar Arduino. Si se ha vuelto a estallar, en el cual cambia de coche, pues con un pulsador, indique otra vez la introducción de valores.

Pueden dar mejores ideas que yo en este aspecto.

Post Data:
No se estrellen tanto. :ROFLMAO: :ROFLMAO: :ROFLMAO:
 
En una aforadora, bomba de combustible, tiene una resistencia de 23 a 278 Óhmios. En la pantalla, tiene que demostrar porcentaje del 0 % al 100 %.
Lamentablemente tu idea no funciona por que la medición del nivel de combustible en el depósito no es lineal con la resistencia del potenciómetro, así que tu equivalente a la función map() de Arduino es inaplicable.
La forma correcta de hacerlo es como te comebtó @Scooter un par de mensajes atrás:
Hay que llenar el tanque de combustible con cantidades conocidas de líquido y tomar el valor del potenciómetro en cada una de ellas. Luego hay que ajustar una curva que coincida con las lecturas de resistencia vs. volumen registradas y recién ahí podrás convertir a un valor entre 0 y 100%.
Lo siento, pero tu cálculo es tan malo como las indicaciones actuales de los medidores de nivel de combustible.
 
No son mis cálculos pero bueno, y si, son lineales me dijeron unos matemáticos.
matem%C3%A1ticas02-jpg.318959
matem%C3%A1ticas03-jpg.318960

---
Variación lineal. La resistencia es directamente proporcional al ángulo de giro. Denominados con una letra B, según la normativa actual (anteriormente, A).
Variación logarítmica. La resistencia depende logarítmicamente del ángulo de giro. Denominados con una letra A, según normativa actual (anteriormente, B).
Variación senoidal. La resistencia es proporcional al seno del ángulo de giro. Dos potenciómetros senoidales solidarios y girados 90° proporcionan el seno y el coseno del ángulo de giro. Pueden tener topes de fin de carrera o no.
Variación antilogarítmica. La resistencia es directamente proporcional a 10 con potencia el ángulo girado. Generalmente denominados con la letra F o la letra C.
Variacion de balance. Se utiliza principalmente en audio para obtener la misma salida en dos canales en configuración estéreo. Para esto se utiliza un potenciómetro doble, el cual obtiene su máximo valor resistivo en el centro del potenciómetro y el mínimo en los extremos. Generalmente este lleva una detención en el centro para que la salida sea simétrica, y suele denominarse con las letras MN.
Lo que dices arriba, de tomar valores según el porcentaje, es un método, este de variar el potenciómetro es otro método, los dos valen.

De todas maneras, haré pruebas reales, de lo segundo.

El 23 Óhmios que es el 100 %. El potenciómetro no es 0 o no llega a 0 Óhmios porque lo hicieron así adrede.

¿El motivo?

La centralita, Arduino, PIC16F84A, Pentium III, Spectrum, etc detecta 0 Óhmios, indica que se soltó un cable, circuito abierto, o cortocircuito a masa. En el cuadro ya indica error, un buen aviso de error y no quedarte pensando que es lo que pasa antes de estrellarte.

Haber si hago un diagrama de flujo de lo que quiero el programa de Arduino. Introduces un valor mínimo, 23, el máximo, 278. Esos valores se guarda en su EEPROM interna para que no vuelva a pedirlo al reiniciar el sistema (Arduino).
Luego lee condiciones, del 23 Óhmios al 278 Óhmios. Expresado de 0% al 100 % de gasolina o lo que le hechen, :ROFLMAO: :ROFLMAO: :ROFLMAO: :ROFLMAO:

En cuanto a la función map, a parte que no tiene decimales, solo puro enteros, tiene otra fórmula y por supuesto, no sirve. Hace tiempo hice una función map con float en librería a parte, deja ver si lo encuentro.
 

Adjuntos

  • Matemáticas02.jpg
    Matemáticas02.jpg
    27.2 KB · Visitas: 28
  • Matemáticas03.jpg
    Matemáticas03.jpg
    25.2 KB · Visitas: 28
Última edición:
No son mis cálculos pero bueno, y si, son lineales me dijeron unos matemáticos.
El potenciómetro puede ser lineal, y seguramente lo es, pero lo que NO es lineal es el movimiento del eje del potenciómetro respecto al volumen del líquido en el tanque. Y esto es por que los tanques no son uniformes ni tienen formas regulares ya que van puestos en el lugar que queda libre en el chasis.
Imaginate un tanque de combustible que sea cilindrico y se coloque "acostado". El cambio de volumen no es el mismo si tiene 10mm de nivel de combustible que si tiene 20mm. Sacá la cuenta y vas a ver que el volumen con 20mm no es el doble que el volumen con 10mm...y ahí murió la linealidad.
Buscá en la web y vas a ver las diversas formas que tienen los tanques....
 
@

Dr. Zoidberg

Te entiendo lo que dices. Desde que mueva la bolla, que varía de 23 a 278 Ohmios, indica claramente el 0 % al 100 %, de eso se trata.


Es verdad que no es uniforme el depósito de gasolina en algunos coches, más bien muchos.

limpiar-deposito-combustible-1024x634.jpg

El cálculo matemático que te da el map, no sirve. El que puse si.

Por si no lo sabían, aquí un poco de GeoGgebra.


Cálculo hecho en C#.
C#:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        float valorPot, valorOhmicoMinimo, valorOhmicoMaximo, valorMinimo, porcentaje100, resultado, resultadoFinal;
        private void button_Resultado_Click(object sender, EventArgs e)
        {
           
            valorPot = (float)Convert.ToDouble(textBox_valorResistencia.Text);
            valorOhmicoMinimo = (float)Convert.ToDouble(textBox_b.Text);
            valorOhmicoMaximo = (float)Convert.ToDouble(textBox_c.Text);
            valorMinimo = (float)Convert.ToDouble(textBox_d.Text);
            porcentaje100 = (float)Convert.ToDouble(textBox_100.Text);

            resultado = (valorPot - valorOhmicoMinimo) / (valorOhmicoMaximo - valorMinimo) * porcentaje100;
            resultadoFinal = porcentaje100 - resultado;

            label_Resultado.Text = resultadoFinal.ToString("0.##") + " %";
        }
    }

Ya le pregunté el motivo del porqué no funciona según ustedes, ya les diré sus respuestas.

Gracias camaradas.
 
Última edición:
Te están diciendo que ese cálculo no es lineal.

Por ej., la tensión durante la carga de un capacitor, no es lineal. Podés aproximarla como si fuera lineal en un cierto punto, solo en caso de que te alejes en el tiempo muy poco, pero a medida que te vas alejando, esa linealidad ya no sirve.

Acá sucede lo mismo, vos estás linealizando todo el rango de 0 - 100%, pero que el valor inicial/final sean los correctos, no implican que un recta pueda establecer correctamente los valores en el medio.
 
Para empezar es un movimiento angular así que lineal es el ángulo.
La vertical sería algo relacionado con del sen(x) por la longitud del brazo.
Suponiendo que la bolla flote siempre igual porque lo mismo la resistencia del brazo cambia, si lleva un muelle, no sé si es por gravedad y se hunde más o menos según el ángulo. O el propio peso del brazo que no afecte igual según el ángulo.
Pero vamos, brazo × sen(ángulo) sería lineal en la vertical.
Ahora como la sección es cambiante pues se acabó otra vez, u obtienes la ecuación de la sección del depósito en función de la altura o estás perdido.

Acabas antes llenando de 5 en 5l u tomando directamente la lectura del potenciómetro. Esos tramos los puedes considerar líneas rectas, que no serán pero mas o menos se aproximaran razonablemente.
En su defecto tras tomar esos 5, 19, 10000 puntos de llenado puedes usar un polinomio interpolador como el método de Runge-Kutta o como se escriba y sacarás algo más preciso que la poligonal, a cambio de mayor esfuerzo de cómputo.

Otra opción es dejarlo como está y poner un sistema que cuente con dos aforadores la gasolina que sale y la que vuelve y así contarlo.
PD este método no funciona porque el aforador de salida se ensucia. Comprobado.

No son mis cálculos pero bueno, y si, son lineales me dijeron unos matemáticos.
Cambia de "matemáticos" NPI tienen de matemáticas, ni de depósitos ni de aforadores, ni de ley de ohm ni de nada de nada. Que vuelvan a primaria.
Linealizar, se puede linealizar un pequeño intervalo de datos en el que sustituyes la ecuación de la función por un trocito de recta. Si el trocito curva es infinitesimal entonces es correcta, cuanto mas trozo linealizas mas error metes, si tomas como recta de A a B la curva entera, pues has hecho una porquería como un avión. Eso es como medir en un plano la distancia de la ciudad A a la B con una regla, eso da una idea de cuanta carretera hay pro no es la distancia que vas recorrer.
 
Las mediciones de nivel de combustible fueron historicamente NO lineal, incluso si mal no recuerdo eran hiperbolicas, y eso se veía en la manera en que estaba enrollado el alambre, cuando se pasó a placas de porcelana con la resistencia incrustada como si fuese un potenciometro de flyback, tiene mas que ver con la durabilidad que con la alta tensión, estos siguen siendo NO lineales, la razón es muy simple, de medio tanque hacia vacio, es medición es mas exacta que de la mitad hacia lleno.
 
Acabas antes llenando de 5 en 5l u tomando directamente la lectura del potenciómetro. Esos tramos los puedes considerar líneas rectas, que no serán pero mas o menos se aproximaran razonablemente.
En su defecto tras tomar esos 5, 19, 10000 puntos de llenado puedes usar un polinomio interpolador como el método de Runge-Kutta o como se escriba y sacarás algo más preciso que la poligonal, a cambio de mayor esfuerzo de cómputo.
Lo mas simple es tomar un conjunto de medidas de volumen y resistencia luego construir una lookup-table con valores interpolados linealmente (tantos como quieras). Luego solo es cuestión de medir, entrar a la tabla y tomar el valor mas cercano...o interpolar de nuevo...y punto final. Cero cálculo y máxima performance.
 
Buenas de nuevo:

Por lo que cuentan.

Mi idea es, depósito irregular vacío, es 278 Ohmios, lleno un 0.5 Litros y marco por donde anta la resistencia, así sucesivamente hasta llegar la bolla a 23 Ohmios, que es lleno al 100 %.

¿Es así?
 
Me da curiosidad, y mas allá de la linealidad o no.

Por qué no usas preset para el offset superior e inferior, y luego (ya que tienes el mínimo y el máximo medible), haz una simple regla de tres;
Rporcentaje = (Vpote / Vmáximo ) * 100

O sea, por ejemplo, si vas por la mitad (o sea 512, los mismo que 2,5Vcc) y el máximo es 1024 (5Vcc) y el mínimo 0 (0Vcc) del conversor ADC, entonces;

Rporcentaje = (512 / 1024) * 100
Rporcentaje = 0.5 * 100
Rporcentaje = 50%

Las medidas para el mínimo y máximo son simple.
Tester en modo para medir tensión contínua sobre el pin analógico del microcontrolador, y subes la bolla al máximo llenando el tanque o a mano, mides para que ajustando el preset te dé 5Vcc allí, luego vacías el tanque o bajas a mano la bolla y vuelves a medir para que te de 0Vcc, repite las veces que haga falta.

Yo creo que un preset en serie con una resistencia colocada a 5Vcc, y este al pin analógico, es para el máximo.
Luego un preset en paralelo a la entrada analógica y GND o 0Vcc, ese es el mínimo.

Entonces;

IMG_20230124_065332094_20240715131356490.jpg
 
Atrás
Arriba