Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: TMP117.cpp
- Revision:
- 4:0e3e93c26d83
- Parent:
- 3:23ecb85b6e8b
--- a/TMP117.cpp Wed Sep 30 09:59:57 2020 -0400 +++ b/TMP117.cpp Tue Oct 06 09:41:35 2020 -0400 @@ -14,9 +14,9 @@ @brief Constructor @param addr device I2C address [0x48 - 0x4B] */ -TMP117::TMP117 (uint8_t addr) { - - address = addr; +TMP117::TMP117 (uint8_t tmp_quant) +{ + TMP117::tmp_quant = tmp_quant; alert_pin = -1; alert_type = NOALERT; newDataCallback = NULL; @@ -26,12 +26,12 @@ @brief Initialize in default mode @param _newDataCallback callback function will be called when new data is available */ -void TMP117::init ( void (*_newDataCallback) (void) ) { - setConvMode (CONTINUOUS); - setConvTime (C125mS); - setAveraging (AVE8); - setAlertMode (DATA); - setOffsetTemperature(0); +void TMP117::init ( void (*_newDataCallback) (void), int addr ) { + setConvMode (CONTINUOUS, addr); + setConvTime (C125mS, addr); + setAveraging (AVE8, addr); + setAlertMode (DATA, addr); + setOffsetTemperature(0, addr); newDataCallback = _newDataCallback; } @@ -47,10 +47,10 @@ /*! @brief Performs a soft reset. All default values will be loaded to the configuration register */ -void TMP117::softReset ( void ) { +void TMP117::softReset ( int addr ) { uint16_t reg_value = 0; reg_value |= 1UL << 1; - writeConfig ( reg_value ); + writeConfig ( reg_value, addr ); } /*! @@ -58,7 +58,7 @@ @param mode TMP117_PMODE [Thermal-Alert-Data] */ -void TMP117::setAlertMode ( TMP117_PMODE mode) { +void TMP117::setAlertMode ( TMP117_PMODE mode, int addr) { uint16_t reg_value = readConfig (); if (mode == THERMAL) { reg_value |= 1UL << 4; // change to thermal mode @@ -73,7 +73,7 @@ else if (mode == DATA) { reg_value |= 1UL << 2; // set pin as data ready flag } - writeConfig ( reg_value ); + writeConfig ( reg_value, addr ); } ///*! @@ -94,13 +94,13 @@ @param lowtemp low boundary alert temperature @param hightemp high boundary alert temperature */ -void TMP117::setAllertTemperature (double lowtemp, double hightemp) { +void TMP117::setAllertTemperature (double lowtemp, double hightemp, int addr) { uint16_t high_temp_value = hightemp / TMP117_RESOLUTION; uint16_t low_temp_value = lowtemp / TMP117_RESOLUTION; - i2cWrite2B (TMP117_REG_TEMP_HIGH_LIMIT , high_temp_value); - i2cWrite2B (TMP117_REG_TEMP_LOW_LIMIT , low_temp_value); + i2cWrite2B (TMP117_REG_TEMP_HIGH_LIMIT , high_temp_value, addr); + i2cWrite2B (TMP117_REG_TEMP_LOW_LIMIT , low_temp_value, addr); } /*! @@ -108,11 +108,11 @@ @param cmode ::TMP117_CMODE [CONTINUOUS-SHUTDOWN-ONESHOT] */ -void TMP117::setConvMode ( TMP117_CMODE cmode) { +void TMP117::setConvMode ( TMP117_CMODE cmode, int addr) { uint16_t reg_value = readConfig (); reg_value &= ~((1UL << 11) | (1UL << 10)); // clear bits reg_value = reg_value | ( cmode & 0x03 ) << 10; // set bits - writeConfig ( reg_value ); + writeConfig ( reg_value , addr); } /*! @@ -120,22 +120,22 @@ @param convtime ::TMP117_CONVT [C15mS5-C125mS-C250mS-C500mS-C1S-C4S-C8S-C16S] */ -void TMP117::setConvTime ( TMP117_CONVT convtime ) { +void TMP117::setConvTime ( TMP117_CONVT convtime, int addr ) { uint16_t reg_value = readConfig (); reg_value &= ~((1UL << 9) | (1UL << 8) | (1UL << 7)); // clear bits reg_value = reg_value | ( convtime & 0x07 ) << 7; // set bits - writeConfig ( reg_value ); + writeConfig ( reg_value, addr ); } /*! @brief Set averaging mode @param ave ::TMP117_AVE [NOAVE-AVE8-AVE32-AVE64] */ -void TMP117::setAveraging ( TMP117_AVE ave ) { +void TMP117::setAveraging ( TMP117_AVE ave, int addr ) { uint16_t reg_value = readConfig (); reg_value &= ~((1UL << 6) | (1UL << 5) ); // clear bits reg_value = reg_value | ( ave & 0x03 ) << 5; // set bits - writeConfig ( reg_value ); + writeConfig ( reg_value, addr ); } /*! @@ -143,9 +143,9 @@ @param double target offset temperature in the range of ±256°C */ -void TMP117::setOffsetTemperature ( double offset ) { +void TMP117::setOffsetTemperature ( double offset, int addr ) { int16_t offset_temp_value = offset / TMP117_RESOLUTION; - i2cWrite2B (TMP117_REG_TEMPERATURE_OFFSET , offset_temp_value); + i2cWrite2B (TMP117_REG_TEMPERATURE_OFFSET , offset_temp_value, addr); } /*! @@ -153,11 +153,12 @@ @param double target temperature to calibrate to in the range of ±256°C */ -void TMP117::setTargetTemperature ( double target ) { - double actual_temp = getTemperature ( ); +void TMP117::setTargetTemperature ( double target, int addr ) { + getTemperatures(); + double actual_temp = temps[addr]; double delta_temp = target - actual_temp; - setOffsetTemperature ( delta_temp ); -} + setOffsetTemperature ( delta_temp, addr ); +} /*! @brief Read configuration register and handle events. @@ -189,14 +190,17 @@ return reg_value; } + /*! @brief Returns the recalculated temperature @return double temperature in °C */ -double TMP117::getTemperature (void) { - int16_t temp = i2cRead2B( TMP117_REG_TEMPERATURE ); - return (temp * TMP117_RESOLUTION); +void TMP117::getTemperatures (void) { + for(int i = 0; i < tmp_quant; i++) + { + temps[i] = (double)i2cRead2B( TMP117_REG_TEMPERATURE, TMP117_BASE_ADDR + i ) * TMP117_RESOLUTION; + } } /*! @brief Get Device Revision @@ -247,16 +251,16 @@ @param eeprom_nr represents the EEPROM number [1 - 3] */ -void TMP117::writeEEPROM (uint16_t data, uint8_t eeprom_nr) { +void TMP117::writeEEPROM (uint16_t data, uint8_t eeprom_nr, int addr) { if (!EEPROMisBusy()) { - unlockEEPROM(); + unlockEEPROM(addr); switch (eeprom_nr) { - case 1 : i2cWrite2B ( TMP117_REG_EEPROM1, data); break; - case 2 : i2cWrite2B ( TMP117_REG_EEPROM2, data); break; - case 3 : i2cWrite2B ( TMP117_REG_EEPROM3, data); break; + case 1 : i2cWrite2B ( TMP117_REG_EEPROM1, data, addr); break; + case 2 : i2cWrite2B ( TMP117_REG_EEPROM2, data, addr); break; + case 3 : i2cWrite2B ( TMP117_REG_EEPROM3, data, addr); break; default: printf("EEPROM value must be between 1 and 3"); } - lockEEPROM(); + lockEEPROM(addr); } else { printf("EEPROM is busy"); @@ -299,13 +303,13 @@ @param reg target register @param data data to write */ -void TMP117::i2cWrite2B (uint8_t reg, uint16_t data){ +void TMP117::i2cWrite2B (uint8_t reg, uint16_t data, int addr ){ TMP117::i2c.start(); TMP117::i2c.write(reg); char* w; w[0] = (char)data>>8; w[1] = (char)data & 0xff; - TMP117::i2c.write(address, w, 2); + TMP117::i2c.write(addr, w, 2); TMP117::i2c.stop(); wait_us(10*1000); } @@ -323,12 +327,42 @@ int16_t temp = 0; TMP117::i2c.start(); - ACK = TMP117::i2c.write(TMP117::address<<1); + ACK = TMP117::i2c.write(TMP117_BASE_ADDR<<1); if(!ACK) return -1; ACK = TMP117::i2c.write((0x0f)®); if(!ACK) return -1; TMP117::i2c.start(); - TMP117::i2c.write((TMP117::address<<1)|0x01); + TMP117::i2c.write((TMP117_BASE_ADDR<<1)|0x01); + if(!ACK) return -1; + read[0] = TMP117::i2c.read(ACK); + if(!ACK) return -1; + read[1] = TMP117::i2c.read(ACK); + TMP117::i2c.read(ACK); + temp = (read[0] << 8) | read[1]; + msb = read[0]; + lsb = read[1]; + return temp; +} + +/*! + @brief Read two bytes (16 bits) from TMP117 I2C sensor + + @param reg target register to read from + + @return uint16_t read data +*/ +uint16_t TMP117::i2cRead2B (uint8_t reg, uint8_t addr) { + int ACK = 0; + uint8_t read[2] = {0}; + int16_t temp = 0; + + TMP117::i2c.start(); + ACK = TMP117::i2c.write(addr<<1); + if(!ACK) return -1; + ACK = TMP117::i2c.write((0x0f)®); + if(!ACK) return -1; + TMP117::i2c.start(); + TMP117::i2c.write((addr<<1)|0x01); if(!ACK) return -1; read[0] = TMP117::i2c.read(ACK); if(!ACK) return -1; @@ -345,8 +379,8 @@ @param config_data configuration */ -void TMP117::writeConfig (uint16_t config_data) { - i2cWrite2B (TMP117_REG_CONFIGURATION, config_data); +void TMP117::writeConfig (uint16_t config_data, int addr) { + i2cWrite2B (TMP117_REG_CONFIGURATION, config_data, addr); } /*! @@ -385,22 +419,22 @@ /*! @brief Lock EEPROM, write protection */ -void TMP117::lockEEPROM (void) { +void TMP117::lockEEPROM ( int addr) { // clear bit 15 uint16_t code = 0; code &= ~(1UL << 15); - i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code ); + i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code, addr ); wait_us(100*1000); } /*! @brief Unlock EEPROM, remove write protection */ -void TMP117::unlockEEPROM (void) { +void TMP117::unlockEEPROM ( int addr) { // set bit 15 uint16_t code = 0; code |= 1UL << 15; - i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code ); + i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code, addr ); wait_us(100*1000); }