A feature complete driver for the LM75B temperature sensor from NXP.

Dependents:   app-board-TempAlarm LM75B IoTWorkshopSensors EduRobot ... more

Committer:
neilt6
Date:
Fri May 30 19:04:36 2014 +0000
Revision:
16:7ac462ba84ac
Parent:
15:69991c038abe
Added MBED_OPERATORS check to implementation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neilt6 2:9ecc39b2ca70 1 /* LM75B Driver Library
neilt6 4:06676376766a 2 * Copyright (c) 2013 Neil Thiessen
neilt6 0:557a92280097 3 *
neilt6 3:9d68eed28bfb 4 * Licensed under the Apache License, Version 2.0 (the "License");
neilt6 3:9d68eed28bfb 5 * you may not use this file except in compliance with the License.
neilt6 3:9d68eed28bfb 6 * You may obtain a copy of the License at
neilt6 4:06676376766a 7 *
neilt6 4:06676376766a 8 * http://www.apache.org/licenses/LICENSE-2.0
neilt6 0:557a92280097 9 *
neilt6 3:9d68eed28bfb 10 * Unless required by applicable law or agreed to in writing, software
neilt6 3:9d68eed28bfb 11 * distributed under the License is distributed on an "AS IS" BASIS,
neilt6 3:9d68eed28bfb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
neilt6 3:9d68eed28bfb 13 * See the License for the specific language governing permissions and
neilt6 3:9d68eed28bfb 14 * limitations under the License.
neilt6 0:557a92280097 15 */
neilt6 0:557a92280097 16
neilt6 0:557a92280097 17 #ifndef LM75B_H
neilt6 0:557a92280097 18 #define LM75B_H
neilt6 0:557a92280097 19
neilt6 0:557a92280097 20 #include "mbed.h"
neilt6 0:557a92280097 21
neilt6 0:557a92280097 22 /** LM75B class.
neilt6 0:557a92280097 23 * Used for controlling an LM75B temperature sensor connected via I2C.
neilt6 0:557a92280097 24 *
neilt6 0:557a92280097 25 * Example:
neilt6 0:557a92280097 26 * @code
neilt6 0:557a92280097 27 * #include "mbed.h"
neilt6 0:557a92280097 28 * #include "LM75B.h"
neilt6 0:557a92280097 29 *
neilt6 12:fc27dc535ea9 30 * //Create an LM75B object at the default address (ADDRESS_0)
neilt6 12:fc27dc535ea9 31 * LM75B sensor(p28, p27);
neilt6 0:557a92280097 32 *
neilt6 9:74b44a27fa40 33 * int main()
neilt6 9:74b44a27fa40 34 * {
neilt6 9:74b44a27fa40 35 * //Try to open the LM75B
neilt6 9:74b44a27fa40 36 * if (sensor.open()) {
neilt6 9:74b44a27fa40 37 * printf("Device detected!\n");
neilt6 9:74b44a27fa40 38 *
neilt6 9:74b44a27fa40 39 * while (1) {
neilt6 12:fc27dc535ea9 40 * //Print the current temperature
neilt6 12:fc27dc535ea9 41 * printf("Temp = %.3f\n", (float)sensor);
neilt6 0:557a92280097 42 *
neilt6 9:74b44a27fa40 43 * //Sleep for 0.5 seconds
neilt6 9:74b44a27fa40 44 * wait(0.5);
neilt6 9:74b44a27fa40 45 * }
neilt6 9:74b44a27fa40 46 * } else {
neilt6 12:fc27dc535ea9 47 * error("Device not detected!\n");
neilt6 0:557a92280097 48 * }
neilt6 0:557a92280097 49 * }
neilt6 0:557a92280097 50 * @endcode
neilt6 0:557a92280097 51 */
neilt6 0:557a92280097 52 class LM75B
neilt6 0:557a92280097 53 {
neilt6 0:557a92280097 54 public:
neilt6 2:9ecc39b2ca70 55 /** Represents the different I2C address possibilities for the LM75B
neilt6 2:9ecc39b2ca70 56 */
neilt6 2:9ecc39b2ca70 57 enum Address {
neilt6 2:9ecc39b2ca70 58 ADDRESS_0 = (0x48 << 1), /**< A[2:0] pins = 000 */
neilt6 2:9ecc39b2ca70 59 ADDRESS_1 = (0x49 << 1), /**< A[2:0] pins = 001 */
neilt6 2:9ecc39b2ca70 60 ADDRESS_2 = (0x4A << 1), /**< A[2:0] pins = 010 */
neilt6 2:9ecc39b2ca70 61 ADDRESS_3 = (0x4B << 1), /**< A[2:0] pins = 011 */
neilt6 2:9ecc39b2ca70 62 ADDRESS_4 = (0x4C << 1), /**< A[2:0] pins = 100 */
neilt6 2:9ecc39b2ca70 63 ADDRESS_5 = (0x4D << 1), /**< A[2:0] pins = 101 */
neilt6 2:9ecc39b2ca70 64 ADDRESS_6 = (0x4E << 1), /**< A[2:0] pins = 110 */
neilt6 2:9ecc39b2ca70 65 ADDRESS_7 = (0x4F << 1) /**< A[2:0] pins = 111 */
neilt6 2:9ecc39b2ca70 66 };
neilt6 2:9ecc39b2ca70 67
neilt6 2:9ecc39b2ca70 68 /** Represents the power mode of the LM75B
neilt6 2:9ecc39b2ca70 69 */
neilt6 2:9ecc39b2ca70 70 enum PowerMode {
neilt6 2:9ecc39b2ca70 71 POWER_NORMAL, /**< Chip is enabled and samples every 100ms */
neilt6 2:9ecc39b2ca70 72 POWER_SHUTDOWN /**< Chip is in low-power shutdown mode */
neilt6 2:9ecc39b2ca70 73 };
neilt6 2:9ecc39b2ca70 74
neilt6 2:9ecc39b2ca70 75 /** Represents OS pin mode of the LM75B
neilt6 2:9ecc39b2ca70 76 */
neilt6 2:9ecc39b2ca70 77 enum OSMode {
neilt6 2:9ecc39b2ca70 78 OS_COMPARATOR, /**< OS is asserted when the temperature reaches the alert threshold, and de-asserted when the temperature drops below the alert hysteresis threshold */
neilt6 2:9ecc39b2ca70 79 OS_INTERRUPT /**< OS is asserted when the temperature reaches the alert threshold, or drops below the alert hysteresis threshold, and only de-asserted when a register has been read */
neilt6 2:9ecc39b2ca70 80 };
neilt6 2:9ecc39b2ca70 81
neilt6 2:9ecc39b2ca70 82 /** Represents OS pin polarity of the LM75B
neilt6 2:9ecc39b2ca70 83 */
neilt6 2:9ecc39b2ca70 84 enum OSPolarity {
neilt6 2:9ecc39b2ca70 85 OS_ACTIVE_LOW, /**< OS is a logic low when asserted, and a logic high when de-asserted */
neilt6 2:9ecc39b2ca70 86 OS_ACTIVE_HIGH /**< OS is a logic high when asserted, and a logic low when de-asserted */
neilt6 2:9ecc39b2ca70 87 };
neilt6 2:9ecc39b2ca70 88
neilt6 2:9ecc39b2ca70 89 /** Represents OS pin fault queue length of the LM75B
neilt6 2:9ecc39b2ca70 90 */
neilt6 2:9ecc39b2ca70 91 enum OSFaultQueue {
neilt6 2:9ecc39b2ca70 92 OS_FAULT_QUEUE_1, /**< OS is asserted after 1 fault */
neilt6 2:9ecc39b2ca70 93 OS_FAULT_QUEUE_2, /**< OS is asserted after 2 consecutive faults */
neilt6 2:9ecc39b2ca70 94 OS_FAULT_QUEUE_4, /**< OS is asserted after 4 consecutive faults */
neilt6 2:9ecc39b2ca70 95 OS_FAULT_QUEUE_6 /**< OS is asserted after 6 consecutive faults */
neilt6 2:9ecc39b2ca70 96 };
neilt6 2:9ecc39b2ca70 97
neilt6 0:557a92280097 98 /** Create an LM75B object connected to the specified I2C pins with the specified I2C slave address
neilt6 0:557a92280097 99 *
neilt6 7:bebde8098fca 100 * @param sda The I2C data pin.
neilt6 7:bebde8098fca 101 * @param scl The I2C clock pin.
neilt6 12:fc27dc535ea9 102 * @param addr The I2C slave address (defaults to ADDRESS_0).
neilt6 15:69991c038abe 103 * @param hz The I2C bus frequency (defaults to 400kHz).
neilt6 0:557a92280097 104 */
neilt6 15:69991c038abe 105 LM75B(PinName sda, PinName scl, Address addr = ADDRESS_0, int hz = 400000);
neilt6 2:9ecc39b2ca70 106
neilt6 14:3a44310726fe 107 /** Probe for the LM75B and indicate if it's present on the bus
neilt6 9:74b44a27fa40 108 *
neilt6 9:74b44a27fa40 109 * @returns
neilt6 9:74b44a27fa40 110 * 'true' if the device exists on the bus,
neilt6 9:74b44a27fa40 111 * 'false' if the device doesn't exist on the bus.
neilt6 9:74b44a27fa40 112 */
neilt6 13:27c19044ace6 113 bool open();
neilt6 9:74b44a27fa40 114
neilt6 0:557a92280097 115 /** Get the current power mode of the LM75B
neilt6 0:557a92280097 116 *
neilt6 6:6b8a9d1ad49a 117 * @returns The current power mode as a PowerMode enum.
neilt6 0:557a92280097 118 */
neilt6 13:27c19044ace6 119 LM75B::PowerMode powerMode();
neilt6 2:9ecc39b2ca70 120
neilt6 0:557a92280097 121 /** Set the power mode of the LM75B
neilt6 0:557a92280097 122 *
neilt6 6:6b8a9d1ad49a 123 * @param mode The new power mode as a PowerMode enum.
neilt6 0:557a92280097 124 */
neilt6 8:2b797c309258 125 void powerMode(PowerMode mode);
neilt6 2:9ecc39b2ca70 126
neilt6 0:557a92280097 127 /** Get the current OS pin mode of the LM75B
neilt6 0:557a92280097 128 *
neilt6 6:6b8a9d1ad49a 129 * @returns The current OS pin mode as an OSMode enum.
neilt6 0:557a92280097 130 */
neilt6 13:27c19044ace6 131 LM75B::OSMode osMode();
neilt6 2:9ecc39b2ca70 132
neilt6 0:557a92280097 133 /** Set the OS pin mode of the LM75B
neilt6 0:557a92280097 134 *
neilt6 6:6b8a9d1ad49a 135 * @param mode The new OS pin mode as an OSMode enum.
neilt6 0:557a92280097 136 */
neilt6 8:2b797c309258 137 void osMode(OSMode mode);
neilt6 2:9ecc39b2ca70 138
neilt6 0:557a92280097 139 /** Get the current OS pin polarity of the LM75B
neilt6 0:557a92280097 140 *
neilt6 6:6b8a9d1ad49a 141 * @returns The current OS pin polarity as an OSPolarity enum.
neilt6 0:557a92280097 142 */
neilt6 13:27c19044ace6 143 LM75B::OSPolarity osPolarity();
neilt6 2:9ecc39b2ca70 144
neilt6 0:557a92280097 145 /** Set the OS pin polarity of the LM75B
neilt6 0:557a92280097 146 *
neilt6 6:6b8a9d1ad49a 147 * @param polarity The new OS pin polarity as an OSPolarity enum.
neilt6 0:557a92280097 148 */
neilt6 8:2b797c309258 149 void osPolarity(OSPolarity polarity);
neilt6 2:9ecc39b2ca70 150
neilt6 0:557a92280097 151 /** Get the current OS pin fault queue length of the LM75B
neilt6 0:557a92280097 152 *
neilt6 6:6b8a9d1ad49a 153 * @returns The current OS pin fault queue length as an OSFaultQueue enum.
neilt6 0:557a92280097 154 */
neilt6 13:27c19044ace6 155 LM75B::OSFaultQueue osFaultQueue();
neilt6 2:9ecc39b2ca70 156
neilt6 0:557a92280097 157 /** Set the OS pin fault queue length of the LM75B
neilt6 0:557a92280097 158 *
neilt6 6:6b8a9d1ad49a 159 * @param queue The new OS pin fault queue length as an OSFaultQueue enum.
neilt6 0:557a92280097 160 */
neilt6 8:2b797c309258 161 void osFaultQueue(OSFaultQueue queue);
neilt6 2:9ecc39b2ca70 162
neilt6 0:557a92280097 163 /** Get the current alert temperature threshold of the LM75B
neilt6 0:557a92280097 164 *
neilt6 6:6b8a9d1ad49a 165 * @returns The current alert temperature threshold in °C.
neilt6 0:557a92280097 166 */
neilt6 13:27c19044ace6 167 float alertTemp();
neilt6 2:9ecc39b2ca70 168
neilt6 0:557a92280097 169 /** Set the alert temperature threshold of the LM75B
neilt6 0:557a92280097 170 *
neilt6 6:6b8a9d1ad49a 171 * @param temp The new alert temperature threshold in °C.
neilt6 0:557a92280097 172 */
neilt6 8:2b797c309258 173 void alertTemp(float temp);
neilt6 2:9ecc39b2ca70 174
neilt6 0:557a92280097 175 /** Get the current alert temperature hysteresis threshold of the LM75B
neilt6 0:557a92280097 176 *
neilt6 6:6b8a9d1ad49a 177 * @returns The current alert temperature hysteresis threshold in °C.
neilt6 0:557a92280097 178 */
neilt6 13:27c19044ace6 179 float alertHyst();
neilt6 2:9ecc39b2ca70 180
neilt6 0:557a92280097 181 /** Set the alert temperature hysteresis threshold of the LM75B
neilt6 0:557a92280097 182 *
neilt6 6:6b8a9d1ad49a 183 * @param temp The new alert temperature hysteresis threshold in °C.
neilt6 0:557a92280097 184 */
neilt6 8:2b797c309258 185 void alertHyst(float temp);
neilt6 2:9ecc39b2ca70 186
neilt6 0:557a92280097 187 /** Get the current temperature measurement of the LM75B
neilt6 0:557a92280097 188 *
neilt6 6:6b8a9d1ad49a 189 * @returns The current temperature measurement in °C.
neilt6 0:557a92280097 190 */
neilt6 13:27c19044ace6 191 float temp();
neilt6 0:557a92280097 192
neilt6 12:fc27dc535ea9 193 #ifdef MBED_OPERATORS
neilt6 12:fc27dc535ea9 194 /** A shorthand for temp()
neilt6 12:fc27dc535ea9 195 *
neilt6 12:fc27dc535ea9 196 * @returns The current temperature measurement in °C.
neilt6 12:fc27dc535ea9 197 */
neilt6 13:27c19044ace6 198 operator float();
neilt6 12:fc27dc535ea9 199 #endif
neilt6 12:fc27dc535ea9 200
neilt6 0:557a92280097 201 private:
neilt6 8:2b797c309258 202 //I2C register addresses
neilt6 8:2b797c309258 203 enum Register {
neilt6 8:2b797c309258 204 REG_TEMP = 0x00,
neilt6 8:2b797c309258 205 REG_CONF = 0x01,
neilt6 8:2b797c309258 206 REG_THYST = 0x02,
neilt6 8:2b797c309258 207 REG_TOS = 0x03
neilt6 8:2b797c309258 208 };
neilt6 8:2b797c309258 209
neilt6 8:2b797c309258 210 //Member variables
neilt6 8:2b797c309258 211 I2C m_I2C;
neilt6 13:27c19044ace6 212 const int m_ADDR;
neilt6 8:2b797c309258 213
neilt6 8:2b797c309258 214 //Internal functions
neilt6 8:2b797c309258 215 char read8(char reg);
neilt6 8:2b797c309258 216 void write8(char reg, char data);
neilt6 8:2b797c309258 217 unsigned short read16(char reg);
neilt6 8:2b797c309258 218 void write16(char reg, unsigned short data);
neilt6 8:2b797c309258 219 float readAlertTempHelper(char reg);
neilt6 8:2b797c309258 220 void writeAlertTempHelper(char reg, float temp);
neilt6 0:557a92280097 221 };
neilt6 0:557a92280097 222
neilt6 5:f8b36d66b768 223 #endif