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.
Dependencies: AdaFruit_RGBLCDShield MCP23017 mbed RTclock
Fork of MCP_test by
Modules/TempModule.cpp@20:93c70a1869ee, 2014-08-30 (annotated)
- Committer:
- vtraveller
- Date:
- Sat Aug 30 16:30:27 2014 +0000
- Revision:
- 20:93c70a1869ee
- Parent:
- 15:d1eaddb363be
- Child:
- 21:c44cfd3259c0
Updated with temp sensor support.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vtraveller | 10:3fcab08717fc | 1 | #include "mbed.h" |
vtraveller | 10:3fcab08717fc | 2 | #include "TempModule.h" |
vtraveller | 10:3fcab08717fc | 3 | |
vtraveller | 10:3fcab08717fc | 4 | #include "extra_chars.h" |
vtraveller | 10:3fcab08717fc | 5 | |
vtraveller | 20:93c70a1869ee | 6 | #define MCP9808_I2CADDR_DEFAULT 0x30 |
vtraveller | 20:93c70a1869ee | 7 | #define MCP9808_REG_CONFIG 0x01 |
vtraveller | 20:93c70a1869ee | 8 | |
vtraveller | 20:93c70a1869ee | 9 | #define MCP9808_REG_CONFIG_SHUTDOWN 0x0100 |
vtraveller | 20:93c70a1869ee | 10 | #define MCP9808_REG_CONFIG_CRITLOCKED 0x0080 |
vtraveller | 20:93c70a1869ee | 11 | #define MCP9808_REG_CONFIG_WINLOCKED 0x0040 |
vtraveller | 20:93c70a1869ee | 12 | #define MCP9808_REG_CONFIG_INTCLR 0x0020 |
vtraveller | 20:93c70a1869ee | 13 | #define MCP9808_REG_CONFIG_ALERTSTAT 0x0010 |
vtraveller | 20:93c70a1869ee | 14 | #define MCP9808_REG_CONFIG_ALERTCTRL 0x0008 |
vtraveller | 20:93c70a1869ee | 15 | #define MCP9808_REG_CONFIG_ALERTSEL 0x0002 |
vtraveller | 20:93c70a1869ee | 16 | #define MCP9808_REG_CONFIG_ALERTPOL 0x0002 |
vtraveller | 20:93c70a1869ee | 17 | #define MCP9808_REG_CONFIG_ALERTMODE 0x0001 |
vtraveller | 20:93c70a1869ee | 18 | |
vtraveller | 20:93c70a1869ee | 19 | #define MCP9808_REG_UPPER_TEMP 0x02 |
vtraveller | 20:93c70a1869ee | 20 | #define MCP9808_REG_LOWER_TEMP 0x03 |
vtraveller | 20:93c70a1869ee | 21 | #define MCP9808_REG_CRIT_TEMP 0x04 |
vtraveller | 20:93c70a1869ee | 22 | #define MCP9808_REG_AMBIENT_TEMP 0x05 |
vtraveller | 20:93c70a1869ee | 23 | #define MCP9808_REG_MANUF_ID 0x06 |
vtraveller | 20:93c70a1869ee | 24 | #define MCP9808_REG_DEVICE_ID 0x07 |
vtraveller | 20:93c70a1869ee | 25 | |
vtraveller | 13:9641bc42db92 | 26 | TempModule::TempModule(Serial & in_cDisplay) |
vtraveller | 13:9641bc42db92 | 27 | : Module(in_cDisplay) |
vtraveller | 20:93c70a1869ee | 28 | , m_cI2C(D3, D6) //I2C_SDA, I2C_SCL) |
vtraveller | 20:93c70a1869ee | 29 | , m_nAddress(MCP9808_I2CADDR_DEFAULT) |
vtraveller | 10:3fcab08717fc | 30 | { |
vtraveller | 20:93c70a1869ee | 31 | uint16_t nManufacturer = read16(MCP9808_REG_MANUF_ID);// != 0x0054) return false; |
vtraveller | 20:93c70a1869ee | 32 | uint16_t nDeviceId = read16(MCP9808_REG_DEVICE_ID);// |
vtraveller | 20:93c70a1869ee | 33 | |
vtraveller | 20:93c70a1869ee | 34 | // Check to see if we need to autoscan for our device |
vtraveller | 20:93c70a1869ee | 35 | bool bAutoScan = (0x0054 != nManufacturer || 0x0400 != nDeviceId); |
vtraveller | 20:93c70a1869ee | 36 | if (bAutoScan) m_nAddress = 0; |
vtraveller | 20:93c70a1869ee | 37 | |
vtraveller | 20:93c70a1869ee | 38 | while (bAutoScan && m_nAddress < 0x80) |
vtraveller | 20:93c70a1869ee | 39 | { |
vtraveller | 20:93c70a1869ee | 40 | nManufacturer = read16(MCP9808_REG_MANUF_ID);// != 0x0054) return false; |
vtraveller | 20:93c70a1869ee | 41 | nDeviceId = read16(MCP9808_REG_DEVICE_ID);// |
vtraveller | 20:93c70a1869ee | 42 | |
vtraveller | 20:93c70a1869ee | 43 | bAutoScan = (0x0054 != nManufacturer || 0x0400 != nDeviceId); |
vtraveller | 20:93c70a1869ee | 44 | m_nAddress++; |
vtraveller | 20:93c70a1869ee | 45 | } |
vtraveller | 10:3fcab08717fc | 46 | } |
vtraveller | 10:3fcab08717fc | 47 | |
vtraveller | 10:3fcab08717fc | 48 | TempModule::~TempModule() |
vtraveller | 10:3fcab08717fc | 49 | { |
vtraveller | 10:3fcab08717fc | 50 | } |
vtraveller | 11:96146db429de | 51 | |
vtraveller | 20:93c70a1869ee | 52 | float TempModule::readTempC() |
vtraveller | 11:96146db429de | 53 | { |
vtraveller | 20:93c70a1869ee | 54 | uint16_t t = read16(MCP9808_REG_AMBIENT_TEMP); |
vtraveller | 20:93c70a1869ee | 55 | |
vtraveller | 20:93c70a1869ee | 56 | float temp = t & 0x0FFF; |
vtraveller | 20:93c70a1869ee | 57 | temp /= 16.0f; |
vtraveller | 20:93c70a1869ee | 58 | |
vtraveller | 20:93c70a1869ee | 59 | // check to see if signed bit set |
vtraveller | 20:93c70a1869ee | 60 | if (t & 0x1000) temp -= 0xff; |
vtraveller | 10:3fcab08717fc | 61 | |
vtraveller | 20:93c70a1869ee | 62 | return temp; |
vtraveller | 20:93c70a1869ee | 63 | } |
vtraveller | 20:93c70a1869ee | 64 | |
vtraveller | 20:93c70a1869ee | 65 | void TempModule::write16(uint8_t in_nRegister, uint16_t in_nValue) |
vtraveller | 20:93c70a1869ee | 66 | { |
vtraveller | 20:93c70a1869ee | 67 | char aBuffer[3] = { in_nRegister, in_nValue >> 8, in_nValue & 0xFF }; |
vtraveller | 20:93c70a1869ee | 68 | m_cI2C.write(MCP9808_I2CADDR_DEFAULT, aBuffer, sizeof(aBuffer)); |
vtraveller | 11:96146db429de | 69 | } |
vtraveller | 11:96146db429de | 70 | |
vtraveller | 20:93c70a1869ee | 71 | uint16_t TempModule::read16(uint8_t in_nRegister) |
vtraveller | 10:3fcab08717fc | 72 | { |
vtraveller | 20:93c70a1869ee | 73 | m_cI2C.write(m_nAddress, (const char *)&in_nRegister, sizeof(in_nRegister)); |
vtraveller | 10:3fcab08717fc | 74 | |
vtraveller | 20:93c70a1869ee | 75 | char aReadBuffer[2]; |
vtraveller | 20:93c70a1869ee | 76 | m_cI2C.read(m_nAddress, aReadBuffer, sizeof(aReadBuffer)); |
vtraveller | 20:93c70a1869ee | 77 | |
vtraveller | 20:93c70a1869ee | 78 | return (aReadBuffer[0] << 8) | aReadBuffer[1]; |
vtraveller | 10:3fcab08717fc | 79 | } |
vtraveller | 10:3fcab08717fc | 80 | |
vtraveller | 20:93c70a1869ee | 81 | void TempModule::show(bool in_bRefresh) |
vtraveller | 10:3fcab08717fc | 82 | { |
vtraveller | 20:93c70a1869ee | 83 | static time_t nTime = time(NULL) + 1; |
vtraveller | 20:93c70a1869ee | 84 | if (in_bRefresh || nTime < time(NULL)) |
vtraveller | 20:93c70a1869ee | 85 | { |
vtraveller | 20:93c70a1869ee | 86 | m_cDisplay.printf("Room: %0.1f%cC ",readTempC(),eDegree); |
vtraveller | 20:93c70a1869ee | 87 | |
vtraveller | 20:93c70a1869ee | 88 | // uint8_t nValue = read16(MCP9808_REG_MANUF_ID); |
vtraveller | 20:93c70a1869ee | 89 | // m_cDisplay.printf("%x - %x - %x ", m_nAddress, nValue,read16(MCP9808_REG_DEVICE_ID)); |
vtraveller | 20:93c70a1869ee | 90 | |
vtraveller | 20:93c70a1869ee | 91 | nTime = time(NULL) + 1; |
vtraveller | 20:93c70a1869ee | 92 | } |
vtraveller | 10:3fcab08717fc | 93 | } |