MAX44009 Ambient Light Sensor with ADC library

Fork of MAX44009 by Davy Van Belle

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?

UserRevisionLine numberNew 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 }