Current, voltage and power
INA219 with ESP32
An INA219 measures the current through a small shunt resistor, and the voltage of the line, then reports both over I2C. On a typical purple module the shunt is 0.1 Ω, and the chip handles lines up to 26 V, so you can measure a 12 V or 24 V circuit while the sensor itself runs from the ESP32's 3.3 V.
Wiring confuses people at first, because there are two separate sides. VIN+ and VIN- go in series with the positive wire of the load, so the current flows through the shunt. VCC, GND, SDA and SCL go to the ESP32. The grounds of both circuits must be connected, or the bus voltage reading will be wrong.
TI lists a 12-bit ADC and up to 16 programmable addresses, and common modules set the address with solder bridges, starting at 0x40. The code below reads the power-on default registers without a library: bus voltage and shunt voltage, then Ohm's law. Values assume a 0.1 Ω shunt, so change that number if your module differs.

Specifications
| Measures | Current, bus voltage, power |
|---|---|
| Bus voltage | 0–26 V |
| Supply | 3–5.5 V |
| ADC | 12-bit |
| Accuracy | Up to 0.5 % max over temperature (INA219B) |
| Interface | I2C / SMBus, 16 addresses |
| Common module address | 0x40 |
Power and logic levels
3.3 V: safe to connect directly
| Supply | 3–5.5 V, use 3V3 |
|---|---|
| Signal level | I2C follows the supply |
| On an ESP32 | The measured circuit stays separate. Run it from 3V3, so the I2C lines stay at 3.3 V. |
ESP32 pins, including those on a display board's connectors, work at 3.3 V and are not 5 V tolerant. Modules differ, so if in doubt, measure the signal before you connect it.
Wiring
| INA219 | Connect to | Note |
|---|---|---|
| VCC | 3V3 | Check the module: the bare sensor is not 5 V |
| GND | GND | |
| SDA | GPIO 8 | Any free pin, set in Wire.begin() |
| SCL | GPIO 9 | Any free pin, set in Wire.begin() |
| VIN+ | Load supply + | In series with the load |
| VIN- | Load + | Current flows through the shunt |
Arduino code
#include <Wire.h>
const int SDA_PIN = 8, SCL_PIN = 9; // use your board's I2C pins
const uint8_t INA219_ADDR = 0x40;
const float SHUNT_OHM = 0.1; // check your module
int16_t readReg(uint8_t reg) {
Wire.beginTransmission(INA219_ADDR);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(INA219_ADDR, (uint8_t)2);
return (Wire.read() << 8) | Wire.read();
}
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
}
void loop() {
float shuntmV = readReg(0x01) * 0.01; // 10 uV per bit
float busV = ((uint16_t)readReg(0x02) >> 3) * 0.004; // 4 mV per bit
float currentA = shuntmV / 1000.0 / SHUNT_OHM;
Serial.printf("%.2f V %.3f A %.2f W\n", busV, currentA, busV * currentA);
delay(1000);
}
No extra library needed. Compiled for ESP32-S3 with arduino-esp32 3.x. Not yet tested by us on a physical sensor. Change the pins to match your board.
On a display
Read the value in your sketch and pass it to a label, or send it over MQTT and show it with an MQTT value in the editor.
Design a display for INA219Boards with a ready connector
Only boards whose connectors we have surveyed. Others may still work on free GPIOs.
| Elecrow CrowPanel ESP32 HMI 2.4" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 2.8" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 3.5" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32-S3 HMI 5.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| Elecrow CrowPanel ESP32-S3 HMI 7.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| LilyGO T-Display-S3-Pro 2.33" | QWIIC RIGHT: SDA 5, SCL 6I2C only — same bus as the touch, the PMU (SY6970) and the light sensor |
| M5Stack AtomS3 0.85" | Bottom I2C pins: SDA 38, SCL 39Same I2C bus as the built-in IMU (MPU6886, 0x68) |
| Makerfabs MaTouch ESP32-S3 Rotary IPS 2.1 Round | Mabee I2C (J1): SDA 17, SCL 18Same I2C bus as the touch controller (CST826) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT 4.3" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 5.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 7.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Sunton ESP32-4827S043R/C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S043C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S050C 5.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S070C 7.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Waveshare ESP32-S3 Touch LCD 2.1" round | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3 Touch LCD 2.8" | I2C connector: SDA 11, SCL 10Same I2C bus as the RTC and the IMU (0x51, 0x6B, 0x7E taken) — the touch has its own bus |
| Waveshare ESP32-S3 Touch LCD 2.8" Type B | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-Touch-LCD-2.8C | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-LCD-7B | I2C connector (H1): SDA 8, SCL 9Same I2C bus as the touch controller (GT911) and the IO expander (CH422G) |
Good to know
- Connect the grounds of both circuits.
- Do not exceed 26 V on the measured line.
- The shunt value sets the current scale. Check your module.
- Check the current rating of the module's shunt and terminals for your load.
What it is good for
- Battery monitors
- Solar charge displays
- Power supply dashboards
FAQ
What is the maximum voltage of the INA219?
26 V on the measured line.
Why does my INA219 read 0 V?
Check that the load's current flows through VIN+ and VIN-, and that the grounds are connected.
What is the I2C address?
Common modules start at 0x40. TI lists 16 addresses, set by the A0 and A1 pins.
Sources
Related parts
Use this information at your own risk. It is for general guidance only: the example code compiles, but it has not been tested on every part, and modules differ between sellers. Check the manufacturer's data before you build. Product names belong to their owners, and LCD Ultra Pro is not affiliated with them. See our Terms.