Jolyon Hill / ColourSensor

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Thu Nov 10 16:57:19 2016 +0000
Revision:
13:ef2f1c11e33b
Parent:
12:eab1bc88fe68
Child:
14:02de92b0206a
Code now uses I2C chip to pull button data

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