MAX44009 Ambient Light Sensor with ADC library
Fork of MAX44009 by
MAX44009.cpp@3:b3745ae13d09, 2018-02-19 (annotated)
- Committer:
- lucian@192-168-0-103.rdsnet.ro
- Date:
- Mon Feb 19 18:35:44 2018 +0200
- Revision:
- 3:b3745ae13d09
- Parent:
- 2:7aa4718b2e2b
- Child:
- 4:1799f106738d
Fix raw reading method
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gizmo69the2nd | 0:726b77a319d8 | 1 | /* |
gizmo69the2nd | 0:726b77a319d8 | 2 | * MAX44009 Ambient Light Sensor with ADC library |
gizmo69the2nd | 0:726b77a319d8 | 3 | * |
gizmo69the2nd | 0:726b77a319d8 | 4 | * |
gizmo69the2nd | 0:726b77a319d8 | 5 | * Copyright (c) 2013 Davy Van Belle, MIT License |
gizmo69the2nd | 0:726b77a319d8 | 6 | * |
gizmo69the2nd | 0:726b77a319d8 | 7 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
gizmo69the2nd | 0:726b77a319d8 | 8 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
gizmo69the2nd | 0:726b77a319d8 | 9 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
gizmo69the2nd | 0:726b77a319d8 | 10 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
gizmo69the2nd | 0:726b77a319d8 | 11 | * furnished to do so, subject to the following conditions: |
gizmo69the2nd | 0:726b77a319d8 | 12 | * |
gizmo69the2nd | 0:726b77a319d8 | 13 | * The above copyright notice and this permission notice shall be included in all copies or |
gizmo69the2nd | 0:726b77a319d8 | 14 | * substantial portions of the Software. |
gizmo69the2nd | 0:726b77a319d8 | 15 | * |
gizmo69the2nd | 0:726b77a319d8 | 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
gizmo69the2nd | 0:726b77a319d8 | 17 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
gizmo69the2nd | 0:726b77a319d8 | 18 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
gizmo69the2nd | 0:726b77a319d8 | 19 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
gizmo69the2nd | 0:726b77a319d8 | 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
gizmo69the2nd | 0:726b77a319d8 | 21 | */ |
gizmo69the2nd | 0:726b77a319d8 | 22 | |
gizmo69the2nd | 0:726b77a319d8 | 23 | /** @file |
gizmo69the2nd | 0:726b77a319d8 | 24 | * @brief MAX44009 I2C |
gizmo69the2nd | 0:726b77a319d8 | 25 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 26 | |
gizmo69the2nd | 0:726b77a319d8 | 27 | #include "mbed.h" |
gizmo69the2nd | 0:726b77a319d8 | 28 | #include "MAX44009.h" |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 29 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 30 | /** init MAX44009 class |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 31 | * @param *i2c pointer to I2C serial interface |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 32 | * @param addr sensor I2C address |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 33 | */ |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 34 | MAX44009::MAX44009(I2C &i2c, char addr) { |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 35 | _i2c = &i2c; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 36 | _addr = addr; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 37 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 38 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 39 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 40 | * Set configuration register for the device |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 41 | * @param config desired configuration register bits |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 42 | * BIT 7 - CONT: 1 = continuous mode, 0 = single measurement |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 43 | * BIT 6 - MANUAL: 1 = CDR, TIM[2:0] set by user, 0 = CDR, TIM[2:0] set by internal autorange |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 44 | * BIT [5:4] - Not Used |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 45 | * BIT 3 - CDR: 1 = Current divided by 8. (High-brightness), 0 = Current not divided. |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 46 | * BIT [2:0] - TIM: Integration Time. See datasheet. |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 47 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 48 | void MAX44009::setConfig(char config) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 49 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 50 | cmd[0] = CONFIG; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 51 | cmd[1] = config; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 52 | _i2c->write(_addr, cmd, 2); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 53 | } |
gizmo69the2nd | 0:726b77a319d8 | 54 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 55 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 56 | * Get device INT_STATUS register |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 57 | * BIT 0 : 0 = No interrupt event occurred, 1 = Ambient light intensity is outside the threshold range. |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 58 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 59 | char MAX44009::getIntStatus() { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 60 | char status; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 61 | char cmd = INT_STATUS; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 62 | _i2c->write(_addr, &cmd, 1, true); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 63 | _i2c->read(_addr + 1, &status, 1); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 64 | return status; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 65 | } |
gizmo69the2nd | 0:726b77a319d8 | 66 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 67 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 68 | * Set device INT_ENABLE register |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 69 | * @param Enable BIT 0 : 0 = INT pin and INTS bit not effected if an interrupt event occurred, 1 = INT pin pulled low and INTS bit is set if interrupt occurred. / |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 70 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 71 | void MAX44009::setIntEnable(bool Enable) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 72 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 73 | cmd[0] = INT_ENABLE; |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 74 | cmd[1] = (char) 0x00 | Enable; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 75 | _i2c->write(_addr, cmd, 2); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 76 | } |
gizmo69the2nd | 0:726b77a319d8 | 77 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 78 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 79 | * Get raw reading over I2C |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 80 | * @param buff raw reading buffer |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 81 | */ |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 82 | void MAX44009::getRawReading(char buff[2]) { |
gizmo69the2nd | 0:726b77a319d8 | 83 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 84 | |
gizmo69the2nd | 0:726b77a319d8 | 85 | cmd[0] = LUX_HIGH_B; |
gizmo69the2nd | 0:726b77a319d8 | 86 | cmd[1] = LUX_LOW_B; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 87 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 88 | _i2c->write(_addr, &cmd[0], 1, true); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 89 | _i2c->read(_addr + 1, &buff[0], 1, true); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 90 | _i2c->write(_addr, &cmd[1], 1, true); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 91 | _i2c->read(_addr + 1, &buff[1], 1); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 92 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 93 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 94 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 95 | * Get LUX reading from ADC |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 96 | */ |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 97 | double MAX44009::getLUXReading() { |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 98 | char buff[2]; |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 99 | |
lucian@192-168-0-103.rdsnet.ro | 3:b3745ae13d09 | 100 | this->getRawReading(buff); |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 101 | return this->getLuxFromBuffReading(buff); |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 102 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 103 | |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 104 | /** |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 105 | * Get the computed lux value for given buff reading |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 106 | */ |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 107 | double MAX44009::getLuxFromBuffReading(char *buff) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 108 | char exponent, mantissa; |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 109 | double lux; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 110 | |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 111 | exponent = (char) (buff[0] & 0xF0) >> 4; |
lucian@192-168-0-100.rdsnet.ro | 2:7aa4718b2e2b | 112 | mantissa = (char) (((buff[0] & 0x0F) << 4) | (buff[1] & 0x0F)); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 113 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 114 | lux = pow((double) 2, (double) exponent) * mantissa * 0.045; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 115 | |
gizmo69the2nd | 0:726b77a319d8 | 116 | return lux; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 117 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 118 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 119 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 120 | * Set upper threshold |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 121 | * @param threshold set upper threshold value. Further info, see datasheet |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 122 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 123 | void MAX44009::setUpperThreshold(char threshold) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 124 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 125 | cmd[0] = UP_THRESH_HIGH_B; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 126 | cmd[1] = threshold; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 127 | _i2c->write(_addr, cmd, 2); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 128 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 129 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 130 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 131 | * Set lower threshold |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 132 | * @param threshold set lower threshold value. Further info, see datasheet |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 133 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 134 | void MAX44009::setLowerThreshold(char threshold) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 135 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 136 | cmd[0] = LOW_THRESH_HIGH_B; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 137 | cmd[1] = threshold; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 138 | _i2c->write(_addr, cmd, 2); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 139 | } |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 140 | |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 141 | /** |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 142 | * Set Threshold time |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 143 | * @param time set time to trigger interrupt if value is below or above threshold value. Further info, see datasheet |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 144 | */ |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 145 | void MAX44009::setThresholdTimer(char time) { |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 146 | char cmd[2]; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 147 | cmd[0] = THRESH_TIMER; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 148 | cmd[1] = time; |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 149 | _i2c->write(_addr, cmd, 2); |
lucian@192-168-0-103.rdsnet.ro | 1:b8240ff9ddc3 | 150 | } |