xszdx

Dependencies:   mbed TCS3472_I2C MCP23017 VL6180 DebounceIn WattBob_TextLCD

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