MAX44005 RGB Color, Temperature, and Infrared Proximity Sensor
Dependents: test_MAX44005 testSensor
MAX44005.cpp@0:81100c58ea0e, 2015-12-18 (annotated)
- Committer:
- Rhyme
- Date:
- Fri Dec 18 00:01:14 2015 +0000
- Revision:
- 0:81100c58ea0e
commit before publishing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Rhyme | 0:81100c58ea0e | 1 | /** |
Rhyme | 0:81100c58ea0e | 2 | * MAX44005 RGB Color, Temperature, |
Rhyme | 0:81100c58ea0e | 3 | * and Infrared Proximity Sensor |
Rhyme | 0:81100c58ea0e | 4 | * I2C 7bit address: 0x4A |
Rhyme | 0:81100c58ea0e | 5 | */ |
Rhyme | 0:81100c58ea0e | 6 | #include "MAX44005.h" |
Rhyme | 0:81100c58ea0e | 7 | |
Rhyme | 0:81100c58ea0e | 8 | /* some definitions here */ |
Rhyme | 0:81100c58ea0e | 9 | #define REG_INT_STATUS 0x00 |
Rhyme | 0:81100c58ea0e | 10 | #define REG_MAIN_CONFIG 0x01 |
Rhyme | 0:81100c58ea0e | 11 | #define REG_AMB_CONFIG 0x02 |
Rhyme | 0:81100c58ea0e | 12 | #define REG_PRX_CONFIG 0x03 |
Rhyme | 0:81100c58ea0e | 13 | |
Rhyme | 0:81100c58ea0e | 14 | /* AMBIENT + PROXIMITY READING */ |
Rhyme | 0:81100c58ea0e | 15 | #define REG_AMB_CLR_MSB 0x04 |
Rhyme | 0:81100c58ea0e | 16 | #define REG_AMB_CLR_LSB 0x05 |
Rhyme | 0:81100c58ea0e | 17 | #define REG_AMB_RED_MSB 0x06 |
Rhyme | 0:81100c58ea0e | 18 | #define REG_AMB_REG_LSB 0x07 |
Rhyme | 0:81100c58ea0e | 19 | #define REG_AMB_GRN_MSB 0x08 |
Rhyme | 0:81100c58ea0e | 20 | #define REG_AMB_GRN_LSB 0x09 |
Rhyme | 0:81100c58ea0e | 21 | #define REG_AMB_BLU_MSB 0x0A |
Rhyme | 0:81100c58ea0e | 22 | #define REG_AMB_BLU_LSB 0x0B |
Rhyme | 0:81100c58ea0e | 23 | #define REG_AMB_IR_MSB 0x0C |
Rhyme | 0:81100c58ea0e | 24 | #define REG_AMB_IR_LSB 0x0D |
Rhyme | 0:81100c58ea0e | 25 | #define REG_AMB_IRCMP_MSB 0x0E |
Rhyme | 0:81100c58ea0e | 26 | #define REG_AMB_IRCMP_LSB 0x0F |
Rhyme | 0:81100c58ea0e | 27 | #define REG_PRX_MSB 0x10 |
Rhyme | 0:81100c58ea0e | 28 | #define REG_PRX_LSB 0x11 |
Rhyme | 0:81100c58ea0e | 29 | |
Rhyme | 0:81100c58ea0e | 30 | /* TEMPERATURE SENSOR */ |
Rhyme | 0:81100c58ea0e | 31 | #define REG_TMP_MSB 0x12 |
Rhyme | 0:81100c58ea0e | 32 | #define REG_TMP_LSB 0x13 |
Rhyme | 0:81100c58ea0e | 33 | |
Rhyme | 0:81100c58ea0e | 34 | /* INTERRUPT THRESHOLDS */ |
Rhyme | 0:81100c58ea0e | 35 | #define REG_AMB_UTHR_MSB 0x14 |
Rhyme | 0:81100c58ea0e | 36 | #define REG_AMB_UTHR_LSB 0x15 |
Rhyme | 0:81100c58ea0e | 37 | #define REG_AMB_LTHR_MSB 0x16 |
Rhyme | 0:81100c58ea0e | 38 | #define REG_AMB_LTHR_LSB 0x17 |
Rhyme | 0:81100c58ea0e | 39 | #define REG_THR_PST 0x18 |
Rhyme | 0:81100c58ea0e | 40 | #define REG_PRX_UTHR_MSB 0x19 |
Rhyme | 0:81100c58ea0e | 41 | #define REG_PRX_UTHR_LSB 0x1A |
Rhyme | 0:81100c58ea0e | 42 | #define REG_PRX_LTHR_MSB 0x1B |
Rhyme | 0:81100c58ea0e | 43 | #define REG_PRX_LTHR_LSB 0x1C |
Rhyme | 0:81100c58ea0e | 44 | |
Rhyme | 0:81100c58ea0e | 45 | /* AMBIENT ADC GAINS */ |
Rhyme | 0:81100c58ea0e | 46 | #define REG_TRIM_GAIN_CLR 0x1D |
Rhyme | 0:81100c58ea0e | 47 | #define REG_TRIM_GAIN_RED 0x1E |
Rhyme | 0:81100c58ea0e | 48 | #define REG_TRIM_GAIN_GRN 0x1F |
Rhyme | 0:81100c58ea0e | 49 | #define REG_TRIM_GAIN_BLU 0x20 |
Rhyme | 0:81100c58ea0e | 50 | #define REG_TRIM_GAIN_IR 0x21 |
Rhyme | 0:81100c58ea0e | 51 | |
Rhyme | 0:81100c58ea0e | 52 | MAX44005::MAX44005(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { |
Rhyme | 0:81100c58ea0e | 53 | // activate the peripheral |
Rhyme | 0:81100c58ea0e | 54 | } |
Rhyme | 0:81100c58ea0e | 55 | |
Rhyme | 0:81100c58ea0e | 56 | MAX44005::~MAX44005() { } |
Rhyme | 0:81100c58ea0e | 57 | |
Rhyme | 0:81100c58ea0e | 58 | void MAX44005::readRegs(int addr, uint8_t * data, int len) { |
Rhyme | 0:81100c58ea0e | 59 | char t[1] = {addr} ; |
Rhyme | 0:81100c58ea0e | 60 | m_i2c.write(m_addr, t, 1, true) ; |
Rhyme | 0:81100c58ea0e | 61 | m_i2c.read(m_addr, (char*)data, len) ; |
Rhyme | 0:81100c58ea0e | 62 | } |
Rhyme | 0:81100c58ea0e | 63 | |
Rhyme | 0:81100c58ea0e | 64 | void MAX44005::writeRegs(uint8_t * data, int len) { |
Rhyme | 0:81100c58ea0e | 65 | m_i2c.write(m_addr, (char *)data, len) ; |
Rhyme | 0:81100c58ea0e | 66 | } |
Rhyme | 0:81100c58ea0e | 67 | |
Rhyme | 0:81100c58ea0e | 68 | int16_t MAX44005::getAMB_CLEAR(void) { |
Rhyme | 0:81100c58ea0e | 69 | int16_t value; |
Rhyme | 0:81100c58ea0e | 70 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 71 | readRegs(REG_AMB_CLR_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 72 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 73 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 74 | } |
Rhyme | 0:81100c58ea0e | 75 | |
Rhyme | 0:81100c58ea0e | 76 | int16_t MAX44005::getAMB_RED(void) { |
Rhyme | 0:81100c58ea0e | 77 | int16_t value; |
Rhyme | 0:81100c58ea0e | 78 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 79 | readRegs(REG_AMB_RED_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 80 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 81 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 82 | } |
Rhyme | 0:81100c58ea0e | 83 | |
Rhyme | 0:81100c58ea0e | 84 | int16_t MAX44005::getAMB_GREEN(void) { |
Rhyme | 0:81100c58ea0e | 85 | int16_t value; |
Rhyme | 0:81100c58ea0e | 86 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 87 | readRegs(REG_AMB_GRN_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 88 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 89 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 90 | } |
Rhyme | 0:81100c58ea0e | 91 | |
Rhyme | 0:81100c58ea0e | 92 | int16_t MAX44005::getAMB_BLUE(void) { |
Rhyme | 0:81100c58ea0e | 93 | int16_t value; |
Rhyme | 0:81100c58ea0e | 94 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 95 | readRegs(REG_AMB_BLU_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 96 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 97 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 98 | } |
Rhyme | 0:81100c58ea0e | 99 | |
Rhyme | 0:81100c58ea0e | 100 | int16_t MAX44005::getIR(void) { |
Rhyme | 0:81100c58ea0e | 101 | int16_t value; |
Rhyme | 0:81100c58ea0e | 102 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 103 | readRegs(REG_AMB_IR_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 104 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 105 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 106 | } |
Rhyme | 0:81100c58ea0e | 107 | |
Rhyme | 0:81100c58ea0e | 108 | int16_t MAX44005::getIRCOMP(void) { |
Rhyme | 0:81100c58ea0e | 109 | int16_t value; |
Rhyme | 0:81100c58ea0e | 110 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 111 | readRegs(REG_AMB_IRCMP_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 112 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 113 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 114 | } |
Rhyme | 0:81100c58ea0e | 115 | |
Rhyme | 0:81100c58ea0e | 116 | int16_t MAX44005::getTEMP(void) { |
Rhyme | 0:81100c58ea0e | 117 | int16_t value; |
Rhyme | 0:81100c58ea0e | 118 | uint8_t res[2]; |
Rhyme | 0:81100c58ea0e | 119 | readRegs(REG_TMP_MSB, res, 2) ; |
Rhyme | 0:81100c58ea0e | 120 | value = (res[0] << 8)+res[1] ; |
Rhyme | 0:81100c58ea0e | 121 | return( value ) ; |
Rhyme | 0:81100c58ea0e | 122 | } |
Rhyme | 0:81100c58ea0e | 123 | |
Rhyme | 0:81100c58ea0e | 124 | void MAX44005::enableTEMP(void) { |
Rhyme | 0:81100c58ea0e | 125 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 126 | val[0] = REG_AMB_CONFIG ; |
Rhyme | 0:81100c58ea0e | 127 | readRegs(REG_AMB_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 128 | val[1] = val[1] | 0x20 ; // set TEMPEN |
Rhyme | 0:81100c58ea0e | 129 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 130 | } |
Rhyme | 0:81100c58ea0e | 131 | |
Rhyme | 0:81100c58ea0e | 132 | void MAX44005::disableTEMP(void) { |
Rhyme | 0:81100c58ea0e | 133 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 134 | val[0] = REG_AMB_CONFIG ; |
Rhyme | 0:81100c58ea0e | 135 | readRegs(REG_AMB_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 136 | val[1] = val[1] & (~0x20) ; // clear TEMPEN |
Rhyme | 0:81100c58ea0e | 137 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 138 | } |
Rhyme | 0:81100c58ea0e | 139 | |
Rhyme | 0:81100c58ea0e | 140 | void MAX44005::enableAMBINT(void) |
Rhyme | 0:81100c58ea0e | 141 | { |
Rhyme | 0:81100c58ea0e | 142 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 143 | val[0] = REG_MAIN_CONFIG ; |
Rhyme | 0:81100c58ea0e | 144 | readRegs(REG_MAIN_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 145 | val[1] |= 0x01 ; |
Rhyme | 0:81100c58ea0e | 146 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 147 | } |
Rhyme | 0:81100c58ea0e | 148 | |
Rhyme | 0:81100c58ea0e | 149 | void MAX44005::disableAMBINT(void) |
Rhyme | 0:81100c58ea0e | 150 | { |
Rhyme | 0:81100c58ea0e | 151 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 152 | val[0] = REG_MAIN_CONFIG ; |
Rhyme | 0:81100c58ea0e | 153 | readRegs(REG_MAIN_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 154 | val[1] &= (~0x01) ; |
Rhyme | 0:81100c58ea0e | 155 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 156 | } |
Rhyme | 0:81100c58ea0e | 157 | |
Rhyme | 0:81100c58ea0e | 158 | void MAX44005::enablePRXINT(void) |
Rhyme | 0:81100c58ea0e | 159 | { |
Rhyme | 0:81100c58ea0e | 160 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 161 | val[0] = REG_MAIN_CONFIG ; |
Rhyme | 0:81100c58ea0e | 162 | readRegs(REG_MAIN_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 163 | val[1] |= 0x02 ; |
Rhyme | 0:81100c58ea0e | 164 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 165 | } |
Rhyme | 0:81100c58ea0e | 166 | |
Rhyme | 0:81100c58ea0e | 167 | void MAX44005::disablePRXINT(void) |
Rhyme | 0:81100c58ea0e | 168 | { |
Rhyme | 0:81100c58ea0e | 169 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 170 | val[0] = REG_MAIN_CONFIG ; |
Rhyme | 0:81100c58ea0e | 171 | readRegs(REG_MAIN_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 172 | val[1] &= (~0x02) ; |
Rhyme | 0:81100c58ea0e | 173 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 174 | } |
Rhyme | 0:81100c58ea0e | 175 | |
Rhyme | 0:81100c58ea0e | 176 | void MAX44005::setMode(uint8_t newMode) |
Rhyme | 0:81100c58ea0e | 177 | { |
Rhyme | 0:81100c58ea0e | 178 | uint8_t val[2] ; |
Rhyme | 0:81100c58ea0e | 179 | val[0] = REG_MAIN_CONFIG ; |
Rhyme | 0:81100c58ea0e | 180 | readRegs(REG_MAIN_CONFIG, &val[1], 1) ; |
Rhyme | 0:81100c58ea0e | 181 | val[1] = (0x70 & (newMode << 4)) | (val[1] & 0x0F) ; |
Rhyme | 0:81100c58ea0e | 182 | writeRegs(val, 2) ; |
Rhyme | 0:81100c58ea0e | 183 | } |