# Smooth para un float

Hola buenos días, tengo un programa para leer el desfase de corriente:

Tengo conectada una pantalla lcd liquid crystal:

``````#include <LiquidCrystal.h>
#include <math.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pin = 13;
const int capacitor = 6;
float degree = 360;
float frequency = 50;
float nano = 1 * pow (10,-6); // Multiplication factor to convert nano seconds into seconds

// Define floats to contain calculations

float pf;
float angle;
float pf_max = 0;
float angle_max = 0;
int ctr;

//float positivo;

void setup()
{
pinMode(pin, INPUT);
pinMode(capacitor, OUTPUT);
lcd.begin(16, 2);
}

void loop()
{

for (ctr = 0; ctr <= 10; ctr++) // Perform 4 measurements then reset
{
// 1st line calculates the phase angle in degrees from differentiated time pulse
// Function COS uses radians not Degree's hence conversion made by dividing angle / 57.2958
angle = ((((pulseIn(pin, HIGH)) * nano)* degree)* frequency);

if (angle > angle_max) // Test if the angle is maximum angle
{
angle_max = angle; // If maximum record in variable "angle_max"
pf_max = cos(angle_max / rads); // Calc PF from "angle_max"
}
}
//if (angle_max > 360) // If the calculation is higher than 360 do following...
if (angle_max > 360)
{
angle_max = 0; // assign the 0 to "angle_max"
pf_max = 1; // Assign the Unity PF to "pf_max"
}
if (angle_max == 0) // If the calculation is higher than 360 do following...
{
angle_max = 0; // assign the 0 to "angle_max"
pf_max = 1; // Assign the Unity PF to "pf_max"
}
/*if(pf_max<=0){
pf_max=0;
}*/
/*if((pf_max>=0.82) && (pf_max <= 0.83)){
digitalWrite(capacitor, HIGH);

}
else{
digitalWrite(capacitor, LOW);
}
*/
if((pf_max>=0.92) && (pf_max <= 0.99)){
digitalWrite(capacitor, LOW);

}
else{
digitalWrite(capacitor, HIGH);
}

//positivo = pf_max;
/*Serial.print(angle_max, 2); // Print the result
Serial.print(",");
Serial.println(pf_max, 2);
Serial.println(fabs(caca));*/

lcd.clear();
lcd.setCursor(0,0);
lcd.print("PF=");
lcd.setCursor(4,0);
lcd.print(pf_max);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Ph-Shift=");
lcd.setCursor(10,1);
lcd.print(angle_max);
lcd.print(" ");

delay(1000); //tiempo de escaneo
angle = 0; // Reset variables for next test
angle_max = 0;
}
``````

Estoy intentando poner un smoothing o averange para "PF_max" que es el factor de potencia para que no cambie tan bruscamente, pero no puedo hacer que haga uno con float, ya que todos los ejemplos o librerías son con enteros o directamente lo leen desde los pines analógicos.

Hay alguno para floats?

Antes que nada, comprobaste la salida de la compuerta con un Osciloscopio?

Ambas señales hacen un cruce por cero y eso pasa por la XOR, verifica que tienes un pulso de un ancho proporcional al desfaseje Tension-Corriente.

surbyte:
Antes que nada, comprobaste la salida de la compuerta con un Osciloscopio?

Ambas señales hacen un cruce por cero y eso pasa por la XOR, verifica que tienes un pulso de un ancho proporcional al desfaseje Tensión-Corriente.

Si, funciona todo bien, lo tengo probando con una luz led, con una de bajo consumo y una resistiva.
Quiero ponerle un smoothing para que los valores no cambien tan rapidos y para que se muevan mas suave, la verdad es que no sabia si iba a funcionar este proyecto pero termino siendo bastante preciso.

Si claro que lo es.

Y el resultado de pulsein cual es.. puedes poner un listado de valores leidos. No el promedio.. solo lo que pulsein devuelve.