ACS712

From ElectroDragon Wiki

Schematic

  • For redesigning this module, note to enlarge the trace line to accept the large current flow

ACS712 Sensor schematic.jpg

How to Use

DC current measurement

void setup() {

Serial.begin(9600);
}

void loop() {
float average = 0;
for(int i = 0; i<= 1000; i++) { // sample 1000 times by 1 ms
        average = average + (.0264 * analogRead(A0) -13.51);
        delay(1);
}
Serial.print(average);
Serial.println("mA");

}

AC current measurement

Working Principle

  • Read the Vrms from the device:

VPP-VPEAK-RMS.png

Conversion for a sine wave with a zero volt offset (like your mains or line power) is performed as follows…

  1. Find the peak to peak voltage ( Volts Peak to Peak )
  2. Divide the peak to peak voltage by two to get peak voltage (Volts Peak)
  3. Multiply the peak voltage by 0.707 to yield rms volts (Volts RMS)
  • First read Vrms, then convert it to Arms:
Acs712 selection guide.png
AmpsRMS = (VRMS * 1000)/mVperAmp;
  • in which:
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module
  • The maximium output voltage is 3.5 for 5A, and 4.5 for 10A

Acs712 5A 3.5.png

Use Filiter Library

#include <Filters.h>

float testFrequency = 60;                     // test signal frequency (Hz)
float windowLength = 20.0/testFrequency;     // how long to average the signal, for statistist
int sensorValue = 0;
float intercept = -0.1129; // to be adjusted based on calibration testing
float slope = 0.0405; // to be adjusted based on calibration testing
float current_amps; // estimated actual current in amps

unsigned long printPeriod = 1000; // in milliseconds
// Track time in milliseconds since last reading 
unsigned long previousMillis = 0;

void setup() {
  Serial.begin( 57600 );    // start the serial port
}

void loop() {
  RunningStatistics inputStats;                 // create statistics to look at the raw test signal
  inputStats.setWindowSecs( windowLength );
   
  while( true ) {   
    sensorValue = analogRead(A0);  // read the analog in value:
    inputStats.input(sensorValue);  // log to Stats function
        
    if((unsigned long)(millis() - previousMillis) >= printPeriod) {
      previousMillis = millis();   // update time
      
      // display current values to the screen
      Serial.print( "\n" );
      // output sigma or variation values associated with the inputValue itsel
      Serial.print( "\tsigma: " ); Serial.print( inputStats.sigma() );
      // convert signal sigma value to current in amps
      current_amps = intercept + slope * inputStats.sigma();
      Serial.print( "\tamps: " ); Serial.print( current_amps );
    }
  }
}
Testing Results
  • 220V 42W Home Fan (42/220 = 0.19)

Standby:

sigma: 0.98	amps: -0.00
sigma: 0.89	amps: -0.00
sigma: 2.76	amps: 0.07
sigma: 2.92	amps: 0.08

Running:

sigma: 2.86	amps: 0.08
sigma: 2.86	amps: 0.08
sigma: 2.93	amps: 0.08
sigma: 6.13	amps: 0.21
sigma: 6.00	amps: 0.20
sigma: 5.98	amps: 0.20
  • 220V 13W Lamp (13/220 = 0.06)
sigma: 3.11	amps: 0.09
sigma: 3.12	amps: 0.09
sigma: 3.16	amps: 0.09

Simplified AC current measurement demo code

Code reference from here.

/*
Measuring AC Current Using ACS712
*/
const int sensorIn = A0;
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;



void setup(){ 
 Serial.begin(9600);
}

void loop(){
 
 
 Voltage = getVPP();
 VRMS = (Voltage/2.0) *0.707; 
 AmpsRMS = (VRMS * 1000)/mVperAmp;
 Serial.print(AmpsRMS);
 Serial.println(" Amps RMS");

}

float getVPP()
{
  float result;
  
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here
  
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
   {
       readValue = analogRead(sensorIn);
       // see if you have a new maxValue
       if (readValue > maxValue) 
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       if (readValue < minValue) 
       {
           /*record the maximum sensor value*/
           minValue = readValue;
       }
   }
   
   // Subtract min from max
   result = ((maxValue - minValue) * 5.0)/1024.0;
      
   return result;
 }

Datasheet