This lib allows control of VISHAY VCNL4000 distance/ambient light sensor via I2C bus.

Dependents:   Major_dHome

Committer:
bengo
Date:
Tue Feb 14 10:55:19 2012 +0000
Revision:
0:1720792a6e28
This is first beta

Who changed what in which revision?

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