AC Energy Meter calculation using ACS712 ..#2

Thread Starter

Deepthi@

Joined Jun 15, 2021
1
Experts! Shout for help again!

I'm trying to build an AC power/energy meter for some project of mine. I'm using the ACS712 Hall Effect current sensor for this project due to its compact size and very high output linearity. I'm using the 30A version of this sensor. I use the ADS1115 16bit ADC to read the output from ACS712 and process it in the code.

I'm building this on an ESP8266 microprocessor board using Arduino IDE. Below is my code for calculating the power. As a starting point, I've taken the code for now from:

https://www.instructables.com/id/Arduino-Energy-Meter-V20/

C:
// Arduino Energy Meter V2.0
// This code is for This code is for Wemos(ESP8266) based Energy monitoring Device
// This code is a modified version of sample code from https://github.com/pieman64/ESPecoMon
// Last updated on 30.05.2018
#include <Wire.h>
#include <Adafruit_ADS1015.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

Adafruit_ADS1115 ads(0x48);  /* Use this for the 16-bit version */


#define SERIAL_BAUD 115200
int ledPower = 12;
// ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV (default)
// ads.setGain(GAIN_ONE);     // 1x gain   +/- 4.096V  1 bit = 2mV
// ads.setGain(GAIN_TWO);     // 2x gain   +/- 2.048V  1 bit = 1mV
// ads.setGain(GAIN_FOUR);    // 4x gain   +/- 1.024V  1 bit = 0.5mV
// ads.setGain(GAIN_EIGHT);   // 8x gain   +/- 0.512V  1 bit = 0.25mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain  +/- 0.256V  1 bit = 0.125mV

unsigned int Sensitivity = 66;   // 185mV/A for 5A, 100 mV/A for 20A and 66mV/A for 30A Module
float Vpp = 0; // peak-peak voltage
float Vrms = 0; // rms voltage
float Irms = 0; // rms current
float Supply_Voltage = 247.0;           // reading from DMM
float Vcc = 5.0;         // ADC reference voltage // voltage at 5V pin
float power = 0;         // power in watt         
float Wh =0 ;             // Energy in kWh
unsigned long last_time =0;
unsigned long current_time =0;
unsigned long interval = 100;
unsigned int calibration = 12;  // V2 slider calibrates this
unsigned int pF = 85;           // Power Factor default 95


void getACS712() {  // for AC
  Vpp = getVPP();
  Vrms = (Vpp/2.0) *0.707;
  Vrms = Vrms - (calibration / 10000.0);     // calibtrate to zero with slider
  Irms = (Vrms * 1000)/Sensitivity ;
  if((Irms > -0.015) && (Irms < 0.008)){  // remove low end chatter
    Irms = 0.0;
  }
  power= (Supply_Voltage * Irms) * (pF / 100.0);
  last_time = current_time;
  current_time = millis();
  Wh = Wh+  power *(( current_time -last_time) /3600000.0) ; // calculating energy in Watt-Hour

  Serial.print("Irms:  ");
  Serial.print(String(Irms, 3));
  Serial.println(" A");
  Serial.print("Power: ");
  Serial.print(String(power, 3));
  Serial.print(" W");
  Serial.print("\t Energy Unit(s) (KWh): ");
  Serial.println(String((Wh/1000), 4));

}

float getVPP()
{
  int16_t adc1;
  float result;
  int readValue;           
  int maxValue = 0;        
  int minValue = 32768;     
  uint32_t start_time = millis();



  while((millis()-start_time) < 950) //read every 0.95 Sec
  {
     readValue = ads.readADC_SingleEnded(1);
     if (readValue > maxValue)
     {    
         maxValue = readValue;
     }
     if (readValue < minValue)
     {     
         minValue = readValue;
     }
  }
   result = ((maxValue - minValue) * Vcc) / 32768.0;
   Serial.print("\nVp-p:  ");
   Serial.println(String(result, 3));

   return result;
}


void setup() {

  Serial.begin(115200);
  Serial.println("\n Rebooted");
  Serial.begin(SERIAL_BAUD);

  while(!Serial) {} // Wait
  Wire.begin(D3,D4); //Changed defaults to match ESP8266 pin connections: 23 - SDA, 24 - SCL
  ads.begin();

  WiFi.begin("Tulsani", "homenetwork");
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  pinMode(ledPower,OUTPUT);

}

void loop()
{

  getACS712();
  delay (2000);
}
For testing, I'm using a 200W filament bulb as load.

Issue that I'm facing is:
- When I check the current on my DMM, it shows approx 0.8A of current drawn
- Output of the ESP8266, using the above code, shows me a current drawn of approx 1A

AC voltage seen on my DMM is approx 245V (I know its on the higher side. It should be around 230V, but what to do ... its India).

Can someone help me understand/identify where am I going wrong or where the code is going wrong? Would be of immense help!

Regards,
Deepak
Are the below any good to get a baseline/crude figure for PF? I assume that this will show me the PF for the load that is connected to it?

https://www.amazon.in/Techno-Single-Phase-Power-Factor/dp/B00Z16DNT8



https://www.amazon.in/Caldipree-Dig...1535037593&sr=1-8&keywords=power+factor+meter
Sir May I know why you made of as default bcoz of varies device to device kindly tell me sir


Link to old Thread.
https://forum.allaboutcircuits.com/...-calculation-using-acs712.150636/post-1299207
 
Last edited by a moderator:

Privatier

Joined Dec 10, 2008
7
I suggest that the author submits the question in his/her native language and then hopefully we find somebody who can translate the request into English which engineers can understand.
 
Top