Dependencies:   MMA8451Q mbed

main.cpp

Committer:
xlizne01
Date:
2016-01-12
Revision:
6:5711a5b57d17
Parent:
5:d6738e1238d8
Child:
7:29f6c0e0b427

File content as of revision 6:5711a5b57d17:

#include "mbed.h"
#include "MMA8451Q.h"
 
#define MMA8451_I2C_ADDRESS (0x1d<<1)
#define MOVE_ANGLE 35   // > degrees for move 

MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);

void accelerometer(void);  
void zobrazeni(void);
void barva(int,int);
void pohyb(void);
void proved(int);

 int i,j,k;
 int p=1;
 int RED, GREEN, BLUE;
 int RledA, RledB, GledA, GledB, BledA, BledB;
 float xAngle, yAngle;
 
 char acc_dir;
 
 int pole[4][4]={{2,0,0,0}, {0,0,0,2}, {2,0,0,0}, {2,0,0,0}};

DigitalOut prvni(PTE5);
DigitalOut druhy(PTE4);
DigitalOut treti(PTE3);
DigitalOut ctvrty(PTE2);
DigitalOut paty(PTB11);
DigitalOut sesty(PTB10);
DigitalOut sedmy(PTB9);
DigitalOut osmy(PTB8);

DigitalOut Rled1(PTC9); 
DigitalOut Rled2(PTC8);
DigitalOut Rled3(PTA5);
DigitalOut Rled4(PTA4);
DigitalOut Rled5(PTA12);
DigitalOut Rled6(PTD4);
DigitalOut Rled7(PTA1);
DigitalOut Rled8(PTA2);

DigitalOut Gled1(PTA13);
DigitalOut Gled2(PTD5);
DigitalOut Gled3(PTD0);
DigitalOut Gled4(PTD2);
DigitalOut Gled5(PTD3);
DigitalOut Gled6(PTD1);
DigitalOut Gled7(PTE31);
DigitalOut Gled8(PTB0);

DigitalOut Bled1(PTC1);
DigitalOut Bled2(PTE29);
DigitalOut Bled3(PTC2);
DigitalOut Bled4(PTB3);
DigitalOut Bled5(PTB2);
DigitalOut Bled6(PTE21);
DigitalOut Bled7(PTE20);
DigitalOut Bled8(PTB1);

 
int main()
{      
    while(1)
    { 
    accelerometer();
    zobrazeni();
    pohyb();
    }
}
        
void pohyb()
{
    switch(acc_dir)
    {
    case 'D': //pohyb smerem dolu
        if(p==0)
        {
        proved(1);
        p=1;
        }
        break;
    case 'R': // pohyb smerem vpravo
        if(p==0)
        {
        proved(2);
        p=1;
        }
        break;
    case 'U': // pohyb smerem nahoru
        if(p==0)
        {
        proved(3);
        p=1;
        }
        break;
    case 'L': // pohyb smerem vlevo
        if(p==0)
        {
        proved(4);
        p=1;
        }
        break;
    case '0': // detekovana nulova pozice
        p=0;
        break;
    default:
        break; 
        
    }
}

void proved(int x)
{
    int a,b,c,d,n;
    
    for(n=0;n<4;n++)
    {
        
        if(x==1) // dolu
        {
            a=pole[n][0];
            b=pole[n][1];
            c=pole[n][2];
            d=pole[n][3];
        }
        
        if(x==2) // vpravo
        {
            a=pole[3][n];
            b=pole[2][n];
            c=pole[1][n];
            d=pole[0][n];
        }
        
        if(x==3) // nahoru
        {
            a=pole[n][3];
            b=pole[n][2];
            c=pole[n][1];
            d=pole[n][0];
        }
        
        if(x==4) // vlevo
        {
            a=pole[0][n];
            b=pole[1][n];
            c=pole[2][n];
            d=pole[3][n];
        }
        
        //sesypani
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(b==0)
            {b=c; c=d; d=0;}
        if(b==0)
            {b=c; c=d; d=0;}
        if(c==0)
            {c=d; d=0;}
           
           //spojeni 
        if(a==b)
            {a=2*a; b=c; c=d; d=0;}
        if(b==c)
            {b=2*b; c=d; d=0;}
        if(c==d)
            {c=2*c; d=0;}
         
        if(x==1) // dolu
        {   
            pole[n][0]=a;
            pole[n][1]=b;
            pole[n][2]=c;
            pole[n][3]=d;
        }
        if(x==2) // vpravo
        {   
            pole[3][n]=a;
            pole[2][n]=b;
            pole[1][n]=c;
            pole[0][n]=d;
        }
        
        if(x==3) // nahoru
        {   
            pole[n][3]=a;
            pole[n][2]=b;
            pole[n][1]=c;
            pole[n][0]=d;
        }
        
        if(x==4) // vlevo
        {   
            pole[0][n]=a;
            pole[1][n]=b;
            pole[2][n]=c;
            pole[3][n]=d;
        }
    }     
}

void zobrazeni()
{
    for(k=0;k<4;k++)
    {  
        prvni=0;
        druhy=0;
        treti=0;
        ctvrty=0;
        paty=0;
        sesty=0;
        sedmy=0;
        osmy=0;
        
        if(k==0)
        {
        prvni=1;
        druhy=1;
        }
    
        if(k==1)
        {
        treti=1;
        ctvrty=1;
        }
    
        if(k==2)
        {
        paty=1;
        sesty=1;
        }
    
        if(k==3)
        {
        sedmy=1;
        osmy=1;
        }
    
        for(j=0;j<4;j++)
        { 
        
        barva(j,k);
                
            for(i=15;i>0;i--)
            {
                if(RED>0)
                {
                RledA=1;
                RledB=1;
                }
                else
                {
                RledA=0;
                RledB=0;
                }
            
                if(GREEN>0)
                {
                GledA=1;
                GledB=1;
                }
                else
                {
                GledA=0;
                GledB=0;
                }
                    
                if(BLUE>0)
                {
                BledA=1;
                BledB=1;
                }
                else
                {
                BledA=0;
                BledB=0;
                }
        
                if(j==0)
                {
                Rled1=RledA;
                Rled2=RledB;
                Gled1=GledA;
                Gled2=GledB;
                Bled1=BledA;
                Bled2=BledB;
                }
                
                if(j==1)
                {
                Rled3=RledA;
                Rled4=RledB;
                Gled3=GledA;
                Gled4=GledB;
                Bled3=BledA;
                Bled4=BledB;
                }
                
                if(j==2)
                {
                Rled5=RledA;
                Rled6=RledB;
                Gled5=GledA;
                Gled6=GledB;
                Bled5=BledA;
                Bled6=BledB;
                }
                
                if(j==3)
                {
                Rled7=RledA;
                Rled8=RledB;
                Gled7=GledA;
                Gled8=GledB;
                Bled7=BledA;
                Bled8=BledB;
                } 
            
                wait(0.000005);
                RED--;
                BLUE--;
                GREEN--;
                
            }    
        }
    }  
} 

void barva(int j , int k)
{
    RED=pole[j][k];
    GREEN=pole[j][k];
    BLUE=pole[j][k];
}


void accelerometer()
{
        float ax, ay, az;

        ax = acc.getAccX();
        ay = acc.getAccY();
        az = acc.getAccZ();
        
        xAngle = atan( ax / (sqrt((ay)*(ay) + (az)*(az)))) * 60;
        yAngle = atan( ay / (sqrt((ax)*(ax) + (az)*(az)))) * 60;
        
        
        if((abs(xAngle)+abs(yAngle))<15)
        {
             acc_dir = '0';   // nula
        }
        
         
        if(abs(xAngle) >= abs(yAngle))
        {
            if(xAngle >= MOVE_ANGLE)
            {                 
                 acc_dir = 'U';   // +X 
            }
           
            if(xAngle <= -MOVE_ANGLE)
            {
                 acc_dir = 'D';    // -X  
            }   
        }
        
        else
        {      
            if(yAngle >= MOVE_ANGLE)
            {
                 acc_dir = 'L';   // +Y 
            }
    
            if(yAngle <= -MOVE_ANGLE)
            {
                 acc_dir = 'R';   // -Y  
            }   
        }        
    
}