
Programa del TRABAJO PRACTICO PTC -- Mayo 2020
Dependencies: mbed tsi_sensor MMA8451Q
main.cpp
- Committer:
- nacho9640
- Date:
- 2020-06-23
- Revision:
- 2:e970a9093797
- Parent:
- 1:268507041816
File content as of revision 2:e970a9093797:
#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 TIEMPO_ACTIVO1 100 #define TIEMPO_ACTIVO2 1700 #define PERIODO_INACTIVO 500 #define ANTIRREBOTE 40 #define EJES 250 #define INICIO '@' #define FIN '#' #define ENVIAR_EJE_X '1' #define ENVIAR_EJE_Y '2' #define ENVIAR_EJE_Z '3' #define ENVIAR_ENTRADA_ANALOGICA '4' #define ENVIAR_ENTRADA_DIGITAL '5' 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, Dato_a_Enviar[3]; Ticker ticker; //Inicializo un Timer DigitalIn InputRef(PTB9); DigitalOut LED_EXTERNO(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, Etapa_Activo = 1; ROJO = 1; VERDE = 1; AZUL = 1; while(1) { Tactil = tsi.readPercentage(); if(1 >= 3.3*Analog_Voltage){ ROJO = 0; VERDE = 1; AZUL = 1; }else if(2 < 3.3 * Analog_Voltage){ ROJO = 1; VERDE = 1; AZUL = 0; }else{ ROJO = 1; VERDE = 0; AZUL = 1; } 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){ switch(Etapa_Activo){ case 1: LED_EXTERNO = 1; if(Cont_Blink >= TIEMPO_ACTIVO1){ Etapa_Activo = 2; Cont_Blink = 0; } break; case 2: LED_EXTERNO = 0; if(Cont_Blink >= TIEMPO_ACTIVO1){ Etapa_Activo = 3; Cont_Blink = 0; } break; case 3: LED_EXTERNO = 1; if(Cont_Blink >= TIEMPO_ACTIVO1){ Etapa_Activo = 4; Cont_Blink = 0; } break; case 4: LED_EXTERNO = 0; if(Cont_Blink >= TIEMPO_ACTIVO2){ Etapa_Activo = 1; Cont_Blink = 0; } break; } }else{ if(Cont_Blink < PERIODO_INACTIVO/2) LED_EXTERNO = 1; else LED_EXTERNO = 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 == ENVIAR_EJE_X){ if(EjeX < 0){ EjeX = EjeX * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeX); Verif = INICIO ^ ENVIAR_EJE_X ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("@1%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, FIN); } if(Accion == ENVIAR_EJE_Y){ if(EjeY < 0){ EjeY = EjeY * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeY); Verif = INICIO ^ ENVIAR_EJE_Y ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("@2%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, FIN); } if(Accion == ENVIAR_EJE_Z){ if(EjeZ < 0){ EjeZ = EjeZ * -1; Signo = '-'; }else Signo = '+'; Dato_Enviar(EjeZ); Verif = INICIO ^ ENVIAR_EJE_Z ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("@3%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, FIN); } if(Accion == ENVIAR_ENTRADA_ANALOGICA){ Dato_Enviar(Analog_Voltage*3.3); Verif = INICIO ^ ENVIAR_ENTRADA_ANALOGICA ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; printf("@4%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, FIN); } if(Accion == ENVIAR_ENTRADA_DIGITAL){ Verif = INICIO ^ ENVIAR_ENTRADA_DIGITAL ^ (InputRef + 48); printf("@5%c%x%x%c\r\n", InputRef + 48,(Verif & 0xF0) >> 4, Verif & 0x0F, FIN); } 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 = Dato; Estado = 2; break; case(2): if(Dato != FIN){ Accion = 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; }