A bipolar hall effect sensor outputs a continuous, ratiometric analog voltage that shifts above or below a midpoint quiescent voltage depending on whether a north or south magnetic pole is applied. Unlike digital hall switches (like the A3144) that simply snap between 0V and VCC to indicate presence, linear bipolar sensors tell you exactly how strong the magnetic field is and which polarity it has. This makes them ideal for applications like joystick positioning, linear actuator feedback, and non-contact current sensing.
In this guide, we will wire a standard Honeywell SS49E (and discuss the modern TI DRV5055 alternative), translate the raw ADC readings into physical magnetic flux density (Gauss/milliTesla), and eliminate the signal noise that plagues most beginner breadboard builds.
The Physics: How Bipolar Hall Sensing Works
When a control current flows through a thin semiconductor element inside the sensor, an external magnetic field exerts a Lorentz force on the moving charge carriers (electrons). This force deflects the electrons to one side of the semiconductor, creating a measurable transverse voltage difference known as the Hall voltage. Because the sensor IC includes an internal amplifier, this microvolt-level Hall voltage is boosted to a usable 0V–5V analog signal.
The "bipolar" designation means the sensor's internal circuitry is biased to sit at a midpoint voltage (usually VCC/2) when no magnetic field is present. Applying a North pole pushes the output voltage higher toward VCC, while a South pole pulls it lower toward ground. Unipolar sensors, by contrast, only respond to one specific pole and typically act as digital on/off switches rather than linear measurement devices.
Hardware Setup and Pinout Specifications
The most common bipolar linear hall sensor in the hobbyist bin is the Honeywell SS49E (or the identical S49E). For modern 3.3V designs, the Texas Instruments DRV5055 is a superior choice due to its lower noise floor and better thermal compensation. Both share the standard 3-pin TO-92-3 package.
| Parameter | Honeywell SS49E | TI DRV5055 (A1 Variant) |
|---|---|---|
| Output Type | Ratiometric Analog Voltage | Ratiometric Analog Voltage |
| Supply Voltage Range | 2.7V to 6.5V | 2.5V to 5.5V |
| Quiescent Voltage (No Field) | VCC / 2 (e.g., 2.5V at 5V supply) | VCC / 2 |
| Typical Sensitivity | 1.4 mV/Gauss (14 mV/mT) | 13.3 mV/mT (approx 1.33 mV/G) |
| Magnetic Range | ±1000 Gauss | ±69 mT (±690 Gauss) |
Wiring to Arduino / ESP32
- VCC (Pin 1): Connect to 5V on Arduino Uno, or 3.3V on ESP32. Ensure your supply is clean; the output is ratiometric, meaning any ripple on VCC directly injects noise into your signal.
- GND (Pin 2): Connect to system ground.
- OUT (Pin 3): Connect to an analog input pin (e.g., A0 on Uno, GPIO34 on ESP32).
- Decoupling: Solder a 0.1µF (100nF) X7R ceramic capacitor directly across the VCC and GND pins on the sensor side of the breadboard. This is non-negotiable for clean readings.
Translating Raw ADC to Magnetic Flux Density
The raw integer from analogRead() is useless on its own. You must scale it to a physical unit. The standard unit for magnetic flux density in US datasheets is the Gauss (G), while the SI unit is the milliTesla (mT). 1 mT = 10 Gauss.
The mathematical relationship is linear:
B (Gauss) = (V_out - V_quiescent) / Sensitivity
Assuming an Arduino Uno (5V logic, 10-bit ADC) and an SS49E sensor:
- V_quiescent: 2.5V (which is 5.0V / 2)
- Sensitivity: 1.4 mV/G, which is 0.0014 V/G
- ADC Resolution: 1024 steps across 5.0V, so each step is ~4.88mV.
Here is the complete, copy-pasteable Arduino code to read the sensor, apply the math, and output both Gauss and milliTesla to the serial monitor:
// Bipolar Hall Effect Sensor (SS49E) Reader
// Target: Arduino Uno / Nano (5V, 10-bit ADC)
const int HALL_PIN = A0;
const float VCC = 5.0; // Supply voltage
const int ADC_MAX = 1023; // 10-bit ADC max value
const float V_QUIESCENT = VCC / 2.0; // 2.5V
const float SENSITIVITY_V_G = 0.0014; // 1.4 mV/Gauss in Volts
void setup() {
Serial.begin(115200);
analogReference(DEFAULT); // Ensure 5V reference
}
void loop() {
// Read raw ADC and convert to voltage
int rawADC = analogRead(HALL_PIN);
float vOut = (rawADC * VCC) / ADC_MAX;
// Calculate Magnetic Flux Density
float gauss = (vOut - V_QUIESCENT) / SENSITIVITY_V_G;
float milliTesla = gauss / 10.0;
Serial.print("Raw: "); Serial.print(rawADC);
Serial.print(" | V: "); Serial.print(vOut, 3);
Serial.print(" | G: "); Serial.print(gauss, 1);
Serial.print(" | mT: "); Serial.println(milliTesla, 2);
delay(100); // 10 Hz sample rate
}
analogRead(). Instead, use analogReadMilliVolts() (available in ESP32 Arduino Core v2.0+) which applies factory efuse calibration, or bypass the internal ADC entirely and use an external I2C ADS1115 16-bit ADC.
Troubleshooting Interference and Signal Noise
Hall sensors are essentially high-gain magnetic antennas. If your serial monitor looks like a heart monitor during a cardiac event, you are picking up interference. Here are the three most common sources and how to kill them:
- Switching Power Supply EMI: If you are powering your project from a cheap buck converter or a laptop USB port, the high-frequency switching noise couples directly into the Hall element. Fix: Add the 0.1µF decoupling capacitor mentioned earlier, and add a 10µF electrolytic capacitor at the breadboard power rails. For extreme noise, add a 100Ω resistor in series with the OUT pin and a 10nF capacitor to ground to form a low-pass RC filter (cutoff ~160kHz).
- Ferrous Metal Proximity: Mounting the sensor directly to a steel chassis or using steel-core jumper wires distorts the local magnetic field lines, causing hysteresis and zero-point shifts. Fix: Keep the sensor at least 5mm away from any unmagnetized ferrous metals.
- Thermal Drift: While modern ICs have internal temperature compensation, extreme ambient shifts (e.g., moving from a 20°C bench to a 40°C outdoor enclosure) will shift the quiescent voltage by a few millivolts. Fix: Implement a software auto-zero routine in your code that records the baseline ADC value on startup when no magnet is present, rather than hardcoding
VCC / 2.
Frequently Asked Questions
What is the difference between a bipolar and unipolar hall effect sensor?
A unipolar hall sensor (like the A3144) acts as a digital switch that only triggers when a specific magnetic pole (usually South) exceeds a threshold, and releases when the field drops. It outputs a strict HIGH or LOW signal. A bipolar linear sensor (like the SS49E) responds to both North and South poles, outputting a continuous analog voltage that increases for one pole and decreases for the other, allowing you to measure the exact strength and polarity of the field.
Why is my bipolar hall sensor outputting noisy readings on the ESP32?
The ESP32's internal SAR ADC has inherent hardware noise and non-linearity that is much worse than the ATmega328P found on the Arduino Uno. Furthermore, the ESP32's WiFi/Bluetooth radio draws pulsed current, causing voltage sags on the 3.3V rail that the ratiometric hall sensor translates directly into signal noise. To fix this, average 32 to 64 samples in software, use the analogReadMilliVolts() function, or use an external ADS1115 ADC via I2C for true 16-bit precision.
Can I use a bipolar hall effect sensor to measure AC current?
Yes, but not by itself. You must pair the sensor with a split-core ferrite toroid (or a purpose-built magnetic concentrator like the Allegro ACS712, which integrates the Hall element and concentrator into one IC). The AC current flowing through a wire generates an alternating magnetic field, which the ferrite core focuses across the air gap where the hall sensor sits. Because the sensor is bipolar, it will output a sine wave centered around the quiescent voltage, accurately tracking the AC waveform. For DC current measurement, you will need to calibrate out the Earth's ambient magnetic field, which is roughly 0.5 Gauss.
For deeper design insights into magnetic circuit concentrators and advanced thermal compensation, refer to the Allegro Micro Hall Effect Sensor Basics guide and the Texas Instruments Hall Effect Sensor portfolio documentation.






