ACS712 current sensor reads wrong at zero: offset, noise and 5 V supply

The ACS712 outputs about half the supply voltage at zero current. Measure that offset at start-up and subtract it.

What the message means

The output sits at the middle of its range and moves up and down with current. Supply changes move the middle point too.

Fix it in this order

  1. Power it from a stable 5 V and use the same supply as a reference where you can.
  2. Read the output with no load at start-up and store it as the zero point.
  3. Average many readings, since the signal is noisy.
  4. Scale by the sensitivity for your version, such as 185 mV per amp for the 5 A part.
  5. On a 3.3 V board divide the output so it stays within the pin limit.
  6. Use the sensor only for the range it is made for.

Why it happens

The ACS712 outputs half its supply voltage at zero current, about 2.5 V on 5 V, and the output moves by a fixed number of millivolts per amp that depends on the version (commonly 185, 100 or 66 mV/A for the 5 A, 20 A and 30 A parts). The signal is small and noisy, and a 3.3 V ADC cannot read a 5 V output without scaling.

Measure the zero-current reading at start-up and subtract it, average many samples, add a capacitor on the output, and divide the output down if your ADC is 3.3 V.

If you see this, do this

You seeDo this
Reads a few amps with no loadOffset. Zero it at start.
Noisy readingsAverage and add a capacitor.

INA219 current sensor, battery voltage monitor.

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

Why this happens

The ACS712 is a Hall-effect sensor. Current flowing through its internal copper path makes a magnetic field, and the chip turns this into a voltage. At zero current the output rests at half of the supply, so about 2.5 V on 5 V. It then moves by a fixed amount per amp: commonly 185 mV for the 5 A version, 100 mV for the 20 A version and 66 mV for the 30 A version. The output is ratiometric, so if the supply changes, the midpoint and the scale change with it.

The signal is small, so noise matters. On an Uno with a 10-bit ADC and a 5 V reference, one count is about 4.9 mV, which for the 5 A version is 4.88 / 185 = 0.026 A, or about 26 mA per count. A tiny load therefore disappears into the noise. A 20 A or 30 A part makes this worse, because its step is smaller per amp.

How to confirm the cause

  • Disconnect the load and measure the output pin with a multimeter. It should read about half of the supply voltage. Record the value.
  • Measure the supply at the sensor with the circuit running. If it is not 5.0 V, the midpoint and scale shift.
  • Print raw ADC counts with no load. On an Uno a good midpoint is near 512, and the readings should vary by only a few counts.
  • Put a known load in series, measure the current with a meter, and compare. A scale error shows as a constant percentage difference.
  • Run the motor or switching load and watch the noise. If noise rises, filter with a capacitor and more averaging.

Worked example

A 5 A module on 5.00 V: the zero point is 2.500 V. A reading of 2.685 V gives (2.685 – 2.500) / 0.185 = 1.00 A. The sketch measures the zero point at start-up, with no load.

const float SENS = 0.185;          // V per A, 5 A module
float zero;
float avgV(int n) {
  long s = 0;
  for (int i = 0; i < n; i++) s += analogRead(A0);
  return (s / (float)n) * 5.0 / 1023.0;
}
void setup() { Serial.begin(115200); zero = avgV(500); }
void loop() {
  Serial.println((avgV(100) - zero) / SENS, 2);
  delay(200);
}

Common mistakes

  • Starting the sketch with the load already running, so the zero point is wrong.
  • Using a 30 A sensor for a 1 A circuit and then complaining about resolution.
  • Feeding the 5 V output into a 3.3 V ADC without a divider.
  • Reading an alternating current by averaging, which gives zero. Use an RMS method instead.
  • Assuming the ADC reference is exactly 5.00 V when the board runs from USB.

If this did not fix it

  • Check that the sensor was not damaged by an overcurrent, which can leave the output stuck.
  • Check you are using the right sensitivity for your version, shown on the chip marking.
  • Check the wiring of the current path. The current must pass through the sensor terminals, not around it.