Gabriel Silva / Mbed OS LOG
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)&reg);
   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)&reg);
+  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);
 }