For use with STM32L746RG . Class which provides functions to control a TAOS TCS3472 Color Light-to-Digital Converter with IR Filter via I2C.

Dependents:   colerSenser2

Fork of TCS3472_I2C by Karl Maxwell

Committer:
Allar
Date:
Thu Jun 01 08:04:39 2017 +0000
Revision:
8:764a98777c11
Parent:
7:ab9ff8738826
night;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
karlmaxwell67 1:70d7d9f1af01 1 #include "TCS3472_I2C.h"
karlmaxwell67 1:70d7d9f1af01 2
karlmaxwell67 3:6a89ac4a1979 3 TCS3472_I2C::TCS3472_I2C( PinName sda, PinName scl ) : i2c( sda, scl ){
karlmaxwell67 5:d4cf0fa1a182 4 i2c.frequency(100000);
karlmaxwell67 3:6a89ac4a1979 5 enablePowerAndRGBC();
karlmaxwell67 1:70d7d9f1af01 6 }
karlmaxwell67 1:70d7d9f1af01 7
karlmaxwell67 6:6d5bb4ad7d6e 8 TCS3472_I2C::~TCS3472_I2C(){
karlmaxwell67 6:6d5bb4ad7d6e 9
karlmaxwell67 6:6d5bb4ad7d6e 10 }
karlmaxwell67 6:6d5bb4ad7d6e 11
Allar 8:764a98777c11 12 bool TCS3472_I2C::verifyConnection(void) {
Allar 8:764a98777c11 13 uint8_t part_id = readSingleRegister(0x12);//ID
Allar 8:764a98777c11 14 if (part_id == 0x44)
Allar 8:764a98777c11 15 return true;
Allar 8:764a98777c11 16 return false;
Allar 8:764a98777c11 17 }
karlmaxwell67 1:70d7d9f1af01 18 int TCS3472_I2C::writeSingleRegister( char address, char data ){
karlmaxwell67 1:70d7d9f1af01 19 char tx[2] = { address | 160, data }; //0d160 = 0b10100000
karlmaxwell67 3:6a89ac4a1979 20 int ack = i2c.write( SLAVE_ADDRESS << 1, tx, 2 );
karlmaxwell67 3:6a89ac4a1979 21 return ack;
karlmaxwell67 3:6a89ac4a1979 22 }
karlmaxwell67 3:6a89ac4a1979 23
karlmaxwell67 3:6a89ac4a1979 24 int TCS3472_I2C::writeMultipleRegisters( char address, char* data, int quantity ){
karlmaxwell67 3:6a89ac4a1979 25 char tx[ quantity + 1 ];
karlmaxwell67 3:6a89ac4a1979 26 tx[0] = address | 160;
karlmaxwell67 3:6a89ac4a1979 27 for ( int i = 1; i <= quantity; i++ ){
karlmaxwell67 3:6a89ac4a1979 28 tx[ i ] = data[ i - 1 ];
karlmaxwell67 3:6a89ac4a1979 29 }
karlmaxwell67 3:6a89ac4a1979 30 int ack = i2c.write( SLAVE_ADDRESS << 1, tx, quantity + 1 );
karlmaxwell67 1:70d7d9f1af01 31 return ack;
karlmaxwell67 1:70d7d9f1af01 32 }
karlmaxwell67 1:70d7d9f1af01 33
karlmaxwell67 1:70d7d9f1af01 34 char TCS3472_I2C::readSingleRegister( char address ){
karlmaxwell67 1:70d7d9f1af01 35 char output = 255;
karlmaxwell67 1:70d7d9f1af01 36 char command = address | 160; //0d160 = 0b10100000
karlmaxwell67 3:6a89ac4a1979 37 i2c.write( SLAVE_ADDRESS << 1, &command, 1, true );
karlmaxwell67 3:6a89ac4a1979 38 i2c.read( SLAVE_ADDRESS << 1, &output, 1 );
karlmaxwell67 1:70d7d9f1af01 39 return output;
karlmaxwell67 1:70d7d9f1af01 40 }
karlmaxwell67 1:70d7d9f1af01 41
karlmaxwell67 1:70d7d9f1af01 42 int TCS3472_I2C::readMultipleRegisters( char address, char* output, int quantity ){
karlmaxwell67 1:70d7d9f1af01 43 char command = address | 160; //0d160 = 0b10100000
karlmaxwell67 3:6a89ac4a1979 44 i2c.write( SLAVE_ADDRESS << 1, &command, 1, true );
karlmaxwell67 3:6a89ac4a1979 45 int ack = i2c.read( SLAVE_ADDRESS << 1, output, quantity );
karlmaxwell67 1:70d7d9f1af01 46 return ack;
karlmaxwell67 1:70d7d9f1af01 47 }
karlmaxwell67 1:70d7d9f1af01 48
karlmaxwell67 6:6d5bb4ad7d6e 49 void TCS3472_I2C::getAllColors( int* readings ){
karlmaxwell67 1:70d7d9f1af01 50 char buffer[8] = { 0 };
karlmaxwell67 1:70d7d9f1af01 51
Allar 7:ab9ff8738826 52 if (readMultipleRegisters( CDATA, buffer, 8 ) ==0){
Allar 7:ab9ff8738826 53 readings[0] = (int)buffer[1] << 8 | (int)buffer[0];//c
Allar 7:ab9ff8738826 54 readings[1] = (int)buffer[3] << 8 | (int)buffer[2];//r
Allar 7:ab9ff8738826 55 readings[2] = (int)buffer[5] << 8 | (int)buffer[4];//g
Allar 7:ab9ff8738826 56 readings[3] = (int)buffer[7] << 8 | (int)buffer[6];//b
Allar 7:ab9ff8738826 57 }
Allar 7:ab9ff8738826 58 else{
Allar 7:ab9ff8738826 59 readings[0] = 0;readings[1] = 0;readings[2] = 0;readings[3] = 0;
Allar 7:ab9ff8738826 60 }
karlmaxwell67 1:70d7d9f1af01 61 }
karlmaxwell67 1:70d7d9f1af01 62
karlmaxwell67 1:70d7d9f1af01 63 int TCS3472_I2C::getClearData(){
karlmaxwell67 1:70d7d9f1af01 64 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 65 readMultipleRegisters( CDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 66 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 67 return reading;
karlmaxwell67 1:70d7d9f1af01 68 }
karlmaxwell67 1:70d7d9f1af01 69
karlmaxwell67 1:70d7d9f1af01 70 int TCS3472_I2C::getRedData(){
karlmaxwell67 1:70d7d9f1af01 71 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 72 readMultipleRegisters( RDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 73 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 74 return reading;
karlmaxwell67 1:70d7d9f1af01 75 }
karlmaxwell67 1:70d7d9f1af01 76
karlmaxwell67 1:70d7d9f1af01 77 int TCS3472_I2C::getGreenData(){
karlmaxwell67 1:70d7d9f1af01 78 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 79 readMultipleRegisters( GDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 80 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 81 return reading;
karlmaxwell67 1:70d7d9f1af01 82 }
karlmaxwell67 1:70d7d9f1af01 83
karlmaxwell67 1:70d7d9f1af01 84 int TCS3472_I2C::getBlueData(){
karlmaxwell67 1:70d7d9f1af01 85 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 86 readMultipleRegisters( BDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 87 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 88 return reading;
karlmaxwell67 2:38d5187a4e7b 89 }
karlmaxwell67 2:38d5187a4e7b 90
karlmaxwell67 3:6a89ac4a1979 91 int TCS3472_I2C::enablePower(){
karlmaxwell67 3:6a89ac4a1979 92 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 93 char enable_new = enable_old | 1; // sets PON (bit 0) to 1
karlmaxwell67 3:6a89ac4a1979 94 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 95 return ack;
karlmaxwell67 3:6a89ac4a1979 96 }
karlmaxwell67 3:6a89ac4a1979 97
karlmaxwell67 3:6a89ac4a1979 98 int TCS3472_I2C::disablePower(){
karlmaxwell67 3:6a89ac4a1979 99 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 100 char enable_new = enable_old & 254; // sets PON (bit 0) to 0
karlmaxwell67 3:6a89ac4a1979 101 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 102 return ack;
karlmaxwell67 3:6a89ac4a1979 103 }
karlmaxwell67 3:6a89ac4a1979 104
karlmaxwell67 4:5d1f8d7d81ff 105 bool TCS3472_I2C::isPowerEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 106 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 107 char pon = enable << 7;
karlmaxwell67 4:5d1f8d7d81ff 108 pon = pon >> 7; // gets PON (bit 0) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 109 return (bool)pon;
karlmaxwell67 4:5d1f8d7d81ff 110 }
karlmaxwell67 4:5d1f8d7d81ff 111
karlmaxwell67 3:6a89ac4a1979 112 int TCS3472_I2C::enableRGBC(){
karlmaxwell67 3:6a89ac4a1979 113 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 114 char enable_new = enable_old | 2; // sets AEN (bit 1) to 1
karlmaxwell67 3:6a89ac4a1979 115 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 116 return ack;
karlmaxwell67 3:6a89ac4a1979 117 }
karlmaxwell67 3:6a89ac4a1979 118
karlmaxwell67 3:6a89ac4a1979 119 int TCS3472_I2C::disableRGBC(){
karlmaxwell67 3:6a89ac4a1979 120 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 121 char enable_new = enable_old & 253; // sets AEN (bit 1) to 0
karlmaxwell67 3:6a89ac4a1979 122 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 123 return ack;
karlmaxwell67 3:6a89ac4a1979 124 }
karlmaxwell67 3:6a89ac4a1979 125
karlmaxwell67 4:5d1f8d7d81ff 126 bool TCS3472_I2C::isRGBCEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 127 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 128 char aen = enable << 6;
karlmaxwell67 4:5d1f8d7d81ff 129 aen = aen >> 7; // gets AEN (bit 1) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 130 return (bool)aen;
karlmaxwell67 4:5d1f8d7d81ff 131 }
karlmaxwell67 4:5d1f8d7d81ff 132
karlmaxwell67 3:6a89ac4a1979 133 int TCS3472_I2C::enablePowerAndRGBC(){
karlmaxwell67 3:6a89ac4a1979 134 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 135 char enable_new = enable_old | 3; // sets PON (bit 0) and AEN (bit 1) to 1
karlmaxwell67 3:6a89ac4a1979 136 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 137 return ack;
karlmaxwell67 3:6a89ac4a1979 138 }
karlmaxwell67 3:6a89ac4a1979 139
karlmaxwell67 3:6a89ac4a1979 140 int TCS3472_I2C::disablePowerAndRGBC(){
karlmaxwell67 3:6a89ac4a1979 141 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 142 char enable_new = enable_old & 252; // sets PON (bit 0) and AEN (bit 1) to 0
karlmaxwell67 3:6a89ac4a1979 143 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 144 return ack;
karlmaxwell67 2:38d5187a4e7b 145 }
karlmaxwell67 2:38d5187a4e7b 146
karlmaxwell67 2:38d5187a4e7b 147 int TCS3472_I2C::enableWait(){
karlmaxwell67 3:6a89ac4a1979 148 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 149 char enable_new = enable_old | 8; // sets WEN (bit 3) to 1
karlmaxwell67 3:6a89ac4a1979 150 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 151 return ack;
karlmaxwell67 2:38d5187a4e7b 152 }
karlmaxwell67 2:38d5187a4e7b 153
karlmaxwell67 2:38d5187a4e7b 154 int TCS3472_I2C::disableWait(){
karlmaxwell67 3:6a89ac4a1979 155 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 156 char enable_new = enable_old & 247; // sets WEN (bit 3) to 0
karlmaxwell67 3:6a89ac4a1979 157 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 158 return ack;
karlmaxwell67 2:38d5187a4e7b 159 }
karlmaxwell67 2:38d5187a4e7b 160
karlmaxwell67 4:5d1f8d7d81ff 161 bool TCS3472_I2C::isWaitEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 162 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 163 char wen = enable << 4;
karlmaxwell67 4:5d1f8d7d81ff 164 wen = wen >> 7; // gets WEN (bit 3) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 165 return (bool)wen;
karlmaxwell67 4:5d1f8d7d81ff 166 }
karlmaxwell67 4:5d1f8d7d81ff 167
karlmaxwell67 2:38d5187a4e7b 168 int TCS3472_I2C::enableInterrupt(){
karlmaxwell67 3:6a89ac4a1979 169 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 170 char enable_new = enable_old | 16; // sets AIEN (bit 4) to 1
karlmaxwell67 3:6a89ac4a1979 171 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 172 return ack;
karlmaxwell67 2:38d5187a4e7b 173 }
karlmaxwell67 2:38d5187a4e7b 174
karlmaxwell67 2:38d5187a4e7b 175 int TCS3472_I2C::disableInterrupt(){
karlmaxwell67 3:6a89ac4a1979 176 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 177 char enable_new = enable_old & 239; // sets AIEN (bit 4) to 0
karlmaxwell67 3:6a89ac4a1979 178 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 179 return ack;
karlmaxwell67 3:6a89ac4a1979 180 }
karlmaxwell67 3:6a89ac4a1979 181
karlmaxwell67 4:5d1f8d7d81ff 182 bool TCS3472_I2C::isInterruptEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 183 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 184 char aien = enable << 3;
karlmaxwell67 4:5d1f8d7d81ff 185 aien = aien >> 7; // gets AIEN (bit 4) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 186 return (bool)aien;
karlmaxwell67 4:5d1f8d7d81ff 187 }
karlmaxwell67 4:5d1f8d7d81ff 188
karlmaxwell67 3:6a89ac4a1979 189 int TCS3472_I2C::setIntegrationTime( const float itime ){
Allar 7:ab9ff8738826 190 char atime = 256 - (int)roundTowardsZero( itime / 2.4 ); // rounding ensures nearest value of atime is used
karlmaxwell67 3:6a89ac4a1979 191 int ack = writeSingleRegister( ATIME, atime );
karlmaxwell67 2:38d5187a4e7b 192 return ack;
karlmaxwell67 2:38d5187a4e7b 193 }
karlmaxwell67 2:38d5187a4e7b 194
karlmaxwell67 4:5d1f8d7d81ff 195 float TCS3472_I2C::readIntegrationTime(){
karlmaxwell67 4:5d1f8d7d81ff 196 float itime = 0;
karlmaxwell67 4:5d1f8d7d81ff 197 char atime = readSingleRegister( ATIME );
karlmaxwell67 4:5d1f8d7d81ff 198 itime = 2.4 * ( 256 - atime );
karlmaxwell67 4:5d1f8d7d81ff 199 return itime;
karlmaxwell67 4:5d1f8d7d81ff 200 }
karlmaxwell67 4:5d1f8d7d81ff 201
karlmaxwell67 2:38d5187a4e7b 202 int TCS3472_I2C::setWaitTime( const float time ){
karlmaxwell67 2:38d5187a4e7b 203 int ack = 1;
karlmaxwell67 2:38d5187a4e7b 204 char wtime = 0;
karlmaxwell67 4:5d1f8d7d81ff 205 if ( time >= 2.39 && time <= 614.4 ){ // 2.39 instead of 2.4 to allow for float accuracy errors
karlmaxwell67 3:6a89ac4a1979 206 ack = writeSingleRegister( CONFIG, 0 ); // sets WLONG to 0
karlmaxwell67 4:5d1f8d7d81ff 207 wtime = 256 - roundTowardsZero( time / 2.4 );
karlmaxwell67 2:38d5187a4e7b 208 }
karlmaxwell67 4:5d1f8d7d81ff 209 else if ( time > 614.4 && time <= 7400.1 ){ // 7400.1 instead of 7400 to allow for float accuracy errors
karlmaxwell67 3:6a89ac4a1979 210 ack = writeSingleRegister( CONFIG, 2 ); // sets WLONG to 1
karlmaxwell67 4:5d1f8d7d81ff 211 wtime = 256 - roundTowardsZero( time / 28.8 );
karlmaxwell67 2:38d5187a4e7b 212 }
karlmaxwell67 2:38d5187a4e7b 213 ack = ack || writeSingleRegister( WTIME, wtime );
karlmaxwell67 2:38d5187a4e7b 214 return ack;
karlmaxwell67 3:6a89ac4a1979 215 }
karlmaxwell67 3:6a89ac4a1979 216
karlmaxwell67 4:5d1f8d7d81ff 217 float TCS3472_I2C::readWaitTime(){
karlmaxwell67 4:5d1f8d7d81ff 218 float time = 0;
karlmaxwell67 4:5d1f8d7d81ff 219 char wtime = readSingleRegister( WTIME );
karlmaxwell67 4:5d1f8d7d81ff 220 char config = readSingleRegister( CONFIG );
karlmaxwell67 4:5d1f8d7d81ff 221 int wlong = ( config << 6 ) >> 7; // gets WLONG (bit 1) from CONFIG register byte
karlmaxwell67 4:5d1f8d7d81ff 222 if ( wlong == 0 ){
karlmaxwell67 4:5d1f8d7d81ff 223 time = 2.4 * ( 256 - wtime );
karlmaxwell67 4:5d1f8d7d81ff 224 }
karlmaxwell67 4:5d1f8d7d81ff 225 else if ( wlong == 1 ){
karlmaxwell67 4:5d1f8d7d81ff 226 time = 28.8 * ( 256 - wtime ); // 28.8 = 2.4 * 12
karlmaxwell67 4:5d1f8d7d81ff 227 }
karlmaxwell67 4:5d1f8d7d81ff 228 return time;
karlmaxwell67 4:5d1f8d7d81ff 229 }
karlmaxwell67 4:5d1f8d7d81ff 230
karlmaxwell67 3:6a89ac4a1979 231 char TCS3472_I2C::readEnableRegister(){
karlmaxwell67 3:6a89ac4a1979 232 return readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 233 }
karlmaxwell67 3:6a89ac4a1979 234
karlmaxwell67 3:6a89ac4a1979 235 int TCS3472_I2C::readLowInterruptThreshold(){
karlmaxwell67 3:6a89ac4a1979 236 char buffer[2] = { 0 };
karlmaxwell67 3:6a89ac4a1979 237 readMultipleRegisters( AILTL, buffer, 2 );
karlmaxwell67 3:6a89ac4a1979 238 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 3:6a89ac4a1979 239 return reading;
karlmaxwell67 3:6a89ac4a1979 240 }
karlmaxwell67 3:6a89ac4a1979 241
karlmaxwell67 3:6a89ac4a1979 242 int TCS3472_I2C::readHighInterruptThreshold(){
karlmaxwell67 3:6a89ac4a1979 243 char buffer[2] = { 0 };
karlmaxwell67 3:6a89ac4a1979 244 readMultipleRegisters( AIHTL, buffer, 2 );
karlmaxwell67 3:6a89ac4a1979 245 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 3:6a89ac4a1979 246 return reading;
karlmaxwell67 3:6a89ac4a1979 247 }
karlmaxwell67 3:6a89ac4a1979 248
karlmaxwell67 3:6a89ac4a1979 249 int TCS3472_I2C::setLowInterruptThreshold( const int threshold ){
karlmaxwell67 3:6a89ac4a1979 250 char threshold_bytes[2];
karlmaxwell67 3:6a89ac4a1979 251 threshold_bytes[0] = threshold; // take lowest 8 bits of threshold
karlmaxwell67 3:6a89ac4a1979 252 threshold_bytes[1] = threshold >> 8; // take highest 8 bits of threshold
karlmaxwell67 3:6a89ac4a1979 253 int ack = writeMultipleRegisters( AILTL, threshold_bytes, 2 );
karlmaxwell67 3:6a89ac4a1979 254 return ack;
karlmaxwell67 3:6a89ac4a1979 255 }
karlmaxwell67 3:6a89ac4a1979 256
karlmaxwell67 3:6a89ac4a1979 257 int TCS3472_I2C::setHighInterruptThreshold( const int threshold ){
karlmaxwell67 3:6a89ac4a1979 258 char threshold_bytes[2];
karlmaxwell67 3:6a89ac4a1979 259 threshold_bytes[0] = threshold;
karlmaxwell67 3:6a89ac4a1979 260 threshold_bytes[1] = threshold >> 8;
karlmaxwell67 3:6a89ac4a1979 261 int ack = writeMultipleRegisters( AIHTL, threshold_bytes, 2 );
karlmaxwell67 3:6a89ac4a1979 262 return ack;
karlmaxwell67 3:6a89ac4a1979 263 }
karlmaxwell67 3:6a89ac4a1979 264
karlmaxwell67 3:6a89ac4a1979 265 int TCS3472_I2C::readInterruptPersistence(){
karlmaxwell67 3:6a89ac4a1979 266 char pers = readSingleRegister( PERS );
karlmaxwell67 3:6a89ac4a1979 267 char persistence_bits = ( pers << 4 ) >> 4; // discard bits 4 to 7, keep only bits 0 to 3
karlmaxwell67 3:6a89ac4a1979 268 int persistence = -1;
karlmaxwell67 3:6a89ac4a1979 269 switch (persistence_bits){
karlmaxwell67 3:6a89ac4a1979 270 case 0:
karlmaxwell67 3:6a89ac4a1979 271 persistence = 0;
karlmaxwell67 3:6a89ac4a1979 272 break;
karlmaxwell67 3:6a89ac4a1979 273 case 1:
karlmaxwell67 3:6a89ac4a1979 274 persistence = 1;
karlmaxwell67 3:6a89ac4a1979 275 break;
karlmaxwell67 3:6a89ac4a1979 276 case 2:
karlmaxwell67 3:6a89ac4a1979 277 persistence = 2;
karlmaxwell67 3:6a89ac4a1979 278 break;
karlmaxwell67 3:6a89ac4a1979 279 case 3:
karlmaxwell67 3:6a89ac4a1979 280 persistence = 3;
karlmaxwell67 3:6a89ac4a1979 281 break;
karlmaxwell67 3:6a89ac4a1979 282 case 4:
karlmaxwell67 3:6a89ac4a1979 283 persistence = 5;
karlmaxwell67 3:6a89ac4a1979 284 break;
karlmaxwell67 3:6a89ac4a1979 285 case 5:
karlmaxwell67 3:6a89ac4a1979 286 persistence = 10;
karlmaxwell67 3:6a89ac4a1979 287 break;
karlmaxwell67 3:6a89ac4a1979 288 case 6:
karlmaxwell67 3:6a89ac4a1979 289 persistence = 15;
karlmaxwell67 3:6a89ac4a1979 290 break;
karlmaxwell67 3:6a89ac4a1979 291 case 7:
karlmaxwell67 3:6a89ac4a1979 292 persistence = 20;
karlmaxwell67 3:6a89ac4a1979 293 break;
karlmaxwell67 3:6a89ac4a1979 294 case 8:
karlmaxwell67 3:6a89ac4a1979 295 persistence = 25;
karlmaxwell67 3:6a89ac4a1979 296 break;
karlmaxwell67 3:6a89ac4a1979 297 case 9:
karlmaxwell67 3:6a89ac4a1979 298 persistence = 30;
karlmaxwell67 3:6a89ac4a1979 299 break;
karlmaxwell67 3:6a89ac4a1979 300 case 10:
karlmaxwell67 3:6a89ac4a1979 301 persistence = 35;
karlmaxwell67 3:6a89ac4a1979 302 break;
karlmaxwell67 3:6a89ac4a1979 303 case 11:
karlmaxwell67 3:6a89ac4a1979 304 persistence = 40;
karlmaxwell67 3:6a89ac4a1979 305 break;
karlmaxwell67 3:6a89ac4a1979 306 case 12:
karlmaxwell67 3:6a89ac4a1979 307 persistence = 45;
karlmaxwell67 3:6a89ac4a1979 308 break;
karlmaxwell67 3:6a89ac4a1979 309 case 13:
karlmaxwell67 3:6a89ac4a1979 310 persistence = 50;
karlmaxwell67 3:6a89ac4a1979 311 break;
karlmaxwell67 3:6a89ac4a1979 312 case 14:
karlmaxwell67 3:6a89ac4a1979 313 persistence = 55;
karlmaxwell67 3:6a89ac4a1979 314 break;
karlmaxwell67 3:6a89ac4a1979 315 case 15:
karlmaxwell67 3:6a89ac4a1979 316 persistence = 60;
karlmaxwell67 3:6a89ac4a1979 317 break;
karlmaxwell67 3:6a89ac4a1979 318 default:
karlmaxwell67 3:6a89ac4a1979 319 break;
karlmaxwell67 3:6a89ac4a1979 320 }
karlmaxwell67 3:6a89ac4a1979 321 return persistence;
karlmaxwell67 3:6a89ac4a1979 322 }
karlmaxwell67 3:6a89ac4a1979 323
karlmaxwell67 3:6a89ac4a1979 324 int TCS3472_I2C::setInterruptPersistence( const int persistence ){
karlmaxwell67 3:6a89ac4a1979 325 char pers_byte;
karlmaxwell67 3:6a89ac4a1979 326 int ack = 0;
karlmaxwell67 3:6a89ac4a1979 327 switch (persistence){
karlmaxwell67 3:6a89ac4a1979 328 case 0:
karlmaxwell67 3:6a89ac4a1979 329 pers_byte = 0;
karlmaxwell67 3:6a89ac4a1979 330 break;
karlmaxwell67 3:6a89ac4a1979 331 case 1:
karlmaxwell67 3:6a89ac4a1979 332 pers_byte = 1;
karlmaxwell67 3:6a89ac4a1979 333 break;
karlmaxwell67 3:6a89ac4a1979 334 case 2:
karlmaxwell67 3:6a89ac4a1979 335 pers_byte = 2;
karlmaxwell67 3:6a89ac4a1979 336 break;
karlmaxwell67 3:6a89ac4a1979 337 case 3:
karlmaxwell67 3:6a89ac4a1979 338 pers_byte = 3;
karlmaxwell67 3:6a89ac4a1979 339 break;
karlmaxwell67 3:6a89ac4a1979 340 case 5:
karlmaxwell67 3:6a89ac4a1979 341 pers_byte = 4;
karlmaxwell67 3:6a89ac4a1979 342 break;
karlmaxwell67 3:6a89ac4a1979 343 case 10:
karlmaxwell67 3:6a89ac4a1979 344 pers_byte = 5;
karlmaxwell67 3:6a89ac4a1979 345 break;
karlmaxwell67 3:6a89ac4a1979 346 case 15:
karlmaxwell67 3:6a89ac4a1979 347 pers_byte = 6;
karlmaxwell67 3:6a89ac4a1979 348 break;
karlmaxwell67 3:6a89ac4a1979 349 case 20:
karlmaxwell67 3:6a89ac4a1979 350 pers_byte = 7;
karlmaxwell67 3:6a89ac4a1979 351 break;
karlmaxwell67 3:6a89ac4a1979 352 case 25:
karlmaxwell67 3:6a89ac4a1979 353 pers_byte = 8;
karlmaxwell67 3:6a89ac4a1979 354 break;
karlmaxwell67 3:6a89ac4a1979 355 case 30:
karlmaxwell67 3:6a89ac4a1979 356 pers_byte = 9;
karlmaxwell67 3:6a89ac4a1979 357 break;
karlmaxwell67 3:6a89ac4a1979 358 case 35:
karlmaxwell67 3:6a89ac4a1979 359 pers_byte = 10;
karlmaxwell67 3:6a89ac4a1979 360 break;
karlmaxwell67 3:6a89ac4a1979 361 case 40:
karlmaxwell67 3:6a89ac4a1979 362 pers_byte = 11;
karlmaxwell67 3:6a89ac4a1979 363 break;
karlmaxwell67 3:6a89ac4a1979 364 case 45:
karlmaxwell67 3:6a89ac4a1979 365 pers_byte = 12;
karlmaxwell67 3:6a89ac4a1979 366 break;
karlmaxwell67 3:6a89ac4a1979 367 case 50:
karlmaxwell67 3:6a89ac4a1979 368 pers_byte = 13;
karlmaxwell67 3:6a89ac4a1979 369 break;
karlmaxwell67 3:6a89ac4a1979 370 case 55:
karlmaxwell67 3:6a89ac4a1979 371 pers_byte = 14;
karlmaxwell67 3:6a89ac4a1979 372 break;
karlmaxwell67 3:6a89ac4a1979 373 case 60:
karlmaxwell67 3:6a89ac4a1979 374 pers_byte = 15;
karlmaxwell67 3:6a89ac4a1979 375 break;
karlmaxwell67 3:6a89ac4a1979 376 default:
karlmaxwell67 3:6a89ac4a1979 377 ack = 2; // 2 used to indicate invalid entry
karlmaxwell67 3:6a89ac4a1979 378 break;
karlmaxwell67 3:6a89ac4a1979 379 }
karlmaxwell67 3:6a89ac4a1979 380 if ( ack != 2 ){
karlmaxwell67 3:6a89ac4a1979 381 ack = writeSingleRegister( PERS, pers_byte );
karlmaxwell67 3:6a89ac4a1979 382 }
karlmaxwell67 3:6a89ac4a1979 383 return ack;
karlmaxwell67 3:6a89ac4a1979 384 }
karlmaxwell67 3:6a89ac4a1979 385
karlmaxwell67 3:6a89ac4a1979 386 int TCS3472_I2C::clearInterrupt(){
karlmaxwell67 3:6a89ac4a1979 387 char tx = 230;
karlmaxwell67 3:6a89ac4a1979 388 int ack = i2c.write( SLAVE_ADDRESS << 1, &tx, 1 );
karlmaxwell67 3:6a89ac4a1979 389 return ack;
karlmaxwell67 3:6a89ac4a1979 390 }
karlmaxwell67 3:6a89ac4a1979 391
karlmaxwell67 3:6a89ac4a1979 392 int TCS3472_I2C::readRGBCGain(){
karlmaxwell67 3:6a89ac4a1979 393 char control = readSingleRegister( CONTROL );
karlmaxwell67 3:6a89ac4a1979 394 char gain_bits = ( control << 6 ) >> 6; // discard bits 2 to 7, keep only bits 0 & 1
karlmaxwell67 3:6a89ac4a1979 395 int gain;
karlmaxwell67 3:6a89ac4a1979 396 switch (gain_bits) {
karlmaxwell67 3:6a89ac4a1979 397 case 0:
karlmaxwell67 3:6a89ac4a1979 398 gain = 1;
karlmaxwell67 3:6a89ac4a1979 399 break;
karlmaxwell67 3:6a89ac4a1979 400 case 1:
karlmaxwell67 3:6a89ac4a1979 401 gain = 4;
karlmaxwell67 3:6a89ac4a1979 402 break;
karlmaxwell67 3:6a89ac4a1979 403 case 2:
karlmaxwell67 3:6a89ac4a1979 404 gain = 16;
karlmaxwell67 3:6a89ac4a1979 405 break;
karlmaxwell67 3:6a89ac4a1979 406 case 3:
karlmaxwell67 3:6a89ac4a1979 407 gain = 60;
karlmaxwell67 3:6a89ac4a1979 408 break;
karlmaxwell67 3:6a89ac4a1979 409 default:
karlmaxwell67 3:6a89ac4a1979 410 gain = 0;
karlmaxwell67 3:6a89ac4a1979 411 break;
karlmaxwell67 3:6a89ac4a1979 412 }
karlmaxwell67 3:6a89ac4a1979 413 return gain;
karlmaxwell67 3:6a89ac4a1979 414 }
karlmaxwell67 3:6a89ac4a1979 415
karlmaxwell67 3:6a89ac4a1979 416 int TCS3472_I2C::setRGBCGain( const int gain ){
karlmaxwell67 3:6a89ac4a1979 417 char control;
karlmaxwell67 3:6a89ac4a1979 418 int ack = 0;
karlmaxwell67 3:6a89ac4a1979 419 switch (gain){
karlmaxwell67 3:6a89ac4a1979 420 case 1:
karlmaxwell67 3:6a89ac4a1979 421 control = 0;
karlmaxwell67 3:6a89ac4a1979 422 break;
karlmaxwell67 3:6a89ac4a1979 423 case 4:
karlmaxwell67 3:6a89ac4a1979 424 control = 1;
karlmaxwell67 3:6a89ac4a1979 425 break;
karlmaxwell67 3:6a89ac4a1979 426 case 16:
karlmaxwell67 3:6a89ac4a1979 427 control = 2;
karlmaxwell67 3:6a89ac4a1979 428 break;
karlmaxwell67 3:6a89ac4a1979 429 case 60:
karlmaxwell67 3:6a89ac4a1979 430 control = 3;
karlmaxwell67 3:6a89ac4a1979 431 break;
karlmaxwell67 3:6a89ac4a1979 432 default:
karlmaxwell67 3:6a89ac4a1979 433 ack = 2; // 2 used to indicate invalid entry
karlmaxwell67 3:6a89ac4a1979 434 break;
karlmaxwell67 3:6a89ac4a1979 435 }
karlmaxwell67 3:6a89ac4a1979 436 if ( ack != 2 ){
karlmaxwell67 3:6a89ac4a1979 437 ack = writeSingleRegister( CONTROL, control );
karlmaxwell67 3:6a89ac4a1979 438 }
karlmaxwell67 3:6a89ac4a1979 439 return ack;
karlmaxwell67 3:6a89ac4a1979 440 }
karlmaxwell67 3:6a89ac4a1979 441
karlmaxwell67 3:6a89ac4a1979 442 char TCS3472_I2C::getDeviceID(){
karlmaxwell67 3:6a89ac4a1979 443 return readSingleRegister( ID );
karlmaxwell67 3:6a89ac4a1979 444 }
karlmaxwell67 3:6a89ac4a1979 445
karlmaxwell67 3:6a89ac4a1979 446 char TCS3472_I2C::readStatusRegister(){
karlmaxwell67 3:6a89ac4a1979 447 return readSingleRegister( STATUS );
karlmaxwell67 4:5d1f8d7d81ff 448 }
karlmaxwell67 4:5d1f8d7d81ff 449
karlmaxwell67 4:5d1f8d7d81ff 450 float TCS3472_I2C::roundTowardsZero( const float value ){
karlmaxwell67 4:5d1f8d7d81ff 451 float result = 0;
karlmaxwell67 4:5d1f8d7d81ff 452 if ( ( value >= 0 && ( value - (int)value ) < 0.5 ) || ( value < 0 && ( abs(value) - (int)abs(value) ) >= 0.5 ) ){
karlmaxwell67 4:5d1f8d7d81ff 453 result = floor(value);
karlmaxwell67 4:5d1f8d7d81ff 454 }
karlmaxwell67 4:5d1f8d7d81ff 455 else{
karlmaxwell67 4:5d1f8d7d81ff 456 result = ceil(value);
karlmaxwell67 4:5d1f8d7d81ff 457 }
karlmaxwell67 4:5d1f8d7d81ff 458 return result;
Allar 7:ab9ff8738826 459 }
Allar 7:ab9ff8738826 460
Allar 7:ab9ff8738826 461 int TCS3472_I2C::calculateColorTemperature(int r, int g, int b)
Allar 7:ab9ff8738826 462 {
Allar 7:ab9ff8738826 463 float X, Y, Z; /* RGB to XYZ correlation */
Allar 7:ab9ff8738826 464 float xc, yc; /* Chromaticity co-ordinates */
Allar 7:ab9ff8738826 465 float n; /* McCamy's formula */
Allar 7:ab9ff8738826 466 float cct;
Allar 7:ab9ff8738826 467
Allar 7:ab9ff8738826 468 /* 1. Map RGB values to their XYZ counterparts. */
Allar 7:ab9ff8738826 469 /* Based on 6500K fluorescent, 3000K fluorescent */
Allar 7:ab9ff8738826 470 /* and 60W incandescent values for a wide range. */
Allar 7:ab9ff8738826 471 /* Note: Y = Illuminance or lux */
Allar 7:ab9ff8738826 472 X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b);
Allar 7:ab9ff8738826 473 Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
Allar 7:ab9ff8738826 474 Z = (-0.68202F * r) + (0.77073F * g) + ( 0.56332F * b);
Allar 7:ab9ff8738826 475
Allar 7:ab9ff8738826 476 /* 2. Calculate the chromaticity co-ordinates */
Allar 7:ab9ff8738826 477 xc = (X) / (X + Y + Z);
Allar 7:ab9ff8738826 478 yc = (Y) / (X + Y + Z);
Allar 7:ab9ff8738826 479
Allar 7:ab9ff8738826 480 /* 3. Use McCamy's formula to determine the CCT */
Allar 7:ab9ff8738826 481 n = (xc - 0.3320F) / (0.1858F - yc);
Allar 7:ab9ff8738826 482
Allar 7:ab9ff8738826 483 /* Calculate the final CCT */
Allar 7:ab9ff8738826 484 cct = -(449.0F * powf(n, 3)) + (3525.0F * powf(n, 2)) - (6823.3F * n) + 5520.33F;
Allar 7:ab9ff8738826 485
Allar 7:ab9ff8738826 486 /* Return the results in degrees Kelvin */
Allar 7:ab9ff8738826 487 return (int)cct;
Allar 7:ab9ff8738826 488 }
Allar 7:ab9ff8738826 489
Allar 7:ab9ff8738826 490 float TCS3472_I2C::calculateChromaticityX(int r, int g, int b)
Allar 7:ab9ff8738826 491 {
Allar 7:ab9ff8738826 492 float X, Y, Z; /* RGB to XYZ correlation */
Allar 7:ab9ff8738826 493 float xc, yc; /* Chromaticity co-ordinates */
Allar 7:ab9ff8738826 494
Allar 7:ab9ff8738826 495 /* 1. Map RGB values to their XYZ counterparts. */
Allar 7:ab9ff8738826 496 /* Based on 6500K fluorescent, 3000K fluorescent */
Allar 7:ab9ff8738826 497 /* and 60W incandescent values for a wide range. */
Allar 7:ab9ff8738826 498 /* Note: Y = Illuminance or lux */
Allar 7:ab9ff8738826 499 X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b);
Allar 7:ab9ff8738826 500 Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
Allar 7:ab9ff8738826 501 Z = (-0.68202F * r) + (0.77073F * g) + ( 0.56332F * b);
Allar 7:ab9ff8738826 502
Allar 7:ab9ff8738826 503 /* 2. Calculate the chromaticity co-ordinates */
Allar 7:ab9ff8738826 504 xc = (X) / (X + Y + Z);
Allar 7:ab9ff8738826 505 yc = (Y) / (X + Y + Z);
Allar 7:ab9ff8738826 506
Allar 7:ab9ff8738826 507 /* Return the results in degrees Kelvin */
Allar 7:ab9ff8738826 508 return (float)xc;
Allar 7:ab9ff8738826 509 }
Allar 7:ab9ff8738826 510 float TCS3472_I2C::calculateChromaticityY(int r, int g, int b)
Allar 7:ab9ff8738826 511 {
Allar 7:ab9ff8738826 512 float X, Y, Z; /* RGB to XYZ correlation */
Allar 7:ab9ff8738826 513 float xc, yc; /* Chromaticity co-ordinates */
Allar 7:ab9ff8738826 514
Allar 7:ab9ff8738826 515 /* 1. Map RGB values to their XYZ counterparts. */
Allar 7:ab9ff8738826 516 /* Based on 6500K fluorescent, 3000K fluorescent */
Allar 7:ab9ff8738826 517 /* and 60W incandescent values for a wide range. */
Allar 7:ab9ff8738826 518 /* Note: Y = Illuminance or lux */
Allar 7:ab9ff8738826 519 X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b);
Allar 7:ab9ff8738826 520 Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
Allar 7:ab9ff8738826 521 Z = (-0.68202F * r) + (0.77073F * g) + ( 0.56332F * b);
Allar 7:ab9ff8738826 522
Allar 7:ab9ff8738826 523 /* 2. Calculate the chromaticity co-ordinates */
Allar 7:ab9ff8738826 524 xc = (X) / (X + Y + Z);
Allar 7:ab9ff8738826 525 yc = (Y) / (X + Y + Z);
Allar 7:ab9ff8738826 526
Allar 7:ab9ff8738826 527 /* Return the results in degrees Kelvin */
Allar 7:ab9ff8738826 528 return (float)yc;
Allar 7:ab9ff8738826 529 }
Allar 7:ab9ff8738826 530
Allar 7:ab9ff8738826 531 int TCS3472_I2C::calculateLux(int r, int g, int b)
Allar 7:ab9ff8738826 532 {
Allar 7:ab9ff8738826 533 float illuminance;
Allar 7:ab9ff8738826 534
Allar 7:ab9ff8738826 535 /* This only uses RGB ... how can we integrate clear or calculate lux */
Allar 7:ab9ff8738826 536 /* based exclusively on clear since this might be more reliable? */
Allar 7:ab9ff8738826 537 illuminance = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
Allar 7:ab9ff8738826 538
Allar 7:ab9ff8738826 539 return (int)illuminance;
karlmaxwell67 0:453a43c8bf2b 540 }