Ok I have created some code on the Arduino Micro to read data from a fuel gauge chip and it works fine on the Arduino Micro.
When I run this code on the Teensy 3.1 I have a few numbers that do not calculate right and I'm assuming it has to do with the Teensy 3.1 handling things a little bit differently some how. Here is the serial readings I get when I run the same code on the Teensy 3.1,
Most readings are the same as the Arduino Micro provides but the "Power Input / -Output" , "Average Current Draw", "Standby Current Consumption" are all reading way high for some reason. Any ideas?
Here is my code for this:
When I run this code on the Teensy 3.1 I have a few numbers that do not calculate right and I'm assuming it has to do with the Teensy 3.1 handling things a little bit differently some how. Here is the serial readings I get when I run the same code on the Teensy 3.1,
Most readings are the same as the Arduino Micro provides but the "Power Input / -Output" , "Average Current Draw", "Standby Current Consumption" are all reading way high for some reason. Any ideas?
Here is my code for this:
Code:
#include <Wire.h> // Wire library for communicating over I2C
#define BQ34Z100 0x55 // This is the I2C address of the
unsigned int soc, voltage, remain_cap, TTE, TTF, STE, Cycles, SOH, AvaliableCap, FLAGS, AvailableEnergy, FullChgCap, ChipTemp;
int avg_current, batt_temp, StandbyCurrent, PassedCharge, SelfDischargeCurrent , AveragePower;
float power_draw;
// ~~ Status Functions~~
// State of Charge, a percent value of the battery's total charge
void readSOC()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x02);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
soc = high1 + low;
}
// The battery's remaining capacity in mAh
void readRemainingCapacity()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x04);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x05);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
remain_cap = high1 + low;
}
void readVoltage()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x08);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x09);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
voltage = high1 + low;
}
void readAverageCurrent()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0a);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0b);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
avg_current = high1 + low;
}
void readBattTemp()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0c);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0d);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
batt_temp = high1 + low;
batt_temp = 0.1*batt_temp; // Each bit is 0.1K, so we have a value in Kelvins
batt_temp = batt_temp - 273.15; // Convert to degrees Celsius
}
// Time To Empty - The amoutn of time until the battery is empty.
void readTTE()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x18);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x19);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
TTE = high1 + low;
}
// Time Till Fully Charged Reading.
void readTTF()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1a);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1b);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
TTF = high1 + low;
}
// Time Till Fully Charged Reading.
void readSTE()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1e);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1f);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
STE = high1 + low;
}
// Battery Liftime Cycles
void readCycles()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2c);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2d);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
Cycles = high1 + low;
}
// Battery State of Health
void readSOH()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2e);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2f );
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
SOH = high1 + low;
}
float PowerDraw(float volt, float current)
{
volt = volt/1000.0;
current = current/1000.0;
float power = volt*current;
return power;
}
void readAvaliableCap()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x16);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x17);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
AvaliableCap = high1 + low;
}
void readStandbyCurrent()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1c);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x1d);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
StandbyCurrent = high1 + low;
}
void readAvailableEnergy()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x24);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x25);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
AvailableEnergy = high1 + low;
}
void readAveragePower()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x26);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x27);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
AveragePower = high1 + low;
}
void readPassedCharge()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x34);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x35);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
PassedCharge = high1 + low;
}
void readSelfDischargeCurrent()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x38);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x39);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
SelfDischargeCurrent = high1 + low;
}
void readFLAGS()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0e);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x0f);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
FLAGS = high1 + low;
}
void readFullChgCap()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x16);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x17);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
FullChgCap = high1 + low;
}
void readChipTemp()
{
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2a);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int low = Wire.read();
Wire.beginTransmission(BQ34Z100);
Wire.write(0x2b);
Wire.endTransmission();
Wire.requestFrom(BQ34Z100,1);
unsigned int high = Wire.read();
unsigned int high1 = high<<8;
ChipTemp = high1 + low;
ChipTemp = 0.1*ChipTemp; // Each bit is 0.1K, so we have a value in Kelvins
ChipTemp = ChipTemp - 273.15; // Convert to degrees Celsius
}
void setup()
{
Serial.begin(9600);
Wire.begin();
}
void loop()
{
readSOC();
Serial.print("Battery State of Charge: ");
Serial.print(soc);
Serial.println("%");
power_draw = PowerDraw(voltage,avg_current);
Serial.print("Power Input & -Output: ");
Serial.print(power_draw);
Serial.println(" W");
readVoltage();
Serial.print("Battery Pack Voltage: ");
Serial.print(voltage *0.001);
Serial.println(" V");
readAverageCurrent();
Serial.print("Average Current Draw: ");
Serial.print(avg_current * 0.001);
Serial.println(" A");
readRemainingCapacity();
Serial.print("Remaining Capacity: ");
Serial.print(remain_cap * 0.001);
Serial.println(" Ah");
readFullChgCap();
Serial.print("Full Charge Capacity : ");
Serial.print(FullChgCap * 0.001);
Serial.println(" Ah");
readAvailableEnergy();
Serial.print("Avaliable Energy : ");
Serial.print(AvailableEnergy * 0.001);
Serial.println(" Wh");
readPassedCharge();
Serial.print("Total Power Transferred : ");
Serial.print(PassedCharge * 0.001);
Serial.println(" Ah");
readTTE();
Serial.print("Time Till Empty: ");
Serial.print(TTE /60.0);
Serial.println(" Hours ");
readTTF();
Serial.print("Time Till Full: ");
Serial.print(TTF /60.0);
Serial.println("Hours");
readSTE();
Serial.print("Standby Time Till Empty: ");
Serial.print(STE /1440);
Serial.println("Days");
readStandbyCurrent();
Serial.print("Standby Current Consumption : ");
Serial.print(StandbyCurrent);
Serial.println("mA");
readCycles();
Serial.print("Battery Cycles: ");
Serial.print(Cycles);
Serial.println("");
readSOH();
Serial.print("Battery Health Percentage: ");
Serial.print(SOH);
Serial.println("");
readChipTemp();
Serial.print("Chip Temperature : ");
Serial.print(ChipTemp * 9.0/ 5.0 + 32.0);
Serial.println(" F");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
readAveragePower();
Serial.print("Average Discharge Power : ");
Serial.print(AveragePower * 10 * 0.0001 );
Serial.println(" W");
readSelfDischargeCurrent();
Serial.print("SelfDischargeCurrent : ");
Serial.print(SelfDischargeCurrent);
Serial.println(" mAh");
readBattTemp();
Serial.print("Battery Temperature: ");
Serial.print(batt_temp * 9.0/ 5.0 + 32.0);
Serial.println(" F");
readFLAGS();
Serial.print("Flags : ");
Serial.print(FLAGS);
Serial.println("");
Serial.print("\r\n");
delay(1000);
}