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:
Sun Apr 30 08:00:52 2017 +0000
Revision:
7:ab9ff8738826
Parent:
6:6d5bb4ad7d6e
Child:
8:764a98777c11
need to see which is a better measurement; comp or non comp

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