Es un programa de comunicacion serial que trabaja con habilitacion del tsi , en el que se pide desde una plataforma, con un protocolo con verificacion xor los valores de una entrada digital, una entradad analogica y los distintos ejes del accelerometro, a su vez se indica el funcionamiento del programa con 2 diferentes frecuencias de led

Dependencies:   mbed tsi_sensor MMA8451Q

main.cpp

Committer:
nahue2k18
Date:
2020-05-10
Revision:
0:231d401c17dc

File content as of revision 0:231d401c17dc:

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

Serial pc(USBTX, USBRX);

/* This defines will be replaced by PinNames soon */
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
#define ELEC0 9
#define ELEC1 10
#elif defined (TARGET_KL05Z)
#define ELEC0 9
#define ELEC1 8
#else
#error TARGET NOT DEFINED
#endif

TSIAnalogSlider tsi(ELEC0, ELEC1, 40);//DECLARO TSI

#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
PinName const SDA = PTE25;
PinName const SCL = PTE24;
#elif defined (TARGET_KL05Z)
PinName const SDA = PTB4;
PinName const SCL = PTB3;
#elif defined (TARGET_K20D50M)
PinName const SDA = PTB1;
PinName const SCL = PTB0;
#else
#error TARGET NOT DEFINED
#endif

#define MMA8451_I2C_ADDRESS (0x1d<<1)

MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);//DECLARO ACELEROMETRO

Ticker ti;//DECLARO EL TIMER 1

DigitalOut LV(LED2);
AnalogIn ANALOGICA(A2);
DigitalIn ENTRADA (PTB10);

//DECLARO MAQUINAS DE ESTADOS
void ME_SERIE_RECIBO(void);
void ME_SERIE_ENVIO(void);
void ME_LED_SERIE_ON(void);
void ME_LED_SERIE_OFF(void);

//DECLARO FUNCIONES
void TSII(void);//FUNCION TSI
void ANALOGICO(void);//FUNCION DE LA ENTRADA ANALOGICA
void ACELEROMETRO(void);//FUNCION ACELEROMETRO
void tiempo(void);//FUNCION DEL TIMER

//bit usado como flag para procesar datos
bool newdata = false;

//VARIABLES DEL SERIE RECIBO
char c = '\0';

//Callback cuando se detecta una entrada
void onCharReceived()
{
    //Copiamos lo leido en c
    c = pc.getc();
    newdata = true;
}

//VARIABLES DE SERIE RECIBO
int e_serie_recibo=0;
bool ok=0, recibo_A=0, recibo_$=0, recibo_V=0, recibo_D=0, recibo_1=0, recibo_X=0, recibo_Y=0, recibo_Z=0;

//VARIABLES DE SERIE ENVIO
int e_serie_envio=0;

// VARIABLES DE LED SERIE ON
bool e_led_serie_on=0;

// VARIABLES DE LED SERIE ON
bool e_led_serie_off=0;

// VARIABLES DEL TSII
float j=0;
bool inicio=0;

// VARIABLES DE LA ENTRADA ANALOGICA
int analog=0;
int analog_previa=0;
int analog_unidad=0, analog_decena=0;
int analog_unidad_ascii=0, analog_decena_ascii=0;
int analog_unidad_xor=0, analog_decena_xor=0;

// VARIABLES DEL ACELEROMETRO
float x=0, y=0, z=0;
int x_previa=0, y_previa=0, z_previa=0;
int x_unidad=0, x_decena=0, y_unidad=0, y_decena=0, z_unidad=0, z_decena=0;
int unidad_x_ascii=0, decena_x_ascii=0, unidad_y_ascii=0, decena_y_ascii=0, unidad_z_ascii=0, decena_z_ascii=0;
int xor_x_decena=0, xor_y_decena=0, xor_z_decena=0, xor_x_unidad=0, xor_y_unidad=0, xor_z_unidad=0;

// VARIABLES DEL TIMER
int t_tsii=0;
int t_led_serie_on=0;
int t_led_serie_off=0;
int main()
{
    pc.attach(&onCharReceived);
    LV=1;
    ti.attach(&tiempo,0.05);
    while(1) {
        TSII();
        if(inicio==1) {
            ME_SERIE_RECIBO();
            ME_SERIE_ENVIO();
            ME_LED_SERIE_ON();
        } else {
            ME_LED_SERIE_OFF();
        }
    }
}

void ME_SERIE_RECIBO(void)
{
    if (newdata) {
        newdata=false;
        switch(e_serie_recibo) {
            default:
                e_serie_recibo=0;
                break;
            case 0:
                if(c=='$') {
                    e_serie_recibo=1;
                    recibo_$=1;
                    break;
                } else {
                    printf("\n error de codigo\r\n");
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_recibo=0;

                }
                break;
            case 1:
                if (c=='A') {
                    recibo_A=1;
                    e_serie_recibo=2;
                    break;
                } else if(c=='V') {
                    recibo_V=1;
                    e_serie_recibo=2;
                    break;
                } else if(c=='D') {
                    recibo_D=1;
                    e_serie_recibo=2;
                    break;
                } else {
                    printf("\n error de codigo\r\n");
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_recibo=0;
                }
                break;
            case 2:
                if(c=='X') {
                    recibo_X=1;
                    e_serie_recibo=3;
                    break;
                } else if(c=='Y') {
                    recibo_Y=1;
                    e_serie_recibo=3;
                    break;
                } else if(c=='Z') {
                    recibo_Z=1;
                    e_serie_recibo=3;
                    break;
                } else if(c=='1') {
                    recibo_1=1;
                    e_serie_recibo=3;
                    break;
                } else {
                    printf("\n error de codigo\r\n");
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_recibo=0;
                }
                break;
            case 3:
                if(c=='%') {
                    ok=1;
                    e_serie_recibo=0;
                } else {
                    printf("\n error de codigo\r\n");
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_recibo=0;
                }
                break;
        }

    }
}

void ME_SERIE_ENVIO(void)
{
    if(ok==1) {
        switch(e_serie_envio) {
            default:
                e_serie_envio=0;
            case 0:
                if(recibo_$==1) {
                    recibo_$=0;
                    e_serie_envio=1;
                    break;
                }
                break;
            case 1:
                if(recibo_A==1) {
                    recibo_A=0;
                    e_serie_envio=2;
                    break;
                } else if(recibo_V==1) {
                    recibo_V=0;
                    e_serie_envio=3;
                    break;
                } else if(recibo_D==1) {
                    recibo_D=0;
                    e_serie_envio=4;
                }
                break;
            case 2:
                if(recibo_X==1) {
                    ACELEROMETRO();
                    printf("\n $AX%d%d%x%% \r\n",x_decena,x_unidad,xor_x_unidad);
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_envio=0;
                    break;
                } else if (recibo_Y==1) {
                    ACELEROMETRO();
                    printf("\n $AY%d%d%x%% \r\n",y_decena,y_unidad,xor_y_unidad);
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_envio=0;
                    break;
                } else if(recibo_Z==1) {
                    ACELEROMETRO();
                    printf("\n $AZ%d%d%x%% \r\n",z_decena,z_unidad,xor_z_unidad);
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_envio=0;
                }
                break;
            case 3:
                if(recibo_1==1) {
                    ANALOGICO();
                    printf("\n $V1%d%d%x%% \r\n",analog_decena,analog_unidad,analog_unidad_xor);
                    ok=0;
                    recibo_$=0;
                    recibo_A=0;
                    recibo_V=0;
                    recibo_D=0;
                    recibo_1=0;
                    recibo_X=0;
                    recibo_Y=0;
                    recibo_Z=0;
                    e_serie_envio=0;
                }
                break;
            case 4:
                if(recibo_1==1) {
                    if(ENTRADA==1) {
                        printf("\n $D10174%% \r\n");
                        ok=0;
                        recibo_$=0;
                        recibo_A=0;
                        recibo_V=0;
                        recibo_D=0;
                        recibo_1=0;
                        recibo_X=0;
                        recibo_Y=0;
                        recibo_Z=0;
                        e_serie_envio=0;
                        break;
                    } else {
                        printf("\n $D10075%% \r\n");
                        ok=0;
                        recibo_$=0;
                        recibo_A=0;
                        recibo_V=0;
                        recibo_D=0;
                        recibo_1=0;
                        recibo_X=0;
                        recibo_Y=0;
                        recibo_Z=0;
                        e_serie_envio=0;
                        break;
                    }
                }
                break;
        }
    }
}

void ME_LED_SERIE_ON(void)
{
    if(inicio==1) {
        switch(e_led_serie_on) {
            case 0:
                LV=0;
                if(t_led_serie_on>=3 && LV==0) {
                    t_led_serie_on=0;
                    e_led_serie_on=1;
                }
                break;
            case 1:
                LV=1;
                if(t_led_serie_on>=10 && LV==1) {
                    t_led_serie_on=0;
                    e_led_serie_on=0;
                }
                break;
        }
    }
}

void ME_LED_SERIE_OFF(void)
{
    if(inicio==0) {
        switch(e_led_serie_off) {
            case 0:
                LV=0;
                if(t_led_serie_off>=5 && LV==0) {
                    t_led_serie_off=0;
                    e_led_serie_off=1;
                }
                break;
            case 1:
                LV=1;
                if(t_led_serie_off>=5 && LV==1) {
                    t_led_serie_off=0;
                    e_led_serie_off=0;
                }
                break;
        }
    }
}

void TSII(void)
{
    j=tsi.readPercentage();
    if(j>0.01 && t_tsii==0) {
        inicio=!inicio;
        t_tsii=3;
    }
}

void ANALOGICO(void)
{
    analog=ANALOGICA.read_u16();
    //USO REGLA DE 3
    analog_previa=(analog*33)/65536;
    //DIVIDO UNIADADES Y DECENAS
    analog_decena=analog_previa/10;
    analog_unidad=analog_previa-(analog_decena*10);
    //PASO A ASCII
    analog_decena_ascii=analog_decena+48;
    analog_unidad_ascii=analog_unidad+48;
    //PASO A XOR PARA VERIFICACION
    analog_decena_xor = analog_decena_ascii ^ 103;
    analog_unidad_xor = analog_decena_xor ^ analog_unidad_ascii;

}

void ACELEROMETRO(void)
{
    x = abs(acc.getAccX());
    y = abs(acc.getAccY());
    z = abs(acc.getAccZ());

    x_previa= x*10;
    //DIVIDO UNIADADES Y DECENAS
    x_decena=x_previa/10;
    x_unidad=x_previa-(x_decena*10);
    //PASO A ASCII
    decena_x_ascii= x_decena+48;
    unidad_x_ascii= x_unidad+48;
    //PASO A XOR PARA VERIFICACION
    xor_x_decena= 25 ^ decena_x_ascii;
    xor_x_unidad=xor_x_decena ^ unidad_x_ascii;

    y_previa= y*10;
    //DIVIDO UNIADADES Y DECENAS
    y_decena=y_previa/10;
    y_unidad=y_previa-(y_decena*10);
    //PASO A ASCII
    decena_y_ascii= y_decena+48;
    unidad_y_ascii= y_unidad+48;
    //PASO A XOR PARA VERIFICACION
    xor_y_decena= 24 ^ decena_y_ascii;
    xor_y_unidad=xor_y_decena ^ unidad_y_ascii;

    z_previa= z*10;
    //DIVIDO UNIADADES Y DECENAS
    z_decena=z_previa/10;
    z_unidad=z_previa-(z_decena*10);
    //PASO A ASCII
    decena_z_ascii= z_decena+48;
    unidad_z_ascii= z_unidad+48;
    //PASO A XOR PARA VERIFICACION
    xor_z_decena = 27 ^ decena_z_ascii;
    xor_z_unidad = xor_z_decena ^ unidad_z_ascii;

}

void tiempo(void)
{
    t_led_serie_off++;
    t_led_serie_on++;
    t_tsii--;
    if(t_tsii <=0) {
        t_tsii=0;
    }
}