Jolyon Hill / ColourSensor

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Tue Aug 16 15:00:22 2016 +0000
Revision:
4:dce5fc58abe9
Parent:
3:b8218b61b0e2
Child:
5:dc77c5967412
Initial working build

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 2:4a8eacbb3657 3 #include "MCP23S17.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 3:b8218b61b0e2 13 #define WHITE_THRESHOLD 15
jolyon 3:b8218b61b0e2 14
jolyon 3:b8218b61b0e2 15 //--------------------------------------
jolyon 3:b8218b61b0e2 16 //each LED type is defined here
jolyon 3:b8218b61b0e2 17 #define NOTUSED 0
jolyon 3:b8218b61b0e2 18 #define STD_RED 1
jolyon 3:b8218b61b0e2 19 #define STD_GREEN 2
jolyon 3:b8218b61b0e2 20 #define STD_BLUE 3
jolyon 3:b8218b61b0e2 21 #define STD_YELLOW 4
jolyon 3:b8218b61b0e2 22 #define GREEN_YELLOW 5
jolyon 3:b8218b61b0e2 23 #define RGB 6
jolyon 3:b8218b61b0e2 24
jolyon 3:b8218b61b0e2 25
jolyon 3:b8218b61b0e2 26 //--------------------------------------
jolyon 3:b8218b61b0e2 27 //Current LED Colour Definitions
jolyon 3:b8218b61b0e2 28 #define ERROR 0 //off or wrong
jolyon 3:b8218b61b0e2 29 #define RED 1
jolyon 3:b8218b61b0e2 30 #define GREEN 2
jolyon 3:b8218b61b0e2 31 #define BLUE 3
jolyon 3:b8218b61b0e2 32 #define YELLOW 4
jolyon 3:b8218b61b0e2 33
jolyon 3:b8218b61b0e2 34
jolyon 3:b8218b61b0e2 35
jolyon 3:b8218b61b0e2 36 //--------------------------------------
jolyon 1:d99dad8a1f50 37
jolyon 1:d99dad8a1f50 38
jolyon 1:d99dad8a1f50 39
jolyon 0:9d301ae51ecf 40
jolyon 0:9d301ae51ecf 41 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 42 //----------- LED's -------------------------------------------------------------
jolyon 0:9d301ae51ecf 43 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 44 // Detection LED's use the onboard MBED LED's
jolyon 0:9d301ae51ecf 45 // These are all blue on the MBED but on DSE PCB they areas follows
jolyon 0:9d301ae51ecf 46 // LED1 = GREEN
jolyon 0:9d301ae51ecf 47 // LED2 = BLUE
jolyon 0:9d301ae51ecf 48 // LED3 = RED
jolyon 0:9d301ae51ecf 49 // LED4 = YELLOW
jolyon 0:9d301ae51ecf 50 DigitalOut GreenLed(LED1);
jolyon 0:9d301ae51ecf 51 DigitalOut BlueLed(LED2);
jolyon 0:9d301ae51ecf 52 DigitalOut RedLed(LED3);
jolyon 0:9d301ae51ecf 53 DigitalOut YellowLed(LED4);
jolyon 0:9d301ae51ecf 54
jolyon 0:9d301ae51ecf 55 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 56
jolyon 0:9d301ae51ecf 57 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 58 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 59 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 60 //Analogue inputs are used to set thresholds for detector levels
jolyon 2:4a8eacbb3657 61 //AnalogIn RedTrimmer(p15);
jolyon 2:4a8eacbb3657 62 //AnalogIn GreenTrimmer(p16);
jolyon 2:4a8eacbb3657 63 //AnalogIn BlueTrimmer(p17);
jolyon 2:4a8eacbb3657 64 //AnalogIn HysTrimmer(p18);
jolyon 0:9d301ae51ecf 65 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 66
jolyon 0:9d301ae51ecf 67 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 68 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 69 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 70 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 71 //final version uses I2C port
jolyon 0:9d301ae51ecf 72 TextLCD lcd(p14, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 73
jolyon 0:9d301ae51ecf 74 //set up I2C Communication to LCD
jolyon 0:9d301ae51ecf 75 //I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 76
jolyon 0:9d301ae51ecf 77 //I2C Portexpander PCF8574 for LCD
jolyon 0:9d301ae51ecf 78 //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 79
jolyon 0:9d301ae51ecf 80 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 81
jolyon 2:4a8eacbb3657 82 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 83 //------------ Create SPI bus -----------------------------------------------------
jolyon 2:4a8eacbb3657 84 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 85 //set up the SPI port for use as output driver
jolyon 2:4a8eacbb3657 86 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 87
jolyon 2:4a8eacbb3657 88 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 89
jolyon 2:4a8eacbb3657 90 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 91 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 92 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 93
jolyon 2:4a8eacbb3657 94 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 95
jolyon 0:9d301ae51ecf 96 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 97 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 98 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 99 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 100 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 101
jolyon 0:9d301ae51ecf 102
jolyon 0:9d301ae51ecf 103 typedef struct{
jolyon 0:9d301ae51ecf 104 uint16_t White;
jolyon 0:9d301ae51ecf 105 uint16_t Red;
jolyon 0:9d301ae51ecf 106 uint16_t Green;
jolyon 0:9d301ae51ecf 107 uint16_t Blue;
jolyon 0:9d301ae51ecf 108 }Colour;
jolyon 0:9d301ae51ecf 109
jolyon 0:9d301ae51ecf 110 Colour SensorData;
jolyon 0:9d301ae51ecf 111
jolyon 0:9d301ae51ecf 112 //-------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 113 //The system looks up the type of LED that is being detected for Each sensor and will fill in the result table & update the associated Output list
jolyon 3:b8218b61b0e2 114 //outputs start at 0 torough to 15
jolyon 3:b8218b61b0e2 115
jolyon 4:dce5fc58abe9 116 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 4:dce5fc58abe9 117 GREEN_YELLOW, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 4:dce5fc58abe9 118 NOTUSED, 2, //sensor 1
jolyon 4:dce5fc58abe9 119 NOTUSED, 3, //sensor 2
jolyon 4:dce5fc58abe9 120 NOTUSED, 4, //sensor 3
jolyon 4:dce5fc58abe9 121 NOTUSED, 5, //sensor 4
jolyon 4:dce5fc58abe9 122 NOTUSED, 6, //sensor 5
jolyon 4:dce5fc58abe9 123 NOTUSED, 7, //sensor 6
jolyon 4:dce5fc58abe9 124 RGB, 8, //sensor 7
jolyon 4:dce5fc58abe9 125 NOTUSED, 11, //sensor 8
jolyon 4:dce5fc58abe9 126 NOTUSED, 12, //sensor 9
jolyon 4:dce5fc58abe9 127 NOTUSED, 13, //sensor 10
jolyon 4:dce5fc58abe9 128 NOTUSED, 14, //sensor 11
jolyon 4:dce5fc58abe9 129 NOTUSED, 15, //sensor 12
jolyon 4:dce5fc58abe9 130 NOTUSED, 15, //sensor 13
jolyon 4:dce5fc58abe9 131 NOTUSED, 15, //sensor 14
jolyon 4:dce5fc58abe9 132 NOTUSED, 15, //sensor 15
jolyon 3:b8218b61b0e2 133 };
jolyon 3:b8218b61b0e2 134
jolyon 3:b8218b61b0e2 135 char LEDState[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //current detected LED states
jolyon 3:b8218b61b0e2 136
jolyon 3:b8218b61b0e2 137 uint16_t OutputData = 0; //word containing the current output states of the board
jolyon 3:b8218b61b0e2 138
jolyon 3:b8218b61b0e2 139 uint8_t SensorNumber = 0; //current sensor number
jolyon 3:b8218b61b0e2 140 char SensorResult = 0; //detected colour
jolyon 3:b8218b61b0e2 141
jolyon 0:9d301ae51ecf 142
jolyon 0:9d301ae51ecf 143 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 144 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 145
jolyon 0:9d301ae51ecf 146 char TempReg[1] = {0};
jolyon 0:9d301ae51ecf 147 char TempData[2] = {0,0};
jolyon 0:9d301ae51ecf 148
jolyon 0:9d301ae51ecf 149
jolyon 0:9d301ae51ecf 150 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 151
jolyon 0:9d301ae51ecf 152 uint16_t Red = 1;
jolyon 0:9d301ae51ecf 153 uint16_t Green = 2;
jolyon 0:9d301ae51ecf 154 uint16_t Blue = 3;
jolyon 0:9d301ae51ecf 155 uint16_t White = 4;
jolyon 1:d99dad8a1f50 156 uint16_t Yellow = 0;
jolyon 0:9d301ae51ecf 157
jolyon 0:9d301ae51ecf 158 uint32_t AvgRed = 0;
jolyon 0:9d301ae51ecf 159 uint32_t AvgGreen = 0;
jolyon 0:9d301ae51ecf 160 uint32_t AvgBlue = 0;
jolyon 0:9d301ae51ecf 161 uint32_t AvgWhite = 0;
jolyon 0:9d301ae51ecf 162 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 163 uint32_t TempR = 0;
jolyon 0:9d301ae51ecf 164 uint32_t TempG = 0;
jolyon 0:9d301ae51ecf 165 uint32_t TempB = 0;
jolyon 0:9d301ae51ecf 166
jolyon 0:9d301ae51ecf 167
jolyon 0:9d301ae51ecf 168 uint16_t RedProp = 0;
jolyon 0:9d301ae51ecf 169 uint16_t GreenProp = 0;
jolyon 0:9d301ae51ecf 170 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 171
jolyon 0:9d301ae51ecf 172 uint16_t myMix = 0;
jolyon 0:9d301ae51ecf 173
jolyon 0:9d301ae51ecf 174 float MyCCT;
jolyon 0:9d301ae51ecf 175 float MyCCTi;
jolyon 0:9d301ae51ecf 176 uint8_t DisplayIndex = 0;
jolyon 0:9d301ae51ecf 177
jolyon 3:b8218b61b0e2 178 uint8_t SensorConfig = 0x30;
jolyon 0:9d301ae51ecf 179 // bit description setting
jolyon 0:9d301ae51ecf 180 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 181 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 182 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 183 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 184 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 185 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 186 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 187 // 7 N/F 0 0
jolyon 0:9d301ae51ecf 188
jolyon 0:9d301ae51ecf 189
jolyon 2:4a8eacbb3657 190 uint16_t MyPort = 1;
jolyon 2:4a8eacbb3657 191
jolyon 2:4a8eacbb3657 192 //working thresholds from pot inputs, scaled 0-100
jolyon 2:4a8eacbb3657 193 uint16_t RedThreshold = 0;
jolyon 2:4a8eacbb3657 194 uint16_t GreenThreshold = 0;
jolyon 2:4a8eacbb3657 195 uint16_t BlueThreshold = 0;
jolyon 2:4a8eacbb3657 196 uint16_t Hysteresis = 0;
jolyon 2:4a8eacbb3657 197
jolyon 2:4a8eacbb3657 198
jolyon 0:9d301ae51ecf 199 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 200 {
jolyon 0:9d301ae51ecf 201 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 202 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 203 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 204 *Acc = Temp;
jolyon 0:9d301ae51ecf 205 return *Acc >> factor;
jolyon 0:9d301ae51ecf 206 }
jolyon 0:9d301ae51ecf 207
jolyon 0:9d301ae51ecf 208
jolyon 0:9d301ae51ecf 209 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 210 {
jolyon 0:9d301ae51ecf 211 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 212 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 213
jolyon 0:9d301ae51ecf 214
jolyon 0:9d301ae51ecf 215
jolyon 0:9d301ae51ecf 216 char id_regval[1] = {146};
jolyon 0:9d301ae51ecf 217 char data[1] = {0};
jolyon 0:9d301ae51ecf 218 i2c.write(sensor_addr,id_regval,1, true);
jolyon 0:9d301ae51ecf 219 i2c.read(sensor_addr,data,1,false);
jolyon 0:9d301ae51ecf 220
jolyon 0:9d301ae51ecf 221 if (data[0]==68) {
jolyon 0:9d301ae51ecf 222 GreenLed = 0;
jolyon 0:9d301ae51ecf 223 wait (2);
jolyon 0:9d301ae51ecf 224 GreenLed = 1;
jolyon 0:9d301ae51ecf 225 } else {
jolyon 0:9d301ae51ecf 226 GreenLed = 1;
jolyon 0:9d301ae51ecf 227 }
jolyon 0:9d301ae51ecf 228
jolyon 0:9d301ae51ecf 229 // Initialize color sensor
jolyon 0:9d301ae51ecf 230
jolyon 0:9d301ae51ecf 231 char enable_register[2] = {128,3}; //enable the sensor
jolyon 0:9d301ae51ecf 232 i2c.write(sensor_addr,enable_register,2,false);
jolyon 0:9d301ae51ecf 233
jolyon 0:9d301ae51ecf 234 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 0:9d301ae51ecf 235 i2c.write(sensor_addr,timing_register,2,false);
jolyon 0:9d301ae51ecf 236
jolyon 0:9d301ae51ecf 237 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 0:9d301ae51ecf 238 i2c.write(sensor_addr,control_register,2,false);
jolyon 0:9d301ae51ecf 239
jolyon 0:9d301ae51ecf 240
jolyon 0:9d301ae51ecf 241
jolyon 0:9d301ae51ecf 242 // Read data from color sensor (Clear/Red/Green/Blue)
jolyon 0:9d301ae51ecf 243 //led = 1;
jolyon 0:9d301ae51ecf 244
jolyon 0:9d301ae51ecf 245 }
jolyon 0:9d301ae51ecf 246
jolyon 1:d99dad8a1f50 247 Colour GetSensorData(char SensorNumber)
jolyon 1:d99dad8a1f50 248 {
jolyon 1:d99dad8a1f50 249 Colour NewData;
jolyon 1:d99dad8a1f50 250 char AddrReg[1] = {0};
jolyon 1:d99dad8a1f50 251 char DataReg[5] ={0,0,0,0,0};
jolyon 1:d99dad8a1f50 252
jolyon 1:d99dad8a1f50 253 NewData.White = 0;
jolyon 1:d99dad8a1f50 254 NewData.Red = 0;
jolyon 1:d99dad8a1f50 255 NewData.Green = 0;
jolyon 1:d99dad8a1f50 256 NewData.Blue = 0;
jolyon 1:d99dad8a1f50 257
jolyon 1:d99dad8a1f50 258 AddrReg[0] = SENSOR_WHITE_REG;
jolyon 1:d99dad8a1f50 259 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 260 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 261 NewData.White = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 262
jolyon 1:d99dad8a1f50 263 AddrReg[0] = SENSOR_RED_REG;
jolyon 1:d99dad8a1f50 264 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 265 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 266 NewData.Red = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 267
jolyon 1:d99dad8a1f50 268 AddrReg[0] = SENSOR_GREEN_REG;
jolyon 1:d99dad8a1f50 269 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 270 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 271 NewData.Green = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 272
jolyon 1:d99dad8a1f50 273 AddrReg[0] = SENSOR_BLUE_REG;
jolyon 1:d99dad8a1f50 274 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 275 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 276 NewData.Blue = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 277
jolyon 1:d99dad8a1f50 278 return NewData;
jolyon 1:d99dad8a1f50 279 }
jolyon 1:d99dad8a1f50 280
jolyon 2:4a8eacbb3657 281 void InitOutputs(void)
jolyon 2:4a8eacbb3657 282 {
jolyon 2:4a8eacbb3657 283 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 284 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 285 // Set all 8 Port B bits to output direction
jolyon 2:4a8eacbb3657 286 chip.direction(PORT_B, 0x00);
jolyon 2:4a8eacbb3657 287 }
jolyon 0:9d301ae51ecf 288
jolyon 2:4a8eacbb3657 289 void SetOutputBit(char bit)
jolyon 2:4a8eacbb3657 290 {
jolyon 2:4a8eacbb3657 291 uint16_t OutputWord = 1;
jolyon 2:4a8eacbb3657 292 char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 293
jolyon 2:4a8eacbb3657 294 OutputWord <<= bit;
jolyon 4:dce5fc58abe9 295 OutputData |= OutputWord;
jolyon 4:dce5fc58abe9 296
jolyon 4:dce5fc58abe9 297 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 298 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 299
jolyon 4:dce5fc58abe9 300 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 301 //PortA |=BitA;
jolyon 4:dce5fc58abe9 302 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 303
jolyon 4:dce5fc58abe9 304 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 305 //PortB |=BitB;
jolyon 4:dce5fc58abe9 306 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 307 }
jolyon 2:4a8eacbb3657 308
jolyon 2:4a8eacbb3657 309 void ClearOutputBit(char bit)
jolyon 2:4a8eacbb3657 310 {
jolyon 2:4a8eacbb3657 311 uint16_t OutputWord = 1;
jolyon 2:4a8eacbb3657 312 char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 313
jolyon 2:4a8eacbb3657 314 OutputWord <<= bit;
jolyon 2:4a8eacbb3657 315 OutputWord = ~OutputWord;
jolyon 4:dce5fc58abe9 316 OutputWord &= OutputWord;
jolyon 2:4a8eacbb3657 317
jolyon 4:dce5fc58abe9 318 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 319 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 320
jolyon 4:dce5fc58abe9 321 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 322 //PortA &=BitA;
jolyon 4:dce5fc58abe9 323 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 324
jolyon 4:dce5fc58abe9 325 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 326 //PortB &=BitB;
jolyon 4:dce5fc58abe9 327 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 328 }
jolyon 2:4a8eacbb3657 329
jolyon 2:4a8eacbb3657 330 void WriteOutputPort(uint16_t FullPort)
jolyon 2:4a8eacbb3657 331 {
jolyon 2:4a8eacbb3657 332 chip.write(PORT_A, FullPort & 0xFF);
jolyon 2:4a8eacbb3657 333 chip.write(PORT_B, FullPort >> 8);
jolyon 2:4a8eacbb3657 334 }
jolyon 2:4a8eacbb3657 335
jolyon 2:4a8eacbb3657 336
jolyon 2:4a8eacbb3657 337 void GetThresholds(void)
jolyon 2:4a8eacbb3657 338 {
jolyon 2:4a8eacbb3657 339 //Load the pot values ant make 0 to 100% value
jolyon 2:4a8eacbb3657 340 /*
jolyon 2:4a8eacbb3657 341 RedThreshold = RedTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 342 GreenThreshold = GreenTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 343 BlueThreshold = BlueTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 344 Hysteresis = HysTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 345 */
jolyon 2:4a8eacbb3657 346
jolyon 2:4a8eacbb3657 347 RedThreshold = 45;
jolyon 2:4a8eacbb3657 348 GreenThreshold = 35;
jolyon 2:4a8eacbb3657 349 BlueThreshold = 10;
jolyon 2:4a8eacbb3657 350 Hysteresis = 5;
jolyon 2:4a8eacbb3657 351 }
jolyon 0:9d301ae51ecf 352
jolyon 3:b8218b61b0e2 353
jolyon 3:b8218b61b0e2 354 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 355 {
jolyon 3:b8218b61b0e2 356 //make 12 bit only (display)
jolyon 3:b8218b61b0e2 357 Red >>=4;
jolyon 3:b8218b61b0e2 358 Green >>=4;
jolyon 3:b8218b61b0e2 359 Blue >>=4;
jolyon 3:b8218b61b0e2 360 White >>=4;
jolyon 3:b8218b61b0e2 361
jolyon 3:b8218b61b0e2 362 lcd.locate(0, 0);
jolyon 3:b8218b61b0e2 363 lcd.printf("R%02i G%02i B%02i W%04i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 364 lcd.locate(0, 1);
jolyon 3:b8218b61b0e2 365 lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 3:b8218b61b0e2 366 }
jolyon 3:b8218b61b0e2 367
jolyon 3:b8218b61b0e2 368
jolyon 3:b8218b61b0e2 369 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 370 {
jolyon 3:b8218b61b0e2 371 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 372
jolyon 3:b8218b61b0e2 373 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 374 {
jolyon 3:b8218b61b0e2 375 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 376 {
jolyon 3:b8218b61b0e2 377 case STD_RED:
jolyon 3:b8218b61b0e2 378 {
jolyon 3:b8218b61b0e2 379 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 380 {
jolyon 3:b8218b61b0e2 381 LEDColour = RED;
jolyon 3:b8218b61b0e2 382 }
jolyon 3:b8218b61b0e2 383 }
jolyon 3:b8218b61b0e2 384 break;
jolyon 3:b8218b61b0e2 385
jolyon 3:b8218b61b0e2 386 case STD_GREEN:
jolyon 3:b8218b61b0e2 387 {
jolyon 3:b8218b61b0e2 388 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 389 {
jolyon 3:b8218b61b0e2 390 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 391 }
jolyon 3:b8218b61b0e2 392 }
jolyon 3:b8218b61b0e2 393 break;
jolyon 3:b8218b61b0e2 394
jolyon 3:b8218b61b0e2 395 case STD_BLUE:
jolyon 3:b8218b61b0e2 396 {
jolyon 3:b8218b61b0e2 397 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 398 {
jolyon 3:b8218b61b0e2 399 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 400 }
jolyon 3:b8218b61b0e2 401 }
jolyon 3:b8218b61b0e2 402 break;
jolyon 3:b8218b61b0e2 403
jolyon 3:b8218b61b0e2 404 case STD_YELLOW:
jolyon 3:b8218b61b0e2 405 {
jolyon 3:b8218b61b0e2 406 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 407 {
jolyon 3:b8218b61b0e2 408 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 409 }
jolyon 3:b8218b61b0e2 410 }
jolyon 3:b8218b61b0e2 411 break;
jolyon 3:b8218b61b0e2 412
jolyon 3:b8218b61b0e2 413 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 414 {
jolyon 3:b8218b61b0e2 415 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 416 { //pretty sure it's Yellow
jolyon 3:b8218b61b0e2 417
jolyon 3:b8218b61b0e2 418 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 419 }
jolyon 3:b8218b61b0e2 420 else
jolyon 3:b8218b61b0e2 421 {
jolyon 3:b8218b61b0e2 422 if( (GreenProp > (GreenThreshold+Hysteresis)) && (RedProp <=(RedThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 423 { //pretty sure it's green
jolyon 3:b8218b61b0e2 424 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 425 }
jolyon 3:b8218b61b0e2 426 }
jolyon 3:b8218b61b0e2 427 }
jolyon 3:b8218b61b0e2 428 break;
jolyon 3:b8218b61b0e2 429
jolyon 3:b8218b61b0e2 430 case RGB:
jolyon 3:b8218b61b0e2 431 {
jolyon 3:b8218b61b0e2 432 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 433 {
jolyon 3:b8218b61b0e2 434 LEDColour = RED;
jolyon 3:b8218b61b0e2 435 }
jolyon 3:b8218b61b0e2 436 else
jolyon 3:b8218b61b0e2 437 {
jolyon 3:b8218b61b0e2 438 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 439 {
jolyon 3:b8218b61b0e2 440 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 441 }
jolyon 3:b8218b61b0e2 442 else
jolyon 3:b8218b61b0e2 443 {
jolyon 3:b8218b61b0e2 444 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 445 {
jolyon 3:b8218b61b0e2 446 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 447 }
jolyon 3:b8218b61b0e2 448 }
jolyon 3:b8218b61b0e2 449 }
jolyon 3:b8218b61b0e2 450 }
jolyon 3:b8218b61b0e2 451 break;
jolyon 3:b8218b61b0e2 452
jolyon 3:b8218b61b0e2 453 case NOTUSED:
jolyon 3:b8218b61b0e2 454 default:
jolyon 3:b8218b61b0e2 455 {
jolyon 3:b8218b61b0e2 456 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 457 }
jolyon 3:b8218b61b0e2 458 break;
jolyon 3:b8218b61b0e2 459 }
jolyon 3:b8218b61b0e2 460 }
jolyon 3:b8218b61b0e2 461 return LEDColour;
jolyon 3:b8218b61b0e2 462 }
jolyon 3:b8218b61b0e2 463
jolyon 3:b8218b61b0e2 464
jolyon 4:dce5fc58abe9 465 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 466 {
jolyon 4:dce5fc58abe9 467 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 468 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 469 {
jolyon 4:dce5fc58abe9 470 case STD_RED:
jolyon 4:dce5fc58abe9 471 case STD_GREEN:
jolyon 4:dce5fc58abe9 472 case STD_BLUE:
jolyon 4:dce5fc58abe9 473 case STD_YELLOW:
jolyon 4:dce5fc58abe9 474 {
jolyon 4:dce5fc58abe9 475 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 476 {
jolyon 4:dce5fc58abe9 477 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 478 }
jolyon 4:dce5fc58abe9 479 else
jolyon 4:dce5fc58abe9 480 {
jolyon 4:dce5fc58abe9 481 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 482 }
jolyon 4:dce5fc58abe9 483 }
jolyon 4:dce5fc58abe9 484 break;
jolyon 4:dce5fc58abe9 485
jolyon 4:dce5fc58abe9 486 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 487 {
jolyon 4:dce5fc58abe9 488 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 489 {
jolyon 4:dce5fc58abe9 490 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 491 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 492 }
jolyon 4:dce5fc58abe9 493 else
jolyon 4:dce5fc58abe9 494 {
jolyon 4:dce5fc58abe9 495 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 496 {
jolyon 4:dce5fc58abe9 497 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 498 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 499 }
jolyon 4:dce5fc58abe9 500 else
jolyon 4:dce5fc58abe9 501 {
jolyon 4:dce5fc58abe9 502 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 503 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 504 }
jolyon 4:dce5fc58abe9 505 }
jolyon 4:dce5fc58abe9 506 }
jolyon 4:dce5fc58abe9 507 break;
jolyon 4:dce5fc58abe9 508
jolyon 4:dce5fc58abe9 509 case RGB:
jolyon 4:dce5fc58abe9 510 {
jolyon 4:dce5fc58abe9 511 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 512 {
jolyon 4:dce5fc58abe9 513 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 514 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 515 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 516 }
jolyon 4:dce5fc58abe9 517 else
jolyon 4:dce5fc58abe9 518 {
jolyon 4:dce5fc58abe9 519 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 520 {
jolyon 4:dce5fc58abe9 521 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 522 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 523 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 524 }
jolyon 4:dce5fc58abe9 525 else
jolyon 4:dce5fc58abe9 526 {
jolyon 4:dce5fc58abe9 527 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 528 {
jolyon 4:dce5fc58abe9 529 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 530 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 531 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 532 }
jolyon 4:dce5fc58abe9 533 else
jolyon 4:dce5fc58abe9 534 {
jolyon 4:dce5fc58abe9 535 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 536 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 537 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 538 }
jolyon 4:dce5fc58abe9 539
jolyon 4:dce5fc58abe9 540 }
jolyon 4:dce5fc58abe9 541 }
jolyon 4:dce5fc58abe9 542 }
jolyon 4:dce5fc58abe9 543 break;
jolyon 4:dce5fc58abe9 544
jolyon 4:dce5fc58abe9 545 default:
jolyon 4:dce5fc58abe9 546 {
jolyon 4:dce5fc58abe9 547 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 548 }
jolyon 4:dce5fc58abe9 549 break;
jolyon 4:dce5fc58abe9 550 } //end switch
jolyon 4:dce5fc58abe9 551 }
jolyon 4:dce5fc58abe9 552
jolyon 4:dce5fc58abe9 553 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 554 {
jolyon 4:dce5fc58abe9 555 RedLed = 0;
jolyon 4:dce5fc58abe9 556 GreenLed = 0;
jolyon 4:dce5fc58abe9 557 BlueLed = 0;
jolyon 4:dce5fc58abe9 558 YellowLed = 0;
jolyon 4:dce5fc58abe9 559 switch (WhichColour)
jolyon 4:dce5fc58abe9 560 {
jolyon 4:dce5fc58abe9 561 case RED:
jolyon 4:dce5fc58abe9 562 {
jolyon 4:dce5fc58abe9 563 RedLed = 1;
jolyon 4:dce5fc58abe9 564 }
jolyon 4:dce5fc58abe9 565 break;
jolyon 4:dce5fc58abe9 566
jolyon 4:dce5fc58abe9 567 case GREEN:
jolyon 4:dce5fc58abe9 568 {
jolyon 4:dce5fc58abe9 569 GreenLed = 1;
jolyon 4:dce5fc58abe9 570 }
jolyon 4:dce5fc58abe9 571 break;
jolyon 4:dce5fc58abe9 572
jolyon 4:dce5fc58abe9 573 case BLUE:
jolyon 4:dce5fc58abe9 574 {
jolyon 4:dce5fc58abe9 575 BlueLed = 1;
jolyon 4:dce5fc58abe9 576 }
jolyon 4:dce5fc58abe9 577 break;
jolyon 4:dce5fc58abe9 578
jolyon 4:dce5fc58abe9 579 case YELLOW:
jolyon 4:dce5fc58abe9 580 {
jolyon 4:dce5fc58abe9 581 YellowLed = 1;
jolyon 4:dce5fc58abe9 582 }
jolyon 4:dce5fc58abe9 583 break;
jolyon 4:dce5fc58abe9 584
jolyon 4:dce5fc58abe9 585 default:
jolyon 4:dce5fc58abe9 586 {
jolyon 4:dce5fc58abe9 587 }
jolyon 4:dce5fc58abe9 588 break;
jolyon 4:dce5fc58abe9 589 }
jolyon 4:dce5fc58abe9 590 }
jolyon 4:dce5fc58abe9 591
jolyon 4:dce5fc58abe9 592
jolyon 3:b8218b61b0e2 593
jolyon 0:9d301ae51ecf 594 int main()
jolyon 0:9d301ae51ecf 595 {
jolyon 2:4a8eacbb3657 596 InitOutputs();
jolyon 1:d99dad8a1f50 597 //----------------------Initialise My TCS3472--------------------
jolyon 0:9d301ae51ecf 598 ConfigureTSC(0);
jolyon 1:d99dad8a1f50 599 //---------------------- My TCS3472 --------------------
jolyon 0:9d301ae51ecf 600
jolyon 1:d99dad8a1f50 601 while(1)
jolyon 1:d99dad8a1f50 602 {
jolyon 2:4a8eacbb3657 603
jolyon 2:4a8eacbb3657 604 //WriteOutputPort(MyPort);
jolyon 4:dce5fc58abe9 605 /*
jolyon 2:4a8eacbb3657 606 ClearOutputBit(MyPort);
jolyon 2:4a8eacbb3657 607 MyPort++;
jolyon 2:4a8eacbb3657 608 if (MyPort == 16)
jolyon 2:4a8eacbb3657 609 {
jolyon 2:4a8eacbb3657 610 MyPort = 0;
jolyon 2:4a8eacbb3657 611 }
jolyon 2:4a8eacbb3657 612 SetOutputBit(MyPort);
jolyon 4:dce5fc58abe9 613 */
jolyon 2:4a8eacbb3657 614 GetThresholds();
jolyon 0:9d301ae51ecf 615
jolyon 0:9d301ae51ecf 616 DisplayIndex++;
jolyon 4:dce5fc58abe9 617 if(DisplayIndex >= 20)
jolyon 4:dce5fc58abe9 618 {
jolyon 0:9d301ae51ecf 619 DisplayIndex = 0;
jolyon 0:9d301ae51ecf 620 }
jolyon 2:4a8eacbb3657 621
jolyon 0:9d301ae51ecf 622 wait(0.1);
jolyon 4:dce5fc58abe9 623 OutputData = 0;
jolyon 2:4a8eacbb3657 624
jolyon 0:9d301ae51ecf 625 //----------------------My TCS3472--------------------
jolyon 0:9d301ae51ecf 626
jolyon 0:9d301ae51ecf 627
jolyon 3:b8218b61b0e2 628 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 629 {
jolyon 4:dce5fc58abe9 630 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 631 {
jolyon 3:b8218b61b0e2 632 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 633
jolyon 3:b8218b61b0e2 634 White = SensorData.White;
jolyon 3:b8218b61b0e2 635 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 636 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 637 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 638
jolyon 3:b8218b61b0e2 639 UpdateDisplay();
jolyon 3:b8218b61b0e2 640
jolyon 3:b8218b61b0e2 641 // work out % of colour mix
jolyon 3:b8218b61b0e2 642 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 643 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 644 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 645 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 646
jolyon 3:b8218b61b0e2 647
jolyon 3:b8218b61b0e2 648 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 649 UpdateOutputs();
jolyon 4:dce5fc58abe9 650 ShowLeds(SensorResult);
jolyon 3:b8218b61b0e2 651 } //end if
jolyon 3:b8218b61b0e2 652 } //end for
jolyon 4:dce5fc58abe9 653 WriteOutputPort(OutputData);
jolyon 0:9d301ae51ecf 654
jolyon 1:d99dad8a1f50 655
jolyon 1:d99dad8a1f50 656
jolyon 4:dce5fc58abe9 657 /*
jolyon 0:9d301ae51ecf 658 //guess the colour
jolyon 3:b8218b61b0e2 659 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 2:4a8eacbb3657 660 {
jolyon 2:4a8eacbb3657 661 if((GreenProp <= 30) && (RedProp >=50))
jolyon 2:4a8eacbb3657 662 { //pretty sure it's Yellow
jolyon 0:9d301ae51ecf 663 YellowLed = 1;
jolyon 0:9d301ae51ecf 664 GreenLed = 0;
jolyon 2:4a8eacbb3657 665 }
jolyon 2:4a8eacbb3657 666 else
jolyon 2:4a8eacbb3657 667 {
jolyon 0:9d301ae51ecf 668 YellowLed = 0;
jolyon 2:4a8eacbb3657 669 if((GreenProp > 40) && (RedProp <=40)) { //pretty sure it's green
jolyon 0:9d301ae51ecf 670 GreenLed = 1;
jolyon 0:9d301ae51ecf 671 } else {
jolyon 0:9d301ae51ecf 672 GreenLed = 1;
jolyon 0:9d301ae51ecf 673 YellowLed = 1;
jolyon 0:9d301ae51ecf 674 }
jolyon 0:9d301ae51ecf 675 }
jolyon 3:b8218b61b0e2 676
jolyon 3:b8218b61b0e2 677 //------------------------CHECK red-----------------------------------------
jolyon 3:b8218b61b0e2 678 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 679 {
jolyon 3:b8218b61b0e2 680 RedLed = 1;
jolyon 3:b8218b61b0e2 681 GreenLed = 0;
jolyon 3:b8218b61b0e2 682 BlueLed = 0;
jolyon 3:b8218b61b0e2 683 YellowLed = 0;
jolyon 3:b8218b61b0e2 684 }
jolyon 3:b8218b61b0e2 685 else
jolyon 3:b8218b61b0e2 686 {
jolyon 3:b8218b61b0e2 687
jolyon 3:b8218b61b0e2 688 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 689 {
jolyon 3:b8218b61b0e2 690 RedLed = 0;
jolyon 3:b8218b61b0e2 691 GreenLed = 1;
jolyon 3:b8218b61b0e2 692 BlueLed = 0;
jolyon 3:b8218b61b0e2 693 YellowLed = 0;
jolyon 3:b8218b61b0e2 694 }
jolyon 3:b8218b61b0e2 695 else
jolyon 3:b8218b61b0e2 696 {
jolyon 3:b8218b61b0e2 697 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 698 {
jolyon 3:b8218b61b0e2 699 RedLed = 0;
jolyon 3:b8218b61b0e2 700 GreenLed = 0;
jolyon 3:b8218b61b0e2 701 BlueLed = 1;
jolyon 3:b8218b61b0e2 702 YellowLed = 0;
jolyon 3:b8218b61b0e2 703 }
jolyon 3:b8218b61b0e2 704 else
jolyon 3:b8218b61b0e2 705 {
jolyon 3:b8218b61b0e2 706 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 707 { //pretty sure it's Yellow
jolyon 3:b8218b61b0e2 708 //YellowLed = 1;
jolyon 3:b8218b61b0e2 709 //GreenLed = 0;
jolyon 3:b8218b61b0e2 710
jolyon 3:b8218b61b0e2 711 RedLed = 0;
jolyon 3:b8218b61b0e2 712 GreenLed = 0;
jolyon 3:b8218b61b0e2 713 BlueLed = 0;
jolyon 3:b8218b61b0e2 714 YellowLed = 1;;
jolyon 3:b8218b61b0e2 715 }
jolyon 3:b8218b61b0e2 716 else
jolyon 3:b8218b61b0e2 717 {
jolyon 3:b8218b61b0e2 718 RedLed = 0;
jolyon 3:b8218b61b0e2 719 GreenLed = 0;
jolyon 3:b8218b61b0e2 720 BlueLed = 0;
jolyon 3:b8218b61b0e2 721 YellowLed = 0;
jolyon 3:b8218b61b0e2 722 }
jolyon 3:b8218b61b0e2 723 }
jolyon 3:b8218b61b0e2 724 }
jolyon 3:b8218b61b0e2 725 }
jolyon 3:b8218b61b0e2 726
jolyon 3:b8218b61b0e2 727 }
jolyon 3:b8218b61b0e2 728 else
jolyon 3:b8218b61b0e2 729 {
jolyon 3:b8218b61b0e2 730 RedLed = 0;
jolyon 3:b8218b61b0e2 731 GreenLed = 0;
jolyon 3:b8218b61b0e2 732 BlueLed = 0;
jolyon 3:b8218b61b0e2 733 YellowLed = 0;
jolyon 3:b8218b61b0e2 734 }
jolyon 3:b8218b61b0e2 735
jolyon 3:b8218b61b0e2 736
jolyon 4:dce5fc58abe9 737 */
jolyon 3:b8218b61b0e2 738
jolyon 3:b8218b61b0e2 739 /*
jolyon 3:b8218b61b0e2 740 //-------------------------------------------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 741
jolyon 2:4a8eacbb3657 742 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 2:4a8eacbb3657 743 { //pretty sure it's Yellow
jolyon 2:4a8eacbb3657 744 YellowLed = 1;
jolyon 2:4a8eacbb3657 745 GreenLed = 0;
jolyon 2:4a8eacbb3657 746 }
jolyon 2:4a8eacbb3657 747 else
jolyon 2:4a8eacbb3657 748 {
jolyon 2:4a8eacbb3657 749 YellowLed = 0;
jolyon 2:4a8eacbb3657 750 if( (GreenProp > (GreenThreshold+Hysteresis)) && (RedProp <=(RedThreshold-Hysteresis)) )
jolyon 2:4a8eacbb3657 751 { //pretty sure it's green
jolyon 2:4a8eacbb3657 752 GreenLed = 1;
jolyon 2:4a8eacbb3657 753 }
jolyon 2:4a8eacbb3657 754 else
jolyon 2:4a8eacbb3657 755 {
jolyon 2:4a8eacbb3657 756 GreenLed = 1;
jolyon 2:4a8eacbb3657 757 YellowLed = 1;
jolyon 2:4a8eacbb3657 758 }
jolyon 2:4a8eacbb3657 759 }
jolyon 2:4a8eacbb3657 760 }
jolyon 2:4a8eacbb3657 761 else
jolyon 2:4a8eacbb3657 762 {
jolyon 0:9d301ae51ecf 763 //not enough intensity to determine
jolyon 0:9d301ae51ecf 764 GreenLed = 0;
jolyon 0:9d301ae51ecf 765 YellowLed = 0;
jolyon 0:9d301ae51ecf 766 }
jolyon 3:b8218b61b0e2 767
jolyon 3:b8218b61b0e2 768 */
jolyon 3:b8218b61b0e2 769 //----------------------------------------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 770 } //while(1)
jolyon 3:b8218b61b0e2 771 }//main
jolyon 0:9d301ae51ecf 772
jolyon 0:9d301ae51ecf 773
jolyon 0:9d301ae51ecf 774
jolyon 2:4a8eacbb3657 775 /*
jolyon 2:4a8eacbb3657 776 ---------------------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 777 //SPI SampleCode
jolyon 0:9d301ae51ecf 778
jolyon 2:4a8eacbb3657 779 #include "mbed.h"
jolyon 2:4a8eacbb3657 780 #include "MCP23S17.h"
jolyon 2:4a8eacbb3657 781 // Create SPI bus
jolyon 2:4a8eacbb3657 782 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 783 //
jolyon 2:4a8eacbb3657 784
jolyon 2:4a8eacbb3657 785 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 786
jolyon 2:4a8eacbb3657 787 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 788 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 789 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 790
jolyon 2:4a8eacbb3657 791 DigitalOut led1(LED1); // mbed LED1 is used for test status display
jolyon 2:4a8eacbb3657 792
jolyon 2:4a8eacbb3657 793 int main() {
jolyon 2:4a8eacbb3657 794 //
jolyon 2:4a8eacbb3657 795 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 796 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 797 // Set all 8 Port B bits to input direction
jolyon 2:4a8eacbb3657 798 chip.direction(PORT_B, 0xFF);
jolyon 2:4a8eacbb3657 799 led1=0;
jolyon 2:4a8eacbb3657 800 // Start Loopback test sending out and reading back values
jolyon 2:4a8eacbb3657 801 // loopback test uses A0 and B0 pins - so use a wire to jumper those two pins on MCP23S17 together
jolyon 2:4a8eacbb3657 802 while (1) {
jolyon 2:4a8eacbb3657 803 // write 0xAA to MCP23S17 Port A
jolyon 2:4a8eacbb3657 804 chip.write(PORT_A, 0xAA);
jolyon 2:4a8eacbb3657 805 wait(.5);
jolyon 2:4a8eacbb3657 806 // read back value from MCP23S17 Port B and display B0 on mbed led1
jolyon 2:4a8eacbb3657 807 led1 = chip.read(PORT_B)& 0x01;
jolyon 2:4a8eacbb3657 808 // write 0x55 to MCP23S17 Port A
jolyon 2:4a8eacbb3657 809 chip.write(PORT_A, 0x55);
jolyon 2:4a8eacbb3657 810 wait(.5);
jolyon 2:4a8eacbb3657 811 // read back value from MCP23S17 Port B and display B0 on mbed led1
jolyon 2:4a8eacbb3657 812 led1 = chip.read(PORT_B)& 0x01;
jolyon 2:4a8eacbb3657 813 // led1 should blink slowly when it is all working
jolyon 0:9d301ae51ecf 814 }
jolyon 0:9d301ae51ecf 815 }
jolyon 2:4a8eacbb3657 816 */
jolyon 0:9d301ae51ecf 817
jolyon 0:9d301ae51ecf 818 //---------------------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 819 //---------------------------------------------------------------------------------------------