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 16:01:36 2016 +0000
Revision:
1:d99dad8a1f50
Parent:
0:9d301ae51ecf
Child:
2:4a8eacbb3657
End of day working

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