Jolyon Hill / ColourSensor

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Mon Nov 07 11:19:24 2016 +0000
Revision:
12:eab1bc88fe68
Parent:
11:729eb224dce6
Child:
13:ef2f1c11e33b
Version prior to import of I2C EEProm Code

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 12:eab1bc88fe68 4 //#include "24LCxx_I2C.h"
jolyon 12:eab1bc88fe68 5
jolyon 0:9d301ae51ecf 6
jolyon 0:9d301ae51ecf 7 #define FACTOR 1
jolyon 0:9d301ae51ecf 8
jolyon 0:9d301ae51ecf 9 #define SENSOR_ADDR (41 << 1)
jolyon 1:d99dad8a1f50 10 #define SENSOR_WHITE_REG 148
jolyon 1:d99dad8a1f50 11 #define SENSOR_RED_REG 150
jolyon 1:d99dad8a1f50 12 #define SENSOR_GREEN_REG 152
jolyon 1:d99dad8a1f50 13 #define SENSOR_BLUE_REG 154
jolyon 1:d99dad8a1f50 14
jolyon 3:b8218b61b0e2 15 #define WHITE_THRESHOLD 15
jolyon 3:b8218b61b0e2 16
jolyon 3:b8218b61b0e2 17 //--------------------------------------
jolyon 3:b8218b61b0e2 18 //each LED type is defined here
jolyon 3:b8218b61b0e2 19 #define NOTUSED 0
jolyon 3:b8218b61b0e2 20 #define STD_RED 1
jolyon 3:b8218b61b0e2 21 #define STD_GREEN 2
jolyon 3:b8218b61b0e2 22 #define STD_BLUE 3
jolyon 3:b8218b61b0e2 23 #define STD_YELLOW 4
jolyon 3:b8218b61b0e2 24 #define GREEN_YELLOW 5
jolyon 3:b8218b61b0e2 25 #define RGB 6
jolyon 3:b8218b61b0e2 26
jolyon 3:b8218b61b0e2 27
jolyon 3:b8218b61b0e2 28 //--------------------------------------
jolyon 3:b8218b61b0e2 29 //Current LED Colour Definitions
jolyon 3:b8218b61b0e2 30 #define ERROR 0 //off or wrong
jolyon 3:b8218b61b0e2 31 #define RED 1
jolyon 3:b8218b61b0e2 32 #define GREEN 2
jolyon 3:b8218b61b0e2 33 #define BLUE 3
jolyon 3:b8218b61b0e2 34 #define YELLOW 4
jolyon 3:b8218b61b0e2 35
jolyon 3:b8218b61b0e2 36
jolyon 3:b8218b61b0e2 37
jolyon 3:b8218b61b0e2 38 //--------------------------------------
jolyon 11:729eb224dce6 39 #define NEWBUTTON 0x80
jolyon 11:729eb224dce6 40 #define UPBUTTON 0x04
jolyon 11:729eb224dce6 41 #define DOWNBUTTON 0x01
jolyon 11:729eb224dce6 42 #define LEFTBUTTON 0x03
jolyon 11:729eb224dce6 43 #define RIGHTBUTTON 0x02
jolyon 11:729eb224dce6 44 #define TICKBUTTON 0x05
jolyon 1:d99dad8a1f50 45
jolyon 5:dc77c5967412 46 void SelectSensorPort(uint8_t SensorID);
jolyon 12:eab1bc88fe68 47 void CreateOutputTable(void);
jolyon 12:eab1bc88fe68 48 void SaveSensorData(void);
jolyon 0:9d301ae51ecf 49
jolyon 0:9d301ae51ecf 50 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 51 //----------- LED's -------------------------------------------------------------
jolyon 0:9d301ae51ecf 52 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 53 // Detection LED's use the onboard MBED LED's
jolyon 0:9d301ae51ecf 54 // These are all blue on the MBED but on DSE PCB they areas follows
jolyon 0:9d301ae51ecf 55 // LED1 = GREEN
jolyon 0:9d301ae51ecf 56 // LED2 = BLUE
jolyon 0:9d301ae51ecf 57 // LED3 = RED
jolyon 0:9d301ae51ecf 58 // LED4 = YELLOW
jolyon 0:9d301ae51ecf 59 DigitalOut GreenLed(LED1);
jolyon 0:9d301ae51ecf 60 DigitalOut BlueLed(LED2);
jolyon 0:9d301ae51ecf 61 DigitalOut RedLed(LED3);
jolyon 0:9d301ae51ecf 62 DigitalOut YellowLed(LED4);
jolyon 0:9d301ae51ecf 63
jolyon 5:dc77c5967412 64 //I2C address selection pins
jolyon 5:dc77c5967412 65 DigitalOut I2C_ID_Bit0(p13);
jolyon 5:dc77c5967412 66 DigitalOut I2C_ID_Bit1(p14);
jolyon 5:dc77c5967412 67 DigitalOut I2C_ID_Bit2(p12);
jolyon 5:dc77c5967412 68 DigitalOut I2C_ID_Bit3(p11);
jolyon 5:dc77c5967412 69
jolyon 8:e6e4eece90f7 70 //mode switch
jolyon 8:e6e4eece90f7 71 DigitalIn ModeSwitch1(p19);
jolyon 8:e6e4eece90f7 72 DigitalIn ModeSwitch2(p29);
jolyon 8:e6e4eece90f7 73 DigitalIn ModeSwitch3(p30);
jolyon 8:e6e4eece90f7 74
jolyon 11:729eb224dce6 75 //buttons
jolyon 11:729eb224dce6 76 DigitalIn Button1(p22);
jolyon 11:729eb224dce6 77 DigitalIn Button2(p23);
jolyon 11:729eb224dce6 78 DigitalIn Button3(p24);
jolyon 11:729eb224dce6 79 DigitalIn Button4(p8);
jolyon 8:e6e4eece90f7 80
jolyon 0:9d301ae51ecf 81 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 82
jolyon 0:9d301ae51ecf 83 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 84 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 85 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 86 //Analogue inputs are used to set thresholds for detector levels
jolyon 2:4a8eacbb3657 87 //AnalogIn RedTrimmer(p15);
jolyon 2:4a8eacbb3657 88 //AnalogIn GreenTrimmer(p16);
jolyon 2:4a8eacbb3657 89 //AnalogIn BlueTrimmer(p17);
jolyon 2:4a8eacbb3657 90 //AnalogIn HysTrimmer(p18);
jolyon 10:efe8585f7fa4 91
jolyon 10:efe8585f7fa4 92 AnalogIn Trimmer1(p15);
jolyon 10:efe8585f7fa4 93 AnalogIn Trimmer2(p16);
jolyon 10:efe8585f7fa4 94 AnalogIn Trimmer3(p17);
jolyon 10:efe8585f7fa4 95
jolyon 10:efe8585f7fa4 96 //-----------------------------------------------------
jolyon 0:9d301ae51ecf 97
jolyon 0:9d301ae51ecf 98 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 99 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 100 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 101 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 102 //final version uses I2C port
jolyon 8:e6e4eece90f7 103 //TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 104
jolyon 0:9d301ae51ecf 105 //set up I2C Communication to LCD
jolyon 8:e6e4eece90f7 106 I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 107
jolyon 0:9d301ae51ecf 108 //I2C Portexpander PCF8574 for LCD
jolyon 8:e6e4eece90f7 109 TextLCD_I2C lcd(&i2c_lcd, 0x40, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 110
jolyon 0:9d301ae51ecf 111 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 112
jolyon 2:4a8eacbb3657 113 //-------------------------------------------------------------------------------
jolyon 12:eab1bc88fe68 114 //------------ I2C EEProm -----------------------------------------------------
jolyon 12:eab1bc88fe68 115 //-------------------------------------------------------------------------------
jolyon 12:eab1bc88fe68 116
jolyon 12:eab1bc88fe68 117 //C24LCXX_I2C ConfigEEPROM(p9, p10, 0x01, p11, 400000); // Create an instance of the class C2424LCXX_I2C, p28: SDA, p29:SDL, p5: wired to WP input of 24LCxx, address: A3=0,A2=0,A=1, on 3.3V I2C bus
jolyon 12:eab1bc88fe68 118 //C24LCXX_I2C mem(p13, p14, 00000100, NC , 400000);
jolyon 12:eab1bc88fe68 119
jolyon 12:eab1bc88fe68 120
jolyon 12:eab1bc88fe68 121
jolyon 12:eab1bc88fe68 122 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 123 //------------ Create SPI bus -----------------------------------------------------
jolyon 2:4a8eacbb3657 124 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 125 //set up the SPI port for use as output driver
jolyon 2:4a8eacbb3657 126 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 127
jolyon 2:4a8eacbb3657 128 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 129
jolyon 2:4a8eacbb3657 130 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 131 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 132 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 133
jolyon 2:4a8eacbb3657 134 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 135
jolyon 0:9d301ae51ecf 136 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 137 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 138 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 139 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 140 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 141
jolyon 0:9d301ae51ecf 142
jolyon 0:9d301ae51ecf 143 typedef struct{
jolyon 0:9d301ae51ecf 144 uint16_t White;
jolyon 0:9d301ae51ecf 145 uint16_t Red;
jolyon 0:9d301ae51ecf 146 uint16_t Green;
jolyon 0:9d301ae51ecf 147 uint16_t Blue;
jolyon 0:9d301ae51ecf 148 }Colour;
jolyon 0:9d301ae51ecf 149
jolyon 0:9d301ae51ecf 150 Colour SensorData;
jolyon 0:9d301ae51ecf 151
jolyon 10:efe8585f7fa4 152
jolyon 10:efe8585f7fa4 153 //-------------------------------------------------------------------------------
jolyon 10:efe8585f7fa4 154 //------------ Serial Port for RS485 -----------------------------------------
jolyon 10:efe8585f7fa4 155 //-------------------------------------------------------------------------------
jolyon 10:efe8585f7fa4 156 Serial RS485(p26,p25);
jolyon 10:efe8585f7fa4 157 //DigitalOut RS485DIR(p21);
jolyon 10:efe8585f7fa4 158 char SendMessage = 0;
jolyon 10:efe8585f7fa4 159 char CommsData = 0;
jolyon 12:eab1bc88fe68 160
jolyon 12:eab1bc88fe68 161
jolyon 0:9d301ae51ecf 162 //-------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 163 //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 164 //outputs start at 0 torough to 15
jolyon 8:e6e4eece90f7 165 /*
jolyon 4:dce5fc58abe9 166 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 7:9c5bca0ac9d7 167 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 168 NOTUSED, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 169 NOTUSED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 170 NOTUSED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 171 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 172 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 173 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 174 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 175 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 176 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 177 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 178 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 179 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 180 NOTUSED, 15, //sensor 13
jolyon 4:dce5fc58abe9 181 NOTUSED, 15, //sensor 14
jolyon 4:dce5fc58abe9 182 NOTUSED, 15, //sensor 15
jolyon 3:b8218b61b0e2 183 };
jolyon 8:e6e4eece90f7 184 */
jolyon 11:729eb224dce6 185 /*
jolyon 8:e6e4eece90f7 186 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 8:e6e4eece90f7 187 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 188 GREEN_YELLOW, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 189 STD_RED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 190 STD_RED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 191 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 192 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 193 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 194 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 195 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 196 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 197 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 198 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 199 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 200 NOTUSED, 15, //sensor 13
jolyon 8:e6e4eece90f7 201 NOTUSED, 15, //sensor 14
jolyon 8:e6e4eece90f7 202 NOTUSED, 15, //sensor 15
jolyon 8:e6e4eece90f7 203 };
jolyon 11:729eb224dce6 204 */
jolyon 8:e6e4eece90f7 205
jolyon 5:dc77c5967412 206 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 11:729eb224dce6 207 STD_RED, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 11:729eb224dce6 208 STD_GREEN, 1, //sensor 1
jolyon 11:729eb224dce6 209 STD_BLUE, 2, //sensor 2
jolyon 11:729eb224dce6 210 STD_YELLOW, 3, //sensor 3
jolyon 11:729eb224dce6 211 GREEN_YELLOW, 4, //sensor 4
jolyon 11:729eb224dce6 212 RGB, 5, //sensor 5
jolyon 11:729eb224dce6 213 STD_RED, 6, //sensor 6
jolyon 5:dc77c5967412 214 STD_GREEN, 7, //sensor 7
jolyon 11:729eb224dce6 215 STD_RED, 8, //sensor 8
jolyon 11:729eb224dce6 216 STD_RED, 9, //sensor 9
jolyon 11:729eb224dce6 217 STD_RED, 10, //sensor 10
jolyon 11:729eb224dce6 218 STD_RED, 11, //sensor 11
jolyon 11:729eb224dce6 219 STD_RED, 12, //sensor 12
jolyon 11:729eb224dce6 220 STD_RED, 13, //sensor 13
jolyon 11:729eb224dce6 221 STD_RED, 14, //sensor 14
jolyon 11:729eb224dce6 222 RGB, 15, //sensor 15
jolyon 5:dc77c5967412 223 };
jolyon 11:729eb224dce6 224
jolyon 6:6346ef2b4638 225 //new config trpe
jolyon 6:6346ef2b4638 226
jolyon 12:eab1bc88fe68 227 //LED Output requirement :type is defined here
jolyon 12:eab1bc88fe68 228 uint8_t OutputCount[7]={
jolyon 12:eab1bc88fe68 229 0, //NOTUSED
jolyon 12:eab1bc88fe68 230 1, //STD_RED
jolyon 12:eab1bc88fe68 231 1, //STD_GREEN
jolyon 12:eab1bc88fe68 232 1, //STD_BLUE
jolyon 12:eab1bc88fe68 233 1, //STD_YELLOW
jolyon 12:eab1bc88fe68 234 2, //GREEN_YELLOW
jolyon 12:eab1bc88fe68 235 3}; //RGB
jolyon 6:6346ef2b4638 236
jolyon 3:b8218b61b0e2 237
jolyon 3:b8218b61b0e2 238 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 239
jolyon 3:b8218b61b0e2 240 uint16_t OutputData = 0; //word containing the current output states of the board
jolyon 8:e6e4eece90f7 241 uint16_t OutputDataB = 0x8000;// test roll
jolyon 3:b8218b61b0e2 242
jolyon 3:b8218b61b0e2 243 uint8_t SensorNumber = 0; //current sensor number
jolyon 3:b8218b61b0e2 244 char SensorResult = 0; //detected colour
jolyon 3:b8218b61b0e2 245
jolyon 6:6346ef2b4638 246 uint8_t ConfigureSensor;
jolyon 0:9d301ae51ecf 247
jolyon 11:729eb224dce6 248 uint8_t DisplayScreen = 0;
jolyon 11:729eb224dce6 249 uint8_t DisplaySensorType;
jolyon 12:eab1bc88fe68 250 uint8_t DisplaySensorOutput = 0;
jolyon 11:729eb224dce6 251 uint8_t ButtonState = 0;
jolyon 11:729eb224dce6 252
jolyon 11:729eb224dce6 253 char LEDTypes[7][6+1]={
jolyon 11:729eb224dce6 254 "SPARE ", //0
jolyon 11:729eb224dce6 255 "RED ", //1
jolyon 11:729eb224dce6 256 "GREEN ", //2
jolyon 11:729eb224dce6 257 "BLUE ", //3
jolyon 11:729eb224dce6 258 "YELLOW", //4
jolyon 11:729eb224dce6 259 "GN/YEL", //5
jolyon 11:729eb224dce6 260 "RGB "
jolyon 11:729eb224dce6 261 }; //6
jolyon 11:729eb224dce6 262
jolyon 11:729eb224dce6 263
jolyon 0:9d301ae51ecf 264 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 265 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 266
jolyon 3:b8218b61b0e2 267 uint8_t SensorConfig = 0x30;
jolyon 0:9d301ae51ecf 268 // bit description setting
jolyon 0:9d301ae51ecf 269 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 270 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 271 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 272 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 273 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 274 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 275 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 276 // 7 N/F 0 0
jolyon 6:6346ef2b4638 277 //------------TSC Stuff----------------
jolyon 6:6346ef2b4638 278
jolyon 6:6346ef2b4638 279 uint16_t Red = 1;
jolyon 6:6346ef2b4638 280 uint16_t Green = 2;
jolyon 6:6346ef2b4638 281 uint16_t Blue = 3;
jolyon 6:6346ef2b4638 282 uint16_t White = 4;
jolyon 6:6346ef2b4638 283
jolyon 6:6346ef2b4638 284 uint32_t Temp = 0;
jolyon 6:6346ef2b4638 285
jolyon 6:6346ef2b4638 286 uint16_t RedProp = 0;
jolyon 6:6346ef2b4638 287 uint16_t GreenProp = 0;
jolyon 6:6346ef2b4638 288 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 289
jolyon 0:9d301ae51ecf 290
jolyon 2:4a8eacbb3657 291
jolyon 2:4a8eacbb3657 292 //working thresholds from pot inputs, scaled 0-100
jolyon 2:4a8eacbb3657 293 uint16_t RedThreshold = 0;
jolyon 2:4a8eacbb3657 294 uint16_t GreenThreshold = 0;
jolyon 2:4a8eacbb3657 295 uint16_t BlueThreshold = 0;
jolyon 2:4a8eacbb3657 296 uint16_t Hysteresis = 0;
jolyon 2:4a8eacbb3657 297
jolyon 10:efe8585f7fa4 298
jolyon 10:efe8585f7fa4 299 uint16_t SingleThreshold = 0;
jolyon 10:efe8585f7fa4 300 uint16_t MixRThreshold = 0;
jolyon 10:efe8585f7fa4 301 uint16_t MixGThreshold = 0;
jolyon 10:efe8585f7fa4 302
jolyon 6:6346ef2b4638 303 //------------------------- filter routine if required -------------------------------
jolyon 0:9d301ae51ecf 304 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 305 {
jolyon 0:9d301ae51ecf 306 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 307 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 308 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 309 *Acc = Temp;
jolyon 0:9d301ae51ecf 310 return *Acc >> factor;
jolyon 0:9d301ae51ecf 311 }
jolyon 0:9d301ae51ecf 312
jolyon 0:9d301ae51ecf 313
jolyon 0:9d301ae51ecf 314 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 315 {
jolyon 0:9d301ae51ecf 316 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 317 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 318
jolyon 6:6346ef2b4638 319 for (ConfigureSensor = 0; ConfigureSensor < 16; ConfigureSensor++)
jolyon 6:6346ef2b4638 320 {
jolyon 9:077d1ad96bca 321 if((Config[ConfigureSensor <<1]) != NOTUSED)
jolyon 6:6346ef2b4638 322 {
jolyon 6:6346ef2b4638 323 SelectSensorPort(ConfigureSensor); //set up H/W mux for this sensor
jolyon 6:6346ef2b4638 324
jolyon 6:6346ef2b4638 325 char id_regval[1] = {146};
jolyon 6:6346ef2b4638 326 char data[1] = {0};
jolyon 6:6346ef2b4638 327 i2c.write(sensor_addr,id_regval,1, true);
jolyon 6:6346ef2b4638 328 i2c.read(sensor_addr,data,1,false); // Initialize color sensor
jolyon 6:6346ef2b4638 329
jolyon 6:6346ef2b4638 330 char enable_register[2] = {128,3}; //enable the sensor
jolyon 6:6346ef2b4638 331 i2c.write(sensor_addr,enable_register,2,false);
jolyon 6:6346ef2b4638 332
jolyon 6:6346ef2b4638 333 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 6:6346ef2b4638 334 i2c.write(sensor_addr,timing_register,2,false);
jolyon 6:6346ef2b4638 335
jolyon 6:6346ef2b4638 336 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 6:6346ef2b4638 337 i2c.write(sensor_addr,control_register,2,false);
jolyon 6:6346ef2b4638 338 }
jolyon 0:9d301ae51ecf 339 }
jolyon 6:6346ef2b4638 340 }
jolyon 0:9d301ae51ecf 341
jolyon 0:9d301ae51ecf 342
jolyon 1:d99dad8a1f50 343 Colour GetSensorData(char SensorNumber)
jolyon 1:d99dad8a1f50 344 {
jolyon 1:d99dad8a1f50 345 Colour NewData;
jolyon 1:d99dad8a1f50 346 char AddrReg[1] = {0};
jolyon 1:d99dad8a1f50 347 char DataReg[5] ={0,0,0,0,0};
jolyon 5:dc77c5967412 348
jolyon 5:dc77c5967412 349
jolyon 5:dc77c5967412 350 SelectSensorPort(SensorNumber);
jolyon 1:d99dad8a1f50 351
jolyon 1:d99dad8a1f50 352 NewData.White = 0;
jolyon 1:d99dad8a1f50 353 NewData.Red = 0;
jolyon 1:d99dad8a1f50 354 NewData.Green = 0;
jolyon 1:d99dad8a1f50 355 NewData.Blue = 0;
jolyon 1:d99dad8a1f50 356
jolyon 1:d99dad8a1f50 357 AddrReg[0] = SENSOR_WHITE_REG;
jolyon 1:d99dad8a1f50 358 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 359 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 360 NewData.White = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 361
jolyon 1:d99dad8a1f50 362 AddrReg[0] = SENSOR_RED_REG;
jolyon 1:d99dad8a1f50 363 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 364 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 365 NewData.Red = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 366
jolyon 1:d99dad8a1f50 367 AddrReg[0] = SENSOR_GREEN_REG;
jolyon 1:d99dad8a1f50 368 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 369 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 370 NewData.Green = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 371
jolyon 1:d99dad8a1f50 372 AddrReg[0] = SENSOR_BLUE_REG;
jolyon 1:d99dad8a1f50 373 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 374 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 375 NewData.Blue = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 376
jolyon 1:d99dad8a1f50 377 return NewData;
jolyon 1:d99dad8a1f50 378 }
jolyon 1:d99dad8a1f50 379
jolyon 8:e6e4eece90f7 380 uint8_t GetModeSwitch(void)
jolyon 8:e6e4eece90f7 381 {
jolyon 8:e6e4eece90f7 382 uint8_t Result = 0;
jolyon 8:e6e4eece90f7 383
jolyon 8:e6e4eece90f7 384 if (!ModeSwitch1)
jolyon 8:e6e4eece90f7 385 {
jolyon 8:e6e4eece90f7 386 Result += 1;
jolyon 8:e6e4eece90f7 387 }
jolyon 8:e6e4eece90f7 388
jolyon 8:e6e4eece90f7 389 if (!ModeSwitch2)
jolyon 8:e6e4eece90f7 390 {
jolyon 8:e6e4eece90f7 391 Result += 2;
jolyon 8:e6e4eece90f7 392 }
jolyon 8:e6e4eece90f7 393
jolyon 8:e6e4eece90f7 394 if (!ModeSwitch3)
jolyon 8:e6e4eece90f7 395 {
jolyon 8:e6e4eece90f7 396 Result += 4;
jolyon 8:e6e4eece90f7 397 }
jolyon 8:e6e4eece90f7 398
jolyon 8:e6e4eece90f7 399 return Result;
jolyon 8:e6e4eece90f7 400 }
jolyon 8:e6e4eece90f7 401
jolyon 11:729eb224dce6 402
jolyon 11:729eb224dce6 403 uint8_t GetButtonState(void)
jolyon 11:729eb224dce6 404 {
jolyon 11:729eb224dce6 405 uint8_t ButtonStateNew = 0;
jolyon 11:729eb224dce6 406 if (Button1 == 1)
jolyon 11:729eb224dce6 407 {
jolyon 11:729eb224dce6 408 ButtonStateNew = 1;
jolyon 11:729eb224dce6 409 }
jolyon 11:729eb224dce6 410
jolyon 11:729eb224dce6 411 if (Button2 == 1)
jolyon 11:729eb224dce6 412 {
jolyon 11:729eb224dce6 413 ButtonStateNew = 2;
jolyon 11:729eb224dce6 414 }
jolyon 11:729eb224dce6 415
jolyon 11:729eb224dce6 416 if (Button3 == 1)
jolyon 11:729eb224dce6 417 {
jolyon 11:729eb224dce6 418 ButtonStateNew = 3;
jolyon 11:729eb224dce6 419 }
jolyon 11:729eb224dce6 420 if (Button4 == 1)
jolyon 11:729eb224dce6 421 {
jolyon 11:729eb224dce6 422 ButtonStateNew = 4;
jolyon 11:729eb224dce6 423 }
jolyon 11:729eb224dce6 424
jolyon 11:729eb224dce6 425 if(ButtonStateNew != 0)
jolyon 11:729eb224dce6 426 {
jolyon 11:729eb224dce6 427 if(ButtonState == 0)
jolyon 11:729eb224dce6 428 {
jolyon 11:729eb224dce6 429 ButtonState = (ButtonStateNew | NEWBUTTON);
jolyon 11:729eb224dce6 430 }
jolyon 11:729eb224dce6 431 else
jolyon 11:729eb224dce6 432 {
jolyon 11:729eb224dce6 433 ButtonState = ButtonStateNew;
jolyon 11:729eb224dce6 434 }
jolyon 11:729eb224dce6 435 }
jolyon 11:729eb224dce6 436 else
jolyon 11:729eb224dce6 437 {
jolyon 11:729eb224dce6 438 ButtonState = 0;
jolyon 11:729eb224dce6 439 }
jolyon 11:729eb224dce6 440
jolyon 11:729eb224dce6 441
jolyon 11:729eb224dce6 442 return ButtonState;
jolyon 11:729eb224dce6 443 }
jolyon 11:729eb224dce6 444
jolyon 11:729eb224dce6 445
jolyon 2:4a8eacbb3657 446 void InitOutputs(void)
jolyon 2:4a8eacbb3657 447 {
jolyon 2:4a8eacbb3657 448 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 449 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 450 // Set all 8 Port B bits to output direction
jolyon 2:4a8eacbb3657 451 chip.direction(PORT_B, 0x00);
jolyon 2:4a8eacbb3657 452 }
jolyon 0:9d301ae51ecf 453
jolyon 2:4a8eacbb3657 454 void SetOutputBit(char bit)
jolyon 2:4a8eacbb3657 455 {
jolyon 2:4a8eacbb3657 456 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 457 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 458
jolyon 2:4a8eacbb3657 459 OutputWord <<= bit;
jolyon 4:dce5fc58abe9 460 OutputData |= OutputWord;
jolyon 4:dce5fc58abe9 461
jolyon 4:dce5fc58abe9 462 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 463 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 464
jolyon 4:dce5fc58abe9 465 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 466 //PortA |=BitA;
jolyon 4:dce5fc58abe9 467 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 468
jolyon 4:dce5fc58abe9 469 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 470 //PortB |=BitB;
jolyon 4:dce5fc58abe9 471 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 472 }
jolyon 2:4a8eacbb3657 473
jolyon 2:4a8eacbb3657 474 void ClearOutputBit(char bit)
jolyon 2:4a8eacbb3657 475 {
jolyon 2:4a8eacbb3657 476 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 477 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 478
jolyon 2:4a8eacbb3657 479 OutputWord <<= bit;
jolyon 2:4a8eacbb3657 480 OutputWord = ~OutputWord;
jolyon 4:dce5fc58abe9 481 OutputWord &= OutputWord;
jolyon 2:4a8eacbb3657 482
jolyon 4:dce5fc58abe9 483 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 484 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 485
jolyon 4:dce5fc58abe9 486 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 487 //PortA &=BitA;
jolyon 4:dce5fc58abe9 488 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 489
jolyon 4:dce5fc58abe9 490 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 491 //PortB &=BitB;
jolyon 4:dce5fc58abe9 492 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 493 }
jolyon 2:4a8eacbb3657 494
jolyon 2:4a8eacbb3657 495 void WriteOutputPort(uint16_t FullPort)
jolyon 2:4a8eacbb3657 496 {
jolyon 2:4a8eacbb3657 497 chip.write(PORT_A, FullPort & 0xFF);
jolyon 2:4a8eacbb3657 498 chip.write(PORT_B, FullPort >> 8);
jolyon 2:4a8eacbb3657 499 }
jolyon 2:4a8eacbb3657 500
jolyon 2:4a8eacbb3657 501
jolyon 2:4a8eacbb3657 502 void GetThresholds(void)
jolyon 2:4a8eacbb3657 503 {
jolyon 2:4a8eacbb3657 504 //Load the pot values ant make 0 to 100% value
jolyon 2:4a8eacbb3657 505
jolyon 10:efe8585f7fa4 506 SingleThreshold = 50 - ( Trimmer1.read_u16()/1310 );
jolyon 10:efe8585f7fa4 507 MixRThreshold = 50 - ( Trimmer2.read_u16() /1310 );
jolyon 10:efe8585f7fa4 508 MixGThreshold = 50 - ( Trimmer3.read_u16() /1310 );
jolyon 10:efe8585f7fa4 509 //Hysteresis = HysTrimmer.read_u16() * 100 >> 11;
jolyon 10:efe8585f7fa4 510
jolyon 10:efe8585f7fa4 511
jolyon 10:efe8585f7fa4 512 RedThreshold = 45; //default for yellow detect (red)
jolyon 10:efe8585f7fa4 513 GreenThreshold = 35;//default for yellow detect (green)
jolyon 10:efe8585f7fa4 514 BlueThreshold = 10;//not used
jolyon 2:4a8eacbb3657 515 Hysteresis = 5;
jolyon 2:4a8eacbb3657 516 }
jolyon 0:9d301ae51ecf 517
jolyon 5:dc77c5967412 518 void SelectSensorPort(uint8_t SensorID)
jolyon 5:dc77c5967412 519 {
jolyon 5:dc77c5967412 520
jolyon 5:dc77c5967412 521 if ( SensorID < 16)
jolyon 5:dc77c5967412 522 {
jolyon 5:dc77c5967412 523 if((SensorID & 0x01) == 0x01)
jolyon 5:dc77c5967412 524 {
jolyon 5:dc77c5967412 525 I2C_ID_Bit0 = 1;
jolyon 5:dc77c5967412 526 }
jolyon 5:dc77c5967412 527 else
jolyon 5:dc77c5967412 528 {
jolyon 5:dc77c5967412 529 I2C_ID_Bit0 = 0;
jolyon 5:dc77c5967412 530 }
jolyon 5:dc77c5967412 531
jolyon 5:dc77c5967412 532 if((SensorID & 0x02) == 0x02)
jolyon 5:dc77c5967412 533 {
jolyon 5:dc77c5967412 534 I2C_ID_Bit1 = 1;
jolyon 5:dc77c5967412 535 }
jolyon 5:dc77c5967412 536 else
jolyon 5:dc77c5967412 537 {
jolyon 5:dc77c5967412 538 I2C_ID_Bit1 = 0;
jolyon 5:dc77c5967412 539 }
jolyon 5:dc77c5967412 540
jolyon 5:dc77c5967412 541 if((SensorID & 0x04) == 0x04)
jolyon 5:dc77c5967412 542 {
jolyon 5:dc77c5967412 543 I2C_ID_Bit2 = 1;
jolyon 5:dc77c5967412 544 }
jolyon 5:dc77c5967412 545 else
jolyon 5:dc77c5967412 546 {
jolyon 5:dc77c5967412 547 I2C_ID_Bit2 = 0;
jolyon 5:dc77c5967412 548 }
jolyon 5:dc77c5967412 549
jolyon 5:dc77c5967412 550 if((SensorID & 0x08) == 0x08)
jolyon 5:dc77c5967412 551 {
jolyon 5:dc77c5967412 552 I2C_ID_Bit3 = 1;
jolyon 5:dc77c5967412 553 }
jolyon 5:dc77c5967412 554 else
jolyon 5:dc77c5967412 555 {
jolyon 5:dc77c5967412 556 I2C_ID_Bit3 = 0;
jolyon 5:dc77c5967412 557 }
jolyon 5:dc77c5967412 558 }
jolyon 5:dc77c5967412 559 }
jolyon 5:dc77c5967412 560
jolyon 6:6346ef2b4638 561 void ScaleColours(void)
jolyon 6:6346ef2b4638 562 {
jolyon 6:6346ef2b4638 563 //make 12 bit only
jolyon 6:6346ef2b4638 564 Red >>=4;
jolyon 6:6346ef2b4638 565 Green >>=4;
jolyon 6:6346ef2b4638 566 Blue >>=4;
jolyon 6:6346ef2b4638 567 White >>=4;
jolyon 6:6346ef2b4638 568 }
jolyon 6:6346ef2b4638 569
jolyon 3:b8218b61b0e2 570
jolyon 3:b8218b61b0e2 571 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 572 {
jolyon 3:b8218b61b0e2 573 lcd.locate(0, 0);
jolyon 7:9c5bca0ac9d7 574 lcd.printf("R%02i G%02i B%02i W%03i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 575 lcd.locate(0, 1);
jolyon 8:e6e4eece90f7 576 //lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 10:efe8585f7fa4 577 lcd.printf("S%02i R%02i G%02i D%01i ",SingleThreshold, MixRThreshold, MixGThreshold, GetModeSwitch() );
jolyon 3:b8218b61b0e2 578 }
jolyon 3:b8218b61b0e2 579
jolyon 3:b8218b61b0e2 580
jolyon 3:b8218b61b0e2 581 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 582 {
jolyon 3:b8218b61b0e2 583 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 584
jolyon 3:b8218b61b0e2 585 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 586 {
jolyon 3:b8218b61b0e2 587 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 588 {
jolyon 3:b8218b61b0e2 589 case STD_RED:
jolyon 3:b8218b61b0e2 590 {
jolyon 10:efe8585f7fa4 591 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 592 {
jolyon 3:b8218b61b0e2 593 LEDColour = RED;
jolyon 3:b8218b61b0e2 594 }
jolyon 3:b8218b61b0e2 595 }
jolyon 3:b8218b61b0e2 596 break;
jolyon 3:b8218b61b0e2 597
jolyon 3:b8218b61b0e2 598 case STD_GREEN:
jolyon 3:b8218b61b0e2 599 {
jolyon 10:efe8585f7fa4 600 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 601 {
jolyon 3:b8218b61b0e2 602 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 603 }
jolyon 3:b8218b61b0e2 604 }
jolyon 3:b8218b61b0e2 605 break;
jolyon 3:b8218b61b0e2 606
jolyon 3:b8218b61b0e2 607 case STD_BLUE:
jolyon 3:b8218b61b0e2 608 {
jolyon 10:efe8585f7fa4 609 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 610 {
jolyon 3:b8218b61b0e2 611 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 612 }
jolyon 3:b8218b61b0e2 613 }
jolyon 3:b8218b61b0e2 614 break;
jolyon 3:b8218b61b0e2 615
jolyon 3:b8218b61b0e2 616 case STD_YELLOW:
jolyon 3:b8218b61b0e2 617 {
jolyon 10:efe8585f7fa4 618 if ((RedProp - GreenProp) < (2* SingleThreshold)) //check it is not red!
jolyon 9:077d1ad96bca 619 {
jolyon 10:efe8585f7fa4 620 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 9:077d1ad96bca 621 {
jolyon 9:077d1ad96bca 622 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 623 }
jolyon 3:b8218b61b0e2 624 }
jolyon 3:b8218b61b0e2 625 }
jolyon 3:b8218b61b0e2 626 break;
jolyon 3:b8218b61b0e2 627
jolyon 3:b8218b61b0e2 628 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 629 {
jolyon 9:077d1ad96bca 630
jolyon 10:efe8585f7fa4 631 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 632 { //pretty sure it's Yellow
jolyon 9:077d1ad96bca 633 if ((RedProp - GreenProp) < 60) //check it is not red!
jolyon 9:077d1ad96bca 634 {
jolyon 9:077d1ad96bca 635 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 636 }
jolyon 3:b8218b61b0e2 637 }
jolyon 3:b8218b61b0e2 638 else
jolyon 3:b8218b61b0e2 639 {
jolyon 10:efe8585f7fa4 640 if( (GreenProp > (MixGThreshold+Hysteresis)) && (RedProp <=(MixRThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 641 { //pretty sure it's green
jolyon 3:b8218b61b0e2 642 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 643 }
jolyon 3:b8218b61b0e2 644 }
jolyon 3:b8218b61b0e2 645 }
jolyon 3:b8218b61b0e2 646 break;
jolyon 3:b8218b61b0e2 647
jolyon 3:b8218b61b0e2 648 case RGB:
jolyon 3:b8218b61b0e2 649 {
jolyon 10:efe8585f7fa4 650 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 651 {
jolyon 3:b8218b61b0e2 652 LEDColour = RED;
jolyon 3:b8218b61b0e2 653 }
jolyon 3:b8218b61b0e2 654 else
jolyon 3:b8218b61b0e2 655 {
jolyon 10:efe8585f7fa4 656 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 657 {
jolyon 3:b8218b61b0e2 658 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 659 }
jolyon 3:b8218b61b0e2 660 else
jolyon 3:b8218b61b0e2 661 {
jolyon 10:efe8585f7fa4 662 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 663 {
jolyon 3:b8218b61b0e2 664 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 665 }
jolyon 3:b8218b61b0e2 666 }
jolyon 3:b8218b61b0e2 667 }
jolyon 3:b8218b61b0e2 668 }
jolyon 3:b8218b61b0e2 669 break;
jolyon 3:b8218b61b0e2 670
jolyon 3:b8218b61b0e2 671 case NOTUSED:
jolyon 3:b8218b61b0e2 672 default:
jolyon 3:b8218b61b0e2 673 {
jolyon 3:b8218b61b0e2 674 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 675 }
jolyon 3:b8218b61b0e2 676 break;
jolyon 3:b8218b61b0e2 677 }
jolyon 3:b8218b61b0e2 678 }
jolyon 3:b8218b61b0e2 679 return LEDColour;
jolyon 3:b8218b61b0e2 680 }
jolyon 3:b8218b61b0e2 681
jolyon 3:b8218b61b0e2 682
jolyon 4:dce5fc58abe9 683 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 684 {
jolyon 4:dce5fc58abe9 685 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 686 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 687 {
jolyon 4:dce5fc58abe9 688 case STD_RED:
jolyon 4:dce5fc58abe9 689 case STD_GREEN:
jolyon 4:dce5fc58abe9 690 case STD_BLUE:
jolyon 4:dce5fc58abe9 691 case STD_YELLOW:
jolyon 4:dce5fc58abe9 692 {
jolyon 4:dce5fc58abe9 693 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 694 {
jolyon 4:dce5fc58abe9 695 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 696 }
jolyon 4:dce5fc58abe9 697 else
jolyon 4:dce5fc58abe9 698 {
jolyon 4:dce5fc58abe9 699 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 700 }
jolyon 4:dce5fc58abe9 701 }
jolyon 4:dce5fc58abe9 702 break;
jolyon 4:dce5fc58abe9 703
jolyon 4:dce5fc58abe9 704 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 705 {
jolyon 4:dce5fc58abe9 706 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 707 {
jolyon 4:dce5fc58abe9 708 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 709 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 710 }
jolyon 4:dce5fc58abe9 711 else
jolyon 4:dce5fc58abe9 712 {
jolyon 4:dce5fc58abe9 713 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 714 {
jolyon 4:dce5fc58abe9 715 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 716 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 717 }
jolyon 4:dce5fc58abe9 718 else
jolyon 4:dce5fc58abe9 719 {
jolyon 4:dce5fc58abe9 720 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 721 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 722 }
jolyon 4:dce5fc58abe9 723 }
jolyon 4:dce5fc58abe9 724 }
jolyon 4:dce5fc58abe9 725 break;
jolyon 4:dce5fc58abe9 726
jolyon 4:dce5fc58abe9 727 case RGB:
jolyon 4:dce5fc58abe9 728 {
jolyon 4:dce5fc58abe9 729 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 730 {
jolyon 4:dce5fc58abe9 731 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 732 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 733 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 734 }
jolyon 4:dce5fc58abe9 735 else
jolyon 4:dce5fc58abe9 736 {
jolyon 4:dce5fc58abe9 737 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 738 {
jolyon 4:dce5fc58abe9 739 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 740 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 741 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 742 }
jolyon 4:dce5fc58abe9 743 else
jolyon 4:dce5fc58abe9 744 {
jolyon 4:dce5fc58abe9 745 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 746 {
jolyon 4:dce5fc58abe9 747 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 748 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 749 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 750 }
jolyon 4:dce5fc58abe9 751 else
jolyon 4:dce5fc58abe9 752 {
jolyon 4:dce5fc58abe9 753 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 754 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 755 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 756 }
jolyon 4:dce5fc58abe9 757
jolyon 4:dce5fc58abe9 758 }
jolyon 4:dce5fc58abe9 759 }
jolyon 4:dce5fc58abe9 760 }
jolyon 4:dce5fc58abe9 761 break;
jolyon 4:dce5fc58abe9 762
jolyon 4:dce5fc58abe9 763 default:
jolyon 4:dce5fc58abe9 764 {
jolyon 4:dce5fc58abe9 765 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 766 }
jolyon 4:dce5fc58abe9 767 break;
jolyon 4:dce5fc58abe9 768 } //end switch
jolyon 4:dce5fc58abe9 769 }
jolyon 4:dce5fc58abe9 770
jolyon 4:dce5fc58abe9 771 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 772 {
jolyon 8:e6e4eece90f7 773 RedLed = 1;
jolyon 8:e6e4eece90f7 774 GreenLed = 1;
jolyon 8:e6e4eece90f7 775 BlueLed = 1;
jolyon 8:e6e4eece90f7 776 YellowLed = 1;
jolyon 4:dce5fc58abe9 777 switch (WhichColour)
jolyon 4:dce5fc58abe9 778 {
jolyon 4:dce5fc58abe9 779 case RED:
jolyon 4:dce5fc58abe9 780 {
jolyon 8:e6e4eece90f7 781 RedLed = 0;
jolyon 4:dce5fc58abe9 782 }
jolyon 4:dce5fc58abe9 783 break;
jolyon 4:dce5fc58abe9 784
jolyon 4:dce5fc58abe9 785 case GREEN:
jolyon 4:dce5fc58abe9 786 {
jolyon 8:e6e4eece90f7 787 GreenLed = 0;
jolyon 4:dce5fc58abe9 788 }
jolyon 4:dce5fc58abe9 789 break;
jolyon 4:dce5fc58abe9 790
jolyon 4:dce5fc58abe9 791 case BLUE:
jolyon 4:dce5fc58abe9 792 {
jolyon 8:e6e4eece90f7 793 BlueLed = 0;
jolyon 4:dce5fc58abe9 794 }
jolyon 4:dce5fc58abe9 795 break;
jolyon 4:dce5fc58abe9 796
jolyon 4:dce5fc58abe9 797 case YELLOW:
jolyon 4:dce5fc58abe9 798 {
jolyon 8:e6e4eece90f7 799 YellowLed = 0;
jolyon 4:dce5fc58abe9 800 }
jolyon 4:dce5fc58abe9 801 break;
jolyon 4:dce5fc58abe9 802
jolyon 4:dce5fc58abe9 803 default:
jolyon 4:dce5fc58abe9 804 {
jolyon 4:dce5fc58abe9 805 }
jolyon 4:dce5fc58abe9 806 break;
jolyon 4:dce5fc58abe9 807 }
jolyon 4:dce5fc58abe9 808 }
jolyon 4:dce5fc58abe9 809
jolyon 12:eab1bc88fe68 810
jolyon 12:eab1bc88fe68 811 void SaveSensorData(void)
jolyon 12:eab1bc88fe68 812 {
jolyon 12:eab1bc88fe68 813 //nothing here right now
jolyon 12:eab1bc88fe68 814 }
jolyon 12:eab1bc88fe68 815
jolyon 12:eab1bc88fe68 816
jolyon 12:eab1bc88fe68 817
jolyon 12:eab1bc88fe68 818
jolyon 10:efe8585f7fa4 819 void InitCommsPort(void)
jolyon 10:efe8585f7fa4 820 {
jolyon 10:efe8585f7fa4 821 Serial RS485(p26,p25);
jolyon 10:efe8585f7fa4 822 RS485.baud(19200);
jolyon 10:efe8585f7fa4 823 RS485.format(8,RS485.None,1); //8 data, no Parity, 1 stop bit
jolyon 10:efe8585f7fa4 824 //set up the other stuff!
jolyon 10:efe8585f7fa4 825 LPC_PINCON->PINSEL4 &= 0x0ffff;
jolyon 10:efe8585f7fa4 826 LPC_PINCON->PINSEL4 |= 0x0AAAA;
jolyon 10:efe8585f7fa4 827
jolyon 10:efe8585f7fa4 828 LPC_UART1->RS485CTRL = (1<<3)|(1<<4)|(1<<5);
jolyon 10:efe8585f7fa4 829 LPC_UART1->RS485DLY = 1;
jolyon 10:efe8585f7fa4 830 RS485.putc('*');
jolyon 10:efe8585f7fa4 831 }
jolyon 10:efe8585f7fa4 832
jolyon 10:efe8585f7fa4 833 void HandleRS485(void)
jolyon 10:efe8585f7fa4 834 {
jolyon 10:efe8585f7fa4 835 //check for character in buffer
jolyon 10:efe8585f7fa4 836 if (RS485.readable())
jolyon 10:efe8585f7fa4 837 {
jolyon 10:efe8585f7fa4 838 CommsData = RS485.getc();
jolyon 10:efe8585f7fa4 839 if (CommsData== '*') //check for correct request
jolyon 10:efe8585f7fa4 840 {
jolyon 10:efe8585f7fa4 841 RS485.putc('*');
jolyon 10:efe8585f7fa4 842 CommsData = (char)(OutputData >> 8);
jolyon 10:efe8585f7fa4 843 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 844 CommsData = (char)(OutputData & 0xFF);
jolyon 10:efe8585f7fa4 845 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 846 }
jolyon 10:efe8585f7fa4 847 }
jolyon 10:efe8585f7fa4 848 }
jolyon 11:729eb224dce6 849
jolyon 11:729eb224dce6 850
jolyon 11:729eb224dce6 851 void HandleDisplay(void)
jolyon 11:729eb224dce6 852 {
jolyon 11:729eb224dce6 853 uint8_t CurrentButton =0;
jolyon 11:729eb224dce6 854 /*
jolyon 11:729eb224dce6 855 #define NEWBUTTON 0x80
jolyon 11:729eb224dce6 856 #define UPBUTTON 0x01
jolyon 11:729eb224dce6 857 #define DOWNBUTTON 0x02
jolyon 11:729eb224dce6 858 #define LEFTBUTTON 0x03
jolyon 11:729eb224dce6 859 #define RIGHTBUTTON 0x04
jolyon 11:729eb224dce6 860 #define TICKBUTTON 0x05
jolyon 11:729eb224dce6 861 */
jolyon 11:729eb224dce6 862 CurrentButton = GetButtonState();
jolyon 11:729eb224dce6 863
jolyon 11:729eb224dce6 864 //------------------- select the sensor ----------------
jolyon 11:729eb224dce6 865 if (CurrentButton == (UPBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 866 {
jolyon 11:729eb224dce6 867 DisplayScreen++;
jolyon 12:eab1bc88fe68 868 if (DisplayScreen == 18)
jolyon 11:729eb224dce6 869 {
jolyon 11:729eb224dce6 870 DisplayScreen = 0;
jolyon 11:729eb224dce6 871 }
jolyon 11:729eb224dce6 872 }
jolyon 11:729eb224dce6 873 else
jolyon 11:729eb224dce6 874 {
jolyon 11:729eb224dce6 875 if (CurrentButton == (DOWNBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 876 {
jolyon 11:729eb224dce6 877 DisplayScreen--;
jolyon 11:729eb224dce6 878 if (DisplayScreen == 255)
jolyon 11:729eb224dce6 879 {
jolyon 11:729eb224dce6 880 DisplayScreen = 16;
jolyon 11:729eb224dce6 881 }
jolyon 11:729eb224dce6 882 }
jolyon 11:729eb224dce6 883 }
jolyon 11:729eb224dce6 884
jolyon 12:eab1bc88fe68 885 //check for config save
jolyon 12:eab1bc88fe68 886 if (DisplayScreen == 17)
jolyon 12:eab1bc88fe68 887 {
jolyon 12:eab1bc88fe68 888 lcd.locate(0, 0);
jolyon 12:eab1bc88fe68 889 lcd.printf("Left to save");
jolyon 12:eab1bc88fe68 890
jolyon 12:eab1bc88fe68 891 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 12:eab1bc88fe68 892 {
jolyon 12:eab1bc88fe68 893 SaveSensorData();
jolyon 12:eab1bc88fe68 894 }
jolyon 12:eab1bc88fe68 895 }
jolyon 12:eab1bc88fe68 896
jolyon 12:eab1bc88fe68 897
jolyon 11:729eb224dce6 898
jolyon 11:729eb224dce6 899 //------------------- select the sensor type ----------------
jolyon 11:729eb224dce6 900 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 11:729eb224dce6 901
jolyon 11:729eb224dce6 902 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 903 {
jolyon 11:729eb224dce6 904 if (DisplaySensorType < 6)
jolyon 11:729eb224dce6 905 {
jolyon 11:729eb224dce6 906 DisplaySensorType++;
jolyon 11:729eb224dce6 907 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 11:729eb224dce6 908 }
jolyon 11:729eb224dce6 909 }
jolyon 11:729eb224dce6 910 else
jolyon 11:729eb224dce6 911 {
jolyon 11:729eb224dce6 912 if (CurrentButton == (LEFTBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 913 {
jolyon 11:729eb224dce6 914 if (DisplaySensorType > 0)
jolyon 11:729eb224dce6 915 {
jolyon 11:729eb224dce6 916 DisplaySensorType--;
jolyon 11:729eb224dce6 917 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 11:729eb224dce6 918 }
jolyon 11:729eb224dce6 919 }
jolyon 11:729eb224dce6 920 }
jolyon 11:729eb224dce6 921
jolyon 12:eab1bc88fe68 922 //update output list
jolyon 12:eab1bc88fe68 923 CreateOutputTable();
jolyon 11:729eb224dce6 924
jolyon 11:729eb224dce6 925 //show current config setting
jolyon 11:729eb224dce6 926 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 12:eab1bc88fe68 927 DisplaySensorOutput = Config[(DisplayScreen-1)*2 +1];
jolyon 11:729eb224dce6 928
jolyon 11:729eb224dce6 929 if (DisplayScreen !=0)
jolyon 11:729eb224dce6 930 {
jolyon 11:729eb224dce6 931 lcd.locate(0, 0);
jolyon 11:729eb224dce6 932 lcd.printf("Sensor %02i %s", DisplayScreen, LEDTypes[DisplaySensorType]);
jolyon 11:729eb224dce6 933 lcd.locate(0, 1);
jolyon 12:eab1bc88fe68 934 lcd.printf("First Output %02i ",DisplaySensorOutput);
jolyon 11:729eb224dce6 935 }
jolyon 11:729eb224dce6 936 }
jolyon 11:729eb224dce6 937
jolyon 12:eab1bc88fe68 938 void CreateOutputTable(void)
jolyon 12:eab1bc88fe68 939 {
jolyon 12:eab1bc88fe68 940 uint8_t CurrentSensor;
jolyon 12:eab1bc88fe68 941 uint8_t CurrentOutput = 0; //set to first output
jolyon 12:eab1bc88fe68 942
jolyon 12:eab1bc88fe68 943 for (CurrentSensor = 0; CurrentSensor <15; CurrentSensor++)
jolyon 12:eab1bc88fe68 944 {
jolyon 12:eab1bc88fe68 945 //set the start output for next sensor
jolyon 12:eab1bc88fe68 946 CurrentOutput += OutputCount[Config[(CurrentSensor)*2]];
jolyon 12:eab1bc88fe68 947 if( CurrentOutput >15 )
jolyon 12:eab1bc88fe68 948 {
jolyon 12:eab1bc88fe68 949 CurrentOutput = 15;
jolyon 12:eab1bc88fe68 950 }
jolyon 12:eab1bc88fe68 951 Config[(CurrentSensor+1)*2 +1] = CurrentOutput;
jolyon 12:eab1bc88fe68 952
jolyon 12:eab1bc88fe68 953 }
jolyon 12:eab1bc88fe68 954 }
jolyon 10:efe8585f7fa4 955
jolyon 3:b8218b61b0e2 956
jolyon 0:9d301ae51ecf 957 int main()
jolyon 0:9d301ae51ecf 958 {
jolyon 6:6346ef2b4638 959 InitOutputs(); //set up output driver chip
jolyon 6:6346ef2b4638 960 ConfigureTSC(0); //Initialise all TCS34725's
jolyon 10:efe8585f7fa4 961 InitCommsPort(); //Initialise the 485 port
jolyon 0:9d301ae51ecf 962
jolyon 10:efe8585f7fa4 963
jolyon 1:d99dad8a1f50 964 while(1)
jolyon 1:d99dad8a1f50 965 {
jolyon 6:6346ef2b4638 966 GetThresholds(); //update thresholds
jolyon 6:6346ef2b4638 967 wait(0.1); //100ms Update Cycle
jolyon 4:dce5fc58abe9 968 OutputData = 0;
jolyon 2:4a8eacbb3657 969
jolyon 3:b8218b61b0e2 970 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 971 {
jolyon 4:dce5fc58abe9 972 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 973 {
jolyon 3:b8218b61b0e2 974 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 975
jolyon 3:b8218b61b0e2 976 White = SensorData.White;
jolyon 3:b8218b61b0e2 977 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 978 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 979 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 980
jolyon 6:6346ef2b4638 981 ScaleColours();
jolyon 6:6346ef2b4638 982
jolyon 3:b8218b61b0e2 983 // work out % of colour mix
jolyon 3:b8218b61b0e2 984 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 985 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 986 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 987 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 988
jolyon 3:b8218b61b0e2 989 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 990 UpdateOutputs();
jolyon 8:e6e4eece90f7 991
jolyon 8:e6e4eece90f7 992 if (SensorNumber == GetModeSwitch())
jolyon 8:e6e4eece90f7 993 {
jolyon 11:729eb224dce6 994 if (DisplayScreen == 0)
jolyon 11:729eb224dce6 995 {
jolyon 11:729eb224dce6 996 UpdateDisplay();
jolyon 11:729eb224dce6 997 ShowLeds(SensorResult);
jolyon 11:729eb224dce6 998 }
jolyon 8:e6e4eece90f7 999 }
jolyon 8:e6e4eece90f7 1000
jolyon 3:b8218b61b0e2 1001 } //end if
jolyon 8:e6e4eece90f7 1002 else
jolyon 8:e6e4eece90f7 1003 {
jolyon 12:eab1bc88fe68 1004 if (DisplayScreen == 0)
jolyon 8:e6e4eece90f7 1005 {
jolyon 12:eab1bc88fe68 1006 if (SensorNumber == GetModeSwitch())
jolyon 12:eab1bc88fe68 1007 {
jolyon 12:eab1bc88fe68 1008 lcd.locate(0, 0);
jolyon 12:eab1bc88fe68 1009 lcd.printf("INVALID SENSOR ");
jolyon 12:eab1bc88fe68 1010 lcd.locate(0, 1);
jolyon 12:eab1bc88fe68 1011 lcd.printf("%02i ",GetModeSwitch() );
jolyon 12:eab1bc88fe68 1012 }
jolyon 8:e6e4eece90f7 1013 }
jolyon 11:729eb224dce6 1014 }
jolyon 11:729eb224dce6 1015
jolyon 8:e6e4eece90f7 1016
jolyon 8:e6e4eece90f7 1017
jolyon 3:b8218b61b0e2 1018 } //end for
jolyon 8:e6e4eece90f7 1019 WriteOutputPort(OutputData);
jolyon 8:e6e4eece90f7 1020 //WriteOutputPort(OutputDataB);
jolyon 8:e6e4eece90f7 1021 //OutputDataB>>=1;
jolyon 8:e6e4eece90f7 1022 //if(OutputDataB == 0)
jolyon 8:e6e4eece90f7 1023 //{
jolyon 8:e6e4eece90f7 1024 // OutputDataB = 0x8000;
jolyon 10:efe8585f7fa4 1025 //}
jolyon 11:729eb224dce6 1026 HandleDisplay();
jolyon 10:efe8585f7fa4 1027 //Handle Comms
jolyon 10:efe8585f7fa4 1028 HandleRS485();
jolyon 3:b8218b61b0e2 1029 } //while(1)
jolyon 3:b8218b61b0e2 1030 }//main