Skip to content

Instantly share code, notes, and snippets.

@zerog2k
Last active December 16, 2020 08:05
Show Gist options
  • Save zerog2k/c02e94600ccaaa80d051 to your computer and use it in GitHub Desktop.
Save zerog2k/c02e94600ccaaa80d051 to your computer and use it in GitHub Desktop.
read TI TMP513/TMP512 (all-in-one current, voltage, temp sensors) via I2C on arduino
// read TI TMP512/TMP513 over I2C
// Jens Jensen AF5MI 2014
#include <Wire.h>
// address of device - see datasheet, assumes A0 = SCL.
#define ADDR 0x5F
// current calibration register, see datasheet for calc
// I = (V_shunt * CalReg) / 4096
#define ICAL 4096 // R_shunt = 0.10 ohms
#define PR_mW 2 // PR multiplier per LSB to get mW result
#define CR_mA 0.1f // CR multiplier per LSB to get mA result
#define CONFREG1 0b0000100110011111 // config reg 1 - see datasheet
#define CFGREG1 0x00 // shunt config
#define CFGREG2 0x01 // temp config
#define STATUSREG 0x02
#define SMBUSCTLREG 0x03
#define SVR 0x04 // shunt voltage result, 10uV LSB
#define BVR 0x05 // bus voltage result, 4mV LSB
#define PR 0x06 // power measurement result
#define CR 0x07 // current measurement result
#define LTR 0x08 // local temp result register
#define RTR1 0x09 // remote temp result 1 register
#define RTR2 0x0A // remote temp result 2 register
#define RTR3 0x0B // remote temp result 3 register
#define SCAL 0x15 // shunt calibration register
#define RTS1_NFACTOR 0x16 // n-Factor 1 Register 16h (r/w)
#define RTS2_NFACTOR 0x17 // n-Factor 2 Register 17h (r/w)
#define RTS3_NFACTOR 0x18 // n-Factor 3 Register 18h (r/w)
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
Serial.println("started TMP513 reader");
/*
// adjust nfactor for remote temp sense 1
Wire.beginTransmission(ADDR);
Wire.write(RTS1_NFACTOR);
Wire.write(0x00); // NF7–NF0: n-Factor Bits
Wire.write(0x00); // HST7–HST0: Hysteresis Register Bits
Wire.endTransmission();
// adjust nfactor for remote temp sense 2
Wire.beginTransmission(ADDR);
Wire.write(RTS2_NFACTOR); // n-Factor 2 Register 17h (Read/Write)
Wire.write(0x00); // NF7–NF0: n-Factor Bits
Wire.write(0x00); // HST7–HST0: Hysteresis Register Bits
Wire.endTransmission();
// setup config 1 register
Wire.beginTransmission(ADDR);
Wire.write(CFGREG1);
byte cr1hi = CONFREG1 >> 8;
byte cr1lo = CONFREG1 & 0xFF;
Wire.write(cr1hi);
Wire.write(cr1lo);
Wire.endTransmission();
*/
// setup current calibration register
Wire.beginTransmission(ADDR);
Wire.write(SCAL);
Wire.write(highByte(ICAL));
Wire.write(lowByte(ICAL));
Wire.endTransmission();
}
float getTempC( byte reg ) {
// valid range: ±256C°
int raw = getRegRaw(reg);
bool diodeOpen = raw & 0x01;
float tempC = (raw >> 3) * 0.0625;
if (diodeOpen)
tempC = -1024; // invalid reading
return tempC;
}
int getRegRaw(byte reg) {
// Send the register address
Wire.beginTransmission(ADDR);
Wire.write(reg);
Wire.endTransmission();
// Request the data
Wire.requestFrom(ADDR, 2);
byte highbyte = Wire.read();
byte lowbyte = Wire.read();
word raw = word(highbyte,lowbyte);
return raw;
}
float tempCtoF ( float tempC ) {
float tempF = (tempC * 9.0) / 5.0 + 32.0;
return tempF;
}
float busVoltageResult ( int bvraw ) {
float busVoltage = (bvraw >> 3) * 0.004;
return busVoltage;
}
void loop()
{
// get data
float ltrTempF = tempCtoF(getTempC(LTR));
float rtr1TempF = tempCtoF(getTempC(RTR1));
float rtr2TempF = tempCtoF(getTempC(RTR2));
float rtr3TempF = tempCtoF(getTempC(RTR3));
int bvrVal = getRegRaw(BVR);
float busVoltage = busVoltageResult(bvrVal);
int svrVal = getRegRaw(SVR);
int pwrVal = getRegRaw(PR) * PR_mW;
int curVal = getRegRaw(CR) * CR_mA;
Serial.print(F("LTR(F): "));
Serial.print(ltrTempF);
Serial.print(F(", RTR1(F): "));
Serial.print(rtr1TempF);
Serial.print(F(", RTR2(F): "));
Serial.print(rtr2TempF);
Serial.print(F(", RTR3(F): "));
Serial.print(rtr3TempF);
Serial.println();
Serial.print(F("SVR: "));
Serial.print(svrVal);
Serial.print(F(", BVR: "));
Serial.print(bvrVal);
Serial.print(F(", BusVoltage(V): "));
Serial.print(busVoltage);
Serial.print(F(", PR(mW): "));
Serial.print(pwrVal);
Serial.print(F(", CR(mA): "));
Serial.print(curVal);
Serial.println();
Serial.println();
delay(2000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment