Proyecto completo del trabajo practico de Embebidos

Dependencies:   mbed tsi_sensor MMA8451Q

main.cpp

Committer:
AlvaAcosta
Date:
2020-10-21
Revision:
0:7cc43619dcac

File content as of revision 0:7cc43619dcac:

#include "mbed.h"
#include "MMA8451Q.h"
#include "tsi_sensor.h"

#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
#define ELEC0 9
#define ELEC1 10
#else
#error TARGET NOT DEFINED
#endif

#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
PinName const SDA = PTE25;
PinName const SCL = PTE24;
#else
#error TARGET NOT DEFINED
#endif

#define MMA8451_I2C_ADDRESS (0x1d<<1)

Serial pc(USBTX,USBRX);
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);

enum{
    INICIO,
    ORDEN,
    FIN
};

enum{
    RESP_X,
    RESP_Y,
    RESP_Z,
    RESP_A,
    RESP_D
};

enum{
    ROJO,
    VERDE,
    AZUL
};

enum{
    HABILITADO,
    DESHABILITADO
};

enum{
    APAGADO,
    ENCENDIDO
};

AnalogIn    Pote(A0);
DigitalIn   Puls(D2);

DigitalOut Led_Ext(D3);
DigitalOut Led_R(LED_RED);
DigitalOut Led_V(LED_GREEN);
DigitalOut Led_A(LED_BLUE);

unsigned int valor_ADC = 0, valor_ADC_xor = 0, Led_tout = 0, a_xor = 0;
int a = 0, esp = 0, habilitacion = 0, j = 0, i = 0, p = 0, x = 0, y = 0, z = 0, X_xor = 0, Y_xor = 0, Z_xor = 0, A_xor = 0, D_xor = 0;
float voltaje = 0, valor_tsi = 0;
char byte = '\0', c = '\0';
char Estado_Emision, Estado_Respuesta, Estado_Color, Estado_Led, Estado_tsi = DESHABILITADO; 
bool newdata = false;

void Emision();
void Respuesta();
void ADC();
void Acelerometro();
void Led_RGB();
void Led_Habilitado();
void Led_Deshabilitado();
void init_mcu();
void contador();
int Pulsador();

Ticker timer;

void Byte_Reciver(){
    
    byte = pc.getc();
    newdata = true;
}

int main (void){
    
    init_mcu();
    pc.attach(&Byte_Reciver);
    
    while(true){
        
        valor_tsi = tsi.readPercentage();
        
        switch(Estado_tsi){
        
            case DESHABILITADO:
                Led_Deshabilitado();
                j = 0;
                if(valor_tsi > 0 && j == 0){
                    Estado_tsi = HABILITADO;
                    valor_tsi = 0;
                }
            break;
        
            case HABILITADO:
                Led_Habilitado();
                j = 1;
                if(newdata){
                    Emision();
                    }
                    
                if(valor_tsi > 0 && j == 1){
                    Estado_tsi = DESHABILITADO;
                    valor_tsi = 0;
                }
            break;
        }
    
        Led_RGB();
        
        }
    
}

void Emision(){
    
    switch(Estado_Emision){
            
        case INICIO:
            if(byte == 64){
                Estado_Emision = ORDEN;
                newdata = false;
            }else{
                Estado_Emision = INICIO;
            }   
        break;
            
        case ORDEN:
            if(byte >= 49 && byte <= 53){
                    c = byte;
                    Estado_Emision = FIN;
                    newdata = false;
            }else{
                c = '\0';
                Estado_Emision = ORDEN;
                newdata = false;
            }
        break;
        
        case FIN:
            if(byte == 35){
                Estado_Emision = INICIO;
                Respuesta();
            }else{
                c = '\0';
                Estado_Emision = FIN;
                newdata = false;
            }
        break;  
    }
    
}

void Respuesta(){
    
    ADC();
    Acelerometro();
    Pulsador();
    
        
        if(c == 49) Estado_Respuesta = RESP_X;
        if(c == 50) Estado_Respuesta = RESP_Y;
        if(c == 51) Estado_Respuesta = RESP_Z;
        if(c == 52) Estado_Respuesta = RESP_A;
        if(c == 53) Estado_Respuesta = RESP_D;
    
        
        switch(Estado_Respuesta){
        
            case RESP_X:
                printf("  @ 1 %d %d #\n", x, X_xor );
            break;
        
            case RESP_Y:
                printf("  @ 2 %d %d #\n", y, Y_xor);
            break;
        
            case RESP_Z:
                printf("  @ 3 %d %d #\n", z, Z_xor);
            break;
        
            case RESP_A:
                printf("  @ 4 %d %d #\n", a, a_xor);
            break;
        
            case RESP_D:
                printf("  @ 5 %d %d #\n", p, 5 ^ p);
            break;
        }
    
}

void Led_RGB(){
    
    ADC();
    
    if(voltaje <= 1.5)                      Estado_Color = ROJO;
    if(voltaje > 1.5 && voltaje <= 2.5 )    Estado_Color = VERDE;
    if(voltaje > 2.5)                       Estado_Color = AZUL;
    
    switch(Estado_Color){
        
        case ROJO:
            Led_R = 0;
            Led_V = 1;
            Led_A = 1;
        break;
        
        case VERDE:
            Led_R = 1;
            Led_V = 0;
            Led_A = 1;
        
        break;
        
        case AZUL:
            Led_R = 1;
            Led_V = 1;
            Led_A = 0;
        
        break;  
        
    }
    
}

void Led_Habilitado(){
    
    switch(Estado_Led){
        
        case APAGADO:
            Led_Ext = 0;
            if(Led_tout == 0){
                Estado_Led = ENCENDIDO;
                Led_tout = 20;
            }  
        
        break;
        
        case ENCENDIDO:
            Led_Ext = 1;
            if(Led_tout == 0){
                i++;
                Estado_Led = APAGADO;
                if(i==3){
                    Led_tout = 150;
                    i=0;
                }
                else Led_tout = 20;
            }
        
        break;
    }
    
}

void Led_Deshabilitado(){
    
    switch(Estado_Led){
        
        case APAGADO:
            Led_Ext = 0;
            if(Led_tout == 0){
                Estado_Led = ENCENDIDO;
                Led_tout = 50;
            } 
        
        break;
        
        case ENCENDIDO:
            Led_Ext = 1;
            if(Led_tout == 0){
                Estado_Led = APAGADO;
                Led_tout = 100;
            }
        
        break;
    }
    
}



int Pulsador(){
    if(Puls == 0)p = 0;
    if(Puls == 1)p = 1;
    return p;
}

void ADC(){
    valor_ADC = Pote.read_u16();
    voltaje = valor_ADC * 3.3 / 65535;
    a = valor_ADC * 100 / 65535;
    
    valor_ADC_xor = 4 ^ valor_ADC;
    a_xor = 4 ^ a;
}

void Acelerometro(){
    x = abs(acc.getAccX())*100; 
    y = abs(acc.getAccY())*100;
    z = abs(acc.getAccZ())*100; 
    
    X_xor = 1 ^ x;
    Y_xor = 2 ^ y;
    Z_xor = 3 ^ z;
    
}

void Contador(){
    if(Led_tout != 0){
        Led_tout--; 
    }
}

void init_mcu(){
    timer.attach(&Contador, 0.01);
}