
Programa del TRABAJO PRACTICO PTC -- Mayo 2020
Dependencies: mbed tsi_sensor MMA8451Q
main.cpp
- Committer:
- nacho9640
- Date:
- 2020-05-12
- Revision:
- 0:da3f5e3d5442
- Child:
- 1:268507041816
File content as of revision 0:da3f5e3d5442:
#include "mbed.h" #include "tsi_sensor.h" #include "MMA8451Q.h" #define MMA8451_I2C_ADDRESS (0x1d<<1) #define ELEC0 9 //Electrodos TSI #define ELEC1 10 #define NO_ACTIVO 0 #define ACTIVO 1 #define CUENTA_ACTIVO 200 #define PERIODO_ACTIVO 1700 #define PERIODO_INACTIVO 500 #define ANTIRREBOTE 40 #define EJES 250 #define INICIO '$' #define FIN '%' void Timer_Interrupt(); void UART_Interrupt(); char Recepcion(char); void Dato_Enviar(double); PinName const SDA = PTE25; //Config I2C Acelerometro PinName const SCL = PTE24; int Cont_Blink = 0, Rebote = 0, Cont_Ejes = 0; bool Activo = 0; char Caracter = 0; bool Nuevo_Char = 0; char Accion[2], Dato_a_Enviar[3]; Ticker ticker; //Inicializo un Timer DigitalIn InputRef(PTB9); DigitalOut PWM(PTB1); DigitalOut ROJO(LED_RED); DigitalOut AZUL(LED_BLUE); DigitalOut VERDE(LED_GREEN); AnalogIn Analog_Voltage(A0); RawSerial UART(USBTX, USBRX); int main() { ticker.attach(&Timer_Interrupt, 0.001); //Se llamara a la funcion de timer cada 1mS UART.attach(&UART_Interrupt); //Cada vez que se recibe algo se llama a la interrupcion de UART TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Configuro cosita tactil MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); //Configuro Acelerometro double Tactil = 0; bool Toque = 1, Rx_OK = 0, Leer_Ejes = 0; double EjeX = 0, EjeY = 0, EjeZ = 0; char Signo = 0, Verif = 0; ROJO = 1; VERDE = 1; AZUL = 1; while(1) { Tactil = tsi.readPercentage(); if(Cont_Ejes >= EJES){ Leer_Ejes = 1; Cont_Ejes = 0; } if(Leer_Ejes){ EjeX = acc.getAccX(); EjeY = acc.getAccY(); EjeZ = acc.getAccZ(); Leer_Ejes = 0; } if(Tactil != NO_TOUCH && !Rebote && !Toque){ Rebote = 1; Toque = 1; } if(Tactil == NO_TOUCH) Toque = 0; if(Rebote >= ANTIRREBOTE){ if(!Activo) Activo = ACTIVO; else Activo = NO_ACTIVO; Rebote = 0; } if(Activo){ if(Cont_Blink < CUENTA_ACTIVO) PWM = 1; else PWM = 0; if(Cont_Blink >= PERIODO_ACTIVO) Cont_Blink = 0; }else{ if(Cont_Blink < PERIODO_INACTIVO/2) PWM = 1; else PWM = 0; if(Cont_Blink >= PERIODO_INACTIVO) Cont_Blink = 0; } if(Nuevo_Char && Activo){ Rx_OK = Recepcion(Caracter); Nuevo_Char = 0; } if(Rx_OK){ if(Accion[0] == 'A' && Accion[1] == 'X'){ if(EjeX < 0){ EjeX = EjeX * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeX); Verif = '$' ^ 'A'^ 'X' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("$AX%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); } if(Accion[0] == 'A' && Accion[1] == 'Y'){ if(EjeY < 0){ EjeY = EjeY * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeY); Verif = '$' ^ 'A' ^ 'Y' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("$AY%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); } if(Accion[0] == 'A' && Accion[1] == 'Z'){ if(EjeZ < 0){ EjeZ = EjeZ * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeZ); Verif = '$' ^ 'A' ^ 'Z' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("$AZ%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); } if(Accion[0] == 'V' && Accion[1] == '1'){ Dato_Enviar(Analog_Voltage*3.3); Verif = '$' ^ 'V'^ '1' ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("$V1%c%c%c%x%x%c\r\n", Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); } if(Accion[0] == 'D' && Accion[1] == '1'){ Verif = '$' ^ 'D'^ '1' ^ (InputRef + 48); printf("$D1%c%x%x%c\r\n", InputRef + 48,(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); } Rx_OK = 0; } } } void Timer_Interrupt(){ Cont_Blink++; Cont_Ejes++; if(Rebote > 0) Rebote++; } void UART_Interrupt(){ Caracter = UART.getc(); Nuevo_Char = 1; } char Recepcion(char Dato){ char Ok = 0; static char Estado = 0; switch(Estado){ case(0): if(Dato == INICIO) Estado = 1; break; case(1): Accion[0] = Dato; Estado = 2; break; case(2): Accion[1] = Dato; Estado = 3; break; case(3): if(Dato != FIN){ Accion[0] = 0; Accion[1] = 0; }else Ok = 1; Estado = 0; break; } return Ok; } void Dato_Enviar(double Dato){ Dato_a_Enviar[2] = (char)Dato; Dato_a_Enviar[1] = ((char)(Dato*10))%10; Dato_a_Enviar[0] = (char)(Dato*100.0f - Dato_a_Enviar[2]*100 - Dato_a_Enviar[1]*10) + 48; Dato_a_Enviar[2] += 48; Dato_a_Enviar[1] += 48; }