xszdx

Dependencies:   mbed TCS3472_I2C MCP23017 VL6180 DebounceIn WattBob_TextLCD

main_copy.cpp

Committer:
maazshaikh
Date:
2020-03-15
Revision:
2:7c34106159c8
Parent:
1:ad7134c4e365

File content as of revision 2:7c34106159c8:

#include "mbed.h"
#include "DebounceIn.h"
#include "stdint.h"
#include "MCP23017.h"
#include "WattBob_TextLCD.h"
#include "VL6180.h"
#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)

MCP23017            *par_port;
WattBob_TextLCD     *lcd;

#define IDENTIFICATIONMODEL_ID 0x0000

Serial PC(USBTX, USBRX); //default 9600 baud
VL6180  TOF_sensor(p28, p27);
TCS3472_I2C rgb_sensor(p9, p10);

DigitalOut servo11 (p8); DigitalOut servo12 (p7);
DigitalOut servo13 (p6); DigitalOut servo14 (p5);

DigitalOut servo21 (p29); DigitalOut servo22 (p23);
DigitalOut servo23 (p22); DigitalOut servo24 (p21);

DigitalOut servo31 (p26); DigitalOut servo32 (p25);  
DigitalOut servo33 (p12); DigitalOut servo34 (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, 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 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};

void LEDgame(); //function prototype of LED game
void reset(); //to reset level
void light(int); //turn on LEDs
void Maint(); // maintainence mode
int Dist(); //check distance sensor
int MAX(int,int,int); //find max rgb value

int main()

{
    pb1.mode(PullUp);   pb2.mode(PullUp);
    pb3.mode(PullUp);   pb4.mode(PullUp);
    wait(.001);
    
    par_port = new MCP23017(p9, p10, 0x40);
    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;
    while (1){
    char c = PC.getc();
    if (c == 'o'){
    while(1)
    {
        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; //to stop game if level reset to zero.
            row = rand()%24;
            tries = 1;
            LEDgame();
        }
        if (Dist() > D) {
            level = 1;
            myled1=0; myled2=0; myled3=0; myled4=0;
            } //resets game if card is removed.
    }
}

    else if (c== 'm'){
        while (1){
            char d = PC.getc();
            if (d=='D') {PC.printf("%d", Dist());}
            if (d=='C'){
                rgb_sensor.getAllColors(rgb_read);
                maxrgb = MAX(rgb_read[1],rgb_read[2],rgb_read[3]);
                if (maxrgb == rgb_read[1]) PC.puts("Red");
                else if (maxrgb == rgb_read[2]) PC.puts("Green");
                else if (maxrgb == rgb_read[3]) PC.puts("Blue");
                }
            else if (d=='r') myled1=1;
            else if (d=='y') myled2=1;
            else if (d=='g') myled3=1;
            else if (d=='w') myled4=1;
            else if (d=='s') {LEDgame();}
            else if (d=='d') {myled1=0; myled2=0; myled3=0; myled4=0; }  
            else if (d=='o'){
                    while(1){
                    char p=PC.getc();
                    if (p=='f') servo11=1;
                    else if (p=='s') servo12=1;
                    else if (p=='t') servo13=1;
                    else if (p=='F') servo14=1;
                    else if (p=='R'){
                        servo11=0; servo12=0; servo13=0; servo14=0;
                        break;
                    }
                    }
                }
            else if (d=='S'){
                    while(1){
                    char p=PC.getc();
                    if (p=='f') servo21=1;
                    else if (p=='s') servo22=1;
                    else if (p=='t') servo23=1;
                    else if (p=='F') servo24=1;
                    else if (p=='R'){
                        servo21=0; servo22=0; servo23=0; servo24=0;
                        break;
                    }
                    }
                }
            else if (d=='t'){
                    while(1){
                    char p=PC.getc();
                    if (p=='f') servo31=1;
                    else if (p=='s') servo32=1;
                    else if (p=='t') servo33=1;
                    else if (p=='F') servo34=1;
                    else if (p=='R'){
                        servo31=0; servo32=0; servo33=0; servo34=0;
                        break;
                    }
                    }
                }
                
                    
            else if (d=='R') {break;}         
                
                
        
}
}
}
}

void LEDgame()
{
    while(Dist() < D)
    {
        levelreset = 0;
        for (col=0; col<4; col++)
        {led = order[row][col]; light(led);} //switches on the respective LEDs according to the order

    while(Dist() < D)
    {
        new_pb1 = pb1; new_pb2 = pb2;
        new_pb3 = pb3; new_pb4 = pb4;
        
    if( ((new_pb1 == 0) && (old_pb1 == 1)) || ((new_pb2 == 0) && (old_pb2 == 1)) || ((new_pb3 == 0) && (old_pb3 == 1)) || ((new_pb4 == 0) && (old_pb4 == 1)) )
    {
        switch(order[row][i])
        {
            case 1:
            {
                if((new_pb1 == 0) && (old_pb1 == 1))
                { myled1 = 1; i++;}
                else {reset(); levelreset = 1; tries++;}
            } break;
            case 2:
            {
                if((new_pb2 == 0) && (old_pb2 == 1))
                { myled2 = 1; i++;}
                else {reset(); levelreset = 1; tries++;}
            } break;
            case 3:
            {
                if((new_pb3 == 0) && (old_pb3 == 1))
                { myled3 = 1; i++;}
                else {reset(); levelreset = 1; tries++;}
            } break;
            case 4:
            {
                if((new_pb4 == 0) && (old_pb4 == 1))
                { myled4 = 1; i++;}
                else {reset(); levelreset = 1; tries++;}
            } break;
        }
        if (levelreset == 1) //do if the level was reset during the game
        {
            //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) //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;
    }
    }
}



void reset() //function to turn off LEDs and reset order
{
    myled1 = 0; myled2 = 0; myled3 = 0; myled4 = 0;
    i = 0; wait(1); return;
}

void light(int n) //to turn on LEDs
{
    //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;}
    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;
}