h

Dependencies:   mbed tsi_sensor MMA8451Q

Revision:
0:72263a224c3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 23 00:54:41 2020 +0000
@@ -0,0 +1,452 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "MMA8451Q.h"
+
+#define DESHABILITADO 0
+#define HABILITADO 1
+
+#define HAB_1 0
+#define HAB_2 1
+#define HAB_3 2
+
+#define DES_ON 0
+#define DES_OFF 1
+
+#define HAB_ON 0
+#define HAB_OFF_1 1
+#define HAB_OFF_2 2
+
+#define ON 0
+#define OFF 1
+
+#define ESPERA 0
+#define ORDEN 1
+#define FIN 2
+#define AUXILIAR 3
+
+AnalogIn voltaje_entrada(PTC1);
+DigitalIn entrada_digital(PTC7);
+DigitalOut led_habilitacion (PTB1);
+
+DigitalOut led_rojo(LED1);
+DigitalOut led_verde(LED2);
+DigitalOut led_azul(LED3);
+
+/* 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)
+
+//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
+
+//Callback cuando se detecta una entrada
+void onCharReceived(){
+    //Copiamos lo leido en c
+    c = pc.getc();
+    newdata = true;
+}
+
+
+void timer();
+void led_deshabilitado();
+void led_habilitado();
+int acelerometro_x();
+int acelerometro_y();
+int acelerometro_z();
+int adc();
+int in_digital();
+char lrc();
+
+Ticker tick;
+
+int habilitacion=0;
+char estado_en_hab = HAB_ON,cont=1,estado_hab=DESHABILITADO;
+char aux=0,var=0;
+int tiempo_des=0, tiempo_rebote=0,tiempo_hab=0,tiempo_espera=0;
+char estado_des = DES_ON;
+int estado=ESPERA;
+char vector_respuesta[10]= {0};
+int orden=0,a=0,j=0;
+int  valor_lrc=0;
+float x,y,z;
+int valor_dig=0;
+unsigned int valor_adc;
+float in_analog;
+int valor_analog;
+char adc_decena=0,adc_unidad=0;
+
+int main (){ 
+
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    
+    tick.attach(&timer, 0.001);
+    
+    TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+    
+    char estado_hab = DESHABILITADO;
+
+    led_rojo = 1;
+    led_verde = 1;
+    led_azul = 1;
+    led_habilitacion = 0; 
+    
+    pc.attach(&onCharReceived);
+    
+    while(true){
+        switch(estado_hab){
+            
+            default:
+            case DESHABILITADO:
+                habilitacion=0;
+                led_deshabilitado();
+                led_habilitacion = 0;
+                //CUANDO HAGAS ADC FIJATE ESTO,ES LO DE MONITOREAR Y MOSTRAR EL ESTADO DE LA ENTRADA ANALOGICA 
+                
+                adc();
+                
+                if(valor_analog<=10){
+                    led_rojo = 0;
+                    led_verde = 1;
+                    led_azul = 1;        
+                }
+                if(valor_analog>10 && adc_decena<=20){
+                    led_rojo = 1;
+                    led_verde = 0;
+                    led_azul = 1;        
+                }
+                if(valor_analog>20){
+                    led_rojo = 1;
+                    led_verde = 1;
+                    led_azul = 0;        
+                }
+                
+                if(tsi.readPercentage()!=0 && aux==0){
+                    tiempo_rebote=0; 
+                    aux=1;
+                    led_habilitacion = 0;
+                }
+                if(tiempo_rebote>=500 && aux==1){
+                    aux=0;
+                    estado_hab = HABILITADO;  
+                }
+            break;
+            
+            case HABILITADO:
+                habilitacion=1;
+                led_habilitado();
+                
+                adc();
+                
+                if(valor_analog<=10){
+                    led_rojo = 0;
+                    led_verde = 1;
+                    led_azul = 1;        
+                }
+                if(valor_analog>10 && adc_decena<=20){
+                    led_rojo = 1;
+                    led_verde = 0;
+                    led_azul = 1;        
+                }
+                if(valor_analog>20){
+                    led_rojo = 1;
+                    led_verde = 1;
+                    led_azul = 0;        
+                }
+                
+                if(tsi.readPercentage()!=0 && aux==0){
+                    tiempo_rebote=0; 
+                    aux=1;
+                }
+                if(tiempo_rebote>=500 && aux==1){
+                    aux=0;
+                    estado_hab = DESHABILITADO;  
+                }
+            break;          
+        } //del switch
+        
+        if(newdata && habilitacion==1){
+            newdata = false;
+            
+            switch(estado){
+            
+                case ESPERA:
+                    if(c==':'){
+                        estado=ORDEN;
+                        vector_respuesta[0]=':'; 
+                        c = '\0';   
+                    }
+                break;
+                
+                case ORDEN:
+                    switch(c){
+                        
+                        default:
+                            estado = ESPERA;
+                        break;
+                            
+                        case 'X':                        
+                            acelerometro_x();
+                                                        
+                            vector_respuesta[1]='X'; 
+                            
+                            vector_respuesta[2]=x/10;
+                            vector_respuesta[3]=x - (vector_respuesta[2] * 10);
+                            
+                            a=vector_respuesta[2];
+                            j=vector_respuesta[3];
+                            orden='X';
+                            
+                            lrc(); 
+                            
+                            if(c=='#'){
+                                estado=FIN;    
+                            }
+                                        
+                            c = '\0';        
+                        break; 
+                        
+                        case 'Y':
+                            acelerometro_y();
+                            
+                            vector_respuesta[1]='Y'; 
+                            
+                            vector_respuesta[2]=y/10;
+                            vector_respuesta[3]=y - (vector_respuesta[2] * 10);
+                            
+                            a=vector_respuesta[2];
+                            j=vector_respuesta[3];
+                            orden='Y';
+                            
+                            lrc();
+                            
+                            if(c=='#'){
+                                estado=FIN;    
+                            }
+                                                        
+                            c = '\0';
+                        break; 
+                        
+                        case 'Z':
+                            acelerometro_z();
+                            
+                            vector_respuesta[1]='Z'; 
+                        
+                            vector_respuesta[2]=z/10;
+                            vector_respuesta[3]=z - (vector_respuesta[2] * 10);
+                            
+                            a=vector_respuesta[2];
+                            j=vector_respuesta[3];
+                            orden='Z';
+                            
+                            lrc();
+                            
+                            if(c=='#'){
+                                estado=FIN;    
+                            }
+                            
+                            c = '\0';
+                        break; 
+                        
+                        case 'V':
+                            adc();
+                            
+                            vector_respuesta[1]='V'; 
+                            
+                            vector_respuesta[2]=valor_analog/10;
+                            vector_respuesta[3]=valor_analog-(vector_respuesta[2]*10);
+                            
+                            a=vector_respuesta[2];
+                            j=vector_respuesta[3];
+                            orden='V';
+                            
+                            lrc();
+                            
+                            tiempo_espera=0;
+                            estado=AUXILIAR; 
+                        
+                            c = '\0';
+                        break; 
+                        
+                        case 'S':
+                            in_digital();
+                            vector_respuesta[1]='S'; 
+                            
+                            vector_respuesta[2]=0;
+                            vector_respuesta[3]=valor_dig;
+                            
+                            a=0;
+                            j=vector_respuesta[3];
+                            orden='S';
+                            
+                            lrc();
+                            
+                            tiempo_espera=0;
+                            estado=AUXILIAR; 
+                            
+                            c = '\0';
+                        break; 
+                    
+                        case ':':
+                        break;  
+                         
+                    }
+                break;  
+                
+                case AUXILIAR:
+                    if(tiempo_espera>=250){
+                        estado=FIN;    
+                    }
+                       
+                break;
+                
+                case FIN:
+                    vector_respuesta[4]='#';
+                    printf("\r\n%c%c%d%d%x%c",vector_respuesta[0],vector_respuesta[1],vector_respuesta[2],vector_respuesta[3],valor_lrc,vector_respuesta[4]);
+                    estado=ESPERA;
+                    c = '\0';
+                break;
+
+            } //switch
+        }// if newdata   
+    } //del while siempre arriba del main  
+} //del main
+
+
+void timer(){
+    tiempo_rebote++;
+    tiempo_des++; 
+    tiempo_hab++;  
+    tiempo_espera++;         
+}
+
+
+void led_deshabilitado(){
+    switch(estado_des){
+        case DES_ON:
+            led_habilitacion = 1;
+            if(tiempo_des >= 250){
+                tiempo_des=0;
+                estado_des=DES_OFF;    
+            }
+        break;  
+        
+        case DES_OFF:
+            led_habilitacion = 0;
+            if(tiempo_des >=250){
+                tiempo_des=0;
+                estado_des=DES_ON;    
+            }
+        break;   
+    }    
+}
+
+
+void led_habilitado(){
+    switch(estado_en_hab){
+        
+        case HAB_ON:
+        led_habilitacion = 1;
+            led_habilitacion = 1;
+            if(tiempo_hab>=100 && var==0){
+                tiempo_hab=0;
+                estado_en_hab = HAB_OFF_1;       
+            }   
+            if(tiempo_hab>=100 && var==1){
+                tiempo_hab=0;
+                estado_en_hab = HAB_OFF_2;    
+            } 
+        break;
+        
+        case HAB_OFF_1:
+            led_habilitacion = 0;
+            if(tiempo_hab>=100){
+                tiempo_hab=0;
+                var=1;
+                estado_en_hab = HAB_ON;    
+            }
+        break;
+        
+        case HAB_OFF_2:
+            led_habilitacion = 0;
+            if(tiempo_hab>=2000){
+                var=0;
+                tiempo_hab=0;
+                estado_en_hab = HAB_ON;    
+            }          
+        break;  
+    }
+}    
+
+
+int acelerometro_x(){
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    x = abs(acc.getAccX());
+    x=x*100;
+    return x;   
+}
+
+int acelerometro_y(){
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    y = abs(acc.getAccY());
+    y=y*100;
+    return y;   
+}
+
+int acelerometro_z(){
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    z = abs(acc.getAccZ());
+    z=z*100;
+    return z;   
+}
+
+
+int adc(){
+    valor_adc = voltaje_entrada.read_u16(); 
+    in_analog = valor_adc * (3.3f / 65535.0f); 
+    valor_analog = in_analog*10;
+    return valor_analog;      
+}
+
+
+int in_digital(){
+    if(entrada_digital==1)valor_dig=1;
+    else valor_dig=0;
+    
+    return valor_dig;                
+}
+
+char lrc(){ 
+    int inicio= ':';
+    valor_lrc=0;
+    valor_lrc ^= inicio;
+    valor_lrc ^= orden;
+    valor_lrc ^= (a + 48);
+    valor_lrc ^= (j + 48);
+    
+    return valor_lrc;  
+}
\ No newline at end of file