Calculation of capacitor value for PFC using Arduino
By this Arduino project you can find out the capacitor value needed for PFC (Power Factor Correction) using arduino without any mathematical process.
Then i connect a capacitor with value given by arduino and the PF become unity
When no load connected
When the load is resistive
Parts list:
Arduino board
Energy meter module Pzem-004t
LCD 16x2 with I2C adapter board
Connecting wires
Wiring:
Video:
#include "math.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h> // Arduino IDE <1.6.6
#include <PZEM004T.h>
LiquidCrystal_I2C lcd(0x27,16,2);
PZEM004T pzem(2,3); // (RX,TX) connect to TX,RX of PZEM
IPAddress ip(192,168,1,1);
void setup() {
Serial.begin(9600);
pzem.setAddress(ip);
pinMode(9, OUTPUT);
}
void loop(){
float v = pzem.voltage(ip);
if (v < 0.0) v = 0.0;
Serial.print(v);Serial.print("V; ");
float i = pzem.current(ip);
if (i < 0.0) i = 0.0;
Serial.print(i);Serial.print("A; ");
float p = pzem.power(ip);
if (p < 0.0) p = 0.0;
Serial.print(p);Serial.print("W; ");
float Cap = ((((i)*sqrt(1-(((p)/(v*i))*((p)/(v*i)))))/(v*314))*1000000);
float PF = ((p)/(v*i));
Serial.print(Cap);Serial.print("uF ");
Serial.print("PF= ");Serial.print((p)/(v*i));
if (PF > 0.99){
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Resistive Load");
lcd.setCursor(0,1);
lcd.print("No Cap. Needed");
}
else if (PF < 0.99){
Serial.println();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Cap. Should Be =");
lcd.setCursor(3,1);
lcd.print(Cap);
lcd.setCursor(8,1);
lcd.print("uF");
}
if (i == 0.00){
lcd.init();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("No Load");
}
}
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h> // Arduino IDE <1.6.6
#include <PZEM004T.h>
LiquidCrystal_I2C lcd(0x27,16,2);
PZEM004T pzem(2,3); // (RX,TX) connect to TX,RX of PZEM
IPAddress ip(192,168,1,1);
void setup() {
Serial.begin(9600);
pzem.setAddress(ip);
pinMode(9, OUTPUT);
}
void loop(){
float v = pzem.voltage(ip);
if (v < 0.0) v = 0.0;
Serial.print(v);Serial.print("V; ");
float i = pzem.current(ip);
if (i < 0.0) i = 0.0;
Serial.print(i);Serial.print("A; ");
float p = pzem.power(ip);
if (p < 0.0) p = 0.0;
Serial.print(p);Serial.print("W; ");
float Cap = ((((i)*sqrt(1-(((p)/(v*i))*((p)/(v*i)))))/(v*314))*1000000);
float PF = ((p)/(v*i));
Serial.print(Cap);Serial.print("uF ");
Serial.print("PF= ");Serial.print((p)/(v*i));
if (PF > 0.99){
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Resistive Load");
lcd.setCursor(0,1);
lcd.print("No Cap. Needed");
}
else if (PF < 0.99){
Serial.println();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Cap. Should Be =");
lcd.setCursor(3,1);
lcd.print(Cap);
lcd.setCursor(8,1);
lcd.print("uF");
}
if (i == 0.00){
lcd.init();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("No Load");
}
}