
I2C数字功率计是一款可测量26V 8A以内各类电子模块、用电设备的电压、电流和功率,最大相对误差不超过±0.2%的高分辨、高精度、大量程测量模块(使用前需进行一次简单的手动校准)。可用于太阳能系统、电池库仑计、电机、主控板或电子模块的功耗测量、电池续航评估与实时电源参数在线监控。 模块采用TI INA219零温漂电流/功率监控芯片和2W大功率低温漂10mΩ合金采样电阻,电压和电流分辨率分别可达4mV与1mA,在满量程测量条件下,电压与电流的最大测量相对误差不超过±0.2%,并提供4个可通过拨码开关配置的I2C地址。模块可对双向高侧电流(流经电源或电池正极的电流)进行准确测量,这在太阳能或库仑计应用,电池既需要充电,也需要放电的场合尤为有用,用户可通过电流的正负读数了解电池的充放电状态,也可以了解电池的冲放电的实时电压、电流与功率。在电机应用场景,可通过实时监控电机电流是否由于堵转或负载过大导致电流过大,从而及时采取保护措施。此外,也可以使用该模块测量各类电子模块或整个项目的实时功耗,从而评估电池的续航时间。

| 引脚名称 | 描述 |
|---|---|
| G | GND(电源输入负极) |
| V | VCC(电源输入正极) |
| SDA | 数据引脚 |
| SCL | 时钟引脚 |
供电电压: 3.3V-5V
连接方式:PH2.0 4P端子线
安装方式:螺丝固定

不会使用库文件的参考这里:库文件安装使用
库文件下载:点击下载
米思齐UNO开发板库文件安装步骤(使用代码前先下载安装米思齐库文件):参考链接
米思齐ESP32开发板库文件下载安装步骤(使用代码前先下载安装米思齐库文件):参考链接
示例程序(UNO开发板):点击下载
#include "DFRobot_INA219.h"
#include <Wire.h>
DFRobot_INA219_IIC ina219(&Wire, INA219_I2C_ADDRESS4);
float ina219Reading_mA = 1000;
float extMeterReading_mA = 1000;
void setup(){
while (!ina219.begin()) {
Serial.println("INA219 初始化失败:请检查I2C接线/地址是否正确");
delay(1000);
}
ina219.linearCalibrate(ina219Reading_mA, extMeterReading_mA);
Serial.begin(9600);
}
void loop(){
Serial.println(String("总线电压:") + String(ina219.getBusVoltage_V()));
Serial.println(String("分流电压:") + String(ina219.getShuntVoltage_mV()));
Serial.println(String("电流值:") + String(ina219.getCurrent_mA()));
Serial.println(String("功率值") + String(ina219.getPower_mW()));
Serial.println(String("------------------"));
delay(500);
}
ESP32 Python 示例(适用于Mixly IDE /米思齐)
(开发板选择 Python ESP32 【ESP32 Generic(4MB)】切换为代码模式上传 ):
from machine import I2C, Pin
import time
INA219_REG_CONFIG = 0x00
INA219_REG_SHUNTVOLTAGE = 0x01
INA219_REG_BUSVOLTAGE = 0x02
INA219_REG_POWER = 0x03
INA219_REG_CURRENT = 0x04
INA219_REG_CALIBRATION = 0x05
INA219_CONFIG_RESET = 0x8000
INA219_I2C_ADDRESS1 = 0x40
INA219_I2C_ADDRESS2 = 0x41
INA219_I2C_ADDRESS3 = 0x44
INA219_I2C_ADDRESS4 = 0x45
class eIna219BusVolRange_t:
eIna219BusVolRange_16V = 0x0000
eIna219BusVolRange_32V = 0x2000
class eIna219PGABits_t:
eIna219PGABits_1 = 0x0000
eIna219PGABits_2 = 0x0800
eIna219PGABits_4 = 0x1000
eIna219PGABits_8 = 0x1800
class eIna219AdcBits_t:
eIna219AdcBits_9 = 0
eIna219AdcBits_10 = 1
eIna219AdcBits_11 = 2
eIna219AdcBits_12 = 3
class eIna219AdcSample_t:
eIna219AdcSample_1 = 0x00
eIna219AdcSample_2 = 0x01
eIna219AdcSample_4 = 0x02
eIna219AdcSample_8 = 0x03
eIna219AdcSample_16 = 0x04
eIna219AdcSample_32 = 0x05
eIna219AdcSample_64 = 0x06
eIna219AdcSample_128 = 0x07
class eInaMode_t:
eIna219PowerDown = 0x00
eIna219SVolTrig = 0x01
eIna219BVolTrig = 0x02
eIna219SAndBVolTrig = 0x03
eIna219AdcOff = 0x04
eIna219SVolCon = 0x05
eIna219BVolCon = 0x06
eIna219SAndBVolCon = 0x07
class HELLO_STEM_INA219:
def __init__(self, i2c_bus, i2c_addr=INA219_I2C_ADDRESS1):
self._i2c = i2c_bus
self._addr = i2c_addr
self.calValue = 0x0000
self.lastOperateStatus = 'eIna219_InitError'
def _writeReg(self, reg, data):
try:
buffer = bytearray([reg, (data >> 8) & 0xFF, data & 0xFF])
self._i2c.writeto(self._addr, buffer)
self.lastOperateStatus = 'eIna219_ok'
except Exception:
self.lastOperateStatus = 'eIna219_WriteRegError'
def _readReg(self, reg):
try:
self._i2c.writeto(self._addr, bytearray([reg]))
buffer = self._i2c.readfrom(self._addr, 2)
self.lastOperateStatus = 'eIna219_ok'
return (buffer[0] << 8) | buffer[1]
except Exception:
self.lastOperateStatus = 'eIna219_ReadRegError'
return 0
def _readInaReg(self, reg):
value = self._readReg(reg)
if value & 0x8000:
return value - 0x10000
return value
def _readInaRegUnsigned(self, reg):
return self._readReg(reg)
def _writeInaReg(self, reg, value):
self._writeReg(reg, value)
def scan(self):
try:
self._i2c.writeto(self._addr, bytearray([]))
return True
except OSError as e:
if str(e) == '[Errno 5] EIO':
return False
return False
def begin(self):
self.lastOperateStatus = 'eIna219_InitError'
if self.scan():
self.setBRNG(eIna219BusVolRange_t.eIna219BusVolRange_32V)
self.setPGA(eIna219PGABits_t.eIna219PGABits_8)
self.setBADC(eIna219AdcBits_t.eIna219AdcBits_12, eIna219AdcSample_t.eIna219AdcSample_8)
self.setSADC(eIna219AdcBits_t.eIna219AdcBits_12, eIna219AdcSample_t.eIna219AdcSample_8)
self.setMode(eInaMode_t.eIna219SAndBVolCon)
self.calValue = 4096
self._writeInaReg(INA219_REG_CALIBRATION, self.calValue)
self.lastOperateStatus = 'eIna219_ok'
return True
else:
return False
def linearCalibrate(self, ina219Reading_mA, extMeterReading_mA):
if ina219Reading_mA == 0:
return
new_calValue = int((extMeterReading_mA / ina219Reading_mA) * self.calValue) & 0xFFFE
self.calValue = new_calValue
self._writeInaReg(INA219_REG_CALIBRATION, self.calValue)
def getBusVoltage_V(self):
reg_val = self._readInaRegUnsigned(INA219_REG_BUSVOLTAGE)
return float(reg_val >> 3) * 0.004
def getShuntVoltage_mV(self):
reg_val = self._readInaReg(INA219_REG_SHUNTVOLTAGE)
return float(reg_val) * 0.01
def getCurrent_mA(self):
return float(self._readInaReg(INA219_REG_CURRENT))
def getPower_mW(self):
return float(self._readInaReg(INA219_REG_POWER)) * 20.0
def setBRNG(self, value):
conf = self._readInaRegUnsigned(INA219_REG_CONFIG)
conf &= ~0x2000
conf |= value
self._writeInaReg(INA219_REG_CONFIG, conf)
def setPGA(self, bits):
conf = self._readInaRegUnsigned(INA219_REG_CONFIG)
conf &= ~0x1800
conf |= bits
self._writeInaReg(INA219_REG_CONFIG, conf)
def _get_adc_value(self, bits, sample):
if bits < eIna219AdcBits_t.eIna219AdcBits_12 and sample > eIna219AdcSample_t.eIna219AdcSample_1:
return -1
if bits < eIna219AdcBits_t.eIna219AdcBits_12:
return bits
else:
return 0x08 | sample
def setBADC(self, bits, sample):
value = self._get_adc_value(bits, sample)
if value == -1:
return
conf = self._readInaRegUnsigned(INA219_REG_CONFIG)
conf &= ~0x0780
conf |= value << 7
self._writeInaReg(INA219_REG_CONFIG, conf)
def setSADC(self, bits, sample):
value = self._get_adc_value(bits, sample)
if value == -1:
return
conf = self._readInaRegUnsigned(INA219_REG_CONFIG)
conf &= ~0x0078
conf |= value << 3
self._writeInaReg(INA219_REG_CONFIG, conf)
def setMode(self, mode):
conf = self._readInaRegUnsigned(INA219_REG_CONFIG)
conf &= ~0x0007
conf |= mode
self._writeInaReg(INA219_REG_CONFIG, conf)
def reset(self):
self._writeInaReg(INA219_REG_CONFIG, INA219_CONFIG_RESET)
i2c = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
sensor = HELLO_STEM_INA219(i2c, i2c_addr=INA219_I2C_ADDRESS4)
if sensor.begin():
print("INA219 初始化成功!")
else:
print("INA219 初始化失败,请检查接线和地址!")
import machine
while True:
print(('总线电压:' + str(sensor.getBusVoltage_V())))
print(('分流电压:' + str(sensor.getShuntVoltage_mV())))
print(('电流: ' + str(sensor.getCurrent_mA())))
print(('功率: ' + str(sensor.getPower_mW())))
time.sleep(1)
示例程序(UNO开发板):点击下载

示例程序(ESP32开发板):点击下载

Arduino UNO 测试环境搭建
准备配件:
电路接线图:

ESP32 Python 测试环境搭建
Arduino UNO视频教程:点击查看
ESP32 Python视频教程:
Arduino UNO测试结论:
发现串口显示总线电压、分流电压、电流值、功率值。
