Jolyon Hill / ColourSensor

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Wed Sep 28 14:34:47 2016 +0000
Revision:
7:9c5bca0ac9d7
Parent:
6:6346ef2b4638
Child:
8:e6e4eece90f7
running single channel yellow / green for test

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 5:dc77c5967412 39 void SelectSensorPort(uint8_t SensorID);
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 5:dc77c5967412 55 //I2C address selection pins
jolyon 5:dc77c5967412 56 DigitalOut I2C_ID_Bit0(p13);
jolyon 5:dc77c5967412 57 DigitalOut I2C_ID_Bit1(p14);
jolyon 5:dc77c5967412 58 DigitalOut I2C_ID_Bit2(p12);
jolyon 5:dc77c5967412 59 DigitalOut I2C_ID_Bit3(p11);
jolyon 5:dc77c5967412 60
jolyon 0:9d301ae51ecf 61 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 62
jolyon 0:9d301ae51ecf 63 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 64 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 65 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 66 //Analogue inputs are used to set thresholds for detector levels
jolyon 2:4a8eacbb3657 67 //AnalogIn RedTrimmer(p15);
jolyon 2:4a8eacbb3657 68 //AnalogIn GreenTrimmer(p16);
jolyon 2:4a8eacbb3657 69 //AnalogIn BlueTrimmer(p17);
jolyon 2:4a8eacbb3657 70 //AnalogIn HysTrimmer(p18);
jolyon 0:9d301ae51ecf 71 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 72
jolyon 0:9d301ae51ecf 73 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 74 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 75 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 76 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 77 //final version uses I2C port
jolyon 5:dc77c5967412 78 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 79
jolyon 0:9d301ae51ecf 80 //set up I2C Communication to LCD
jolyon 0:9d301ae51ecf 81 //I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 82
jolyon 0:9d301ae51ecf 83 //I2C Portexpander PCF8574 for LCD
jolyon 0:9d301ae51ecf 84 //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 85
jolyon 0:9d301ae51ecf 86 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 87
jolyon 2:4a8eacbb3657 88 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 89 //------------ Create SPI bus -----------------------------------------------------
jolyon 2:4a8eacbb3657 90 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 91 //set up the SPI port for use as output driver
jolyon 2:4a8eacbb3657 92 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 93
jolyon 2:4a8eacbb3657 94 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 95
jolyon 2:4a8eacbb3657 96 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 97 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 98 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 99
jolyon 2:4a8eacbb3657 100 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 101
jolyon 0:9d301ae51ecf 102 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 103 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 104 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 105 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 106 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 107
jolyon 0:9d301ae51ecf 108
jolyon 0:9d301ae51ecf 109 typedef struct{
jolyon 0:9d301ae51ecf 110 uint16_t White;
jolyon 0:9d301ae51ecf 111 uint16_t Red;
jolyon 0:9d301ae51ecf 112 uint16_t Green;
jolyon 0:9d301ae51ecf 113 uint16_t Blue;
jolyon 0:9d301ae51ecf 114 }Colour;
jolyon 0:9d301ae51ecf 115
jolyon 0:9d301ae51ecf 116 Colour SensorData;
jolyon 0:9d301ae51ecf 117
jolyon 0:9d301ae51ecf 118 //-------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 119 //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 120 //outputs start at 0 torough to 15
jolyon 7:9c5bca0ac9d7 121
jolyon 4:dce5fc58abe9 122 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 7:9c5bca0ac9d7 123 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 4:dce5fc58abe9 124 NOTUSED, 2, //sensor 1
jolyon 4:dce5fc58abe9 125 NOTUSED, 3, //sensor 2
jolyon 4:dce5fc58abe9 126 NOTUSED, 4, //sensor 3
jolyon 4:dce5fc58abe9 127 NOTUSED, 5, //sensor 4
jolyon 4:dce5fc58abe9 128 NOTUSED, 6, //sensor 5
jolyon 4:dce5fc58abe9 129 NOTUSED, 7, //sensor 6
jolyon 7:9c5bca0ac9d7 130 NOTUSED, 8, //sensor 7
jolyon 7:9c5bca0ac9d7 131 NOTUSED, 9, //sensor 8
jolyon 7:9c5bca0ac9d7 132 NOTUSED, 10, //sensor 9
jolyon 7:9c5bca0ac9d7 133 NOTUSED, 11, //sensor 10
jolyon 7:9c5bca0ac9d7 134 NOTUSED, 12, //sensor 11
jolyon 7:9c5bca0ac9d7 135 NOTUSED, 13, //sensor 12
jolyon 7:9c5bca0ac9d7 136 NOTUSED, 14, //sensor 13
jolyon 4:dce5fc58abe9 137 NOTUSED, 15, //sensor 14
jolyon 4:dce5fc58abe9 138 NOTUSED, 15, //sensor 15
jolyon 3:b8218b61b0e2 139 };
jolyon 7:9c5bca0ac9d7 140 /*
jolyon 5:dc77c5967412 141 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 5:dc77c5967412 142 STD_RED, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 5:dc77c5967412 143 STD_GREEN, 1, //sensor 1
jolyon 5:dc77c5967412 144 STD_RED, 2, //sensor 2
jolyon 5:dc77c5967412 145 STD_GREEN, 3, //sensor 3
jolyon 5:dc77c5967412 146 STD_RED, 4, //sensor 4
jolyon 5:dc77c5967412 147 STD_GREEN, 5, //sensor 5
jolyon 5:dc77c5967412 148 STD_RED, 6, //sensor 6
jolyon 5:dc77c5967412 149 STD_GREEN, 7, //sensor 7
jolyon 5:dc77c5967412 150 STD_RED, 8, //sensor 8
jolyon 5:dc77c5967412 151 STD_GREEN, 9, //sensor 9
jolyon 5:dc77c5967412 152 STD_RED, 10, //sensor 10
jolyon 5:dc77c5967412 153 STD_GREEN, 11, //sensor 11
jolyon 5:dc77c5967412 154 STD_RED, 12, //sensor 12
jolyon 5:dc77c5967412 155 STD_GREEN, 13, //sensor 13
jolyon 5:dc77c5967412 156 STD_RED, 14, //sensor 14
jolyon 5:dc77c5967412 157 STD_GREEN, 15, //sensor 15
jolyon 5:dc77c5967412 158 };
jolyon 7:9c5bca0ac9d7 159 */
jolyon 6:6346ef2b4638 160 //new config trpe
jolyon 6:6346ef2b4638 161
jolyon 6:6346ef2b4638 162
jolyon 3:b8218b61b0e2 163
jolyon 3:b8218b61b0e2 164 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 165
jolyon 3:b8218b61b0e2 166 uint16_t OutputData = 0; //word containing the current output states of the board
jolyon 3:b8218b61b0e2 167
jolyon 3:b8218b61b0e2 168 uint8_t SensorNumber = 0; //current sensor number
jolyon 3:b8218b61b0e2 169 char SensorResult = 0; //detected colour
jolyon 3:b8218b61b0e2 170
jolyon 6:6346ef2b4638 171 uint8_t ConfigureSensor;
jolyon 0:9d301ae51ecf 172
jolyon 0:9d301ae51ecf 173 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 174 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 175
jolyon 3:b8218b61b0e2 176 uint8_t SensorConfig = 0x30;
jolyon 0:9d301ae51ecf 177 // bit description setting
jolyon 0:9d301ae51ecf 178 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 179 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 180 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 181 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 182 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 183 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 184 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 185 // 7 N/F 0 0
jolyon 6:6346ef2b4638 186 //------------TSC Stuff----------------
jolyon 6:6346ef2b4638 187
jolyon 6:6346ef2b4638 188 uint16_t Red = 1;
jolyon 6:6346ef2b4638 189 uint16_t Green = 2;
jolyon 6:6346ef2b4638 190 uint16_t Blue = 3;
jolyon 6:6346ef2b4638 191 uint16_t White = 4;
jolyon 6:6346ef2b4638 192
jolyon 6:6346ef2b4638 193 uint32_t Temp = 0;
jolyon 6:6346ef2b4638 194
jolyon 6:6346ef2b4638 195 uint16_t RedProp = 0;
jolyon 6:6346ef2b4638 196 uint16_t GreenProp = 0;
jolyon 6:6346ef2b4638 197 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 198
jolyon 0:9d301ae51ecf 199
jolyon 2:4a8eacbb3657 200
jolyon 2:4a8eacbb3657 201 //working thresholds from pot inputs, scaled 0-100
jolyon 2:4a8eacbb3657 202 uint16_t RedThreshold = 0;
jolyon 2:4a8eacbb3657 203 uint16_t GreenThreshold = 0;
jolyon 2:4a8eacbb3657 204 uint16_t BlueThreshold = 0;
jolyon 2:4a8eacbb3657 205 uint16_t Hysteresis = 0;
jolyon 2:4a8eacbb3657 206
jolyon 6:6346ef2b4638 207 //------------------------- filter routine if required -------------------------------
jolyon 0:9d301ae51ecf 208 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 209 {
jolyon 0:9d301ae51ecf 210 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 211 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 212 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 213 *Acc = Temp;
jolyon 0:9d301ae51ecf 214 return *Acc >> factor;
jolyon 0:9d301ae51ecf 215 }
jolyon 0:9d301ae51ecf 216
jolyon 0:9d301ae51ecf 217
jolyon 0:9d301ae51ecf 218 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 219 {
jolyon 0:9d301ae51ecf 220 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 221 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 222
jolyon 6:6346ef2b4638 223 for (ConfigureSensor = 0; ConfigureSensor < 16; ConfigureSensor++)
jolyon 6:6346ef2b4638 224 {
jolyon 6:6346ef2b4638 225 if((Config[ConfigureSensor]<<1) != NOTUSED)
jolyon 6:6346ef2b4638 226 {
jolyon 6:6346ef2b4638 227 SelectSensorPort(ConfigureSensor); //set up H/W mux for this sensor
jolyon 6:6346ef2b4638 228
jolyon 6:6346ef2b4638 229 char id_regval[1] = {146};
jolyon 6:6346ef2b4638 230 char data[1] = {0};
jolyon 6:6346ef2b4638 231 i2c.write(sensor_addr,id_regval,1, true);
jolyon 6:6346ef2b4638 232 i2c.read(sensor_addr,data,1,false); // Initialize color sensor
jolyon 6:6346ef2b4638 233
jolyon 6:6346ef2b4638 234 char enable_register[2] = {128,3}; //enable the sensor
jolyon 6:6346ef2b4638 235 i2c.write(sensor_addr,enable_register,2,false);
jolyon 6:6346ef2b4638 236
jolyon 6:6346ef2b4638 237 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 6:6346ef2b4638 238 i2c.write(sensor_addr,timing_register,2,false);
jolyon 6:6346ef2b4638 239
jolyon 6:6346ef2b4638 240 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 6:6346ef2b4638 241 i2c.write(sensor_addr,control_register,2,false);
jolyon 6:6346ef2b4638 242 }
jolyon 0:9d301ae51ecf 243 }
jolyon 6:6346ef2b4638 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 5:dc77c5967412 252
jolyon 5:dc77c5967412 253
jolyon 5:dc77c5967412 254 SelectSensorPort(SensorNumber);
jolyon 1:d99dad8a1f50 255
jolyon 1:d99dad8a1f50 256 NewData.White = 0;
jolyon 1:d99dad8a1f50 257 NewData.Red = 0;
jolyon 1:d99dad8a1f50 258 NewData.Green = 0;
jolyon 1:d99dad8a1f50 259 NewData.Blue = 0;
jolyon 1:d99dad8a1f50 260
jolyon 1:d99dad8a1f50 261 AddrReg[0] = SENSOR_WHITE_REG;
jolyon 1:d99dad8a1f50 262 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 263 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 264 NewData.White = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 265
jolyon 1:d99dad8a1f50 266 AddrReg[0] = SENSOR_RED_REG;
jolyon 1:d99dad8a1f50 267 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 268 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 269 NewData.Red = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 270
jolyon 1:d99dad8a1f50 271 AddrReg[0] = SENSOR_GREEN_REG;
jolyon 1:d99dad8a1f50 272 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 273 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 274 NewData.Green = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 275
jolyon 1:d99dad8a1f50 276 AddrReg[0] = SENSOR_BLUE_REG;
jolyon 1:d99dad8a1f50 277 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 278 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 279 NewData.Blue = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 280
jolyon 1:d99dad8a1f50 281 return NewData;
jolyon 1:d99dad8a1f50 282 }
jolyon 1:d99dad8a1f50 283
jolyon 2:4a8eacbb3657 284 void InitOutputs(void)
jolyon 2:4a8eacbb3657 285 {
jolyon 2:4a8eacbb3657 286 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 287 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 288 // Set all 8 Port B bits to output direction
jolyon 2:4a8eacbb3657 289 chip.direction(PORT_B, 0x00);
jolyon 2:4a8eacbb3657 290 }
jolyon 0:9d301ae51ecf 291
jolyon 2:4a8eacbb3657 292 void SetOutputBit(char bit)
jolyon 2:4a8eacbb3657 293 {
jolyon 2:4a8eacbb3657 294 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 295 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 296
jolyon 2:4a8eacbb3657 297 OutputWord <<= bit;
jolyon 4:dce5fc58abe9 298 OutputData |= OutputWord;
jolyon 4:dce5fc58abe9 299
jolyon 4:dce5fc58abe9 300 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 301 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 302
jolyon 4:dce5fc58abe9 303 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 304 //PortA |=BitA;
jolyon 4:dce5fc58abe9 305 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 306
jolyon 4:dce5fc58abe9 307 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 308 //PortB |=BitB;
jolyon 4:dce5fc58abe9 309 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 310 }
jolyon 2:4a8eacbb3657 311
jolyon 2:4a8eacbb3657 312 void ClearOutputBit(char bit)
jolyon 2:4a8eacbb3657 313 {
jolyon 2:4a8eacbb3657 314 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 315 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 316
jolyon 2:4a8eacbb3657 317 OutputWord <<= bit;
jolyon 2:4a8eacbb3657 318 OutputWord = ~OutputWord;
jolyon 4:dce5fc58abe9 319 OutputWord &= OutputWord;
jolyon 2:4a8eacbb3657 320
jolyon 4:dce5fc58abe9 321 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 322 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 323
jolyon 4:dce5fc58abe9 324 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 325 //PortA &=BitA;
jolyon 4:dce5fc58abe9 326 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 327
jolyon 4:dce5fc58abe9 328 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 329 //PortB &=BitB;
jolyon 4:dce5fc58abe9 330 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 331 }
jolyon 2:4a8eacbb3657 332
jolyon 2:4a8eacbb3657 333 void WriteOutputPort(uint16_t FullPort)
jolyon 2:4a8eacbb3657 334 {
jolyon 2:4a8eacbb3657 335 chip.write(PORT_A, FullPort & 0xFF);
jolyon 2:4a8eacbb3657 336 chip.write(PORT_B, FullPort >> 8);
jolyon 2:4a8eacbb3657 337 }
jolyon 2:4a8eacbb3657 338
jolyon 2:4a8eacbb3657 339
jolyon 2:4a8eacbb3657 340 void GetThresholds(void)
jolyon 2:4a8eacbb3657 341 {
jolyon 2:4a8eacbb3657 342 //Load the pot values ant make 0 to 100% value
jolyon 2:4a8eacbb3657 343 /*
jolyon 2:4a8eacbb3657 344 RedThreshold = RedTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 345 GreenThreshold = GreenTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 346 BlueThreshold = BlueTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 347 Hysteresis = HysTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 348 */
jolyon 2:4a8eacbb3657 349
jolyon 2:4a8eacbb3657 350 RedThreshold = 45;
jolyon 2:4a8eacbb3657 351 GreenThreshold = 35;
jolyon 2:4a8eacbb3657 352 BlueThreshold = 10;
jolyon 2:4a8eacbb3657 353 Hysteresis = 5;
jolyon 2:4a8eacbb3657 354 }
jolyon 0:9d301ae51ecf 355
jolyon 5:dc77c5967412 356 void SelectSensorPort(uint8_t SensorID)
jolyon 5:dc77c5967412 357 {
jolyon 5:dc77c5967412 358
jolyon 5:dc77c5967412 359 if ( SensorID < 16)
jolyon 5:dc77c5967412 360 {
jolyon 5:dc77c5967412 361 if((SensorID & 0x01) == 0x01)
jolyon 5:dc77c5967412 362 {
jolyon 5:dc77c5967412 363 I2C_ID_Bit0 = 1;
jolyon 5:dc77c5967412 364 }
jolyon 5:dc77c5967412 365 else
jolyon 5:dc77c5967412 366 {
jolyon 5:dc77c5967412 367 I2C_ID_Bit0 = 0;
jolyon 5:dc77c5967412 368 }
jolyon 5:dc77c5967412 369
jolyon 5:dc77c5967412 370 if((SensorID & 0x02) == 0x02)
jolyon 5:dc77c5967412 371 {
jolyon 5:dc77c5967412 372 I2C_ID_Bit1 = 1;
jolyon 5:dc77c5967412 373 }
jolyon 5:dc77c5967412 374 else
jolyon 5:dc77c5967412 375 {
jolyon 5:dc77c5967412 376 I2C_ID_Bit1 = 0;
jolyon 5:dc77c5967412 377 }
jolyon 5:dc77c5967412 378
jolyon 5:dc77c5967412 379 if((SensorID & 0x04) == 0x04)
jolyon 5:dc77c5967412 380 {
jolyon 5:dc77c5967412 381 I2C_ID_Bit2 = 1;
jolyon 5:dc77c5967412 382 }
jolyon 5:dc77c5967412 383 else
jolyon 5:dc77c5967412 384 {
jolyon 5:dc77c5967412 385 I2C_ID_Bit2 = 0;
jolyon 5:dc77c5967412 386 }
jolyon 5:dc77c5967412 387
jolyon 5:dc77c5967412 388 if((SensorID & 0x08) == 0x08)
jolyon 5:dc77c5967412 389 {
jolyon 5:dc77c5967412 390 I2C_ID_Bit3 = 1;
jolyon 5:dc77c5967412 391 }
jolyon 5:dc77c5967412 392 else
jolyon 5:dc77c5967412 393 {
jolyon 5:dc77c5967412 394 I2C_ID_Bit3 = 0;
jolyon 5:dc77c5967412 395 }
jolyon 5:dc77c5967412 396 }
jolyon 5:dc77c5967412 397 }
jolyon 5:dc77c5967412 398
jolyon 6:6346ef2b4638 399 void ScaleColours(void)
jolyon 6:6346ef2b4638 400 {
jolyon 6:6346ef2b4638 401 //make 12 bit only
jolyon 6:6346ef2b4638 402 Red >>=4;
jolyon 6:6346ef2b4638 403 Green >>=4;
jolyon 6:6346ef2b4638 404 Blue >>=4;
jolyon 6:6346ef2b4638 405 White >>=4;
jolyon 6:6346ef2b4638 406 }
jolyon 6:6346ef2b4638 407
jolyon 3:b8218b61b0e2 408
jolyon 3:b8218b61b0e2 409 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 410 {
jolyon 3:b8218b61b0e2 411 lcd.locate(0, 0);
jolyon 7:9c5bca0ac9d7 412 lcd.printf("R%02i G%02i B%02i W%03i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 413 lcd.locate(0, 1);
jolyon 3:b8218b61b0e2 414 lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 3:b8218b61b0e2 415 }
jolyon 3:b8218b61b0e2 416
jolyon 3:b8218b61b0e2 417
jolyon 3:b8218b61b0e2 418 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 419 {
jolyon 3:b8218b61b0e2 420 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 421
jolyon 3:b8218b61b0e2 422 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 423 {
jolyon 3:b8218b61b0e2 424 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 425 {
jolyon 3:b8218b61b0e2 426 case STD_RED:
jolyon 3:b8218b61b0e2 427 {
jolyon 3:b8218b61b0e2 428 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 429 {
jolyon 3:b8218b61b0e2 430 LEDColour = RED;
jolyon 3:b8218b61b0e2 431 }
jolyon 3:b8218b61b0e2 432 }
jolyon 3:b8218b61b0e2 433 break;
jolyon 3:b8218b61b0e2 434
jolyon 3:b8218b61b0e2 435 case STD_GREEN:
jolyon 3:b8218b61b0e2 436 {
jolyon 3:b8218b61b0e2 437 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 438 {
jolyon 3:b8218b61b0e2 439 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 440 }
jolyon 3:b8218b61b0e2 441 }
jolyon 3:b8218b61b0e2 442 break;
jolyon 3:b8218b61b0e2 443
jolyon 3:b8218b61b0e2 444 case STD_BLUE:
jolyon 3:b8218b61b0e2 445 {
jolyon 3:b8218b61b0e2 446 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 447 {
jolyon 3:b8218b61b0e2 448 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 449 }
jolyon 3:b8218b61b0e2 450 }
jolyon 3:b8218b61b0e2 451 break;
jolyon 3:b8218b61b0e2 452
jolyon 3:b8218b61b0e2 453 case STD_YELLOW:
jolyon 3:b8218b61b0e2 454 {
jolyon 3:b8218b61b0e2 455 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 456 {
jolyon 3:b8218b61b0e2 457 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 458 }
jolyon 3:b8218b61b0e2 459 }
jolyon 3:b8218b61b0e2 460 break;
jolyon 3:b8218b61b0e2 461
jolyon 3:b8218b61b0e2 462 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 463 {
jolyon 3:b8218b61b0e2 464 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 465 { //pretty sure it's Yellow
jolyon 3:b8218b61b0e2 466
jolyon 3:b8218b61b0e2 467 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 468 }
jolyon 3:b8218b61b0e2 469 else
jolyon 3:b8218b61b0e2 470 {
jolyon 3:b8218b61b0e2 471 if( (GreenProp > (GreenThreshold+Hysteresis)) && (RedProp <=(RedThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 472 { //pretty sure it's green
jolyon 3:b8218b61b0e2 473 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 474 }
jolyon 3:b8218b61b0e2 475 }
jolyon 3:b8218b61b0e2 476 }
jolyon 3:b8218b61b0e2 477 break;
jolyon 3:b8218b61b0e2 478
jolyon 3:b8218b61b0e2 479 case RGB:
jolyon 3:b8218b61b0e2 480 {
jolyon 3:b8218b61b0e2 481 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 482 {
jolyon 3:b8218b61b0e2 483 LEDColour = RED;
jolyon 3:b8218b61b0e2 484 }
jolyon 3:b8218b61b0e2 485 else
jolyon 3:b8218b61b0e2 486 {
jolyon 3:b8218b61b0e2 487 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 488 {
jolyon 3:b8218b61b0e2 489 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 490 }
jolyon 3:b8218b61b0e2 491 else
jolyon 3:b8218b61b0e2 492 {
jolyon 3:b8218b61b0e2 493 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 494 {
jolyon 3:b8218b61b0e2 495 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 496 }
jolyon 3:b8218b61b0e2 497 }
jolyon 3:b8218b61b0e2 498 }
jolyon 3:b8218b61b0e2 499 }
jolyon 3:b8218b61b0e2 500 break;
jolyon 3:b8218b61b0e2 501
jolyon 3:b8218b61b0e2 502 case NOTUSED:
jolyon 3:b8218b61b0e2 503 default:
jolyon 3:b8218b61b0e2 504 {
jolyon 3:b8218b61b0e2 505 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 506 }
jolyon 3:b8218b61b0e2 507 break;
jolyon 3:b8218b61b0e2 508 }
jolyon 3:b8218b61b0e2 509 }
jolyon 3:b8218b61b0e2 510 return LEDColour;
jolyon 3:b8218b61b0e2 511 }
jolyon 3:b8218b61b0e2 512
jolyon 3:b8218b61b0e2 513
jolyon 4:dce5fc58abe9 514 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 515 {
jolyon 4:dce5fc58abe9 516 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 517 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 518 {
jolyon 4:dce5fc58abe9 519 case STD_RED:
jolyon 4:dce5fc58abe9 520 case STD_GREEN:
jolyon 4:dce5fc58abe9 521 case STD_BLUE:
jolyon 4:dce5fc58abe9 522 case STD_YELLOW:
jolyon 4:dce5fc58abe9 523 {
jolyon 4:dce5fc58abe9 524 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 525 {
jolyon 4:dce5fc58abe9 526 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 527 }
jolyon 4:dce5fc58abe9 528 else
jolyon 4:dce5fc58abe9 529 {
jolyon 4:dce5fc58abe9 530 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 531 }
jolyon 4:dce5fc58abe9 532 }
jolyon 4:dce5fc58abe9 533 break;
jolyon 4:dce5fc58abe9 534
jolyon 4:dce5fc58abe9 535 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 536 {
jolyon 4:dce5fc58abe9 537 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 538 {
jolyon 4:dce5fc58abe9 539 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 540 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 541 }
jolyon 4:dce5fc58abe9 542 else
jolyon 4:dce5fc58abe9 543 {
jolyon 4:dce5fc58abe9 544 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 545 {
jolyon 4:dce5fc58abe9 546 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 547 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 548 }
jolyon 4:dce5fc58abe9 549 else
jolyon 4:dce5fc58abe9 550 {
jolyon 4:dce5fc58abe9 551 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 552 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 553 }
jolyon 4:dce5fc58abe9 554 }
jolyon 4:dce5fc58abe9 555 }
jolyon 4:dce5fc58abe9 556 break;
jolyon 4:dce5fc58abe9 557
jolyon 4:dce5fc58abe9 558 case RGB:
jolyon 4:dce5fc58abe9 559 {
jolyon 4:dce5fc58abe9 560 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 561 {
jolyon 4:dce5fc58abe9 562 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 563 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 564 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 565 }
jolyon 4:dce5fc58abe9 566 else
jolyon 4:dce5fc58abe9 567 {
jolyon 4:dce5fc58abe9 568 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 569 {
jolyon 4:dce5fc58abe9 570 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 571 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 572 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 573 }
jolyon 4:dce5fc58abe9 574 else
jolyon 4:dce5fc58abe9 575 {
jolyon 4:dce5fc58abe9 576 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 577 {
jolyon 4:dce5fc58abe9 578 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 579 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 580 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 581 }
jolyon 4:dce5fc58abe9 582 else
jolyon 4:dce5fc58abe9 583 {
jolyon 4:dce5fc58abe9 584 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 585 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 586 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 587 }
jolyon 4:dce5fc58abe9 588
jolyon 4:dce5fc58abe9 589 }
jolyon 4:dce5fc58abe9 590 }
jolyon 4:dce5fc58abe9 591 }
jolyon 4:dce5fc58abe9 592 break;
jolyon 4:dce5fc58abe9 593
jolyon 4:dce5fc58abe9 594 default:
jolyon 4:dce5fc58abe9 595 {
jolyon 4:dce5fc58abe9 596 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 597 }
jolyon 4:dce5fc58abe9 598 break;
jolyon 4:dce5fc58abe9 599 } //end switch
jolyon 4:dce5fc58abe9 600 }
jolyon 4:dce5fc58abe9 601
jolyon 4:dce5fc58abe9 602 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 603 {
jolyon 4:dce5fc58abe9 604 RedLed = 0;
jolyon 4:dce5fc58abe9 605 GreenLed = 0;
jolyon 4:dce5fc58abe9 606 BlueLed = 0;
jolyon 4:dce5fc58abe9 607 YellowLed = 0;
jolyon 4:dce5fc58abe9 608 switch (WhichColour)
jolyon 4:dce5fc58abe9 609 {
jolyon 4:dce5fc58abe9 610 case RED:
jolyon 4:dce5fc58abe9 611 {
jolyon 4:dce5fc58abe9 612 RedLed = 1;
jolyon 4:dce5fc58abe9 613 }
jolyon 4:dce5fc58abe9 614 break;
jolyon 4:dce5fc58abe9 615
jolyon 4:dce5fc58abe9 616 case GREEN:
jolyon 4:dce5fc58abe9 617 {
jolyon 4:dce5fc58abe9 618 GreenLed = 1;
jolyon 4:dce5fc58abe9 619 }
jolyon 4:dce5fc58abe9 620 break;
jolyon 4:dce5fc58abe9 621
jolyon 4:dce5fc58abe9 622 case BLUE:
jolyon 4:dce5fc58abe9 623 {
jolyon 4:dce5fc58abe9 624 BlueLed = 1;
jolyon 4:dce5fc58abe9 625 }
jolyon 4:dce5fc58abe9 626 break;
jolyon 4:dce5fc58abe9 627
jolyon 4:dce5fc58abe9 628 case YELLOW:
jolyon 4:dce5fc58abe9 629 {
jolyon 4:dce5fc58abe9 630 YellowLed = 1;
jolyon 4:dce5fc58abe9 631 }
jolyon 4:dce5fc58abe9 632 break;
jolyon 4:dce5fc58abe9 633
jolyon 4:dce5fc58abe9 634 default:
jolyon 4:dce5fc58abe9 635 {
jolyon 4:dce5fc58abe9 636 }
jolyon 4:dce5fc58abe9 637 break;
jolyon 4:dce5fc58abe9 638 }
jolyon 4:dce5fc58abe9 639 }
jolyon 4:dce5fc58abe9 640
jolyon 4:dce5fc58abe9 641
jolyon 3:b8218b61b0e2 642
jolyon 0:9d301ae51ecf 643 int main()
jolyon 0:9d301ae51ecf 644 {
jolyon 6:6346ef2b4638 645 InitOutputs(); //set up output driver chip
jolyon 6:6346ef2b4638 646 ConfigureTSC(0); //Initialise all TCS34725's
jolyon 0:9d301ae51ecf 647
jolyon 1:d99dad8a1f50 648 while(1)
jolyon 1:d99dad8a1f50 649 {
jolyon 6:6346ef2b4638 650 GetThresholds(); //update thresholds
jolyon 6:6346ef2b4638 651 wait(0.1); //100ms Update Cycle
jolyon 4:dce5fc58abe9 652 OutputData = 0;
jolyon 2:4a8eacbb3657 653
jolyon 3:b8218b61b0e2 654 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 655 {
jolyon 4:dce5fc58abe9 656 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 657 {
jolyon 3:b8218b61b0e2 658 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 659
jolyon 3:b8218b61b0e2 660 White = SensorData.White;
jolyon 3:b8218b61b0e2 661 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 662 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 663 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 664
jolyon 6:6346ef2b4638 665 ScaleColours();
jolyon 6:6346ef2b4638 666
jolyon 3:b8218b61b0e2 667 UpdateDisplay();
jolyon 3:b8218b61b0e2 668
jolyon 3:b8218b61b0e2 669 // work out % of colour mix
jolyon 3:b8218b61b0e2 670 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 671 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 672 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 673 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 674
jolyon 3:b8218b61b0e2 675
jolyon 3:b8218b61b0e2 676 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 677 UpdateOutputs();
jolyon 4:dce5fc58abe9 678 ShowLeds(SensorResult);
jolyon 3:b8218b61b0e2 679 } //end if
jolyon 3:b8218b61b0e2 680 } //end for
jolyon 6:6346ef2b4638 681 WriteOutputPort(OutputData);
jolyon 3:b8218b61b0e2 682 } //while(1)
jolyon 3:b8218b61b0e2 683 }//main