The INA219 is a high-side current shunt and power monitor with an I2C interface. The INA219 monitors both shunt drop and supply voltage, with programmable conversion times and filtering. A programmable calibration value, combined with an internal multiplier, enables direct readouts in amperes. An additional multiplying register calculates power in watts. The I2C interface features 16 programmable addresses.

Revision:
1:2816fc874abc
Parent:
0:81c08f01f0fe
--- a/INA219.cpp	Tue Nov 19 05:31:39 2013 +0000
+++ b/INA219.cpp	Tue Nov 19 07:44:01 2013 +0000
@@ -10,29 +10,28 @@
 bool INA219::detect(void)
 {
     _i2c.start();
-    _adr = (1 == _i2c.write(_adr|1/*write address for reading*/));
+    bool det = (1 == _i2c.write(_adr|1/*write address for reading*/));
     _i2c.stop();
-    return _det;
+    return det;
 }
 
 double INA219::getCurrent(void)
 {
     double d = 0.0;
-    if (_det)
+    char r = 0x01;
+    if (0 == _i2c.write(_adr, &r, sizeof(r), true))
     {
-        char r = 0x01;
-        if (0 == _i2c.write(_adr, &r, sizeof(r), true))
+        char v[2] = {0};
+        if (0 == _i2c.read(_adr, v, sizeof(v)))
         {
-            char v[2] = {0};
-            if (0 == _i2c.read(_adr, v, sizeof(v)))
-            {
-                int u = (int)((((short)v[0]) << 8) + (unsigned char)v[1]) * 10; // uV
-                int i = u * 2/*0.5ohm*/;
-                d = 1e-6 * i;
-            }
+            int u = (int)((((short)v[0]) << 8) + (unsigned char)v[1]) * 10; // uV
+            int i = u * 2/*0.5ohm*/;
+            d = 1e-6 * i;
         }
-        else 
-            _i2c.stop();
+    }
+    else 
+    {
+        _i2c.stop();
     }
     return d;
 }
@@ -40,20 +39,17 @@
 double INA219::getVoltage(void)
 {
     double d = 0.0;
-    if (_det)
+    char r = 0x02;
+    if (0 == _i2c.write(_adr, &r, sizeof(r), true))
     {
-        char r = 0x02;
-        if (0 == _i2c.write(_adr, &r, sizeof(r), true))
+        char v[2] = {0};
+        if (0 == _i2c.read(_adr, v, sizeof(v)))
         {
-            char v[2] = {0};
-            if (0 == _i2c.read(_adr, v, sizeof(v)))
-            {
-                int u = (int)(((((short)v[0]) << 8) + (unsigned char)v[1]) >> 3) * 4; // mV
-                d = 1e-3 * u;
-            }
+            int u = (int)(((((short)v[0]) << 8) + (unsigned char)v[1]) >> 3) * 4; // mV
+            d = 1e-3 * u;
         }
-        else 
-            _i2c.stop();
     }
+    else 
+        _i2c.stop();
     return d;
 }