Quad RGB sensor with SPI output drive, I2C display interface & analogue inputs / UI for various LED types

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Wed Aug 10 09:19:45 2016 +0000
Revision:
0:9d301ae51ecf
Child:
1:d99dad8a1f50
early stable!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jolyon 0:9d301ae51ecf 1 #include "mbed.h"
jolyon 0:9d301ae51ecf 2 #include "TextLCD.h"
jolyon 0:9d301ae51ecf 3 #include "VEML6040.h"
jolyon 0:9d301ae51ecf 4
jolyon 0:9d301ae51ecf 5 #define FACTOR 1
jolyon 0:9d301ae51ecf 6
jolyon 0:9d301ae51ecf 7 #define SENSOR_ADDR (41 << 1)
jolyon 0:9d301ae51ecf 8 #define WHITE_REG 148
jolyon 0:9d301ae51ecf 9 #define SENSOR_RED_REG 148
jolyon 0:9d301ae51ecf 10
jolyon 0:9d301ae51ecf 11 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 12 //----------- LED's -------------------------------------------------------------
jolyon 0:9d301ae51ecf 13 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 14 // Detection LED's use the onboard MBED LED's
jolyon 0:9d301ae51ecf 15 // These are all blue on the MBED but on DSE PCB they areas follows
jolyon 0:9d301ae51ecf 16 // LED1 = GREEN
jolyon 0:9d301ae51ecf 17 // LED2 = BLUE
jolyon 0:9d301ae51ecf 18 // LED3 = RED
jolyon 0:9d301ae51ecf 19 // LED4 = YELLOW
jolyon 0:9d301ae51ecf 20 DigitalOut GreenLed(LED1);
jolyon 0:9d301ae51ecf 21 DigitalOut BlueLed(LED2);
jolyon 0:9d301ae51ecf 22 DigitalOut RedLed(LED3);
jolyon 0:9d301ae51ecf 23 DigitalOut YellowLed(LED4);
jolyon 0:9d301ae51ecf 24
jolyon 0:9d301ae51ecf 25 //DigitalOut myled(LED1);
jolyon 0:9d301ae51ecf 26 //DigitalOut myGreen(p21);
jolyon 0:9d301ae51ecf 27 //DigitalOut myYellow(p22);
jolyon 0:9d301ae51ecf 28 //DigitalOut myled4(LED4);
jolyon 0:9d301ae51ecf 29 //DigitalOut green(LED1);
jolyon 0:9d301ae51ecf 30 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 31
jolyon 0:9d301ae51ecf 32 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 33 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 34 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 35 //Analogue inputs are used to set thresholds for detector levels
jolyon 0:9d301ae51ecf 36 AnalogIn SystemThreshold1(p15);
jolyon 0:9d301ae51ecf 37 //AnalogIn SystemThreshold2(p16);
jolyon 0:9d301ae51ecf 38 //AnalogIn SystemThreshold3(p17);
jolyon 0:9d301ae51ecf 39 //AnalogIn SystemThreshold4(p18);
jolyon 0:9d301ae51ecf 40 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 41
jolyon 0:9d301ae51ecf 42 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 43 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 44 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 45 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 46 //final version uses I2C port
jolyon 0:9d301ae51ecf 47 TextLCD lcd(p14, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 48
jolyon 0:9d301ae51ecf 49 //set up I2C Communication to LCD
jolyon 0:9d301ae51ecf 50 //I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 51
jolyon 0:9d301ae51ecf 52 //I2C Portexpander PCF8574 for LCD
jolyon 0:9d301ae51ecf 53 //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 54
jolyon 0:9d301ae51ecf 55 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 56
jolyon 0:9d301ae51ecf 57
jolyon 0:9d301ae51ecf 58 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 59 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 60 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 61 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 62 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 63
jolyon 0:9d301ae51ecf 64
jolyon 0:9d301ae51ecf 65 typedef struct{
jolyon 0:9d301ae51ecf 66 uint16_t White;
jolyon 0:9d301ae51ecf 67 uint16_t Red;
jolyon 0:9d301ae51ecf 68 uint16_t Green;
jolyon 0:9d301ae51ecf 69 uint16_t Blue;
jolyon 0:9d301ae51ecf 70 }Colour;
jolyon 0:9d301ae51ecf 71
jolyon 0:9d301ae51ecf 72 Colour SensorData;
jolyon 0:9d301ae51ecf 73
jolyon 0:9d301ae51ecf 74 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 75
jolyon 0:9d301ae51ecf 76 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 77 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 78
jolyon 0:9d301ae51ecf 79 char TempReg[1] = {0};
jolyon 0:9d301ae51ecf 80 char TempData[2] = {0,0};
jolyon 0:9d301ae51ecf 81
jolyon 0:9d301ae51ecf 82
jolyon 0:9d301ae51ecf 83 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 84
jolyon 0:9d301ae51ecf 85 uint16_t Red = 1;
jolyon 0:9d301ae51ecf 86 uint16_t Green = 2;
jolyon 0:9d301ae51ecf 87 uint16_t Blue = 3;
jolyon 0:9d301ae51ecf 88 uint16_t White = 4;
jolyon 0:9d301ae51ecf 89
jolyon 0:9d301ae51ecf 90 uint32_t AvgRed = 0;
jolyon 0:9d301ae51ecf 91 uint32_t AvgGreen = 0;
jolyon 0:9d301ae51ecf 92 uint32_t AvgBlue = 0;
jolyon 0:9d301ae51ecf 93 uint32_t AvgWhite = 0;
jolyon 0:9d301ae51ecf 94 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 95 uint32_t TempR = 0;
jolyon 0:9d301ae51ecf 96 uint32_t TempG = 0;
jolyon 0:9d301ae51ecf 97 uint32_t TempB = 0;
jolyon 0:9d301ae51ecf 98
jolyon 0:9d301ae51ecf 99
jolyon 0:9d301ae51ecf 100 uint16_t RedProp = 0;
jolyon 0:9d301ae51ecf 101 uint16_t GreenProp = 0;
jolyon 0:9d301ae51ecf 102 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 103
jolyon 0:9d301ae51ecf 104 uint16_t myMix = 0;
jolyon 0:9d301ae51ecf 105
jolyon 0:9d301ae51ecf 106 float MyCCT;
jolyon 0:9d301ae51ecf 107 float MyCCTi;
jolyon 0:9d301ae51ecf 108 uint8_t DisplayIndex = 0;
jolyon 0:9d301ae51ecf 109
jolyon 0:9d301ae51ecf 110 uint8_t Config = 0x30;
jolyon 0:9d301ae51ecf 111 // bit description setting
jolyon 0:9d301ae51ecf 112 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 113 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 114 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 115 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 116 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 117 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 118 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 119 // 7 N/F 0 0
jolyon 0:9d301ae51ecf 120
jolyon 0:9d301ae51ecf 121
jolyon 0:9d301ae51ecf 122 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 123 {
jolyon 0:9d301ae51ecf 124 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 125 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 126 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 127 *Acc = Temp;
jolyon 0:9d301ae51ecf 128 return *Acc >> factor;
jolyon 0:9d301ae51ecf 129 }
jolyon 0:9d301ae51ecf 130
jolyon 0:9d301ae51ecf 131
jolyon 0:9d301ae51ecf 132 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 133 {
jolyon 0:9d301ae51ecf 134 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 135 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 136
jolyon 0:9d301ae51ecf 137
jolyon 0:9d301ae51ecf 138
jolyon 0:9d301ae51ecf 139 char id_regval[1] = {146};
jolyon 0:9d301ae51ecf 140 char data[1] = {0};
jolyon 0:9d301ae51ecf 141 i2c.write(sensor_addr,id_regval,1, true);
jolyon 0:9d301ae51ecf 142 i2c.read(sensor_addr,data,1,false);
jolyon 0:9d301ae51ecf 143
jolyon 0:9d301ae51ecf 144 if (data[0]==68) {
jolyon 0:9d301ae51ecf 145 GreenLed = 0;
jolyon 0:9d301ae51ecf 146 wait (2);
jolyon 0:9d301ae51ecf 147 GreenLed = 1;
jolyon 0:9d301ae51ecf 148 } else {
jolyon 0:9d301ae51ecf 149 GreenLed = 1;
jolyon 0:9d301ae51ecf 150 }
jolyon 0:9d301ae51ecf 151
jolyon 0:9d301ae51ecf 152 // Initialize color sensor
jolyon 0:9d301ae51ecf 153
jolyon 0:9d301ae51ecf 154 char enable_register[2] = {128,3}; //enable the sensor
jolyon 0:9d301ae51ecf 155 i2c.write(sensor_addr,enable_register,2,false);
jolyon 0:9d301ae51ecf 156
jolyon 0:9d301ae51ecf 157 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 0:9d301ae51ecf 158 i2c.write(sensor_addr,timing_register,2,false);
jolyon 0:9d301ae51ecf 159
jolyon 0:9d301ae51ecf 160 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 0:9d301ae51ecf 161 i2c.write(sensor_addr,control_register,2,false);
jolyon 0:9d301ae51ecf 162
jolyon 0:9d301ae51ecf 163
jolyon 0:9d301ae51ecf 164
jolyon 0:9d301ae51ecf 165 // Read data from color sensor (Clear/Red/Green/Blue)
jolyon 0:9d301ae51ecf 166 //led = 1;
jolyon 0:9d301ae51ecf 167
jolyon 0:9d301ae51ecf 168 }
jolyon 0:9d301ae51ecf 169
jolyon 0:9d301ae51ecf 170
jolyon 0:9d301ae51ecf 171
jolyon 0:9d301ae51ecf 172 int main()
jolyon 0:9d301ae51ecf 173 {
jolyon 0:9d301ae51ecf 174 //----------------------Initialise My TCS3472--------------------
jolyon 0:9d301ae51ecf 175 //Initialise the I2C port
jolyon 0:9d301ae51ecf 176 ConfigureTSC(0);
jolyon 0:9d301ae51ecf 177
jolyon 0:9d301ae51ecf 178
jolyon 0:9d301ae51ecf 179
jolyon 0:9d301ae51ecf 180 //---------------------- My TCS3472 --------------------
jolyon 0:9d301ae51ecf 181
jolyon 0:9d301ae51ecf 182 //myled2 = 1;
jolyon 0:9d301ae51ecf 183 //myled3 = 1;
jolyon 0:9d301ae51ecf 184 //myled4 = 1;
jolyon 0:9d301ae51ecf 185 while(1) {
jolyon 0:9d301ae51ecf 186
jolyon 0:9d301ae51ecf 187 DisplayIndex++;
jolyon 0:9d301ae51ecf 188 if(DisplayIndex >= 20) {
jolyon 0:9d301ae51ecf 189 DisplayIndex = 0;
jolyon 0:9d301ae51ecf 190 }
jolyon 0:9d301ae51ecf 191 //myled = 1;
jolyon 0:9d301ae51ecf 192 wait(0.1);
jolyon 0:9d301ae51ecf 193 //myled = 0;
jolyon 0:9d301ae51ecf 194 //wait(0.1);
jolyon 0:9d301ae51ecf 195
jolyon 0:9d301ae51ecf 196 //get new data
jolyon 0:9d301ae51ecf 197 //--------------VEML6040-------------------
jolyon 0:9d301ae51ecf 198 // RGBW.getRData(&Red);
jolyon 0:9d301ae51ecf 199 // RGBW.getGData(&Green);
jolyon 0:9d301ae51ecf 200 // RGBW.getBData(&Blue);
jolyon 0:9d301ae51ecf 201 // RGBW.getWData(&White);
jolyon 0:9d301ae51ecf 202 //--------------VEML6040-------------------
jolyon 0:9d301ae51ecf 203
jolyon 0:9d301ae51ecf 204 //----------------------My TCS3472--------------------
jolyon 0:9d301ae51ecf 205
jolyon 0:9d301ae51ecf 206 //TempReg[0] = 148;
jolyon 0:9d301ae51ecf 207 //TempData[0] = 0;
jolyon 0:9d301ae51ecf 208 //TempData[1] = 0;
jolyon 0:9d301ae51ecf 209 char clear_reg[1] = {148};
jolyon 0:9d301ae51ecf 210 char clear_data[2] = {0,0};
jolyon 0:9d301ae51ecf 211
jolyon 0:9d301ae51ecf 212
jolyon 0:9d301ae51ecf 213 i2c.write(SENSOR_ADDR, WHITE_REG,1, true);
jolyon 0:9d301ae51ecf 214 i2c.read(sensor_addr,clear_data,2, false);
jolyon 0:9d301ae51ecf 215
jolyon 0:9d301ae51ecf 216 White = ((int)clear_data[1] << 8) | clear_data[0];
jolyon 0:9d301ae51ecf 217
jolyon 0:9d301ae51ecf 218
jolyon 0:9d301ae51ecf 219
jolyon 0:9d301ae51ecf 220 char red_reg[1] = {150};
jolyon 0:9d301ae51ecf 221 char red_data[2] = {0,0};
jolyon 0:9d301ae51ecf 222 i2c.write(sensor_addr,red_reg,1, true);
jolyon 0:9d301ae51ecf 223 i2c.read(sensor_addr,red_data,2, false);
jolyon 0:9d301ae51ecf 224
jolyon 0:9d301ae51ecf 225 Red = ((int)red_data[1] << 8) | red_data[0];
jolyon 0:9d301ae51ecf 226
jolyon 0:9d301ae51ecf 227 char green_reg[1] = {152};
jolyon 0:9d301ae51ecf 228 char green_data[2] = {0,0};
jolyon 0:9d301ae51ecf 229 i2c.write(sensor_addr,green_reg,1, true);
jolyon 0:9d301ae51ecf 230 i2c.read(sensor_addr,green_data,2, false);
jolyon 0:9d301ae51ecf 231
jolyon 0:9d301ae51ecf 232 Green = ((int)green_data[1] << 8) | green_data[0];
jolyon 0:9d301ae51ecf 233
jolyon 0:9d301ae51ecf 234 char blue_reg[1] = {154};
jolyon 0:9d301ae51ecf 235 char blue_data[2] = {0,0};
jolyon 0:9d301ae51ecf 236 i2c.write(sensor_addr,blue_reg,1, true);
jolyon 0:9d301ae51ecf 237 i2c.read(sensor_addr,blue_data,2, false);
jolyon 0:9d301ae51ecf 238
jolyon 0:9d301ae51ecf 239 Blue = ((int)blue_data[1] << 8) | blue_data[0];
jolyon 0:9d301ae51ecf 240 //----------------------My TCS3472--------------------
jolyon 0:9d301ae51ecf 241
jolyon 0:9d301ae51ecf 242
jolyon 0:9d301ae51ecf 243
jolyon 0:9d301ae51ecf 244
jolyon 0:9d301ae51ecf 245 //Red filter
jolyon 0:9d301ae51ecf 246 //Red = Filter(&AvgRed, Red, FACTOR);
jolyon 0:9d301ae51ecf 247
jolyon 0:9d301ae51ecf 248 //Green Filter
jolyon 0:9d301ae51ecf 249 //Green = Filter(&AvgGreen, Green, FACTOR);
jolyon 0:9d301ae51ecf 250
jolyon 0:9d301ae51ecf 251 //Blue Filter
jolyon 0:9d301ae51ecf 252 //Blue = Filter(&AvgBlue, Blue, FACTOR);
jolyon 0:9d301ae51ecf 253
jolyon 0:9d301ae51ecf 254 //White Filter
jolyon 0:9d301ae51ecf 255 //White = Filter(&AvgWhite, White, FACTOR);
jolyon 0:9d301ae51ecf 256
jolyon 0:9d301ae51ecf 257 #define USEWHITE //normalised % for each
jolyon 0:9d301ae51ecf 258 #ifdef USEWHITE
jolyon 0:9d301ae51ecf 259 Temp = (Red+Blue+Green)*10000;
jolyon 0:9d301ae51ecf 260 Temp = Temp / White;
jolyon 0:9d301ae51ecf 261 TempR = (Red* 10000) / Temp ;
jolyon 0:9d301ae51ecf 262 TempG = (Green* 10000) / Temp ;
jolyon 0:9d301ae51ecf 263 TempB = (Blue* 10000) / Temp ;
jolyon 0:9d301ae51ecf 264
jolyon 0:9d301ae51ecf 265 RedProp = (TempR*100) / White;
jolyon 0:9d301ae51ecf 266 GreenProp = (TempG*100) / White;
jolyon 0:9d301ae51ecf 267 BlueProp = (TempB*100) / White;
jolyon 0:9d301ae51ecf 268 #else
jolyon 0:9d301ae51ecf 269 // Vn2 without using white....
jolyon 0:9d301ae51ecf 270 Temp = (Red+Blue+Green);
jolyon 0:9d301ae51ecf 271 RedProp = (Red* 100) / Temp ;
jolyon 0:9d301ae51ecf 272 GreenProp = (Green* 100) / Temp ;
jolyon 0:9d301ae51ecf 273 BlueProp = (Blue* 100) / Temp ;
jolyon 0:9d301ae51ecf 274
jolyon 0:9d301ae51ecf 275 //RedProp = (TempR*100) / White;
jolyon 0:9d301ae51ecf 276 //GreenProp = (TempG*100) / White;
jolyon 0:9d301ae51ecf 277 //BlueProp = (TempB*100) / White;
jolyon 0:9d301ae51ecf 278 #endif
jolyon 0:9d301ae51ecf 279
jolyon 0:9d301ae51ecf 280
jolyon 0:9d301ae51ecf 281
jolyon 0:9d301ae51ecf 282 //make 12 bit only (display)
jolyon 0:9d301ae51ecf 283 Red >>=4;
jolyon 0:9d301ae51ecf 284 Green >>=4;
jolyon 0:9d301ae51ecf 285 Blue >>=4;
jolyon 0:9d301ae51ecf 286 White >>=4;
jolyon 0:9d301ae51ecf 287
jolyon 0:9d301ae51ecf 288 //lcd.locate(0, 0);
jolyon 0:9d301ae51ecf 289 //lcd.printf("%03x %03x %03x %03x",Red,Green,Blue, White);
jolyon 0:9d301ae51ecf 290
jolyon 0:9d301ae51ecf 291 myMix = GreenProp*1000/RedProp;
jolyon 0:9d301ae51ecf 292 lcd.locate(0, 0);
jolyon 0:9d301ae51ecf 293 lcd.printf("Mix = %i %i ",myMix, White);
jolyon 0:9d301ae51ecf 294 lcd.locate(0, 1);
jolyon 0:9d301ae51ecf 295
jolyon 0:9d301ae51ecf 296 //lcd.printf("B=%03x W=%03x",Blue,White);
jolyon 0:9d301ae51ecf 297 //if(DisplayIndex <=10)
jolyon 0:9d301ae51ecf 298 {
jolyon 0:9d301ae51ecf 299 //lcd.printf("R %i G %i B %i ",RedProp, GreenProp, BlueProp);
jolyon 0:9d301ae51ecf 300 lcd.printf("ADC = %05i ",SystemThreshold1.read_u16()>>4);
jolyon 0:9d301ae51ecf 301 }
jolyon 0:9d301ae51ecf 302 // else
jolyon 0:9d301ae51ecf 303 // {
jolyon 0:9d301ae51ecf 304 // MyCCTi = (((float)Red-(float)Blue)/(float)Green) +0.5;
jolyon 0:9d301ae51ecf 305 // MyCCT = 4278.6 * pow((double)MyCCTi,(double)-1.2455);
jolyon 0:9d301ae51ecf 306 // //lcd.locate(0, 1);
jolyon 0:9d301ae51ecf 307 // lcd.printf("CCT = %.2f ",MyCCT);
jolyon 0:9d301ae51ecf 308 // }
jolyon 0:9d301ae51ecf 309
jolyon 0:9d301ae51ecf 310 #define Mix
jolyon 0:9d301ae51ecf 311
jolyon 0:9d301ae51ecf 312 //guess the colour
jolyon 0:9d301ae51ecf 313
jolyon 0:9d301ae51ecf 314 //if((Green > 70) && (Red >70)) //looking at intensity somthing is on!
jolyon 0:9d301ae51ecf 315 if(White > 15) { //looking at intensity somthing is on!
jolyon 0:9d301ae51ecf 316 #ifndef Mix
jolyon 0:9d301ae51ecf 317 if((GreenProp <= 30) && (RedProp >=50)) { //pretty sure it's Yellow
jolyon 0:9d301ae51ecf 318 myYellow = 1;
jolyon 0:9d301ae51ecf 319 myGreen = 0;
jolyon 0:9d301ae51ecf 320 } else {
jolyon 0:9d301ae51ecf 321 myYellow = 0;
jolyon 0:9d301ae51ecf 322 if((GreenProp > 40) && (RedProp <=40)) { //pretty sure it's green
jolyon 0:9d301ae51ecf 323 myGreen = 1;
jolyon 0:9d301ae51ecf 324 } else {
jolyon 0:9d301ae51ecf 325 myGreen = 1;
jolyon 0:9d301ae51ecf 326 myYellow = 1;
jolyon 0:9d301ae51ecf 327 }
jolyon 0:9d301ae51ecf 328 }
jolyon 0:9d301ae51ecf 329 #else
jolyon 0:9d301ae51ecf 330 //as a single ratio
jolyon 0:9d301ae51ecf 331 if((RedProp - GreenProp) > 20) {
jolyon 0:9d301ae51ecf 332 //pretty sure it's Yellow
jolyon 0:9d301ae51ecf 333 YellowLed = 1;
jolyon 0:9d301ae51ecf 334 GreenLed = 0;
jolyon 0:9d301ae51ecf 335 } else {
jolyon 0:9d301ae51ecf 336 YellowLed = 0;
jolyon 0:9d301ae51ecf 337 if((GreenProp - RedProp) > 5) {
jolyon 0:9d301ae51ecf 338 //pretty sure it's green
jolyon 0:9d301ae51ecf 339 GreenLed = 1;
jolyon 0:9d301ae51ecf 340 } else {
jolyon 0:9d301ae51ecf 341 GreenLed = 1;
jolyon 0:9d301ae51ecf 342 YellowLed = 1;
jolyon 0:9d301ae51ecf 343 }
jolyon 0:9d301ae51ecf 344 }
jolyon 0:9d301ae51ecf 345 /*
jolyon 0:9d301ae51ecf 346 if(myMix >1600)
jolyon 0:9d301ae51ecf 347 {
jolyon 0:9d301ae51ecf 348 myGreen = 1;
jolyon 0:9d301ae51ecf 349 myYellow = 0;
jolyon 0:9d301ae51ecf 350 }
jolyon 0:9d301ae51ecf 351 else
jolyon 0:9d301ae51ecf 352 {
jolyon 0:9d301ae51ecf 353 if(myMix <1100)
jolyon 0:9d301ae51ecf 354 {
jolyon 0:9d301ae51ecf 355 myGreen = 0;
jolyon 0:9d301ae51ecf 356 myYellow = 1;
jolyon 0:9d301ae51ecf 357 }
jolyon 0:9d301ae51ecf 358 else
jolyon 0:9d301ae51ecf 359 {
jolyon 0:9d301ae51ecf 360 myGreen = 1;
jolyon 0:9d301ae51ecf 361 myYellow = 1;
jolyon 0:9d301ae51ecf 362 }
jolyon 0:9d301ae51ecf 363 }
jolyon 0:9d301ae51ecf 364 */
jolyon 0:9d301ae51ecf 365 #endif
jolyon 0:9d301ae51ecf 366
jolyon 0:9d301ae51ecf 367 } else {
jolyon 0:9d301ae51ecf 368 //not enough intensity to determine
jolyon 0:9d301ae51ecf 369 GreenLed = 0;
jolyon 0:9d301ae51ecf 370 YellowLed = 0;
jolyon 0:9d301ae51ecf 371 }
jolyon 0:9d301ae51ecf 372 }
jolyon 0:9d301ae51ecf 373 }
jolyon 0:9d301ae51ecf 374
jolyon 0:9d301ae51ecf 375
jolyon 0:9d301ae51ecf 376 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 377 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 378 //Code for the TCS34725 Part
jolyon 0:9d301ae51ecf 379 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 380 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 381
jolyon 0:9d301ae51ecf 382 //#include "mbed.h"
jolyon 0:9d301ae51ecf 383
jolyon 0:9d301ae51ecf 384 //I2C i2c(p9, p10); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 385 //Serial pc(USBTX, USBRX); //Used to view the colors that are read in
jolyon 0:9d301ae51ecf 386
jolyon 0:9d301ae51ecf 387 //int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 388
jolyon 0:9d301ae51ecf 389 //DigitalOut green(LED1);
jolyon 0:9d301ae51ecf 390 //DigitalOut led(p11);
jolyon 0:9d301ae51ecf 391
jolyon 0:9d301ae51ecf 392 int TCS3472main()
jolyon 0:9d301ae51ecf 393 {
jolyon 0:9d301ae51ecf 394 // pc.baud(9600);
jolyon 0:9d301ae51ecf 395 GreenLed = 1; // off
jolyon 0:9d301ae51ecf 396
jolyon 0:9d301ae51ecf 397 // Connect to the Color sensor and verify
jolyon 0:9d301ae51ecf 398
jolyon 0:9d301ae51ecf 399 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 400
jolyon 0:9d301ae51ecf 401 char id_regval[1] = {146};
jolyon 0:9d301ae51ecf 402 char data[1] = {0};
jolyon 0:9d301ae51ecf 403 i2c.write(sensor_addr,id_regval,1, true);
jolyon 0:9d301ae51ecf 404 i2c.read(sensor_addr,data,1,false);
jolyon 0:9d301ae51ecf 405
jolyon 0:9d301ae51ecf 406 if (data[0]==68) {
jolyon 0:9d301ae51ecf 407 GreenLed = 0;
jolyon 0:9d301ae51ecf 408 wait (2);
jolyon 0:9d301ae51ecf 409 GreenLed = 1;
jolyon 0:9d301ae51ecf 410 } else {
jolyon 0:9d301ae51ecf 411 GreenLed = 1;
jolyon 0:9d301ae51ecf 412 }
jolyon 0:9d301ae51ecf 413
jolyon 0:9d301ae51ecf 414 // Initialize color sensor
jolyon 0:9d301ae51ecf 415
jolyon 0:9d301ae51ecf 416 char timing_register[2] = {129,0};
jolyon 0:9d301ae51ecf 417 i2c.write(sensor_addr,timing_register,2,false);
jolyon 0:9d301ae51ecf 418
jolyon 0:9d301ae51ecf 419 char control_register[2] = {143,0};
jolyon 0:9d301ae51ecf 420 i2c.write(sensor_addr,control_register,2,false);
jolyon 0:9d301ae51ecf 421
jolyon 0:9d301ae51ecf 422 char enable_register[2] = {128,3};
jolyon 0:9d301ae51ecf 423 i2c.write(sensor_addr,enable_register,2,false);
jolyon 0:9d301ae51ecf 424
jolyon 0:9d301ae51ecf 425 // Read data from color sensor (Clear/Red/Green/Blue)
jolyon 0:9d301ae51ecf 426 // led = 1;
jolyon 0:9d301ae51ecf 427 while (true) {
jolyon 0:9d301ae51ecf 428 char clear_reg[1] = {148};
jolyon 0:9d301ae51ecf 429 char clear_data[2] = {0,0};
jolyon 0:9d301ae51ecf 430 i2c.write(sensor_addr,clear_reg,1, true);
jolyon 0:9d301ae51ecf 431 i2c.read(sensor_addr,clear_data,2, false);
jolyon 0:9d301ae51ecf 432
jolyon 0:9d301ae51ecf 433 int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
jolyon 0:9d301ae51ecf 434
jolyon 0:9d301ae51ecf 435 char red_reg[1] = {150};
jolyon 0:9d301ae51ecf 436 char red_data[2] = {0,0};
jolyon 0:9d301ae51ecf 437 i2c.write(sensor_addr,red_reg,1, true);
jolyon 0:9d301ae51ecf 438 i2c.read(sensor_addr,red_data,2, false);
jolyon 0:9d301ae51ecf 439
jolyon 0:9d301ae51ecf 440 int red_value = ((int)red_data[1] << 8) | red_data[0];
jolyon 0:9d301ae51ecf 441
jolyon 0:9d301ae51ecf 442 char green_reg[1] = {152};
jolyon 0:9d301ae51ecf 443 char green_data[2] = {0,0};
jolyon 0:9d301ae51ecf 444 i2c.write(sensor_addr,green_reg,1, true);
jolyon 0:9d301ae51ecf 445 i2c.read(sensor_addr,green_data,2, false);
jolyon 0:9d301ae51ecf 446
jolyon 0:9d301ae51ecf 447 int green_value = ((int)green_data[1] << 8) | green_data[0];
jolyon 0:9d301ae51ecf 448
jolyon 0:9d301ae51ecf 449 char blue_reg[1] = {154};
jolyon 0:9d301ae51ecf 450 char blue_data[2] = {0,0};
jolyon 0:9d301ae51ecf 451 i2c.write(sensor_addr,blue_reg,1, true);
jolyon 0:9d301ae51ecf 452 i2c.read(sensor_addr,blue_data,2, false);
jolyon 0:9d301ae51ecf 453
jolyon 0:9d301ae51ecf 454 int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
jolyon 0:9d301ae51ecf 455
jolyon 0:9d301ae51ecf 456 // print sensor readings
jolyon 0:9d301ae51ecf 457
jolyon 0:9d301ae51ecf 458 // pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n", clear_value, red_value, green_value, blue_value);
jolyon 0:9d301ae51ecf 459 //The above code displays the red, green, and blue values read in by the color sensor.
jolyon 0:9d301ae51ecf 460 wait(0.5);
jolyon 0:9d301ae51ecf 461 }
jolyon 0:9d301ae51ecf 462
jolyon 0:9d301ae51ecf 463 }
jolyon 0:9d301ae51ecf 464
jolyon 0:9d301ae51ecf 465
jolyon 0:9d301ae51ecf 466
jolyon 0:9d301ae51ecf 467 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 468 //---------------------------------------------------------------------------------------------