GROVE i2c color sensor Library. based on https://github.com/Seeed-Studio/Grove_I2C_Color_Sensor_TCS3472

Dependents:   PROJ 2PA2S 2PA2S_v2 2PA2S-interrupteur

Committer:
sgrsn
Date:
Fri Aug 31 05:32:03 2018 +0000
Revision:
0:1bf53b314b01
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgrsn 0:1bf53b314b01 1 #include "Adafruit_TCS34725.h"
sgrsn 0:1bf53b314b01 2
sgrsn 0:1bf53b314b01 3 /*example*****************************************************************
sgrsn 0:1bf53b314b01 4
sgrsn 0:1bf53b314b01 5 #include "mbed.h"
sgrsn 0:1bf53b314b01 6 #include "Adafruit_TCS34725.h"
sgrsn 0:1bf53b314b01 7
sgrsn 0:1bf53b314b01 8 #define commonAnode true
sgrsn 0:1bf53b314b01 9
sgrsn 0:1bf53b314b01 10 I2C i2c(p28, p27);
sgrsn 0:1bf53b314b01 11 Adafruit_TCS34725 tcs = Adafruit_TCS34725(&i2c, TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
sgrsn 0:1bf53b314b01 12
sgrsn 0:1bf53b314b01 13 int main()
sgrsn 0:1bf53b314b01 14 {
sgrsn 0:1bf53b314b01 15 char gammatable[256];
sgrsn 0:1bf53b314b01 16 if (tcs.begin())
sgrsn 0:1bf53b314b01 17 {
sgrsn 0:1bf53b314b01 18 printf("Found sensor");
sgrsn 0:1bf53b314b01 19 }
sgrsn 0:1bf53b314b01 20 else
sgrsn 0:1bf53b314b01 21 {
sgrsn 0:1bf53b314b01 22 printf("No TCS34725 found ... check your connections");
sgrsn 0:1bf53b314b01 23 while (1); // halt!
sgrsn 0:1bf53b314b01 24 }
sgrsn 0:1bf53b314b01 25 for (int i=0; i<256; i++)
sgrsn 0:1bf53b314b01 26 {
sgrsn 0:1bf53b314b01 27 float x = i;
sgrsn 0:1bf53b314b01 28 x /= 255;
sgrsn 0:1bf53b314b01 29 x = pow((double)x, 2.5);
sgrsn 0:1bf53b314b01 30 x *= 255;
sgrsn 0:1bf53b314b01 31 if (commonAnode)
sgrsn 0:1bf53b314b01 32 {
sgrsn 0:1bf53b314b01 33 gammatable[i] = 255 - x;
sgrsn 0:1bf53b314b01 34 }
sgrsn 0:1bf53b314b01 35 else
sgrsn 0:1bf53b314b01 36 {
sgrsn 0:1bf53b314b01 37 gammatable[i] = x;
sgrsn 0:1bf53b314b01 38 }
sgrsn 0:1bf53b314b01 39 printf("%d\r\n", gammatable[i]);
sgrsn 0:1bf53b314b01 40 }
sgrsn 0:1bf53b314b01 41 while(1)
sgrsn 0:1bf53b314b01 42 {
sgrsn 0:1bf53b314b01 43 uint16_t clear, red, green, blue;
sgrsn 0:1bf53b314b01 44 tcs.setInterrupt(false); // turn on LED
sgrsn 0:1bf53b314b01 45 tcs.getRawData(&red, &green, &blue, &clear);
sgrsn 0:1bf53b314b01 46 tcs.setInterrupt(true); // turn off LED
sgrsn 0:1bf53b314b01 47 printf("%d, %d, %d, %d\r\n", clear, red, green, blue);
sgrsn 0:1bf53b314b01 48 // Figure out some basic hex code for visualization
sgrsn 0:1bf53b314b01 49 uint32_t sum = clear;
sgrsn 0:1bf53b314b01 50 float r, g, b;
sgrsn 0:1bf53b314b01 51 r = red; r /= sum;
sgrsn 0:1bf53b314b01 52 g = green; g /= sum;
sgrsn 0:1bf53b314b01 53 b = blue; b /= sum;
sgrsn 0:1bf53b314b01 54 r *= 256; g *= 256; b *= 256;
sgrsn 0:1bf53b314b01 55 }
sgrsn 0:1bf53b314b01 56 }
sgrsn 0:1bf53b314b01 57
sgrsn 0:1bf53b314b01 58
sgrsn 0:1bf53b314b01 59 *************************************************************************/
sgrsn 0:1bf53b314b01 60
sgrsn 0:1bf53b314b01 61 void Adafruit_TCS34725::write8 (uint8_t reg, uint32_t value)
sgrsn 0:1bf53b314b01 62 {
sgrsn 0:1bf53b314b01 63 char data[2] = {TCS34725_COMMAND_BIT | reg, value & 0xFF};
sgrsn 0:1bf53b314b01 64 _i2c->write(TCS34725_ADDRESS, data, 2);
sgrsn 0:1bf53b314b01 65 }
sgrsn 0:1bf53b314b01 66
sgrsn 0:1bf53b314b01 67 uint8_t Adafruit_TCS34725::read8(uint8_t reg)
sgrsn 0:1bf53b314b01 68 {
sgrsn 0:1bf53b314b01 69 char data[2] = {TCS34725_COMMAND_BIT | reg, 0};
sgrsn 0:1bf53b314b01 70 char r_data = 0;
sgrsn 0:1bf53b314b01 71 _i2c->write(TCS34725_ADDRESS, data, 1);
sgrsn 0:1bf53b314b01 72 _i2c->read(TCS34725_ADDRESS, &r_data, 1);
sgrsn 0:1bf53b314b01 73
sgrsn 0:1bf53b314b01 74 return r_data;
sgrsn 0:1bf53b314b01 75 }
sgrsn 0:1bf53b314b01 76
sgrsn 0:1bf53b314b01 77 uint16_t Adafruit_TCS34725::read16(uint8_t reg)
sgrsn 0:1bf53b314b01 78 {
sgrsn 0:1bf53b314b01 79 uint16_t x; uint16_t t;
sgrsn 0:1bf53b314b01 80 char data[2] = {TCS34725_COMMAND_BIT | reg, 0};
sgrsn 0:1bf53b314b01 81 char r_data[2] = {};
sgrsn 0:1bf53b314b01 82 _i2c->write(TCS34725_ADDRESS, data, 1);
sgrsn 0:1bf53b314b01 83 _i2c->read(TCS34725_ADDRESS, r_data, 2);
sgrsn 0:1bf53b314b01 84 t = r_data[0];
sgrsn 0:1bf53b314b01 85 x = r_data[1];
sgrsn 0:1bf53b314b01 86 x <<= 8;
sgrsn 0:1bf53b314b01 87 x |= t;
sgrsn 0:1bf53b314b01 88 return x;
sgrsn 0:1bf53b314b01 89 }
sgrsn 0:1bf53b314b01 90
sgrsn 0:1bf53b314b01 91 void Adafruit_TCS34725::enable(void)
sgrsn 0:1bf53b314b01 92 {
sgrsn 0:1bf53b314b01 93 write8(TCS34725_ENABLE, TCS34725_ENABLE_PON);
sgrsn 0:1bf53b314b01 94 wait_ms(3);
sgrsn 0:1bf53b314b01 95 write8(TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
sgrsn 0:1bf53b314b01 96 }
sgrsn 0:1bf53b314b01 97
sgrsn 0:1bf53b314b01 98 void Adafruit_TCS34725::disable(void)
sgrsn 0:1bf53b314b01 99 {
sgrsn 0:1bf53b314b01 100 /* Turn the device off to save power */
sgrsn 0:1bf53b314b01 101 uint8_t reg = 0;
sgrsn 0:1bf53b314b01 102 reg = read8(TCS34725_ENABLE);
sgrsn 0:1bf53b314b01 103 write8(TCS34725_ENABLE, reg & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN));
sgrsn 0:1bf53b314b01 104 }
sgrsn 0:1bf53b314b01 105
sgrsn 0:1bf53b314b01 106 Adafruit_TCS34725::Adafruit_TCS34725(I2C *i2c, tcs34725IntegrationTime_t it, tcs34725Gain_t gain)
sgrsn 0:1bf53b314b01 107 {
sgrsn 0:1bf53b314b01 108 _i2c = i2c;
sgrsn 0:1bf53b314b01 109 _tcs34725Initialised = false;
sgrsn 0:1bf53b314b01 110 _tcs34725IntegrationTime = it;
sgrsn 0:1bf53b314b01 111 _tcs34725Gain = gain;
sgrsn 0:1bf53b314b01 112 }
sgrsn 0:1bf53b314b01 113
sgrsn 0:1bf53b314b01 114 bool Adafruit_TCS34725::begin(void)
sgrsn 0:1bf53b314b01 115 {
sgrsn 0:1bf53b314b01 116 /* Make sure we're actually connected */
sgrsn 0:1bf53b314b01 117 uint8_t x = read8(TCS34725_ID);
sgrsn 0:1bf53b314b01 118 //Serial.println(x, HEX);
sgrsn 0:1bf53b314b01 119 if (x != 0x44)
sgrsn 0:1bf53b314b01 120 {
sgrsn 0:1bf53b314b01 121 return false;
sgrsn 0:1bf53b314b01 122 }
sgrsn 0:1bf53b314b01 123 _tcs34725Initialised = true;
sgrsn 0:1bf53b314b01 124
sgrsn 0:1bf53b314b01 125 /* Set default integration time and gain */
sgrsn 0:1bf53b314b01 126 setIntegrationTime(_tcs34725IntegrationTime);
sgrsn 0:1bf53b314b01 127 setGain(_tcs34725Gain);
sgrsn 0:1bf53b314b01 128
sgrsn 0:1bf53b314b01 129 /* Note: by default, the device is in power down mode on bootup */
sgrsn 0:1bf53b314b01 130 enable();
sgrsn 0:1bf53b314b01 131
sgrsn 0:1bf53b314b01 132 return true;
sgrsn 0:1bf53b314b01 133 }
sgrsn 0:1bf53b314b01 134
sgrsn 0:1bf53b314b01 135 void Adafruit_TCS34725::setIntegrationTime(tcs34725IntegrationTime_t it)
sgrsn 0:1bf53b314b01 136 {
sgrsn 0:1bf53b314b01 137 if (!_tcs34725Initialised) begin();
sgrsn 0:1bf53b314b01 138
sgrsn 0:1bf53b314b01 139 /* Update the timing register */
sgrsn 0:1bf53b314b01 140 write8(TCS34725_ATIME, it);
sgrsn 0:1bf53b314b01 141
sgrsn 0:1bf53b314b01 142 /* Update value placeholders */
sgrsn 0:1bf53b314b01 143 _tcs34725IntegrationTime = it;
sgrsn 0:1bf53b314b01 144 }
sgrsn 0:1bf53b314b01 145
sgrsn 0:1bf53b314b01 146 void Adafruit_TCS34725::setGain(tcs34725Gain_t gain)
sgrsn 0:1bf53b314b01 147 {
sgrsn 0:1bf53b314b01 148 if (!_tcs34725Initialised) begin();
sgrsn 0:1bf53b314b01 149
sgrsn 0:1bf53b314b01 150 /* Update the timing register */
sgrsn 0:1bf53b314b01 151 write8(TCS34725_CONTROL, gain);
sgrsn 0:1bf53b314b01 152
sgrsn 0:1bf53b314b01 153 /* Update value placeholders */
sgrsn 0:1bf53b314b01 154 _tcs34725Gain = gain;
sgrsn 0:1bf53b314b01 155 }
sgrsn 0:1bf53b314b01 156
sgrsn 0:1bf53b314b01 157 void Adafruit_TCS34725::getRawData (uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c)
sgrsn 0:1bf53b314b01 158 {
sgrsn 0:1bf53b314b01 159 if (!_tcs34725Initialised) begin();
sgrsn 0:1bf53b314b01 160
sgrsn 0:1bf53b314b01 161 *c = read16(TCS34725_CDATAL);
sgrsn 0:1bf53b314b01 162 *r = read16(TCS34725_RDATAL);
sgrsn 0:1bf53b314b01 163 *g = read16(TCS34725_GDATAL);
sgrsn 0:1bf53b314b01 164 *b = read16(TCS34725_BDATAL);
sgrsn 0:1bf53b314b01 165
sgrsn 0:1bf53b314b01 166 /* Set a delay for the integration time */
sgrsn 0:1bf53b314b01 167 switch (_tcs34725IntegrationTime)
sgrsn 0:1bf53b314b01 168 {
sgrsn 0:1bf53b314b01 169 case TCS34725_INTEGRATIONTIME_2_4MS:
sgrsn 0:1bf53b314b01 170 wait_ms(3);
sgrsn 0:1bf53b314b01 171 break;
sgrsn 0:1bf53b314b01 172 case TCS34725_INTEGRATIONTIME_24MS:
sgrsn 0:1bf53b314b01 173 wait_ms(24);
sgrsn 0:1bf53b314b01 174 break;
sgrsn 0:1bf53b314b01 175 case TCS34725_INTEGRATIONTIME_50MS:
sgrsn 0:1bf53b314b01 176 wait_ms(50);
sgrsn 0:1bf53b314b01 177 break;
sgrsn 0:1bf53b314b01 178 case TCS34725_INTEGRATIONTIME_101MS:
sgrsn 0:1bf53b314b01 179 wait_ms(101);
sgrsn 0:1bf53b314b01 180 break;
sgrsn 0:1bf53b314b01 181 case TCS34725_INTEGRATIONTIME_154MS:
sgrsn 0:1bf53b314b01 182 wait_ms(154);
sgrsn 0:1bf53b314b01 183 break;
sgrsn 0:1bf53b314b01 184 case TCS34725_INTEGRATIONTIME_700MS:
sgrsn 0:1bf53b314b01 185 wait_ms(700);
sgrsn 0:1bf53b314b01 186 break;
sgrsn 0:1bf53b314b01 187 }
sgrsn 0:1bf53b314b01 188 }
sgrsn 0:1bf53b314b01 189
sgrsn 0:1bf53b314b01 190 uint16_t Adafruit_TCS34725::calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b)
sgrsn 0:1bf53b314b01 191 {
sgrsn 0:1bf53b314b01 192 float X, Y, Z; /* RGB to XYZ correlation */
sgrsn 0:1bf53b314b01 193 float xc, yc; /* Chromaticity co-ordinates */
sgrsn 0:1bf53b314b01 194 float n; /* McCamy's formula */
sgrsn 0:1bf53b314b01 195 float cct;
sgrsn 0:1bf53b314b01 196
sgrsn 0:1bf53b314b01 197 /* 1. Map RGB values to their XYZ counterparts. */
sgrsn 0:1bf53b314b01 198 /* Based on 6500K fluorescent, 3000K fluorescent */
sgrsn 0:1bf53b314b01 199 /* and 60W incandescent values for a wide range. */
sgrsn 0:1bf53b314b01 200 /* Note: Y = Illuminance or lux */
sgrsn 0:1bf53b314b01 201 X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b);
sgrsn 0:1bf53b314b01 202 Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
sgrsn 0:1bf53b314b01 203 Z = (-0.68202F * r) + (0.77073F * g) + ( 0.56332F * b);
sgrsn 0:1bf53b314b01 204
sgrsn 0:1bf53b314b01 205 /* 2. Calculate the chromaticity co-ordinates */
sgrsn 0:1bf53b314b01 206 xc = (X) / (X + Y + Z);
sgrsn 0:1bf53b314b01 207 yc = (Y) / (X + Y + Z);
sgrsn 0:1bf53b314b01 208
sgrsn 0:1bf53b314b01 209 /* 3. Use McCamy's formula to determine the CCT */
sgrsn 0:1bf53b314b01 210 n = (xc - 0.3320F) / (0.1858F - yc);
sgrsn 0:1bf53b314b01 211
sgrsn 0:1bf53b314b01 212 /* Calculate the final CCT */
sgrsn 0:1bf53b314b01 213 cct = (449.0F * powf(n, 3)) + (3525.0F * powf(n, 2)) + (6823.3F * n) + 5520.33F;
sgrsn 0:1bf53b314b01 214
sgrsn 0:1bf53b314b01 215 /* Return the results in degrees Kelvin */
sgrsn 0:1bf53b314b01 216 return (uint16_t)cct;
sgrsn 0:1bf53b314b01 217 }
sgrsn 0:1bf53b314b01 218
sgrsn 0:1bf53b314b01 219 uint16_t Adafruit_TCS34725::calculateLux(uint16_t r, uint16_t g, uint16_t b)
sgrsn 0:1bf53b314b01 220 {
sgrsn 0:1bf53b314b01 221 float illuminance;
sgrsn 0:1bf53b314b01 222
sgrsn 0:1bf53b314b01 223 /* This only uses RGB ... how can we integrate clear or calculate lux */
sgrsn 0:1bf53b314b01 224 /* based exclusively on clear since this might be more reliable? */
sgrsn 0:1bf53b314b01 225 illuminance = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
sgrsn 0:1bf53b314b01 226
sgrsn 0:1bf53b314b01 227 return (uint16_t)illuminance;
sgrsn 0:1bf53b314b01 228 }
sgrsn 0:1bf53b314b01 229
sgrsn 0:1bf53b314b01 230
sgrsn 0:1bf53b314b01 231 void Adafruit_TCS34725::setInterrupt(bool i)
sgrsn 0:1bf53b314b01 232 {
sgrsn 0:1bf53b314b01 233 uint8_t r = read8(TCS34725_ENABLE);
sgrsn 0:1bf53b314b01 234 if (i)
sgrsn 0:1bf53b314b01 235 {
sgrsn 0:1bf53b314b01 236 r |= TCS34725_ENABLE_AIEN;
sgrsn 0:1bf53b314b01 237 }
sgrsn 0:1bf53b314b01 238 else
sgrsn 0:1bf53b314b01 239 {
sgrsn 0:1bf53b314b01 240 r &= ~TCS34725_ENABLE_AIEN;
sgrsn 0:1bf53b314b01 241 }
sgrsn 0:1bf53b314b01 242 write8(TCS34725_ENABLE, r);
sgrsn 0:1bf53b314b01 243 }
sgrsn 0:1bf53b314b01 244
sgrsn 0:1bf53b314b01 245 void Adafruit_TCS34725::clearInterrupt(void)
sgrsn 0:1bf53b314b01 246 {
sgrsn 0:1bf53b314b01 247 char data[2] = {0x66, 0};
sgrsn 0:1bf53b314b01 248 _i2c->write(TCS34725_ADDRESS, data, 1);
sgrsn 0:1bf53b314b01 249 }
sgrsn 0:1bf53b314b01 250
sgrsn 0:1bf53b314b01 251
sgrsn 0:1bf53b314b01 252 void Adafruit_TCS34725::setIntLimits(uint16_t low, uint16_t high)
sgrsn 0:1bf53b314b01 253 {
sgrsn 0:1bf53b314b01 254 write8(0x04, low & 0xFF);
sgrsn 0:1bf53b314b01 255 write8(0x05, low >> 8);
sgrsn 0:1bf53b314b01 256 write8(0x06, high & 0xFF);
sgrsn 0:1bf53b314b01 257 write8(0x07, high >> 8);
sgrsn 0:1bf53b314b01 258 }