ACS712 Current Sensor (20A) with a Raspberry Pi Pico

A Hall-effect current sensor module that turns up to ±20 A, AC or DC, into an analog voltage centred on VCC/2.

ACS712 Current Sensor (20A), A Hall-effect current sensor module that turns up to ±20 A, AC or DC, into an analog voltage centred on VCC/2.
In short

The ACS712 needs 4.5 to 5.5 V, so on the Raspberry Pi Pico its VCC goes to VBUS, the 5 V that arrives over USB. OUT idles near 2.5 V and can climb toward 5 V, so it reaches GP28 (ADC2) through a 10 kΩ / 20 kΩ divider that scales it to two thirds, and the sketch reads it at 12 bits against the Pico's 3.3 V rail.

Wiring the ACS712 Current Sensor (20A) to the Raspberry Pi Pico

Pin by pin.

ACS712 Current Sensor (20A)Raspberry Pi PicoNote
VCCVBUS
GNDGND
OUTGP28through a 10 kΩ resistor, with a 20 kΩ resistor from the board pin to GND: a divider that scales OUT by 2/3, so its 5 V swing stays under 3.3 V
  • VCC is on VBUS, which gives about 5 V only while the board is powered from USB.

What to know on the Raspberry Pi Pico

  • The RP2040's ADC has no reference of its own and measures against its supply, which on the Pico is the 3.3 V rail through an RC filter. That is why the sketch converts with ADC_VREF = 3.3 and 4096 steps, after analogReadResolution(12) lifts arduino-pico's default of 10 bits.Raspberry Pi Pico datasheet, release 21, section 4.3, p. 19; arduino-pico cores/rp2040/wiring_analog.cpp
  • Raspberry Pi estimates an offset of about 30 mV on the Pico's ADC, from the converter's own current flowing through the 201 Ω filter resistor. The zero the sketch measures in setup() with no current flowing removes it together with the sensor's own zero offset.Raspberry Pi Pico datasheet, release 21, section 4.3, p. 19
  • One 12 bit step is 0.81 mV at GP28, about 1.2 mV at OUT after the x1.5 divider, or 12 mA on the 20 A module. The RP2040's ADC is rated at 8.7 effective bits, so the 64 sample average in readOutVolts() matters more than the step size.RP2040 datasheet, section 5.5.3.4, Table 627
  • The divider loads OUT with 30 kΩ, well above the 4.7 kΩ minimum Allegro allows. Seen from GP28 it is a 6.7 kΩ source, and the RP2040 rates its ADC input at 100 kΩ minimum, so at worst readings can sit several percent low; calibrate SENS_V_PER_A against a known current if that matters.Allegro ACS712 datasheet Rev. 22, p. 5; RP2040 datasheet, section 5.5.3.4, Table 627

ACS712 Current Sensor (20A) code for the Raspberry Pi Pico

Compiled for rp2040:rp2040:rpipico on 2026-10-30.

No library needed
// ACS712 Current Sensor (20A) on Raspberry Pi Pico: wiring and a free simulation at https://www.tinkered.ai/components/acs712-current-sensor/raspberry-pi-pico
#include <Arduino.h>

// ACS712 on a Raspberry Pi Pico: OUT reaches GP28 through a 10 kΩ / 20 kΩ divider,
// so the pin sees 2/3 of OUT (the 2.5 V zero becomes about 1.67 V).
const int SENSE_PIN = 28;           // GP28 (ADC2)
const float SENS_V_PER_A = 0.100;   // 20 A module (0.185 for 5 A, 0.066 for 30 A)
const float ADC_VREF = 3.3;         // the Pico's ADC reference: its 3.3 V rail
const float ADC_STEPS = 4096.0;     // 12 bits, set in setup() (arduino-pico defaults to 10)
const float DIVIDER = 1.5;          // (10 kΩ + 20 kΩ) / 20 kΩ: OUT = pin voltage x 1.5
const int SAMPLES = 64;
float zeroV = 2.5;                  // OUT with no current (VCC / 2), measured in setup()

float readOutVolts() {
  uint32_t sum = 0;
  for (int i = 0; i < SAMPLES; i++) sum += analogRead(SENSE_PIN);
  return (sum / (float)SAMPLES) * ADC_VREF / ADC_STEPS * DIVIDER;
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  delay(100);
  zeroV = readOutVolts();           // start with no current flowing
  Serial.print("ACS712 ready, zero at ");
  Serial.print(zeroV, 3);
  Serial.println(" V");
}

void loop() {
  float amps = (readOutVolts() - zeroV) / SENS_V_PER_A;
  Serial.print("Current: ");
  Serial.print(amps, 3);
  Serial.print(" A  (");
  Serial.print(amps * 1000.0, 0);
  Serial.println(" mA)");
  delay(500);
}

ACS712 Current Sensor (20A) on the Raspberry Pi Pico: questions

Can the ACS712 run from the Pico's 3V3 pin?

No. Allegro specifies 4.5 to 5.5 V (p. 5). VBUS only carries about 5 V while USB powers the Pico (Pico datasheet, p. 8), so on battery feed VCC from a separate 5 V supply and join its GND to the Pico's.

Which Pico pins can read the ACS712?

GP26, GP27 and GP28, the three ADC inputs on the header. The RP2040's fourth ADC channel is wired on the board to measure VSYS/3 (Pico datasheet, p. 7), and every ADC input must stay between 0 V and the ADC supply, which the divider ensures.

Why does the Pico print a negative current?

Current flowing from IP+ to IP- raises OUT above its zero (Allegro, p. 1); current the other way lowers it and the sketch prints a negative value. Swap the two wires on the screw terminal if your load's current should read positive.

Keep going

For AI assistants

This guide as plain Markdown. /components/acs712-current-sensor/raspberry-pi-pico.md

What will you build with it?