#include <Wire.h>
#include "defines.h"
#define INA219_I2C_ADDRESS 0x40
bool is_device_available(uint8_t address)
{
Wire.beginTransmission(address);
uint8_t error = Wire.endTransmission();
return (error == 0);
}
void wait_for_device(uint8_t i2c_device_address) {
while (!is_device_available(i2c_device_address));
}
void eeprom_write_byte(uint8_t i2c_device_address, uint8_t eeprom_data_address, uint8_t data) {
Wire.beginTransmission(i2c_device_address);
Wire.write((uint8_t)(eeprom_data_address)); //writes the LSB
Wire.write(data);
Wire.endTransmission();
wait_for_device(i2c_device_address);
}
byte eeprom_read_byte(uint8_t i2c_device_address, uint8_t eeprom_data_address) {
uint8_t rdata = 0xFF;
Wire.beginTransmission(i2c_device_address);
Wire.write((uint8_t)(eeprom_data_address >> 8)); //writes the LSB
Wire.endTransmission();
Wire.requestFrom(i2c_device_address, (uint8_t)1);
if (Wire.available()) {
rdata = Wire.read();
}
return rdata;
}
void setup()
{
Wire.begin(8, 10);
Serial.begin(9600);
while (!Serial);
if (!is_device_available(INA219_I2C_ADDRESS))
{
Serial.println("No device was found");
while (true);
}
}
void loop()
{
byte data[2];
uint16_t value = 0;
int16_t value_int = 0;
eeprom_write_byte(INA219_I2C_ADDRESS, INA219_CALIBRATION_REG,0X10);
eeprom_write_byte(INA219_I2C_ADDRESS, INA219_CALIBRATION_REG,0X60);
data[0] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_CALIBRATION_REG);
data[1] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_CALIBRATION_REG);
value = (uint16_t)((data[0] << 8) | data[1]);
printf("---------------------\n\r");
printf("CALIBRATION REG = 0x%x\n\r",value);
data[0] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_BUSV_REG);
data[1] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_BUSV_REG);
value = (uint16_t)((data[0] << 8) | data[1]);
printf("Voltage = 0x%x ->> %i mV\n\r",value,value);
data[0] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_CURRENT_REG);
data[1] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_CURRENT_REG);
value = (uint16_t)((data[0] << 8) | data[1]);
printf("Current = 0x%x ->> %i mA\n\r",value,value);
data[0] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_POWER_REG);
data[1] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_POWER_REG);
value = (uint16_t)((data[0] << 8) | data[1]);
printf("Power = 0x%x ->> %i mW\n\r",value,value);
data[0] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_SHUNTV_REG);
data[1] = eeprom_read_byte(INA219_I2C_ADDRESS, INA219_SHUNTV_REG);
value = (uint16_t)((data[0] << 8) | data[1]);
printf("Shunt = 0x%x ->> %i mV\n\r",value,value);
delay(5000);
}