Evitar fluctuaciones a la hora de imprimir voltaje con INA219

Buenas, he usado un INA219 para medir Voltaje e Intensidad y reflejarlo en una pantalla Nextion. Funciona todo bien, pero me surge una duda que no se hacer,
Al imprimir en la pantalla los valores fluctúan mucho, por ejemplo si en la fuente de alimentación pongo 12,8V en la nextion fluctúa entre 12,7 - 12,8 -12,9.
Como puedo hacer para que la medición no fluctué.
EL código es este:

#include <Wire.h>
#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;

void setup(void)
{
  uint32_t currentFrequency;
  Serial2.begin(115200);
  ina219.begin();
}

void loop(void)
{
  float busvoltage = 0;
  float current_mA = 0;
  float current_A = 0;

  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  current_A = current_mA / 1000;

  Serial2.print("Voltimetro.txt=");
  Serial2.write(0x22);
  Serial2.print(busvoltage + 0.4);
  Serial2.write(0x22);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);

  Serial2.print("Amperimetro.txt=");
  Serial2.write(0x22);
  Serial2.print(current_A - 0.38);
  Serial2.write(0x22);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

Usa algun tipo de filtro.
El promedio es el mas fácil, la mediana es mas efectiva.
Busca Luis Llamas mediana y verás.

Gracias Surbyte por la ayuda, lo he leído como tres veces, pero se escapa a mis conocimientos.
En mi caso el INA219 solo va a medir de 0 V a 24V.
Antes de postear busque en el foro "promedio de medición de sensores" y encontré algunos ejemplos donde como intervienes tu.
Pero no soy capaz.
Gracias

Se refiere a que hagas un muestreo previo a mostrar los datos y saques un promedio de los valores o una mediana (Matemáticas). Hay librerías que lo hacen pero tampoco es que sea complicado.

Básicamente es obtener una serie de resultados en X tiempo y aplicar la fórmula de la
Mediana
El promedio es una simple media entre los datos que aunque más rápida y simple de hacer no va ser tan real cómo la mediana.

Aparte, no sé si en tu caso un condensador ayudará a mantener estable mejor las mediciones.

Si, probé a poner un condensador, pero el mismo resultado, El problema no creo que este ni en el INA219 ni en el Arduino, creo que esta en la Pantalla, ya que si este mismo Código lo implanto en un LCD de 2x16 por I2C la medida no fluctúa, con lo cual la fluctuación puede ser a la comunicación Serial de la pantalla. Pero no estoy seguro

Si con una pantalla X y comunicación X tienes problemas y con otra NO manteniendo el mismo código se sobreentiende que el problema no son las pantallas.
O bien un sistema de comunicación es más lento que el otro, lo que explicaría que una opción mostrase fluctuaciones, o bien hay algún problema a la hora de montar el circuito, pero ya estas cosas son más del la sección hardware.

Igual veo recomendable la idea de promediar o hallar la media con independencia de esto. Hasta para leer una simple fotorresistencia es útil.

No es nada complicado es hallar los valores con un timer, sumarlos y dividir, la media de toda la vida y la mediana es sólo hallar los valores en medio e incluso puedes aplicar la fórmula.
Si promedias y hallas la mediana y vieses fluctuaciones grandes entonces SÍ sabrías que hay algo en el hardware que no va.

Consejo cuando promedies: la operación (suma y dividir) usa un float, luego ese valor pásalo a un int usando roud para evitar redondeos por defecto en vez de por exceso.

Esto es lo que te había sugerido. Leer la expicación de Luis Llamas es más que suficiente.

Me hace un poco de ruido este comentario. Tal vez lo mal interprete.
Cuando sumes usa un float => NO usa un unsigned int si sabes que la suma no superará 2^16 = 65535 de lo contrario unsigned long.
No tiene sentido usar float 4 bytes para valores de un ADC que vienen como unsigned int.
Como dije para pocos valores me quedo en unsigend int y para valores que superen el máx o sea 65535/1023 = 64
Luego de 64 valores tendras un overflow un rebalse en la suma si usas unsigend int. Ni hablar si usas int solamente, lo tendras a los 32 (aclaro que no hice la cuenta)

Luego que tienes la suma ahi si usar float para calcular el promedio porque se trata de una operación con decimales o sea real, no entera.

@Surbyte Yo veo que soy nuevo en el foro y que tengo ya alguna respuesta suya un tanto extraña.
Una yéndose del hilo por opinar diferente a usted, otra una advertencia por no poner los tags en una línea de código y ahora la forma en la que se expresa con este comentario aquí, ya que por "ruido" se entiende que es molesto.
Quizás sea yo quien malinterprete... Pero veo que usted es el moderador. Algo extraño algunas expresiones que usa.

Va a queja por día que llevo aquí :slight_smile:
Le podría explicar a usted y al autor de la duda a qué me refiero pero prefiero hacer cómo usted en el otro hilo y retirarme tranquilamente :slight_smile: Quizás era la idea desde el primer día. Un cordial saludo.

Bueno os doy las gracias a los dos, se que lo que me planteáis es fácil, para mi no lo es, he leído todo lo que me habéis mandado y matemáticamente se ve fácil, pero no soy capaz de implantarlo en mi código.
Tampoco es algo que me perturbe mucho que fluctué la medición, solo que lo quería dejar sin esas fluctuaciones.

Como no me gusta que se queden los post hasta el infinito sin una respuesta,
Por favor podéis cerrar este post.

Muchas Gracias a los dos.

Has visto la página de Luis Llamas?

Si surbyte, lo lei varias veces, y he visto videos en youtube de TutoElectro y de Electgpl hablando del tema, pero hay muchos conceptos de programación que se me escapan, pienso que lo mejor será seguir estudiando y cuando tenga conceptos mas avanzados podre hacerlo.
Este foro ayuda mucho, no tengo muchos post, pero los pocos que tengo he aprendido mucho.
Muchas Gracias.

Si me permites, lo mejor es tomar el ejemplo de Luis Llamas y entenderlo.
Hazlo y luego pregunta por tus dudas y entonces lo podrás aplicar a tu necesidad.
Por cierto, te sugiero ese ejemplo porque la mediana es mejor que el promedio o la media, pero si te alcanza con promediar, pues es leer N datos, sumarlos y luego dividir por las N muestras tomadas.
Profundizo.
Quieres 10 muestras, entonces leo mi sensor 10 veces, cada vez lo agrego a un sumador que previamente puse a 0.
Al final tengo un valor con 10 sumas que divido por 10 y me da el promedio.
En tu caso tiene 10 lecturas
veamos para tensión

 int N = 10;     // N no debe superar 
 float sumoV = 0;
 float sumomA = 0;
 for (int i=0; i<N; i++) {
        sumoV = ina219.getBusVoltage_V();
        sumomA = ina219.getCurrent_mA();
}
busvoltage = sumoV / N;         // valor promediado de tension V
current_mA = sumomA / N;    // valor promediado de corriente mA

La versión de Luis Llamas mejora esto haciedo que se descarte el termino mas viejo y se agregue el nuevo por lo que el promedio es mas rápido de calcular.

Gracias Surbyte, pero por lo que veo el promedio no me vale, he probado lo que me has mandado y oscila mas que antes, ya me da que pensar que pueda ser otra cosa, aunque lo tengo todo con cables muy cortos y puse incluso un condensador, o es problema de la Nextion.
Estudiare lo de la mediana.
Gracias

El problema jamás puede estar en el instrumento que usas para presentar la información Nextion, o monitor Serie.
Oscila mas que antes, dices. Muy seguramente se ha intensificado el problema físico y justamente eso es lo que genera toda la perturbación.
Identitiquemos el problema entonces.

Puedes hacer un esquema a mano alzada, tomas una foto y lo subes aquí, eso ayudará a entender lo que pasa.
Mide con tu tester las lecturas que te estan dando con ruido. Coloca el tester en CA y mide ese ruido también, debe ser de varias centenas de mV.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.