LM77 Temperature sensor with I2C interface. Provides temperature in celsius and fahrenheit. The device also supports temperature alerts.
Revision 0:8e812deb9f66, committed 2015-01-10
- Comitter:
- wim
- Date:
- Sat Jan 10 19:10:40 2015 +0000
- Commit message:
- First version of LM77 library.
Changed in this revision
| LM77.cpp | Show annotated file Show diff for this revision Revisions of this file |
| LM77.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LM77.cpp Sat Jan 10 19:10:40 2015 +0000
@@ -0,0 +1,548 @@
+/* mbed LM77 Library, for an I2C Temperature sensor
+ * Copyright (c) 2015, v01: WH, Initial version
+ *
+ * The LM77 is a digital temperature sensor and thermal window comparator with an I2C Serial Bus interface.
+ * The open-drain Interrupt (INT) output becomes active whenever temperature goes outside a programmable window,
+ * while a separate Critical Temperature Alarm (T_CRIT_A) output becomes active when the temperature exceeds a
+ * programmable critical limit. The INT output can operate in either a comparator or event mode, while the T_CRIT_A
+ * output operates in comparator mode only. The host can program both the upper and lower limits of the window as
+ * well as the critical temperature limit. Programmable hysterisis as well as a fault queue are available to minimize
+ * false tripping. Two pins (A0, A1) are available for address selection. The sensor powers up with default thresholds
+ * of 2°C THYST, 10°C TLOW, 64°C THIGH, and 80°C TCRIT.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "LM77.h"
+
+/** Create an LM77 device instance
+ *
+ * @param i2c I2C Bus
+ * @param char deviceAddress I2C slaveaddress
+ */
+LM77::LM77(I2C *i2c, char deviceAddress) : _i2c(i2c), _slaveAddress(deviceAddress) {
+
+}
+
+/** Get Status
+ *
+ * @return bool Sensor ready
+ */
+bool LM77::getStatus(void) {
+ char buffer[2];
+ int status;
+
+ // Dummy operation to check status
+ buffer[0] = 0x00;
+ status=_i2c->write(_slaveAddress, buffer, 0);
+
+ return (status==0); // True when device found
+}
+
+
+/** Get the current power mode of the LM77
+ *
+ * @returns The current power mode as a PowerMode enum.
+ */
+LM77::PowerMode LM77::getPowerMode() {
+
+ //Read the 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Return the status of the SHUTDOWN bit
+ if (value & LM77_PWR_MSK) {
+ return POWER_SHUTDOWN;
+ }
+ else {
+ return POWER_NORMAL;
+ }
+}
+
+
+/** Set the power mode of the LM77
+ *
+ * @param mode The new power mode as a PowerMode enum.
+ */
+void LM77::setPowerMode(PowerMode mode) {
+
+ //Read the current 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Set or clear the SHUTDOWN bit
+ if (mode == POWER_SHUTDOWN) {
+ value |= LM77_PWR_DWN;
+ }
+ else {
+ value &= ~LM77_PWR_DWN;
+ }
+
+ //Write the value back out
+ _writeReg8(LM77_REG_CONF, value);
+}
+
+
+/** Get the current INT pin mode of the LM77
+ *
+ * @returns The current INT pin mode as an IntMode enum.
+ */
+LM77::IntMode LM77::getIntMode() {
+
+ //Read the 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Return the status of the INT_MODE bit
+ if (value & LM77_INT_MSK) {
+ return INT_EVENT;
+ }
+ else {
+ return INT_COMPARATOR;
+ }
+}
+
+
+/** Set the INT pin mode of the LM77
+ *
+ * @param mode The new INT pin mode as an IntMode enum.
+ */
+void LM77::setIntMode(IntMode mode) {
+
+ //Read the current 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Set or clear the OS_COMP_INT bit
+ if (mode == INT_EVENT) {
+ value |= LM77_INT_EVENT;
+ }
+ else {
+ // Comparator mode
+ value &= ~LM77_INT_EVENT;
+ }
+
+ //Write the value back out
+ _writeReg8(LM77_REG_CONF, value);
+}
+
+
+/** Get the current INT pin polarity of the LM77
+ *
+ * @returns The current INT pin polarity as an PinPolarity enum.
+ */
+LM77::PinPolarity LM77::getIntPolarity() {
+
+ //Read the 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Return the status of the POL_INT bit
+ if (value & LM77_POL_INT_MSK) {
+ return ACTIVE_HIGH;
+ }
+ else {
+ return ACTIVE_LOW;
+ }
+}
+
+/** Set the INT pin polarity of the LM77
+ *
+ * @param polarity The new INT pin polarity as an PinPolarity enum.
+ */
+void LM77::setIntPolarity(PinPolarity polarity)
+{
+ //Read the current 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Set or clear the POL_INT bit
+ if (polarity == ACTIVE_HIGH) {
+ value |= LM77_POL_INT_H;
+ }
+ else {
+ value &= ~LM77_POL_INT_H;
+ }
+
+ //Write the value back out
+ _writeReg8(LM77_REG_CONF, value);
+}
+
+/** Get the current T_CRIT_A pin polarity of the LM77
+ *
+ * @returns The current T_CRIT_A pin polarity as an PinPolarity enum.
+ */
+LM77::PinPolarity LM77::getTCritPolarity() {
+
+ //Read the 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Return the status of the POL_TCRIT bit
+ if (value & LM77_POL_TCRIT_MSK) {
+ return ACTIVE_HIGH;
+ }
+ else {
+ return ACTIVE_LOW;
+ }
+}
+
+/** Set the T_CRIT_A pin polarity of the LM77
+ *
+ * @param polarity The new T_CRIT_A pin polarity as an PinPolarity enum.
+ */
+void LM77::setTCritPolarity(PinPolarity polarity)
+{
+ //Read the current 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Set or clear the POL_TCRIT bit
+ if (polarity == ACTIVE_HIGH) {
+ value |= LM77_POL_TCRIT_H;
+ }
+ else {
+ value &= ~LM77_POL_TCRIT_H;
+ }
+
+ //Write the value back out
+ _writeReg8(LM77_REG_CONF, value);
+}
+
+
+/** Get the current pin and flag fault queue length of the LM77
+ *
+ * @returns The current pin and flag fault queue length as an FaultQueue enum.
+ */
+LM77::FaultQueue LM77::getFaultQueue()
+{
+ //Read the 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Return the status of the FAULT_QUE bit
+ if (value & LM77_FQU_MSK) {
+ return FAULT_QUEUE_4;
+ }
+ else {
+ return FAULT_QUEUE_1;
+ }
+}
+
+
+/** Set the pin and flag fault queue length of the LM77
+ *
+ * @param queue The new pin and flag fault queue length as an FaultQueue enum.
+ */
+void LM77::setFaultQueue(FaultQueue queue)
+{
+ //Read the current 8-bit register value
+ char value = _readReg8(LM77_REG_CONF);
+
+ //Set the new FAULT_QUE bit
+ if (queue == FAULT_QUEUE_4) {
+ value |= LM77_FQU_4;
+ }
+ else {
+ value &= ~LM77_FQU_4;
+ }
+
+ //Write the value back out
+ _writeReg8(LM77_REG_CONF, value);
+}
+
+/** Get the current Critical alert temperature threshold of the LM77
+ * Reset value is 80.0 °C.
+ *
+ * @returns The current Critical alert temperature threshold in °C.
+ */
+float LM77::getCritAlertTemp() {
+
+ //Use the 9-bit helper to read the TCRIT register
+ return _readTempHelper(LM77_REG_TCRIT);
+}
+
+/** Set the critical alert temperature threshold of the LM77
+ * Reset value is 80.0 °C.
+ *
+ * @param temp The new critical alert temperature threshold in °C.
+ */
+void LM77::setCritAlertTemp(float temp) {
+
+ //Use the 9-bit helper to write to the TCRIT register
+ _writeTempHelper(LM77_REG_TCRIT, temp);
+}
+
+/** Get the current Low temperature alert threshold of the LM77
+ * Reset value is 10.0 °C.
+ *
+ * @returns The current Low temperature alert threshold in °C.
+ */
+float LM77::getLowAlertTemp() {
+
+ //Use the 9-bit helper to read the TLOW register
+ return _readTempHelper(LM77_REG_TLOW);
+}
+
+/** Set the current Low temperature alert threshold of the LM77
+ * Reset value is 10.0 °C.
+ *
+ * @param temp The new Low alert temperature threshold in °C.
+ */
+void LM77::setLowAlertTemp(float temp){
+
+ //Use the 9-bit helper to write to the TLOW register
+ _writeTempHelper(LM77_REG_TLOW, temp);
+}
+
+/** Get the current High temperature alert threshold of the LM77
+ * Reset value is 64.0 °C.
+ *
+ * @returns The current High temperature alert threshold in °C.
+ */
+float LM77::getHighAlertTemp(){
+
+ //Use the 9-bit helper to read the THIGH register
+ return _readTempHelper(LM77_REG_THIGH);
+}
+
+/** Set the High temperature alert threshold of the LM77
+ * Reset value is 64.0 °C.
+ *
+ * @param temp The new High temperature alert threshold in °C.
+ */
+void LM77::setHighAlertTemp(float temp) {
+
+ //Use the 9-bit helper to write to the THIGH register
+ _writeTempHelper(LM77_REG_THIGH, temp);
+}
+
+
+/** Get the current alert temperature hysteresis of the LM77
+ * Reset value is 2.0 °C.
+ *
+ * @returns The current alert temperature hysteresis in °C.
+ */
+float LM77::getAlertHyst() {
+
+ //Use the 9-bit helper to read the THYST register
+ return _readTempHelper(LM77_REG_THYST);
+}
+
+/** Set the alert temperature hysteresis of the LM77
+ * Reset value is 2.0 °C.
+ *
+ * @param temp The new alert temperature hysteresis in °C.
+ */
+void LM77::setAlertHyst(float temp) {
+
+ //Use the 9-bit helper to write to the THYST register
+ _writeTempHelper(LM77_REG_THYST, temp);
+}
+
+
+/** Get Temperature as int in °Celsius x 10
+ *
+ * @return int Temperature in °Celsius x 10
+ */
+int LM77::getTemperatureInt(void) {
+
+ //Signed return value
+ int16_t value;
+
+ //Read the 9-bit raw temperature value in 0.5 degree resolution
+ value = _readReg16(LM77_REG_TEMP) >> 3;
+
+ //Sign extend negative numbers
+ if (value & (1 << 9))
+ value |= 0xFE00;
+
+ //Return the temperature in °C x 10
+ return (int) value * 5; // x 10 x 0.5
+}
+
+/** Get the Alert flags of the LM77
+ *
+ * @returns The current Alert flags as int.
+ */
+int LM77::getAlertFlags() {
+
+ //Signed return value
+ int16_t value;
+
+ //Read the 9-bit raw temperature value and the flags
+ value = _readReg16(LM77_REG_TEMP);
+
+ //Return the flag bits
+ // LM77_FLAG_LOW 0x01
+ // LM77_FLAG_HIGH 0x02
+ // LM77_FLAG_CRIT 0x04
+ // LM77_FLAG_MSK 0x07
+ return (value & LM77_FLAG_MSK);
+}
+
+
+/** Get Temperature as float in °Celsius
+ *
+ * @return float Temperature in °Celsius
+ */
+float LM77::getTemperature(void) {
+
+ return _readTempHelper(LM77_REG_TEMP);
+}
+
+#ifdef MBED_OPERATORS
+LM77::operator float() {
+
+ //Return the current temperature reading
+ return getTemperature();
+}
+#endif
+
+/** Convert Temperature from °Celsius into °Fahrenheit
+ *
+ * @param float celsius in °Celsius
+ * @return float temperature in °Fahrenheit
+ */
+float LM77::celsiusToFahrenheit(float celsius) {
+
+ return ((celsius * 9.0f) / 5.0f) + 32.0f; // Convert to Fahrenheit
+}
+
+
+/** Read 8 bit value from register
+ *
+ * @param reg Index of register
+ * @return data value from register
+ */
+char LM77::_readReg8(char reg) {
+
+ //Select the register
+ _i2c->write(_slaveAddress, ®, 1, true);
+
+ //Read the 8-bit register
+ _i2c->read(_slaveAddress, ®, 1);
+
+ //Return the byte
+ return reg;
+}
+
+/** Write 8 bit value to register
+ *
+ * @param reg Index of register
+ * @param data value to write
+ */
+void LM77::_writeReg8(char reg, char data) {
+
+ //Create a temporary buffer
+ char buf[2];
+
+ //Load the register address and 8-bit data
+ buf[0] = reg;
+ buf[1] = data;
+
+ //Write the data
+ _i2c->write(_slaveAddress, buf, 2);
+}
+
+/** Read 16 bit value from register
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register
+ * @return data value from register
+ */
+int16_t LM77::_readReg16(char reg) {
+
+ //Create a temporary buffer
+ char buf[2];
+
+ //Select the register
+ _i2c->write(_slaveAddress, ®, 1, true);
+
+ //Read the 16-bit register
+ _i2c->read(_slaveAddress, buf, 2);
+
+ //Return the combined 16-bit value
+ return (buf[0] << 8) | buf[1];
+}
+
+/** Write 16 bit value to register
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register
+ * @param data value to write
+ */
+void LM77::_writeReg16(char reg, int16_t data) {
+
+ //Create a temporary buffer
+ char buf[3];
+
+ //Load the register address and 16-bit data
+ buf[0] = reg;
+ buf[1] = data >> 8;
+ buf[2] = data;
+
+ //Write the data
+ _i2c->write(_slaveAddress, buf, 3);
+}
+
+/** Get Temperature as float in °Celsius
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register to read temp value
+ * @return float Temperature in °Celsius
+ */
+float LM77::_readTempHelper(char reg) {
+
+ //Signed return value
+ int16_t value;
+
+#if(1)
+ //Read the 9-bit raw temperature value in 0.5 degree resolution
+ value = _readReg16(reg) >> 3;
+#else
+ int16_t readreg;
+
+ //Test neg temps
+ readreg = 0xFE70; //-25 degree
+ value = readreg >> 3;
+#endif
+
+ //Sign extend negative numbers
+ if (value & (1 << 9))
+ value |= 0xFE00;
+
+ //Return the temperature in °C
+ return (float) value * 0.5f;
+}
+
+
+/** Set Temperature as float in °Celsius
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register to write temp value
+ * @param temp float Temperature value in °Celsius
+ */
+void LM77::_writeTempHelper(char reg, float temp) {
+ //Signed value
+ int16_t value;
+
+ //Range limit temp
+ if (temp < -55.0)
+ temp = -55.0;
+ else if (temp > 125.0)
+ temp = 125.0;
+
+ //Extract and shift the signed integer
+ value = temp * 2.0f;
+ value <<= 3;
+
+ //Send the new value
+ _writeReg16(reg, value);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LM77.h Sat Jan 10 19:10:40 2015 +0000
@@ -0,0 +1,388 @@
+/* mbed LM77 Library, for an I2C Temperature sensor
+ * Copyright (c) 2015, v01: WH, Initial version
+ *
+ * The LM77 is a digital temperature sensor and thermal window comparator with an I2C Serial Bus interface.
+ * The open-drain Interrupt (INT) output becomes active whenever temperature goes outside a programmable window,
+ * while a separate Critical Temperature Alarm (T_CRIT_A) output becomes active when the temperature exceeds a
+ * programmable critical limit. The INT output can operate in either a comparator or event mode, while the T_CRIT_A
+ * output operates in comparator mode only. The host can program both the upper and lower limits of the window as
+ * well as the critical temperature limit. Programmable hysterisis as well as a fault queue are available to minimize
+ * false tripping. Two pins (A0, A1) are available for address selection. The sensor powers up with default thresholds
+ * of 2°C THYST, 10°C TLOW, 64°C THIGH, and 80°C T_CRIT.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MBED_LM77_H
+#define MBED_LM77_H
+
+#include "mbed.h"
+
+/** An interface for the LM77 I2C temperature sensor
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "LM77.h"
+ *
+ * // I2C Communication
+ * I2C i2c(p28,p27); // SDA, SCL
+ *
+ * // Serial Communication*
+ * Serial pc(USBTX,USBRX);
+ *
+ * //Create an LM77 object at the default address (LM77_SA0)
+ * LM77 sensor(&i2c);
+ *
+ * int main() {
+ * pc.printf("Hello World!\n");
+ * if (lm77.getStatus()) {
+ * pc.printf("LM77 status = Ok\n\r");
+ *
+ * pc.printf("Critical Alert temperature from LM77 is %.1f [C]\r\n", lm77.getCritAlertTemp());
+ * pc.printf("Low Alert temperature from LM77 is %.1f [C]\r\n", lm77.getLowAlertTemp());
+ * pc.printf("High Alert temperature from LM77 is %.1f [C]\r\n", lm77.getHighAlertTemp());
+ * pc.printf("Alert Hysteresis from LM77 is %.1f [C]\r\n", lm77.getAlertHyst());
+ * wait(1.0);
+ *
+ *#define CA 95.0f
+ *#define LA 8.0f
+ *#define HA 15.0f
+ *#define HY 3.0f
+ * lm77.setCritAlertTemp(CA);
+ * lm77.setLowAlertTemp(LA);
+ * lm77.setHighAlertTemp(HA);
+ * lm77.setAlertHyst(HY);
+ *
+ * while(1) {
+ *
+ * // Show Temperature LM77
+ * //pc.printf("Ambient temperature from LM77 is %.1f [C]\r\n", (float) lm77.getTemperatureInt() / 10.0f);
+ * pc.printf("Ambient temperature from LM77 is %.1f [C]\r\n", lm77.getTemperature());
+ * wait(1.0);
+ * } // while
+ * }
+ * else {
+ * pc.printf("LM77 status = not Ok\n\r");
+ * } //if
+ * }
+ * @endcode
+ */
+
+// Device I2C Slave addresses
+#define LM77_SA0 0x90
+#define LM77_SA1 0x92
+#define LM77_SA2 0x94
+#define LM77_SA3 0x96
+
+//I2C register addresses
+#define LM77_REG_TEMP 0x00
+#define LM77_REG_CONF 0x01
+#define LM77_REG_THYST 0x02
+#define LM77_REG_TCRIT 0x03
+#define LM77_REG_TLOW 0x04
+#define LM77_REG_THIGH 0x05
+
+//Temp Register
+#define LM77_FLAG_LOW 0x01
+#define LM77_FLAG_HIGH 0x02
+#define LM77_FLAG_CRIT 0x04
+
+#define LM77_FLAG_MSK 0x07
+
+//Config Register
+#define LM77_PWR_ON 0x00
+#define LM77_PWR_DWN 0x01
+#define LM77_INT_CMP 0x00
+#define LM77_INT_EVENT 0x02
+#define LM77_POL_TCRIT_L 0x00
+#define LM77_POL_TCRIT_H 0x04
+#define LM77_POL_INT_L 0x00
+#define LM77_POL_INT_H 0x08
+#define LM77_FQU_1 0x00
+#define LM77_FQU_4 0x10
+
+#define LM77_PWR_MSK 0x01
+#define LM77_INT_MSK 0x02
+#define LM77_POL_TCRIT_MSK 0x04
+#define LM77_POL_INT_MSK 0x08
+#define LM77_FQU_MSK 0x10
+
+/** Create an LM77 Class instance
+ *
+ */
+class LM77 {
+
+public:
+
+ /** Represents the power mode of the LM77
+ */
+ enum PowerMode {
+ POWER_NORMAL, /**< Chip is enabled and samples every 100ms */
+ POWER_SHUTDOWN /**< Chip is in low-power shutdown mode */
+ };
+
+ /** Represents INT pin mode of the LM77
+ */
+ enum IntMode {
+ INT_COMPARATOR, /**< INT pin asserted when temp exceeds an alert threshold, and de-asserted when temp crosses alert hysteresis threshold or when LM77 is read. It will be re-asserted when condition is still true after reading. */
+ INT_EVENT /**< INT pin asserted when temp reaches an alert threshold or threshold +/- hysteris and only de-asserted when a register has been read. It will be re-asserted when next event occurs. */
+ };
+
+ /** Represents Pin polarity of the LM77
+ */
+ enum PinPolarity {
+ ACTIVE_LOW, /**< Pin is a logic low when asserted, and a logic high when de-asserted */
+ ACTIVE_HIGH /**< Pin is a logic high when asserted, and a logic low when de-asserted */
+ };
+
+ /** Represents OS pin fault queue length of the LM77
+ */
+ enum FaultQueue {
+ FAULT_QUEUE_1, /**< Pins and flags are asserted after 1 fault */
+ FAULT_QUEUE_4, /**< Pins and flags are asserted after 4 consecutive faults */
+ };
+
+
+ /** Create an LM77 device instance
+ *
+ * @param i2c I2C Bus
+ * @param char deviceAddress I2C slaveaddress (defaults to LM77_SA0).
+ */
+ LM77(I2C *i2c, char deviceAddress = LM77_SA0);
+
+
+ /** Get the current power mode of the LM77
+ *
+ * @returns The current power mode as a PowerMode enum.
+ */
+ LM77::PowerMode getPowerMode();
+
+ /** Set the power mode of the LM77
+ *
+ * @param mode The new power mode as a PowerMode enum.
+ */
+ void setPowerMode(PowerMode mode);
+
+ /** Get the current INT pin mode of the LM77
+ * Reset value is INT_COMPARATOR
+ *
+ * @returns The current INT pin mode as an IntMode enum.
+ */
+ LM77::IntMode getIntMode();
+
+ /** Set the INT pin mode of the LM77
+ *
+ * @param mode The new INT pin mode as an IntMode enum.
+ */
+ void setIntMode(IntMode mode);
+
+ /** Get the current INT pin polarity of the LM77
+ * Reset value is ACTIVE_LOW
+ *
+ * @returns The current INT pin polarity as an PinPolarity enum.
+ */
+ LM77::PinPolarity getIntPolarity();
+
+ /** Set the INT pin polarity of the LM77
+ *
+ * @param polarity The new INT pin polarity as an PinPolarity enum.
+ */
+ void setIntPolarity(PinPolarity polarity);
+
+ /** Get the current T_CRIT_A pin polarity of the LM77
+ * Reset value is ACTIVE_LOW
+ *
+ * @returns The current T_CRIT_A pin polarity as an PinPolarity enum.
+ */
+ LM77::PinPolarity getTCritPolarity();
+
+ /** Set the T_CRIT_A pin polarity of the LM77
+ *
+ * @param polarity The new T_CRIT_A pin polarity as an PinPolarity enum.
+ */
+ void setTCritPolarity(PinPolarity polarity);
+
+
+ /** Get the current pin and flag fault queue length of the LM77
+ * Reset value is FAULT_QUEUE_1, Pins and flags are asserted after 1 fault
+ *
+ * @returns The current pin and flag fault queue length as an FaultQueue enum.
+ */
+ LM77::FaultQueue getFaultQueue();
+
+ /** Set the pin and flag fault queue length of the LM77
+ *
+ * @param queue The new pin and flag fault queue length as an FaultQueue enum.
+ */
+ void setFaultQueue(FaultQueue queue);
+
+ /** Get the current critical alert temperature threshold of the LM77
+ * Reset value is 80.0 °C.
+ *
+ * @returns The current crtitcal alert temperature threshold in °C.
+ */
+ float getCritAlertTemp();
+
+ /** Set the Critical alert temperature threshold of the LM77
+ * Reset value is 80.0 °C.
+ *
+ * @param temp The new Critical alert temperature threshold in °C.
+ */
+ void setCritAlertTemp(float temp);
+
+
+ /** Get the current Low temperature alert threshold of the LM77
+ * Reset value is 10.0 °C.
+ *
+ * @returns The current Low temperature alert threshold in °C.
+ */
+ float getLowAlertTemp();
+
+ /** Set the current Low temperature alert threshold of the LM77
+ * Reset value is 10.0 °C.
+ *
+ * @param temp The new Low alert temperature threshold in °C.
+ */
+ void setLowAlertTemp(float temp);
+
+
+ /** Get the current High temperature alert threshold of the LM77
+ * Reset value is 64.0 °C.
+ *
+ * @returns The current High temperature alert threshold in °C.
+ */
+ float getHighAlertTemp();
+
+ /** Set the High temperature alert threshold of the LM77
+ * Reset value is 64.0 °C.
+ *
+ * @param temp The new High temperature alert threshold in °C.
+ */
+ void setHighAlertTemp(float temp);
+
+
+ /** Get the current alert temperature hysteresis of the LM77
+ * Reset value is 2.0 °C.
+ *
+ * @returns The current alert temperature hysteresis in °C.
+ */
+ float getAlertHyst();
+
+ /** Set the alert temperature hysteresis of the LM77
+ * Reset value is 2.0 °C.
+ *
+ * @param temp The new alert temperature hysteris in °C.
+ */
+ void setAlertHyst(float temp);
+
+ /** Get Temperature as Int in °Celsius x 10
+ *
+ * @return int Temperature in °Celsius x 10
+ */
+ int getTemperatureInt(void);
+
+ /** Get Temperature as float in °Celsius
+ *
+ * @return float Temperature in °Celsius
+ */
+ float getTemperature(void);
+
+ /** Get the Alert flags of the LM77
+ *
+ * @returns The current Alert flags as int.
+ */
+ int getAlertFlags(void);
+
+
+#ifdef MBED_OPERATORS
+ /** A shorthand for Temperature()
+ *
+ * @returns The current temperature measurement in °C.
+ */
+ operator float();
+#endif
+
+ /** Convert Temperature from °Celsius into °Fahrenheit
+ *
+ * @param float celsius in °Celsius
+ * @return float temperature in °Fahrenheit
+ */
+ float celsiusToFahrenheit(float celsius);
+
+
+ /** Get Status
+ *
+ * @return bool Sensor ready
+ */
+ bool getStatus(void);
+
+private:
+ //Member variables
+ I2C* _i2c;
+ char _slaveAddress;
+
+ //Member methods
+ /** Read 8 bit value from register
+ *
+ * @param reg Index of register
+ * @return data value from register
+ */
+ char _readReg8(char reg);
+
+ /** Write 8 bit value to register
+ *
+ * @param reg Index of register
+ * @param data value to write
+ */
+ void _writeReg8(char reg, char data);
+
+ /** Read 16 bit value from register
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register
+ * @return data value from register
+ */
+ int16_t _readReg16(char reg);
+
+ /** Write 16 bit value to register
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register
+ * @param data value to write
+ */
+ void _writeReg16(char, int16_t data);
+
+ /** Get Temperature as float in °Celsius
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register to read temp value
+ * @return float Temperature in °Celsius
+ */
+ float _readTempHelper(char reg);
+
+ /** Set Temperature as float in °Celsius
+ * Used for Critical temp threshold, Low and High temp threshold window and Hysteresis
+ *
+ * @param reg Index of register to write temp value
+ * @param temp float Temperature value in °Celsius
+ */
+ void _writeTempHelper(char reg, float temp);
+};
+
+#endif
\ No newline at end of file
LM77 temperature sensor