For use with STM32L746RG . Class which provides functions to control a TAOS TCS3472 Color Light-to-Digital Converter with IR Filter via I2C.
Fork of TCS3472_I2C by
TCS3472_I2C.cpp@8:764a98777c11, 2017-06-01 (annotated)
- Committer:
- Allar
- Date:
- Thu Jun 01 08:04:39 2017 +0000
- Revision:
- 8:764a98777c11
- Parent:
- 7:ab9ff8738826
night;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |