Industry's Lowest-Power Ambient Light Sensor with ADC
Dependents: FYPhh FYPhh5 FYPhh5ultrafinal FYPhh5ultrafinal
MAX44009.h@3:13e5af215b11, 2018-09-17 (annotated)
- Committer:
- mcm
- Date:
- Mon Sep 17 11:41:33 2018 +0000
- Revision:
- 3:13e5af215b11
- Parent:
- 2:08d850dd1cb8
This driver was completed and tested ( NUCLEO-L152RE ), it works as expected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:db9c179c2a91 | 1 | /** |
mcm | 1:db9c179c2a91 | 2 | * @brief MAX44009.h |
mcm | 1:db9c179c2a91 | 3 | * @details Industry's Lowest-Power Ambient Light Sensor with ADC. |
mcm | 1:db9c179c2a91 | 4 | * Header file. |
mcm | 1:db9c179c2a91 | 5 | * |
mcm | 1:db9c179c2a91 | 6 | * |
mcm | 1:db9c179c2a91 | 7 | * @return N/A |
mcm | 1:db9c179c2a91 | 8 | * |
mcm | 1:db9c179c2a91 | 9 | * @author Manuel Caballero |
mcm | 1:db9c179c2a91 | 10 | * @date 17/September/2018 |
mcm | 1:db9c179c2a91 | 11 | * @version 17/September/2018 The ORIGIN |
mcm | 1:db9c179c2a91 | 12 | * @pre N/A |
mcm | 1:db9c179c2a91 | 13 | * @warning N/A |
mcm | 1:db9c179c2a91 | 14 | * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ). |
mcm | 1:db9c179c2a91 | 15 | */ |
mcm | 1:db9c179c2a91 | 16 | #ifndef MAX44009_H_ |
mcm | 1:db9c179c2a91 | 17 | #define MAX44009_H_ |
mcm | 1:db9c179c2a91 | 18 | |
mcm | 1:db9c179c2a91 | 19 | #include "mbed.h" |
mcm | 1:db9c179c2a91 | 20 | |
mcm | 1:db9c179c2a91 | 21 | |
mcm | 1:db9c179c2a91 | 22 | /** |
mcm | 1:db9c179c2a91 | 23 | Example: |
mcm | 1:db9c179c2a91 | 24 | |
mcm | 1:db9c179c2a91 | 25 | @code |
mcm | 3:13e5af215b11 | 26 | #include "mbed.h" |
mcm | 3:13e5af215b11 | 27 | #include "MAX44009.h" |
mcm | 1:db9c179c2a91 | 28 | |
mcm | 3:13e5af215b11 | 29 | MAX44009 myMAX44009 ( I2C_SDA, I2C_SCL, MAX44009::MAX44009_ADDRESS_A0_VCC, 400000 ); |
mcm | 3:13e5af215b11 | 30 | Serial pc ( USBTX, USBRX ); // tx, rx |
mcm | 3:13e5af215b11 | 31 | |
mcm | 3:13e5af215b11 | 32 | DigitalOut myled ( LED1 ); |
mcm | 3:13e5af215b11 | 33 | Ticker newAction; |
mcm | 3:13e5af215b11 | 34 | |
mcm | 3:13e5af215b11 | 35 | |
mcm | 3:13e5af215b11 | 36 | //@brief Constants. |
mcm | 3:13e5af215b11 | 37 | // |
mcm | 3:13e5af215b11 | 38 | |
mcm | 3:13e5af215b11 | 39 | |
mcm | 3:13e5af215b11 | 40 | //@brief Variables. |
mcm | 3:13e5af215b11 | 41 | // |
mcm | 3:13e5af215b11 | 42 | volatile uint32_t myState; // State that indicates when to perform an ADC sample |
mcm | 3:13e5af215b11 | 43 | |
mcm | 3:13e5af215b11 | 44 | |
mcm | 3:13e5af215b11 | 45 | // |
mcm | 3:13e5af215b11 | 46 | // @brief FUNCTION PROTOTYPES |
mcm | 3:13e5af215b11 | 47 | // |
mcm | 3:13e5af215b11 | 48 | void changeDATA ( void ); |
mcm | 3:13e5af215b11 | 49 | |
mcm | 3:13e5af215b11 | 50 | |
mcm | 3:13e5af215b11 | 51 | //@brief FUNCTION FOR APPLICATION MAIN ENTRY. |
mcm | 3:13e5af215b11 | 52 | // |
mcm | 3:13e5af215b11 | 53 | int main() |
mcm | 3:13e5af215b11 | 54 | { |
mcm | 3:13e5af215b11 | 55 | MAX44009::MAX44009_status_t aux; |
mcm | 3:13e5af215b11 | 56 | MAX44009::MAX44009_vector_data_t myMAX44009_Data; |
mcm | 3:13e5af215b11 | 57 | |
mcm | 3:13e5af215b11 | 58 | pc.baud ( 115200 ); |
mcm | 3:13e5af215b11 | 59 | |
mcm | 3:13e5af215b11 | 60 | |
mcm | 3:13e5af215b11 | 61 | myled = 1; |
mcm | 3:13e5af215b11 | 62 | wait(3); |
mcm | 3:13e5af215b11 | 63 | myled = 0; |
mcm | 3:13e5af215b11 | 64 | |
mcm | 3:13e5af215b11 | 65 | // Configure the device: Default mode ( sample every 800ms ), CDR and TIM are automatically determined |
mcm | 3:13e5af215b11 | 66 | aux = myMAX44009.MAX44009_Configuration ( MAX44009::CONFIGURATION_CONT_DEFAULT_MODE, MAX44009::CONFIGURATION_MANUAL_DEFAULT_MODE, MAX44009::CONFIGURATION_CDR_CURRENT_NOT_DIVIDED, MAX44009::CONFIGURATION_TIM_800_MS ); |
mcm | 3:13e5af215b11 | 67 | |
mcm | 3:13e5af215b11 | 68 | |
mcm | 3:13e5af215b11 | 69 | myState = 0UL; // Reset the variable |
mcm | 3:13e5af215b11 | 70 | newAction.attach( &changeDATA, 2 ); // the address of the function to be attached ( changeDATA ) and the interval ( 2s ) |
mcm | 3:13e5af215b11 | 71 | |
mcm | 3:13e5af215b11 | 72 | // Let the callbacks take care of everything |
mcm | 3:13e5af215b11 | 73 | while(1) { |
mcm | 3:13e5af215b11 | 74 | sleep(); |
mcm | 3:13e5af215b11 | 75 | |
mcm | 3:13e5af215b11 | 76 | if ( myState == 1UL ) { |
mcm | 3:13e5af215b11 | 77 | myled = 1U; |
mcm | 3:13e5af215b11 | 78 | |
mcm | 3:13e5af215b11 | 79 | // Get Lux value |
mcm | 3:13e5af215b11 | 80 | aux = myMAX44009.MAX44009_GetLux ( MAX44009::RESOLUTION_EXTENDED_RESOLUTION, &myMAX44009_Data ); |
mcm | 3:13e5af215b11 | 81 | |
mcm | 3:13e5af215b11 | 82 | // Get current division ratio |
mcm | 3:13e5af215b11 | 83 | aux = myMAX44009.MAX44009_GetCurrentDivisionRatio ( &myMAX44009_Data ); |
mcm | 3:13e5af215b11 | 84 | |
mcm | 3:13e5af215b11 | 85 | // Get integration time |
mcm | 3:13e5af215b11 | 86 | aux = myMAX44009.MAX44009_GetIntegrationTime ( &myMAX44009_Data ); |
mcm | 3:13e5af215b11 | 87 | |
mcm | 3:13e5af215b11 | 88 | // Transmit result through the UART |
mcm | 3:13e5af215b11 | 89 | pc.printf ( "Lux: %0.001f Lux\r\n", myMAX44009_Data.lux ); |
mcm | 3:13e5af215b11 | 90 | |
mcm | 3:13e5af215b11 | 91 | |
mcm | 3:13e5af215b11 | 92 | // Reset the variables |
mcm | 3:13e5af215b11 | 93 | myState = 0UL; |
mcm | 3:13e5af215b11 | 94 | myled = 0U; |
mcm | 3:13e5af215b11 | 95 | } |
mcm | 3:13e5af215b11 | 96 | } |
mcm | 3:13e5af215b11 | 97 | } |
mcm | 3:13e5af215b11 | 98 | |
mcm | 3:13e5af215b11 | 99 | |
mcm | 3:13e5af215b11 | 100 | // |
mcm | 3:13e5af215b11 | 101 | // @brief changeDATA ( void ) |
mcm | 3:13e5af215b11 | 102 | // |
mcm | 3:13e5af215b11 | 103 | // @details It changes myState variable |
mcm | 3:13e5af215b11 | 104 | // |
mcm | 3:13e5af215b11 | 105 | // @param[in] N/A |
mcm | 3:13e5af215b11 | 106 | // |
mcm | 3:13e5af215b11 | 107 | // @param[out] N/A. |
mcm | 3:13e5af215b11 | 108 | // |
mcm | 3:13e5af215b11 | 109 | // |
mcm | 3:13e5af215b11 | 110 | // @return N/A. |
mcm | 3:13e5af215b11 | 111 | // |
mcm | 3:13e5af215b11 | 112 | // |
mcm | 3:13e5af215b11 | 113 | // @author Manuel Caballero |
mcm | 3:13e5af215b11 | 114 | // @date 17/September/2018 |
mcm | 3:13e5af215b11 | 115 | // @version 17/September/2018 The ORIGIN |
mcm | 3:13e5af215b11 | 116 | // @pre N/A |
mcm | 3:13e5af215b11 | 117 | // @warning N/A. |
mcm | 3:13e5af215b11 | 118 | // |
mcm | 3:13e5af215b11 | 119 | void changeDATA ( void ) |
mcm | 3:13e5af215b11 | 120 | { |
mcm | 3:13e5af215b11 | 121 | myState = 1UL; |
mcm | 3:13e5af215b11 | 122 | } |
mcm | 1:db9c179c2a91 | 123 | @endcode |
mcm | 1:db9c179c2a91 | 124 | */ |
mcm | 1:db9c179c2a91 | 125 | |
mcm | 1:db9c179c2a91 | 126 | |
mcm | 1:db9c179c2a91 | 127 | /*! |
mcm | 2:08d850dd1cb8 | 128 | Library for the MAX44009 Industry's Lowest-Power Ambient Light Sensor with ADC. |
mcm | 1:db9c179c2a91 | 129 | */ |
mcm | 1:db9c179c2a91 | 130 | class MAX44009 |
mcm | 1:db9c179c2a91 | 131 | { |
mcm | 1:db9c179c2a91 | 132 | public: |
mcm | 1:db9c179c2a91 | 133 | /** |
mcm | 1:db9c179c2a91 | 134 | * @brief DEFAULT ADDRESS |
mcm | 1:db9c179c2a91 | 135 | */ |
mcm | 1:db9c179c2a91 | 136 | typedef enum { |
mcm | 1:db9c179c2a91 | 137 | MAX44009_ADDRESS_A0_GND = ( 0b1001010 << 1U ), /*!< MAX44009 I2C Address: A0 connected to GND */ |
mcm | 1:db9c179c2a91 | 138 | MAX44009_ADDRESS_A0_VCC = ( 0b1001011 << 1U ) /*!< MAX44009 I2C Address: A0 connected to VCC */ |
mcm | 1:db9c179c2a91 | 139 | } MAX44009_address_t; |
mcm | 1:db9c179c2a91 | 140 | |
mcm | 1:db9c179c2a91 | 141 | |
mcm | 1:db9c179c2a91 | 142 | /* REGISTER MAP */ |
mcm | 1:db9c179c2a91 | 143 | /** |
mcm | 1:db9c179c2a91 | 144 | * @brief REGISTER MAP |
mcm | 1:db9c179c2a91 | 145 | */ |
mcm | 1:db9c179c2a91 | 146 | typedef enum { |
mcm | 1:db9c179c2a91 | 147 | MAX44009_INTERRUPT_STATUS = 0x00, /*!< Interrupt Status ( Read Only ) ( Default 0x00 ) */ |
mcm | 1:db9c179c2a91 | 148 | MAX44009_INTERRUPT_ENABLE = 0x01, /*!< Interrupt Enable ( Read/Write ) ( Default 0x00 ) */ |
mcm | 1:db9c179c2a91 | 149 | MAX44009_CONFIGURATION = 0x02, /*!< Configuration ( Read/Write ) ( Default 0x03 ) */ |
mcm | 1:db9c179c2a91 | 150 | MAX44009_LUX_HIGH_BYTE = 0x03, /*!< Lux High Byte ( Read Only ) ( Default 0x00 ) */ |
mcm | 1:db9c179c2a91 | 151 | MAX44009_LUX_LOW_BYTE = 0x04, /*!< Lux Low Byte ( Read Only ) ( Default 0x00 ) */ |
mcm | 1:db9c179c2a91 | 152 | MAX44009_UPPER_THRESHOLD_HIGH_BYTE = 0x05, /*!< Upper Threshold High Byte ( Read/Write ) ( Default 0xFF ) */ |
mcm | 1:db9c179c2a91 | 153 | MAX44009_LOWER_THRESHOLD_HIGH_BYTE = 0x06, /*!< Lower Threshold High Byte ( Read/Write ) ( Default 0x00 ) */ |
mcm | 1:db9c179c2a91 | 154 | MAX44009_THRESHOLD_TIMER = 0x07 /*!< Threshold Timer ( Read/Write ) ( Default 0xFF ) */ |
mcm | 1:db9c179c2a91 | 155 | } MAX44009_register_maps_t; |
mcm | 1:db9c179c2a91 | 156 | |
mcm | 1:db9c179c2a91 | 157 | |
mcm | 1:db9c179c2a91 | 158 | |
mcm | 1:db9c179c2a91 | 159 | /* INTERRUPT STATUS */ |
mcm | 1:db9c179c2a91 | 160 | /** |
mcm | 1:db9c179c2a91 | 161 | * @brief INTS. If the INTE bit is set to 1, then the INTS status bit is asserted if the light intensity exceeds either upper or lower threshold |
mcm | 1:db9c179c2a91 | 162 | * limits (as specified by registers 0x05 and 0x06, respectively) for a period longer than that defined by the Threshold |
mcm | 1:db9c179c2a91 | 163 | * Timer register. This bit resets to 0 after the host reads this register. |
mcm | 1:db9c179c2a91 | 164 | */ |
mcm | 1:db9c179c2a91 | 165 | typedef enum { |
mcm | 1:db9c179c2a91 | 166 | INTERRUPT_STATUS_INTS_MASK = ( 1 << 0 ), /*!< INTS mask */ |
mcm | 1:db9c179c2a91 | 167 | INTERRUPT_STATUS_INTS_LIGHT_INTENSITY_OUTSIDE_THRESHOLD_WINDOW = ( 1 << 0 ), /*!< The light intensity exceeds either upper or lower threshold limits */ |
mcm | 1:db9c179c2a91 | 168 | INTERRUPT_STATUS_INTS_LIGHT_INTENSITY_INSIDE_THRESHOLD_WINDOW = ( 0 << 0 ) /*!< The light intensity is inside threshold window */ |
mcm | 1:db9c179c2a91 | 169 | } MAX44009_interrupt_status_ints_t; |
mcm | 1:db9c179c2a91 | 170 | |
mcm | 1:db9c179c2a91 | 171 | |
mcm | 1:db9c179c2a91 | 172 | |
mcm | 1:db9c179c2a91 | 173 | /* INTERRUPT ENABLE. NOTE: Interrupt events set the INTS bit (register 0x00, bit 0) and the INT pin only if the INTE bit is set to 1. If the INTE bit is set |
mcm | 1:db9c179c2a91 | 174 | ( interrupt is enabled ) and the interrupt condition is triggered, then the INT pin is pulled low ( asserted ) and the INTS bit |
mcm | 1:db9c179c2a91 | 175 | in the Interrupt Status register is set to 1. |
mcm | 1:db9c179c2a91 | 176 | */ |
mcm | 1:db9c179c2a91 | 177 | /** |
mcm | 1:db9c179c2a91 | 178 | * @brief INTS. |
mcm | 1:db9c179c2a91 | 179 | */ |
mcm | 1:db9c179c2a91 | 180 | typedef enum { |
mcm | 1:db9c179c2a91 | 181 | INTERRUPT_ENABLE_INTS_MASK = ( 1 << 0 ), /*!< INTS mask */ |
mcm | 1:db9c179c2a91 | 182 | INTERRUPT_ENABLE_INTS_ENABLE = ( 1 << 0 ), /*!< INTS enables */ |
mcm | 1:db9c179c2a91 | 183 | INTERRUPT_ENABLE_INTS_DISABLE = ( 0 << 0 ) /*!< INTS disables */ |
mcm | 1:db9c179c2a91 | 184 | } MAX44009_interrupt_enable_ints_t; |
mcm | 1:db9c179c2a91 | 185 | |
mcm | 1:db9c179c2a91 | 186 | |
mcm | 1:db9c179c2a91 | 187 | |
mcm | 1:db9c179c2a91 | 188 | /* CONFIGURATION */ |
mcm | 1:db9c179c2a91 | 189 | /** |
mcm | 1:db9c179c2a91 | 190 | * @brief CONT ( CONTINUOUS MODE REGISTER ). |
mcm | 1:db9c179c2a91 | 191 | */ |
mcm | 1:db9c179c2a91 | 192 | typedef enum { |
mcm | 1:db9c179c2a91 | 193 | CONFIGURATION_CONT_MASK = ( 1 << 7 ), /*!< CONT mask */ |
mcm | 1:db9c179c2a91 | 194 | CONFIGURATION_CONT_DEFAULT_MODE = ( 0 << 7 ), /*!< Default mode. The IC measures lux intensity only once every 800ms regardless of integration time */ |
mcm | 1:db9c179c2a91 | 195 | CONFIGURATION_CONT_CONTINUOUS_MODE = ( 1 << 7 ) /*!< Continuous mode. The IC continuously measures lux intensity. That is, as soon as one reading is finished, a new one begins */ |
mcm | 1:db9c179c2a91 | 196 | } MAX44009_configuration_cont_t; |
mcm | 1:db9c179c2a91 | 197 | |
mcm | 1:db9c179c2a91 | 198 | |
mcm | 1:db9c179c2a91 | 199 | /** |
mcm | 1:db9c179c2a91 | 200 | * @brief MANUAL ( MANUAL MODE REGISTER ). |
mcm | 1:db9c179c2a91 | 201 | */ |
mcm | 1:db9c179c2a91 | 202 | typedef enum { |
mcm | 1:db9c179c2a91 | 203 | CONFIGURATION_MANUAL_MASK = ( 1 << 6 ), /*!< MANUAL mask */ |
mcm | 1:db9c179c2a91 | 204 | CONFIGURATION_MANUAL_DEFAULT_MODE = ( 0 << 6 ), /*!< Default mode. CDR, TIM[2:0] bits are automatically determined by the internal auto-ranging circuitry of the IC */ |
mcm | 1:db9c179c2a91 | 205 | CONFIGURATION_MANUAL_MANUAL_MODE = ( 1 << 6 ) /*!< Manual mode. CDR, and TIM[2:0] bits can be programmed by the user */ |
mcm | 1:db9c179c2a91 | 206 | } MAX44009_configuration_manual_t; |
mcm | 1:db9c179c2a91 | 207 | |
mcm | 1:db9c179c2a91 | 208 | |
mcm | 1:db9c179c2a91 | 209 | /** |
mcm | 1:db9c179c2a91 | 210 | * @brief CDR ( CURRENT DIVISION RATIO ). |
mcm | 1:db9c179c2a91 | 211 | */ |
mcm | 1:db9c179c2a91 | 212 | typedef enum { |
mcm | 1:db9c179c2a91 | 213 | CONFIGURATION_CDR_MASK = ( 0 << 3 ), /*!< CDR mask */ |
mcm | 1:db9c179c2a91 | 214 | CONFIGURATION_CDR_CURRENT_NOT_DIVIDED = ( 0 << 3 ), /*!< Current not divided. All of the photo-diode current goes to the ADC */ |
mcm | 1:db9c179c2a91 | 215 | CONFIGURATION_CDR_CURRENT_DIVIDED_1_8 = ( 1 << 3 ) /*!< Only 1/8 of the photo-diode current goes to the ADC. This mode is used in high-brightness situations */ |
mcm | 1:db9c179c2a91 | 216 | } MAX44009_configuration_cdr_t; |
mcm | 1:db9c179c2a91 | 217 | |
mcm | 1:db9c179c2a91 | 218 | |
mcm | 1:db9c179c2a91 | 219 | /** |
mcm | 1:db9c179c2a91 | 220 | * @brief TIM ( INTEGRATION TIMER BITS ). |
mcm | 1:db9c179c2a91 | 221 | */ |
mcm | 1:db9c179c2a91 | 222 | typedef enum { |
mcm | 1:db9c179c2a91 | 223 | CONFIGURATION_TIM_MASK = ( 0b111 << 0 ), /*!< TIM mask */ |
mcm | 1:db9c179c2a91 | 224 | CONFIGURATION_TIM_800_MS = ( 0b000 << 0 ), /*!< Integration timer 800ms ( This is a preferred mode for boosting low-light sensitivity ) */ |
mcm | 1:db9c179c2a91 | 225 | CONFIGURATION_TIM_400_MS = ( 0b001 << 0 ), /*!< Integration timer 400ms */ |
mcm | 1:db9c179c2a91 | 226 | CONFIGURATION_TIM_200_MS = ( 0b010 << 0 ), /*!< Integration timer 200ms */ |
mcm | 1:db9c179c2a91 | 227 | CONFIGURATION_TIM_100_MS = ( 0b011 << 0 ), /*!< Integration timer 100ms ( This is a preferred mode for high-brightness applications ) */ |
mcm | 1:db9c179c2a91 | 228 | CONFIGURATION_TIM_50_MS = ( 0b100 << 0 ), /*!< Integration timer 50ms ( Manual mode only ) */ |
mcm | 1:db9c179c2a91 | 229 | CONFIGURATION_TIM_25_MS = ( 0b101 << 0 ), /*!< Integration timer 25ms ( Manual mode only ) */ |
mcm | 1:db9c179c2a91 | 230 | CONFIGURATION_TIM_12_5_MS = ( 0b110 << 0 ), /*!< Integration timer 12.5ms ( Manual mode only ) */ |
mcm | 1:db9c179c2a91 | 231 | CONFIGURATION_TIM_6_25_MS = ( 0b111 << 0 ) /*!< Integration timer 6.25ms ( Manual mode only ) */ |
mcm | 1:db9c179c2a91 | 232 | } MAX44009_configuration_tim_t; |
mcm | 1:db9c179c2a91 | 233 | |
mcm | 1:db9c179c2a91 | 234 | |
mcm | 1:db9c179c2a91 | 235 | |
mcm | 1:db9c179c2a91 | 236 | /* LUX HIGH-BYTE REGISTER */ |
mcm | 1:db9c179c2a91 | 237 | /** |
mcm | 1:db9c179c2a91 | 238 | * @brief EXPONENT AND MANTISSA. |
mcm | 1:db9c179c2a91 | 239 | */ |
mcm | 1:db9c179c2a91 | 240 | typedef enum { |
mcm | 1:db9c179c2a91 | 241 | LUX_HIGH_BYTE_EXPONENT_MASK = ( 0b1111 << 4 ), /*!< Exponent mask */ |
mcm | 1:db9c179c2a91 | 242 | LUX_HIGH_BYTE_MANTISSA_MASK = ( 0b1111 << 0 ) /*!< Mantissa mask */ |
mcm | 1:db9c179c2a91 | 243 | } MAX44009_lux_high_byte_register_t; |
mcm | 1:db9c179c2a91 | 244 | |
mcm | 1:db9c179c2a91 | 245 | |
mcm | 1:db9c179c2a91 | 246 | /* LUX LOW-BYTE REGISTER */ |
mcm | 1:db9c179c2a91 | 247 | /** |
mcm | 1:db9c179c2a91 | 248 | * @brief MANTISSA. |
mcm | 1:db9c179c2a91 | 249 | */ |
mcm | 1:db9c179c2a91 | 250 | typedef enum { |
mcm | 1:db9c179c2a91 | 251 | LUX_LOW_BYTE_MANTISSA_MASK = ( 0b1111 << 0 ) /*!< Mantissa mask */ |
mcm | 1:db9c179c2a91 | 252 | } MAX44009_lux_low_byte_register_t; |
mcm | 1:db9c179c2a91 | 253 | |
mcm | 1:db9c179c2a91 | 254 | |
mcm | 1:db9c179c2a91 | 255 | /* UPPER THRESHOLD HIGH-BYTE REGISTER */ |
mcm | 1:db9c179c2a91 | 256 | /** |
mcm | 1:db9c179c2a91 | 257 | * @brief EXPONENT AND MANTISSA. |
mcm | 1:db9c179c2a91 | 258 | */ |
mcm | 1:db9c179c2a91 | 259 | typedef enum { |
mcm | 1:db9c179c2a91 | 260 | UPPER_THRESHOLD_HIGH_BYTE_EXPONENT_MASK = ( 0b1111 << 4 ), /*!< Exponent mask */ |
mcm | 1:db9c179c2a91 | 261 | UPPER_THRESHOLD_HIGH_BYTE_MANTISSA_MASK = ( 0b1111 << 0 ) /*!< Mantissa mask */ |
mcm | 1:db9c179c2a91 | 262 | } MAX44009_upper_threshold_high_byte_register_t; |
mcm | 1:db9c179c2a91 | 263 | |
mcm | 1:db9c179c2a91 | 264 | |
mcm | 1:db9c179c2a91 | 265 | /* LOWER THRESHOLD HIGH-BYTE REGISTER */ |
mcm | 1:db9c179c2a91 | 266 | /** |
mcm | 1:db9c179c2a91 | 267 | * @brief EXPONENT AND MANTISSA. |
mcm | 1:db9c179c2a91 | 268 | */ |
mcm | 1:db9c179c2a91 | 269 | typedef enum { |
mcm | 1:db9c179c2a91 | 270 | LOWER_THRESHOLD_HIGH_BYTE_EXPONENT_MASK = ( 0b1111 << 4 ), /*!< Exponent mask */ |
mcm | 1:db9c179c2a91 | 271 | LOWER_THRESHOLD_HIGH_BYTE_MANTISSA_MASK = ( 0b1111 << 0 ) /*!< Mantissa mask */ |
mcm | 1:db9c179c2a91 | 272 | } MAX44009_Lower_threshold_high_byte_register_t; |
mcm | 1:db9c179c2a91 | 273 | |
mcm | 1:db9c179c2a91 | 274 | |
mcm | 1:db9c179c2a91 | 275 | |
mcm | 1:db9c179c2a91 | 276 | /* |
mcm | 1:db9c179c2a91 | 277 | AUXILIAR REGISTERS |
mcm | 1:db9c179c2a91 | 278 | |
mcm | 1:db9c179c2a91 | 279 | NOTE: These definitions are for better understanding in order to use the driver |
mcm | 1:db9c179c2a91 | 280 | */ |
mcm | 1:db9c179c2a91 | 281 | /* DEVICE RESOLUTION */ |
mcm | 1:db9c179c2a91 | 282 | /** |
mcm | 1:db9c179c2a91 | 283 | * @brief DEVICE RESOLUTION. |
mcm | 1:db9c179c2a91 | 284 | */ |
mcm | 1:db9c179c2a91 | 285 | typedef enum { |
mcm | 1:db9c179c2a91 | 286 | RESOLUTION_NORMAL_RESOLUTION = 0, /*!< Normal resolution ( LUX = 2^( exponent ) x mantissa x 0.72 ) */ |
mcm | 1:db9c179c2a91 | 287 | RESOLUTION_EXTENDED_RESOLUTION = 1 /*!< Extended resolution ( LUX = 2^( exponent ) x mantissa x 0.045 ) */ |
mcm | 1:db9c179c2a91 | 288 | } MAX44009_device_resolution_t; |
mcm | 1:db9c179c2a91 | 289 | |
mcm | 1:db9c179c2a91 | 290 | |
mcm | 1:db9c179c2a91 | 291 | |
mcm | 1:db9c179c2a91 | 292 | #ifndef MAX44009_VECTOR_STRUCT_H |
mcm | 1:db9c179c2a91 | 293 | #define MAX44009_VECTOR_STRUCT_H |
mcm | 1:db9c179c2a91 | 294 | typedef struct { |
mcm | 1:db9c179c2a91 | 295 | float lux; /*!< LUX */ |
mcm | 1:db9c179c2a91 | 296 | |
mcm | 1:db9c179c2a91 | 297 | uint8_t lux_lower_threshold; /*!< LUX lower threshold */ |
mcm | 1:db9c179c2a91 | 298 | uint8_t lux_upper_threshold; /*!< LUX upper threshold */ |
mcm | 1:db9c179c2a91 | 299 | |
mcm | 1:db9c179c2a91 | 300 | uint16_t threshold_timer_us; /*!< Timer threshold */ |
mcm | 1:db9c179c2a91 | 301 | |
mcm | 1:db9c179c2a91 | 302 | MAX44009_interrupt_status_ints_t interruptStatus; /*!< Interrupt status value */ |
mcm | 1:db9c179c2a91 | 303 | MAX44009_configuration_cdr_t cdr; /*!< Current division ratio */ |
mcm | 1:db9c179c2a91 | 304 | MAX44009_configuration_tim_t tim; /*!< integration time */ |
mcm | 1:db9c179c2a91 | 305 | } MAX44009_vector_data_t; |
mcm | 1:db9c179c2a91 | 306 | #endif |
mcm | 1:db9c179c2a91 | 307 | |
mcm | 1:db9c179c2a91 | 308 | |
mcm | 1:db9c179c2a91 | 309 | /** |
mcm | 1:db9c179c2a91 | 310 | * @brief INTERNAL CONSTANTS |
mcm | 1:db9c179c2a91 | 311 | */ |
mcm | 1:db9c179c2a91 | 312 | typedef enum { |
mcm | 1:db9c179c2a91 | 313 | MAX44009_SUCCESS = 0, |
mcm | 1:db9c179c2a91 | 314 | MAX44009_FAILURE = 1, |
mcm | 1:db9c179c2a91 | 315 | I2C_SUCCESS = 0 /*!< I2C communication was fine */ |
mcm | 1:db9c179c2a91 | 316 | } MAX44009_status_t; |
mcm | 1:db9c179c2a91 | 317 | |
mcm | 1:db9c179c2a91 | 318 | |
mcm | 1:db9c179c2a91 | 319 | |
mcm | 1:db9c179c2a91 | 320 | |
mcm | 1:db9c179c2a91 | 321 | /** Create an MAX44009 object connected to the specified I2C pins. |
mcm | 1:db9c179c2a91 | 322 | * |
mcm | 1:db9c179c2a91 | 323 | * @param sda I2C data pin |
mcm | 1:db9c179c2a91 | 324 | * @param scl I2C clock pin |
mcm | 1:db9c179c2a91 | 325 | * @param addr I2C slave address |
mcm | 1:db9c179c2a91 | 326 | * @param freq I2C frequency in Hz. |
mcm | 1:db9c179c2a91 | 327 | */ |
mcm | 1:db9c179c2a91 | 328 | MAX44009 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ); |
mcm | 1:db9c179c2a91 | 329 | |
mcm | 1:db9c179c2a91 | 330 | /** Delete MAX44009 object. |
mcm | 1:db9c179c2a91 | 331 | */ |
mcm | 1:db9c179c2a91 | 332 | ~MAX44009(); |
mcm | 1:db9c179c2a91 | 333 | |
mcm | 1:db9c179c2a91 | 334 | /** It gets the interrupt status value. |
mcm | 1:db9c179c2a91 | 335 | */ |
mcm | 1:db9c179c2a91 | 336 | MAX44009_status_t MAX44009_ReadInterruptStatus ( MAX44009_vector_data_t* myInterruptStatus ); |
mcm | 1:db9c179c2a91 | 337 | |
mcm | 1:db9c179c2a91 | 338 | /** It enables/disables the interrupt. |
mcm | 1:db9c179c2a91 | 339 | */ |
mcm | 1:db9c179c2a91 | 340 | MAX44009_status_t MAX44009_InterrupEnable ( MAX44009_interrupt_enable_ints_t myInterruptEnable ); |
mcm | 1:db9c179c2a91 | 341 | |
mcm | 1:db9c179c2a91 | 342 | /** It configures the device. |
mcm | 1:db9c179c2a91 | 343 | */ |
mcm | 1:db9c179c2a91 | 344 | MAX44009_status_t MAX44009_Configuration ( MAX44009_configuration_cont_t myContinuousMode, MAX44009_configuration_manual_t myManualMode, |
mcm | 3:13e5af215b11 | 345 | MAX44009_configuration_cdr_t myCurrentRatio, MAX44009_configuration_tim_t myIntegrationTime ); |
mcm | 1:db9c179c2a91 | 346 | |
mcm | 1:db9c179c2a91 | 347 | /** It gets the current division ratio |
mcm | 1:db9c179c2a91 | 348 | */ |
mcm | 1:db9c179c2a91 | 349 | MAX44009_status_t MAX44009_GetCurrentDivisionRatio ( MAX44009_vector_data_t* myCDR ); |
mcm | 1:db9c179c2a91 | 350 | |
mcm | 1:db9c179c2a91 | 351 | /** It gets the integration time |
mcm | 1:db9c179c2a91 | 352 | */ |
mcm | 1:db9c179c2a91 | 353 | MAX44009_status_t MAX44009_GetIntegrationTime ( MAX44009_vector_data_t* myTIM ); |
mcm | 1:db9c179c2a91 | 354 | |
mcm | 1:db9c179c2a91 | 355 | /** It gets the Lux value regarding of the resolution. |
mcm | 1:db9c179c2a91 | 356 | */ |
mcm | 1:db9c179c2a91 | 357 | MAX44009_status_t MAX44009_GetLux ( MAX44009_device_resolution_t myResolution, MAX44009_vector_data_t* myLux ); |
mcm | 1:db9c179c2a91 | 358 | |
mcm | 1:db9c179c2a91 | 359 | /** It sets the upper threshold high-byte |
mcm | 1:db9c179c2a91 | 360 | */ |
mcm | 1:db9c179c2a91 | 361 | MAX44009_status_t MAX44009_SetUpperThreshold ( MAX44009_vector_data_t myUpperThreshold ); |
mcm | 1:db9c179c2a91 | 362 | |
mcm | 1:db9c179c2a91 | 363 | /** It sets the lower threshold high-byte |
mcm | 1:db9c179c2a91 | 364 | */ |
mcm | 1:db9c179c2a91 | 365 | MAX44009_status_t MAX44009_SetLowerThreshold ( MAX44009_vector_data_t myLowerThreshold ); |
mcm | 1:db9c179c2a91 | 366 | |
mcm | 1:db9c179c2a91 | 367 | /** It gets the upper threshold high-byte |
mcm | 1:db9c179c2a91 | 368 | */ |
mcm | 1:db9c179c2a91 | 369 | MAX44009_status_t MAX44009_GetUpperThreshold ( MAX44009_vector_data_t* myUpperThreshold ); |
mcm | 1:db9c179c2a91 | 370 | |
mcm | 1:db9c179c2a91 | 371 | /** It gets the lower threshold high-byte |
mcm | 1:db9c179c2a91 | 372 | */ |
mcm | 1:db9c179c2a91 | 373 | MAX44009_status_t MAX44009_GetLowerThreshold ( MAX44009_vector_data_t* myLowerThreshold ); |
mcm | 1:db9c179c2a91 | 374 | |
mcm | 1:db9c179c2a91 | 375 | /** It sets the threshold timer register |
mcm | 1:db9c179c2a91 | 376 | */ |
mcm | 1:db9c179c2a91 | 377 | MAX44009_status_t MAX44009_SetThresholdTimer ( MAX44009_vector_data_t myThresholdTimer_us ); |
mcm | 1:db9c179c2a91 | 378 | |
mcm | 1:db9c179c2a91 | 379 | /** It gets the threshold timer register |
mcm | 1:db9c179c2a91 | 380 | */ |
mcm | 1:db9c179c2a91 | 381 | MAX44009_status_t MAX44009_GetThresholdTimer ( MAX44009_vector_data_t* myThresholdTimer_us ); |
mcm | 1:db9c179c2a91 | 382 | |
mcm | 1:db9c179c2a91 | 383 | private: |
mcm | 1:db9c179c2a91 | 384 | I2C _i2c; |
mcm | 1:db9c179c2a91 | 385 | uint32_t _MAX44009_Addr; |
mcm | 1:db9c179c2a91 | 386 | }; |
mcm | 1:db9c179c2a91 | 387 | |
mcm | 1:db9c179c2a91 | 388 | #endif /* MAX44009_H */ |