
Parcial Junio Sistemas Embebidos Juan Eguidazu
Dependencies: mbed tsi_sensor MMA8451Q
main.cpp
- Committer:
- juaneguidazu
- Date:
- 2020-06-22
- Revision:
- 0:25fa9c2b3c2a
File content as of revision 0:25fa9c2b3c2a:
#include "mbed.h" #include "tsi_sensor.h" #include "MMA8451Q.h" /* 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 #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) DigitalOut rled(LED_RED); DigitalOut gled(LED_GREEN); DigitalOut bled(LED_BLUE); DigitalOut ledon(PTD4); AnalogIn tensionV(PTB0); DigitalIn tensionD(PTA12); // Definicion de patas TSIAnalogSlider tsi(ELEC0, ELEC1, 40); Ticker pulsador; Ticker ledoon; Ticker ledoff; Ticker analogread; void TIMER(void); void LEDV(void); void LEDON(void); void MAQLEDON(void); void LEDOFF(void); void MAQLEDOFF(void); void R_LRC(); void RECEPCION(void); void onCharReceived(); void ANGIN(void); int casosledon=0; int tiempoledon=0; int estadoon=0; int casosledoff=0; int tiempoledoff=0; int estadooff=0; float j=0; bool hab=0; int t=0; int x, y, z, v, d; int bytenum=0; char buffer[3]; char LRC=0; int phab=0; //Definimos que el puerto serie se llama pc Serial pc(USBTX, USBRX); //Variable donde se guarda lo leido char c = '\0'; //bit usado como flag para procesar datos bool newdata = false; //Se pone en true cuando hay nuevos datos int main(void) { //Ejecutar onCharReceived por cada entrada por puerto pc.attach(&onCharReceived); MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); //printf("MMA8451 ID: %d\n", acc.getWhoAmI()); pulsador.attach(&TIMER,0.1); ledoon.attach(&LEDON,0.1); ledoff.attach(&LEDOFF,0.1); analogread.attach(&ANGIN,0.2); while (true) { j=tsi.readPercentage(); x = int ((abs(acc.getAccX()))*100); y = int ((abs(acc.getAccY()))*100); z = int ((abs(acc.getAccZ()))*100); if(j>0&&t==0) { hab=!hab; if(hab == 1) { tiempoledon = 2; casosledon = 0; estadoon = 1; } t=3; } if(hab==1) { MAQLEDON(); LEDV(); RECEPCION(); switch(phab) { default: phab=0; break; case 1: sprintf(buffer,"X%d",x); R_LRC(); printf("\n\n $%s%X)\n\n",buffer,LRC); phab=0; break; case 2: sprintf(buffer,"Y%d",y); R_LRC(); printf("\n\n $%s%X)\n\n",buffer,LRC); phab=0; break; case 3: sprintf(buffer,"Z%d",z); R_LRC(); printf("\n\n $%s%X)\n\n",buffer,LRC); phab=0; break; case 4: sprintf(buffer,"V%d",v); R_LRC(); printf("\n\n $%s%X)\n\n",buffer,LRC); phab=0; break; case 5: sprintf(buffer,"D%d",d); R_LRC(); printf("\n\n $%s%X)\n\n",buffer,LRC); phab=0; break; } } else MAQLEDOFF(); rled=1; bled=1; gled=1; } } void TIMER(void) { if(t==0) { t=0; } else { t--; } } void LEDV(void) { if(v<=10&&v>0) { rled=0; bled=1; gled=1; } else if(v<=20&&v>10) { rled=1; bled=1; gled=0; } else if(v<=33&&v>20) { rled=1; bled=0; gled=1; } } void LEDON(void) { if(tiempoledon<=0) { tiempoledon=0; } else { tiempoledon--; } } void MAQLEDON(void) { switch(estadoon) { case 0: ledon = 0; if(tiempoledon == 0) { estadoon = 1; tiempoledon = 2; } break; case 1: ledon=1; if(tiempoledon==0) { estadoon=0; casosledon++; if(casosledon < 3) { tiempoledon=2; } else if(casosledon == 3) { tiempoledon = 15; casosledon = 0; } break; } } } void LEDOFF(void) { if(tiempoledoff==0) { tiempoledoff=0; } else { tiempoledoff--; } } void MAQLEDOFF(void) { switch(estadooff) { case 0: ledon=1; casosledoff++; if(tiempoledoff==0) { estadooff=1; tiempoledoff=10; break; } else { break; } case 1: ledon=0; if(tiempoledoff==0) { estadooff=0; tiempoledoff=5; break; } else { break; } } } void R_LRC() { for (int b = 0; b < sizeof(buffer); b++) { LRC ^= buffer[b]; } } //Callback cuando se detecta una entrada void onCharReceived() { //Copiamos lo leido en c c = pc.getc(); newdata = true; } void RECEPCION(void) { if(newdata) { switch(bytenum) { case 0: if(c=='$') { bytenum=1; break; } else { bytenum=0; break; } case 1: if(c=='X') { bytenum=2; break; } else if(c=='Y') { bytenum=3; break; } else if(c=='Z') { bytenum=4; break; } else if(c=='V') { bytenum=5; break; } else if(c=='D') { bytenum=6; break; } else { bytenum=0; break; } case 2: if(c==')') { phab=1; bytenum=0; break; } else { bytenum=0; break; } case 3: if(c==')') { phab=2; bytenum=0; break; } else { bytenum=0; break; } case 4: if(c==')') { phab=3; bytenum=0; break; } else { bytenum=0; break; } case 5: if(c==')') { phab=4; bytenum=0; break; } else { bytenum=0; break; } case 6: if(c==')') { if(tensionD==1) d=11; else d=10; phab=5; bytenum=0; break; } else { bytenum=0; break; } } } } void ANGIN(void) { v = int ((tensionV.read()*3.3)*10); }