![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
xszdx
Dependencies: mbed TCS3472_I2C MCP23017 VL6180 DebounceIn WattBob_TextLCD
Diff: main_copy.cpp
- Revision:
- 1:ad7134c4e365
- Parent:
- 0:171d347f33f7
- Child:
- 2:7c34106159c8
--- a/main_copy.cpp Tue Mar 03 17:42:15 2020 +0000 +++ b/main_copy.cpp Fri Mar 06 12:35:11 2020 +0000 @@ -4,16 +4,7 @@ #include "MCP23017.h" #include "WattBob_TextLCD.h" #include "VL6180.h" - -//Hyperterminal configuration -//9600 bauds, 8-bit data, no parity -//VL6180X defines - -#define IDENTIFICATIONMODEL_ID 0x0000 - -Serial PC(USBTX, USBRX); -VL6180 TOF_sensor(p28, p27); -DigitalOut myled(LED1); +#include "TCS3472_I2C.h" #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) @@ -21,89 +12,84 @@ MCP23017 *par_port; WattBob_TextLCD *lcd; +#define IDENTIFICATIONMODEL_ID 0x0000 -DigitalOut myled1 (p12); DigitalOut myled2 (p13); -DigitalOut myled3 (p14); DigitalOut myled4 (p15); +Serial PC(USBTX, USBRX); //default 9600 baud +VL6180 TOF_sensor(p28, p27); +TCS3472_I2C rgb_sensor(p9, p10); -DebounceIn pb1(p8); DebounceIn pb2(p9); -DebounceIn pb3(p10); DebounceIn pb4(p11); +DigitalOut myled1 (p13); DigitalOut myled2 (p14); +DigitalOut myled3 (p15); DigitalOut myled4 (p16); + +DebounceIn pb1(p17); DebounceIn pb2(p18); +DebounceIn pb3(p19); DebounceIn pb4(p20); int old_pb1 = 0, old_pb2 = 0, old_pb3 = 0, old_pb4 = 0; -int new_pb1, new_pb2, new_pb3, new_pb4; - -int i = 0, j, row, led; -int order[10][4]; -int levelreset, tries, level = 1; -float delay; uint8_t dist; +int new_pb1, new_pb2, new_pb3, new_pb4; -/*int order[4][4] = {1,2,3,4, -4,3,2,1, -3,2,1,4, -2,1,3,4};*/ - -void level1(); -void reset(); -void light(int,int); +int i = 0, col, row, led; //variables for order manipulation +int levelreset, tries, level = 1; //level parameters +float delay; //delay for blinking LEDs +int D = 30; //for distance sensor -int Dist() -{ - lcd->cls(); lcd->locate(0,0); - dist = TOF_sensor.getDistance(); - lcd->printf("Dist=%d", dist); - wait(0.5); - return dist; -} +int order[24][4] = //ORDER ARRAY FOR LED GAME +{1,2,3,4, 2,1,3,4, 3,1,2,4, 1,3,2,4, 2,3,1,4, 3,2,1,4, + 4,2,1,3, 2,4,1,3, 1,4,2,3, 4,1,2,3, 2,1,4,3, 1,2,4,3, + 1,3,4,2, 3,1,4,2, 4,1,3,2, 1,4,3,2, 3,4,1,2, 4,3,1,2, + 4,3,2,1, 3,4,2,1, 2,4,3,1, 4,2,3,1, 3,2,4,1, 2,3,4,1}; -// SPST Pushbutton count demo using internal PullUp function -// no external PullUp resistor needed -// Pushbutton from P8 to GND. -// Demonstrates need for debounce - will not count more than once per button hit -// This ocuurs on all switches due to mechanical contact bounce - +void LEDgame(); //function prototype of LED game +void reset(); //to reset level +void light(int); //turn on LEDs +int Dist(); //check distance sensor +int MAX(int,int,int); //find max rgb value int main() { - // Use internal pullup for pushbutton - pb1.mode(PullUp); - pb2.mode(PullUp); - pb3.mode(PullUp); - pb4.mode(PullUp); - // Delay for initial pullup to take effect + pb1.mode(PullUp); pb2.mode(PullUp); + pb3.mode(PullUp); pb4.mode(PullUp); wait(.001); - TOF_sensor.VL6180_Init(); + par_port = new MCP23017(p9, p10, 0x40); - par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob + par_port->config(0x0F00, 0x0F00, 0x0F00); //configure MCP23017 chip on WattBob lcd = new WattBob_TextLCD(par_port); BACK_LIGHT_ON(par_port); + + TOF_sensor.VL6180_Init(); + rgb_sensor.enablePowerAndRGBC(); + rgb_sensor.setIntegrationTime(100); + + int rgb_read[4], maxrgb; //char c = PC.getc(); - //if (c == 'o') + //(c == 'o') while(1) { - while(Dist() < 250) - while(level <= 4) + rgb_sensor.getAllColors(rgb_read); + maxrgb = MAX(rgb_read[1],rgb_read[2],rgb_read[3]); + if (maxrgb == rgb_read[1]) + //if (maxrgb > 2000 && maxrgb < 3000) + while(level <= 4 && Dist() < D) { - if (level == 0) break; - for (row=0; row<10; row++) - for (j=0; j<4; j++) - { order [row][j] = (rand()% 4) + 1;} - row = rand()%4; - tries = 0; - level1(); + if (level == 0) break; //to stop game if level reset to zero. + row = rand()%24; + tries = 1; + LEDgame(); } + if (Dist() > D) level = 1; //resets game if card is removed. } } -void level1() +void LEDgame() { - while(Dist() < 250) + while(Dist() < D) { levelreset = 0; - for (j=0; j<4; j++) - { led = order[row][j]; light(led,1); } //switches on the respective LEDs according to the order + for (col=0; col<4; col++) + {led = order[row][col]; light(led);} //switches on the respective LEDs according to the order - while(Dist() < 250) + while(Dist() < D) { new_pb1 = pb1; new_pb2 = pb2; new_pb3 = pb3; new_pb4 = pb4; @@ -115,35 +101,36 @@ case 1: { if((new_pb1 == 0) && (old_pb1 == 1)) - { light(1,0); i++;} + { myled1 = 1; i++;} else {reset(); levelreset = 1; tries++;} } break; case 2: { if((new_pb2 == 0) && (old_pb2 == 1)) - { light(2,0); i++;} + { myled2 = 1; i++;} else {reset(); levelreset = 1; tries++;} } break; case 3: { if((new_pb3 == 0) && (old_pb3 == 1)) - { light(3,0); i++;} + { myled3 = 1; i++;} else {reset(); levelreset = 1; tries++;} } break; case 4: { if((new_pb4 == 0) && (old_pb4 == 1)) - { light(4,0); i++;} + { myled4 = 1; i++;} else {reset(); levelreset = 1; tries++;} } break; } - if (levelreset == 1) + if (levelreset == 1) //do if the level was reset during the game { - if (tries > 3) {reset(); level = 0; return;} + //reset level to zero to stop game if number of tries exceeded + if (tries > 3) {level = 0; reset(); return;} else break; } - else if (levelreset == 0) - if(i >= 4){level++; reset(); return;} + else if (levelreset == 0) //else increment level counter + if(i >= 4){level++; wait(2); reset(); return;} } old_pb1 = new_pb1; old_pb2 = new_pb2; old_pb3 = new_pb3; old_pb4 = new_pb4; @@ -159,30 +146,36 @@ i = 0; wait(1); return; } -void light(int n, int m) //to turn on LEDs +void light(int n) //to turn on LEDs { - if (m == 0) //for answer - { - //turns LED on for 1 second - if(n == 1) {myled1 = 1; wait(1); myled1 = 0;} - else if(n == 2) {myled2 = 1; wait(1); myled2 = 0;} - else if(n == 3) {myled3 = 1; wait(1); myled3 = 0;} - else if(n == 4) {myled4 = 1; wait(1); myled4 = 0;} - } + //sets delay based on level number + if(level == 1) delay = 1; + else if (level == 2) delay = 0.75; + else if (level == 3) delay = 0.50; + else if (level == 4) delay = 0.25; - else if (m == 1) //for demo - { - //sets delay based on level number - if(level == 1) delay = 1; - else if (level == 2) delay = 0.75; - else if (level == 3) delay = 0.50; - else if (level == 4) delay = 0.25; - - //turns LED on for delay seconds before turning off - if(n == 1) {myled1 = 1; wait(delay); myled1 = 0; wait(0.2);} - else if(n == 2) {myled2 = 1; wait(delay); myled2 = 0; wait(0.2);} - else if(n == 3) {myled3 = 1; wait(delay); myled3 = 0; wait(0.2);} - else if(n == 4) {myled4 = 1; wait(delay); myled4 = 0; wait(0.2);} - } + //turns LED on for delay seconds before turning off + if(n == 1) {myled1 = 1; wait(delay); myled1 = 0;} + else if(n == 2) {myled2 = 1; wait(delay); myled2 = 0;} + else if(n == 3) {myled3 = 1; wait(delay); myled3 = 0;} + else if(n == 4) {myled4 = 1; wait(delay); myled4 = 0;} return; +} + +int Dist() //returns distance +{ + uint8_t dist; + lcd->cls(); lcd->locate(0,0); + dist = TOF_sensor.getDistance(); + lcd->printf("Dist=%d", dist); + return dist; +} + +int MAX(int R, int G, int B) //returns max rgb value +{ + int max; + if (R > G) max = R; + else max = G; + if (B > max) max = B; + return max; } \ No newline at end of file