Dependencies: mbed tsi_sensor MMA8451Q
main.cpp
- Committer:
- Lucas_Abalos
- Date:
- 2020-05-11
- Revision:
- 0:389e803b62b7
File content as of revision 0:389e803b62b7:
#include "mbed.h"
#include "tsi_sensor.h"
#include "MMA8451Q.h"
#define desactivado 1
#define activado 2
#define prendido 3
#define apagado 4
#define arroba 5
#define orden 6
#define parent 7
#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)
Ticker delay;
Serial pc(USBTX, USBRX);//Definimos que el puerto serie se llama pc
void puls_h();
void me_gen();
void tiempo_leds();
void lee_recepcion();
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
DigitalIn EN_DIG(PTB2,PullUp);
AnalogIn EN_ANA(PTB3);
DigitalOut led(LED_GREEN);
char c='\0';//Variable donde se guarda lo leido
//bit usado como flag para procesar datos
bool newdata = false; //Se pone en true cuando hay nuevos datos
unsigned char puls=0,act=0,tp=0,ta=0,flag_camb_est=1;
unsigned char respuesta[6];
//Callback cuando se detecta una entrada
void onCharReceived()
{
//Copiamos lo leido en c
c = pc.getc();
newdata = true;
}
int main(void)
{
pc.attach(&onCharReceived);//Ejecutar onCharReceived por cada entrada por puerto
delay.attach(tiempo_leds,0.01);
led=1;
pc.printf("MMA8451 ID: %d\n", acc.getWhoAmI());
while (true) {
puls_h();
me_gen();
lee_recepcion();
}
}
void lee_recepcion()
{
static int caso=arroba;
float x, y, z;
float voltaje=0;
int voltaje_dec=0,voltaje_uni=0;
int digital=0;
int coord_uni=0,coord_dec=0;
int primer_dig=0,segundo_dig=0;
if(newdata && act==0) {
newdata = false;
c = '\0';//borra caracter
}
if(newdata && act==1) {
newdata = false;
switch(caso) {
case arroba:
if(c=='@') {
caso=orden;
respuesta[0]=c;
}
c = '\0';//Hacemos NULL c para que no vuelva a ejecutar
break;
case orden:
if(c=='1' || c=='2' || c=='3' || c=='4' || c=='5') {
caso=parent;
switch(c) {
case '1'://ejex acelerometro
x = abs(acc.getAccX());
coord_dec = (int(x*10)) / 10;
coord_uni = (int(x*10)) % 10;
respuesta[1]=c;
respuesta[2]=coord_dec + 0x30;
respuesta[3]=coord_uni + 0x30;
break;
case '2'://ejey acel.
y = abs(acc.getAccY());
coord_dec = (int(y*10)) / 10;
coord_uni = (int(y*10)) % 10;
respuesta[1]=c;
respuesta[2]=coord_dec + 0x30;
respuesta[3]=coord_uni + 0x30;
break;
case '3'://ejez acel.
z = abs(acc.getAccZ());
coord_dec = (int(z*10)) / 10;
coord_uni = (int(z*10)) % 10;
respuesta[1]=c;
respuesta[2]=coord_dec + 0x30;
respuesta[3]=coord_uni + 0x30;
break;
case '4'://entrada analogica
voltaje = EN_ANA;
voltaje = voltaje * 3.3;
voltaje_dec = (int(voltaje*10)) / 10;
voltaje_uni = (int(voltaje*10)) % 10;
respuesta[1]=c;
respuesta[2]= voltaje_dec + 0x30;
respuesta[3]= voltaje_uni + 0x30;
break;
case '5'://entrada digital
digital = EN_DIG;
primer_dig = (digital*10) / 10;// La entrada digital va a valer 10 cuando sea 1 y 00 cuando sea 0
segundo_dig = (digital*10) % 10;
respuesta[1]=c;
respuesta[2]= primer_dig + 0x30;
respuesta[3]= segundo_dig + 0x30;
break;
default:
break;
}
} else caso=arroba;
c = '\0';
break;
case parent:
if(c==')') {
respuesta[4]=(respuesta[0]^respuesta[1]^respuesta[2]^respuesta[3]);
respuesta[5]= 41;
caso=arroba;
pc.printf("\n\r");
for(int i=0; i<=5; i++) {
if(i!=4)pc.printf("%c",respuesta[i]);
if(i==4)pc.printf("%x",respuesta[i]);
}
pc.printf("\n\r");
} else caso=arroba;
c = '\0';
break;
default:
caso=arroba;
c = '\0';
break;
}
}
}
void me_gen()
{
static int caso=desactivado;
switch(caso) {
case desactivado:
tp=25;
ta=25;
act=0;
if(puls==1 && flag_camb_est==1) {
flag_camb_est=0;
caso=activado;
}
break;
case activado:
tp=20;
ta=150;
act=1;
if(puls==1 && flag_camb_est==1) {
flag_camb_est=0;
caso=desactivado;
}
break;
default:
break;
}
}
void tiempo_leds()
{
static int tiempo=0,caso=prendido;
switch(caso) {
case prendido:
if(tiempo<tp) {
tiempo++;
led=0;
}
if(tiempo>=tp) {
tiempo=0;
caso=apagado;
}
break;
case apagado:
if(tiempo<ta) {
tiempo++;
led=1;
}
if(tiempo>=ta) {
tiempo=0;
caso=prendido;
}
break;
default:
break;
}
}
void puls_h()
{
if(puls==1 && tsi.readPercentage() == 0) {
flag_camb_est=1;
puls=0;
}
if(puls==0 && tsi.readPercentage() != 0) puls=1;
}