The Allegro AC758 allows for high current measurements. Coupled with
the isolation benefits of a hall sensor, the power supply requirements and output values make it a
nice fit for an Arduino.
My bench tests show the module to be very functional. What’s not included in these tests is a
determination of whether the module is fit for long term continuous service at peak current. If your
intent is to create a permanent solution, I would do that analysis.
Finding an ACS758
Given the current sensor range, I would consider these reasonably priced.
eBay Amazon
Getting an ACS712
They are readily available at any of the following vendors:
The uni-directional sensors measure current in one direction only and thus allow for a larger scale
factor. This larger scale factor, when properly designed for, can offer better measurement resolution.
Successfully using this sensor requires applying the correct scale factor and offset. The table below
is derived from the ACS758 Datasheet.
Key in the picture below is the reminder to make solid connections. Things heat and burn pretty
quickly if you don’t.
Upload the Arduino ACS758 Tutorial Sketch
The example code here should be modified to match your particular sensor. Either refer to the
comments in the code or in the table above.
/*
Henry's Bench
*/
/* Scale Factors
50A bi-directional = 40
50A uni-directional = 60
100A bi-directional = 20
100A uni-directional = 40
200A bi-directional = 10
200A uni-directional = 20
*/
/* Offsets
If bi-directional = 2500
*/
int RawValue= 0;
double Voltage = 0;
double Amps = 0;
void setup(){
Serial.begin(9600);
void loop(){
RawValue = analogRead(analogIn);
Serial.print(RawValue);
delay(2500);
With both peaks known, it is a matter of knowing the shape of the waveform to calculate the
current. In the case of line or mains power, we know that waveform to be a SINE wave. Knowing
that allows us to apply a basic electronic formula to yield a decent result.
In most cases, an expression of AC current will be in a value known as RMS. In order to use the
ACS712 current sensor to measure AC current, it is important to understand how to calculate an
RMS current value from the device readings.
The formula that is applied here is very basic and is right out of any basic electricity or electronics
manual.
With an ACS712, current measurements are reported with a voltage output. In this tutorial, we will
calculate the RMS volts and apply the ACS712 scale factor.
Conversion for a sine wave with a zero volt offset (like your mains or line power) is performed as
follows…
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)
Having Calculated RMS voltage, is simply a matter of multiplying by the scale factor of the
particular ACS712 to yield the RMS value of the current being measured.
The values out of the ACS712 are constantly changing when measuring AC Current. In order
ensure that you have come very close to finding the peaks, you need to sample fast enough and long
enough. Because mains or line power is at a frequency of 50 to 60 hz, the Arduino will be fast
enough provided it takes consecutive samples with little or no interruption.
Fundamental to performing this tutorial safely is knowing what the current rating of your ACS712
and the amount of current that your load requires.
Connect the components as shown
below:
Copy, Paste and Upload the code below. Also take a look at how I make a call to the ‘getVPP‘
function from the main loop. In that function, I take interupted AC samples for one second while
recording the maximum and minimum values. From this I will calculate the peak to peak voltage
measured. I’ve found this to be extremely effective for line power frequencies.
Mind you, my power is pretty clean. If you’ve got a lot of spikes, getting a meaningful measurement
could be tough.
/*
*/
double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;
void setup(){
Serial.begin(9600);
void loop(){
Voltage = getVPP();
Serial.print(AmpsRMS);
Serial.println(" Amps RMS");
float getVPP()
float result;
readValue = analogRead(sensorIn);
minValue = readValue;
return result;