.

Dependencies:   mbed tsi_sensor MMA8451Q

main.cpp

Committer:
lucasbovone
Date:
2020-05-12
Revision:
0:2641e3a39ede

File content as of revision 0:2641e3a39ede:

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

#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)

#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

//Defines para poder ver mas simple la maquina de estado
#define INICIO  0
#define MODO    1
#define MUESTRO 2
#define ACEL    3
#define ANALOG  4
#define DIGIT   6
#define ERROR   5

Serial pc(USBTX, USBRX);

//Funciones
void recibo();//Paso lo que recibo por pc para ver lo que pide
void r_lrc();//Aca hace el lrc de lo recibido y lo imprime todo
void sw();//funcion que sirve para saber si se prende o apaga
void l_on();//funcion para el parpadeo cuando esta habilitado
void l_off();//funcion para el parpadeo cuando esta habilitado

//Variables
char buffer[5];//Guardo lo que recibo de PC aca
float xm=0,ym=0,zm=0,j=0,an=0,dig=0;//Variables de lo medido
int estado=0,i=0,e=0,ace=0,hab=0,enc=0,t=0,dec=0,uni=0;
int decx=0,unix=0,decy=0,uniy=0,decz=0,uniz=0,decan=0,unian=0;//Decena y unidad acelerometro

//Entradas y salidas
AnalogIn analog(PTB0);//Analogica
DigitalIn digit(PTC3);//Digital
DigitalOut rled(LED1);//Led Rojo
DigitalOut gled(LED2);//Led Verde
DigitalOut bled(LED3);//Led Azul

//Timers
Timer ton;//Timer para contar los ciclos de 0.3
Timer ton2;//Timer para contar el segundo apagado
Timer toff;//Timer para contar los ciclos de 0.25
Timer tw;/*Timer para poder leer cada cierto tiempo el tsi, si no le ponia el 
tiempo podia tirar un valor alto al azar cuando prendia y se habilitaba solo*/

bool newdata = false;   //Se pone en true cuando hay nuevos datos
void onCharReceived()
{
    //Copiamos lo leido en el buffer
    pc.gets(buffer,4);
    newdata = true;
}
/*
ACLARACIONES
-En la entrada analogica por ejemplo 54 representa 0,54V, osea que va de 0 a 0,99
es decir hasta 99, pasa lo mismo con el acelerometro.
-En la digital se envia =1 o =0.
-El LRC se muestra en hexa.
*/
int main()
{
    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
    TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
    rled=1;
    gled=1;
    bled=1;
    pc.attach(&onCharReceived);

    while (true) {
        tw.start();
        if(tw.read()>0.05) {
            j=tsi.readPercentage();
            tw.stop();
            tw.reset();
        }
        sw();
        xm = abs(acc.getAccX());
        ym = abs(acc.getAccY());
        zm = abs(acc.getAccZ());
        if(enc==1) {
            recibo();
            l_on();
        } else {
            newdata=false;
            l_off();
        }


    }
}
void r_lrc()
{
    char LRC=0;
    for (int b = 0; b < sizeof(buffer); b++) {
        LRC ^= buffer[b];
    }
    printf("\n\n %s%X$  \n\n",buffer,LRC);
}
void sw()
{
    if(j>0.0001&&hab==0) {
        enc=!enc;
        hab=1;
    }
    if(j<=0&&hab==1) {
        hab=0;
    }
}
void l_on()
{
    rled=1;
    if(t<2) {
        ton.start();
        if(ton.read()>=0.3) {
            gled=!gled;
            if(gled==1) {
                t++;
            }
            ton.stop();
            ton.reset();
        }
    } else {
        gled=1;
        ton2.start();
        if(ton2.read()>=1) {
            t=0;
            ton2.stop();
            ton2.reset();
        }
    }
}
void l_off()
{
    ton.stop();
    ton.reset();
    ton2.stop();
    ton2.reset();
    t=0;
    gled=1;
    toff.start();
    if(toff.read()>=0.25) {
        rled=!rled;
        toff.stop();
        toff.reset();
    }
}

void recibo()
{
    if(newdata) {

        switch(estado) {
            case INICIO:
                if(buffer[0]=='@') {
                    estado=MODO;
                } else {
                    estado=ERROR;
                }
                break;
            case MODO:
                if(buffer[1]=='x') {
                    ace=1;
                    estado=ACEL;
                } else if(buffer[1]=='y') {
                    ace=2;
                    estado=ACEL;
                } else if(buffer[1]=='z') {
                    ace=3;
                    estado=ACEL;
                } else if(buffer[1]=='a') {
                    estado=ANALOG;
                } else if(buffer[1]=='d') {
                    estado=DIGIT;
                } else if(estado==1) {
                    estado=ERROR;
                }
                break;
            case MUESTRO:
                estado=INICIO;
                i=0;
                r_lrc();
                newdata=false;
                break;
            case ACEL:
                if(ace==1&&buffer[2]=='$') {
                    decx=xm*10;
                    unix=xm*100-decx*10;
                    buffer[2]=decx+48;
                    buffer[3]=unix+48;
                    estado=MUESTRO;
                } else if(ace==2&&buffer[2]=='$') {

                    decy=ym*10;
                    uniy=ym*100-decy*10;
                    buffer[2]=decy+48;
                    buffer[3]=uniy+48;
                    estado=MUESTRO;
                } else if(ace==3&&buffer[2]=='$') {
                    decz=zm*10;
                    uniz=zm*100-decz*10;
                    buffer[2]=decz+48;
                    buffer[3]=uniz+48;
                    estado=MUESTRO;
                } else {
                    estado=ERROR;
                }
                break;
            case 4:
                if(buffer[2]=='$') {
                    gled=1;
                    an=analog*100;
                    decan=an/10;
                    unian=an-decan*10;
                    buffer[2]=decan+48;
                    buffer[3]=unian+48;
                    estado=MUESTRO;
                } else {
                    estado=ERROR;
                }
                break;
            case ERROR:
                newdata=false;
                estado=INICIO;
                break;
            case DIGIT:
                if(buffer[2]=='$') {
                    dig=digit;
                    buffer[2]='=';
                    buffer[3]=digit+48;
                    estado=MUESTRO;
                } else {
                    newdata=false;
                    estado=ERROR;
                }
                break;
        }
    }
}