This lib allows control of VISHAY VCNL4000 distance/ambient light sensor via I2C bus.
VCNL4000.h@0:1720792a6e28, 2012-02-14 (annotated)
- Committer:
- bengo
- Date:
- Tue Feb 14 10:55:19 2012 +0000
- Revision:
- 0:1720792a6e28
This is first beta
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bengo | 0:1720792a6e28 | 1 | /* mbed VCNL4000 Library version 0beta1 |
bengo | 0:1720792a6e28 | 2 | * Copyright (c) 2012 bengo |
bengo | 0:1720792a6e28 | 3 | * |
bengo | 0:1720792a6e28 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
bengo | 0:1720792a6e28 | 5 | * of this software and associated documentation files (the "Software"), to deal |
bengo | 0:1720792a6e28 | 6 | * in the Software without restriction, including without limitation the rights |
bengo | 0:1720792a6e28 | 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
bengo | 0:1720792a6e28 | 8 | * copies of the Software, and to permit persons to whom the Software is |
bengo | 0:1720792a6e28 | 9 | * furnished to do so, subject to the following conditions: |
bengo | 0:1720792a6e28 | 10 | * |
bengo | 0:1720792a6e28 | 11 | * The above copyright notice and this permission notice shall be included in |
bengo | 0:1720792a6e28 | 12 | * all copies or substantial portions of the Software. |
bengo | 0:1720792a6e28 | 13 | * |
bengo | 0:1720792a6e28 | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
bengo | 0:1720792a6e28 | 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
bengo | 0:1720792a6e28 | 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
bengo | 0:1720792a6e28 | 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
bengo | 0:1720792a6e28 | 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
bengo | 0:1720792a6e28 | 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
bengo | 0:1720792a6e28 | 20 | * THE SOFTWARE. |
bengo | 0:1720792a6e28 | 21 | */ |
bengo | 0:1720792a6e28 | 22 | |
bengo | 0:1720792a6e28 | 23 | #ifndef VCNL4000_H |
bengo | 0:1720792a6e28 | 24 | #define VCNL4000_H |
bengo | 0:1720792a6e28 | 25 | |
bengo | 0:1720792a6e28 | 26 | #include "mbed.h" |
bengo | 0:1720792a6e28 | 27 | |
bengo | 0:1720792a6e28 | 28 | /** VCNL4000 distance/luminosity sensor controller library |
bengo | 0:1720792a6e28 | 29 | * |
bengo | 0:1720792a6e28 | 30 | * Example: |
bengo | 0:1720792a6e28 | 31 | * @code |
bengo | 0:1720792a6e28 | 32 | * #include "mbed.h" |
bengo | 0:1720792a6e28 | 33 | * #include "VCNL4000.h" |
bengo | 0:1720792a6e28 | 34 | * |
bengo | 0:1720792a6e28 | 35 | * Serial pc(USBTX, USBRX); // tx, rx |
bengo | 0:1720792a6e28 | 36 | * |
bengo | 0:1720792a6e28 | 37 | * // ----------------------------------- |
bengo | 0:1720792a6e28 | 38 | * int main() { |
bengo | 0:1720792a6e28 | 39 | * |
bengo | 0:1720792a6e28 | 40 | * VCNL4000 vcnl( p9, p10 ); |
bengo | 0:1720792a6e28 | 41 | * |
bengo | 0:1720792a6e28 | 42 | * int status = vcnl.getStatus(); |
bengo | 0:1720792a6e28 | 43 | * |
bengo | 0:1720792a6e28 | 44 | * if( status != 0 ) { |
bengo | 0:1720792a6e28 | 45 | * pc.printf( "\x1b[2J\x1b[f Something went wrong with VCNL4000 access, status = %d.\n\r", status ); |
bengo | 0:1720792a6e28 | 46 | * exit( 1 ); |
bengo | 0:1720792a6e28 | 47 | * } |
bengo | 0:1720792a6e28 | 48 | * |
bengo | 0:1720792a6e28 | 49 | * vcnl.setALAveragingFunction( 0x0f ); |
bengo | 0:1720792a6e28 | 50 | * vcnl.setIRLedCurrent( 2000 ); |
bengo | 0:1720792a6e28 | 51 | * vcnl.setProximityMeasurementSigFreq( 2 ); |
bengo | 0:1720792a6e28 | 52 | * vcnl.setProxiModulatorDelayTime( 0x04 ); |
bengo | 0:1720792a6e28 | 53 | * vcnl.setProxiModulatorDeadTime( 0x01 ); |
bengo | 0:1720792a6e28 | 54 | * |
bengo | 0:1720792a6e28 | 55 | * while( 1 ) { |
bengo | 0:1720792a6e28 | 56 | * int prox = vcnl.getProximity(); |
bengo | 0:1720792a6e28 | 57 | * int ambl = vcnl.getAmbientLight(); |
bengo | 0:1720792a6e28 | 58 | * pc.printf("\x1b[2J\x1b[f proxy: %d\n\r amb.l: %d\n\r", prox, ambl ); |
bengo | 0:1720792a6e28 | 59 | * wait( 0.1 ); |
bengo | 0:1720792a6e28 | 60 | * } |
bengo | 0:1720792a6e28 | 61 | * } |
bengo | 0:1720792a6e28 | 62 | * @endcode |
bengo | 0:1720792a6e28 | 63 | */ |
bengo | 0:1720792a6e28 | 64 | |
bengo | 0:1720792a6e28 | 65 | class VCNL4000 { |
bengo | 0:1720792a6e28 | 66 | |
bengo | 0:1720792a6e28 | 67 | public: |
bengo | 0:1720792a6e28 | 68 | |
bengo | 0:1720792a6e28 | 69 | /** |
bengo | 0:1720792a6e28 | 70 | * Create a VCNL4000 object connected to the specified I2C pins |
bengo | 0:1720792a6e28 | 71 | * @param sda I2C SDA pin |
bengo | 0:1720792a6e28 | 72 | * @param scl I2C SDL pin |
bengo | 0:1720792a6e28 | 73 | */ |
bengo | 0:1720792a6e28 | 74 | VCNL4000( PinName sda, PinName scl ); |
bengo | 0:1720792a6e28 | 75 | |
bengo | 0:1720792a6e28 | 76 | ~VCNL4000( void ); |
bengo | 0:1720792a6e28 | 77 | |
bengo | 0:1720792a6e28 | 78 | /** |
bengo | 0:1720792a6e28 | 79 | * Return status code of previos function call |
bengo | 0:1720792a6e28 | 80 | */ |
bengo | 0:1720792a6e28 | 81 | inline int getStatus( void ) { return( _status ); } |
bengo | 0:1720792a6e28 | 82 | |
bengo | 0:1720792a6e28 | 83 | /** |
bengo | 0:1720792a6e28 | 84 | * Read VCNL4000 internal register content |
bengo | 0:1720792a6e28 | 85 | * @param reg register address |
bengo | 0:1720792a6e28 | 86 | */ |
bengo | 0:1720792a6e28 | 87 | int registerRead( int reg ); |
bengo | 0:1720792a6e28 | 88 | |
bengo | 0:1720792a6e28 | 89 | /** |
bengo | 0:1720792a6e28 | 90 | * Send data to VCNL4000 internal register |
bengo | 0:1720792a6e28 | 91 | * @param reg register address |
bengo | 0:1720792a6e28 | 92 | * @param data value to be written |
bengo | 0:1720792a6e28 | 93 | */ |
bengo | 0:1720792a6e28 | 94 | void registerWrite( int reg, unsigned char data ); |
bengo | 0:1720792a6e28 | 95 | |
bengo | 0:1720792a6e28 | 96 | /** |
bengo | 0:1720792a6e28 | 97 | * Read VCNL4000 proximity measurement |
bengo | 0:1720792a6e28 | 98 | */ |
bengo | 0:1720792a6e28 | 99 | int getProximity( void ); |
bengo | 0:1720792a6e28 | 100 | |
bengo | 0:1720792a6e28 | 101 | /** |
bengo | 0:1720792a6e28 | 102 | * Read VCNL4000 ambient light measurement |
bengo | 0:1720792a6e28 | 103 | */ |
bengo | 0:1720792a6e28 | 104 | int getAmbientLight( void ); |
bengo | 0:1720792a6e28 | 105 | |
bengo | 0:1720792a6e28 | 106 | /** |
bengo | 0:1720792a6e28 | 107 | * Get VCNL 4000 product id (should be 1) |
bengo | 0:1720792a6e28 | 108 | */ |
bengo | 0:1720792a6e28 | 109 | int getProductId( void ); |
bengo | 0:1720792a6e28 | 110 | |
bengo | 0:1720792a6e28 | 111 | /** |
bengo | 0:1720792a6e28 | 112 | * Get VCNL 4000 product revision (should be 1) |
bengo | 0:1720792a6e28 | 113 | */ |
bengo | 0:1720792a6e28 | 114 | int getProductRevision( void ); |
bengo | 0:1720792a6e28 | 115 | |
bengo | 0:1720792a6e28 | 116 | /** |
bengo | 0:1720792a6e28 | 117 | * Return True when a proximity data measurement completed |
bengo | 0:1720792a6e28 | 118 | */ |
bengo | 0:1720792a6e28 | 119 | bool proximityDataReady( void ); |
bengo | 0:1720792a6e28 | 120 | |
bengo | 0:1720792a6e28 | 121 | /** |
bengo | 0:1720792a6e28 | 122 | * Return True when an ambient light measurement completed |
bengo | 0:1720792a6e28 | 123 | */ |
bengo | 0:1720792a6e28 | 124 | bool ambientLightDataReady( void ); |
bengo | 0:1720792a6e28 | 125 | |
bengo | 0:1720792a6e28 | 126 | /** |
bengo | 0:1720792a6e28 | 127 | * Tell VCNL4000 to start a proximity measurement |
bengo | 0:1720792a6e28 | 128 | */ |
bengo | 0:1720792a6e28 | 129 | void startProximityMeasurement( void ); |
bengo | 0:1720792a6e28 | 130 | |
bengo | 0:1720792a6e28 | 131 | /** |
bengo | 0:1720792a6e28 | 132 | * Tell VCNL4000 to start an ambient light measurement |
bengo | 0:1720792a6e28 | 133 | */ |
bengo | 0:1720792a6e28 | 134 | void startAmbientLightMeasurement( void ); |
bengo | 0:1720792a6e28 | 135 | |
bengo | 0:1720792a6e28 | 136 | /** |
bengo | 0:1720792a6e28 | 137 | * Set VCNL4000 infrared led current |
bengo | 0:1720792a6e28 | 138 | * @param milliAmps current in mA |
bengo | 0:1720792a6e28 | 139 | */ |
bengo | 0:1720792a6e28 | 140 | void setIRLedCurrent( int milliAmps ); |
bengo | 0:1720792a6e28 | 141 | |
bengo | 0:1720792a6e28 | 142 | /* |
bengo | 0:1720792a6e28 | 143 | * Enable VCNL4000 continuous conversion mode |
bengo | 0:1720792a6e28 | 144 | */ |
bengo | 0:1720792a6e28 | 145 | void enableALContinuousConversionMode( void ); |
bengo | 0:1720792a6e28 | 146 | |
bengo | 0:1720792a6e28 | 147 | /* |
bengo | 0:1720792a6e28 | 148 | * Disable VCNL4000 continuous conversion mode |
bengo | 0:1720792a6e28 | 149 | */ |
bengo | 0:1720792a6e28 | 150 | void disableALContinuousConversionMode( void ); |
bengo | 0:1720792a6e28 | 151 | |
bengo | 0:1720792a6e28 | 152 | /* |
bengo | 0:1720792a6e28 | 153 | * Return True if VCNL4000 is set in continuous conversion mode |
bengo | 0:1720792a6e28 | 154 | */ |
bengo | 0:1720792a6e28 | 155 | bool isALContinuousConversionMode( void ); |
bengo | 0:1720792a6e28 | 156 | |
bengo | 0:1720792a6e28 | 157 | /* |
bengo | 0:1720792a6e28 | 158 | * Enable ambient light auto offset compensation |
bengo | 0:1720792a6e28 | 159 | */ |
bengo | 0:1720792a6e28 | 160 | void enableALAutoOffsetCompensation( void ); |
bengo | 0:1720792a6e28 | 161 | |
bengo | 0:1720792a6e28 | 162 | /* |
bengo | 0:1720792a6e28 | 163 | * Disable ambient light auto offset compensation |
bengo | 0:1720792a6e28 | 164 | */ |
bengo | 0:1720792a6e28 | 165 | void disableALAutoOffsetCompensation( void ); |
bengo | 0:1720792a6e28 | 166 | |
bengo | 0:1720792a6e28 | 167 | /* |
bengo | 0:1720792a6e28 | 168 | * Return True if ambient light auto offset compensation is set |
bengo | 0:1720792a6e28 | 169 | */ |
bengo | 0:1720792a6e28 | 170 | bool iseALAutoOffsetCompensation( void ); |
bengo | 0:1720792a6e28 | 171 | |
bengo | 0:1720792a6e28 | 172 | /* |
bengo | 0:1720792a6e28 | 173 | * Set ambient light averaging function |
bengo | 0:1720792a6e28 | 174 | * @param measurements [0-7] 2^(measurements) = number of conversions |
bengo | 0:1720792a6e28 | 175 | */ |
bengo | 0:1720792a6e28 | 176 | void setALAveragingFunction( int measurements ); |
bengo | 0:1720792a6e28 | 177 | |
bengo | 0:1720792a6e28 | 178 | /* |
bengo | 0:1720792a6e28 | 179 | * Return the averaging functions. Number of conversions = 2^value |
bengo | 0:1720792a6e28 | 180 | */ |
bengo | 0:1720792a6e28 | 181 | int gettALAveragingFunction( void ); |
bengo | 0:1720792a6e28 | 182 | |
bengo | 0:1720792a6e28 | 183 | /* |
bengo | 0:1720792a6e28 | 184 | * Set proximity measurement signal frequency |
bengo | 0:1720792a6e28 | 185 | * @param frequency [0-3] IR signal frequency 3.125/(frequency+1) |
bengo | 0:1720792a6e28 | 186 | */ |
bengo | 0:1720792a6e28 | 187 | void setProximityMeasurementSigFreq( int frequency ); |
bengo | 0:1720792a6e28 | 188 | |
bengo | 0:1720792a6e28 | 189 | /* |
bengo | 0:1720792a6e28 | 190 | * Return IR signal frequency. Frequency = 3.125/(value+1) MHz |
bengo | 0:1720792a6e28 | 191 | */ |
bengo | 0:1720792a6e28 | 192 | int getProximityMeasurementSigFreq( void ); |
bengo | 0:1720792a6e28 | 193 | |
bengo | 0:1720792a6e28 | 194 | /* |
bengo | 0:1720792a6e28 | 195 | * Set proximity modulator delay time |
bengo | 0:1720792a6e28 | 196 | * @param delayTime delay time. This value should be provided by Vishay |
bengo | 0:1720792a6e28 | 197 | */ |
bengo | 0:1720792a6e28 | 198 | void setProxiModulatorDelayTime( int delayTime ); |
bengo | 0:1720792a6e28 | 199 | |
bengo | 0:1720792a6e28 | 200 | /* |
bengo | 0:1720792a6e28 | 201 | * Return proximity modulator delay time |
bengo | 0:1720792a6e28 | 202 | */ |
bengo | 0:1720792a6e28 | 203 | int getProxiModulatorDelayTime( void ); |
bengo | 0:1720792a6e28 | 204 | |
bengo | 0:1720792a6e28 | 205 | /* |
bengo | 0:1720792a6e28 | 206 | * Set proximity modulator dead time |
bengo | 0:1720792a6e28 | 207 | * @param deadTime dead time. This value should be provided by Vishay |
bengo | 0:1720792a6e28 | 208 | */ |
bengo | 0:1720792a6e28 | 209 | void setProxiModulatorDeadTime( int deadTime ); |
bengo | 0:1720792a6e28 | 210 | |
bengo | 0:1720792a6e28 | 211 | /* |
bengo | 0:1720792a6e28 | 212 | * Return proximity modulator dead time |
bengo | 0:1720792a6e28 | 213 | */ |
bengo | 0:1720792a6e28 | 214 | int getProxiModulatorDeadTime( void ); |
bengo | 0:1720792a6e28 | 215 | |
bengo | 0:1720792a6e28 | 216 | private: |
bengo | 0:1720792a6e28 | 217 | |
bengo | 0:1720792a6e28 | 218 | int _status; |
bengo | 0:1720792a6e28 | 219 | char _bytes[2]; |
bengo | 0:1720792a6e28 | 220 | int _data; |
bengo | 0:1720792a6e28 | 221 | I2C _i2c; |
bengo | 0:1720792a6e28 | 222 | |
bengo | 0:1720792a6e28 | 223 | static const int VCNL4000address; |
bengo | 0:1720792a6e28 | 224 | static const int VCNL4000regAddr; |
bengo | 0:1720792a6e28 | 225 | static const int Command; |
bengo | 0:1720792a6e28 | 226 | static const int ProdIdRevision; |
bengo | 0:1720792a6e28 | 227 | static const int IRLedCurrent; |
bengo | 0:1720792a6e28 | 228 | static const int AmbientLightParam; |
bengo | 0:1720792a6e28 | 229 | static const int AmbientLightMsb; |
bengo | 0:1720792a6e28 | 230 | static const int AmbientLightLsb; |
bengo | 0:1720792a6e28 | 231 | static const int ProximityMsb; |
bengo | 0:1720792a6e28 | 232 | static const int ProximityLsb; |
bengo | 0:1720792a6e28 | 233 | static const int ProximitySigFreq; |
bengo | 0:1720792a6e28 | 234 | static const int ProxymityModulationTime; |
bengo | 0:1720792a6e28 | 235 | |
bengo | 0:1720792a6e28 | 236 | }; |
bengo | 0:1720792a6e28 | 237 | |
bengo | 0:1720792a6e28 | 238 | #endif |