programa puerto serie

Dependencies:   mbed tsi_sensor MMA8451Q

Revision:
0:3182f991c6fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue May 12 19:42:31 2020 +0000
@@ -0,0 +1,303 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "MMA8451Q.h"
+
+#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)
+
+/* 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
+
+
+enum {DESACTIVADO, ACTIVADO};
+
+enum {LED_ON, LED_OFF};
+int tiempo_led, estado_led = 0, aux = 0, hab = 0, b = 0, i = 0, estado_sistema = DESACTIVADO;
+//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
+
+enum {INICIO, ORDEN, ACELEROMETRO, ANALOGICA, DIGITAL, X, Y, Z, UNO, FIN};
+
+Ticker tick;
+DigitalOut lv(LED1);
+DigitalIn dig(PTC7,PullUp);
+AnalogIn ana(PTB2);
+
+
+float adc;
+
+char vector[8];
+int  estado = INICIO, in = 0, cuenta_dig = 0, unidades_dig = 0, decenas_dig = 0, cuenta_ana = 0, decenas_ana = 0, unidades_ana = 0;
+int cuenta_x = 0, cuenta_y = 0, cuenta_z = 0, unidades_x = 0, decenas_x = 0, unidades_y = 0, decenas_y = 0, unidades_z = 0, decenas_z = 0;
+
+//Callback cuando se detecta una entrada
+void onCharReceived()
+{
+    //Copiamos lo leido en c
+    c = pc.getc();
+    newdata = true;
+}
+
+void timer()
+{
+    if(tiempo_led != 0)
+        tiempo_led--;
+}
+int main()
+{
+//Ejecutar onCharReceived por cada entrada por puerto
+    pc.attach(&onCharReceived);
+
+    TSIAnalogSlider tsi(ELEC0, ELEC1, 40);        // Configuro el tsi
+    tick.attach(&timer, 0.01);                    // Configuro el ticker
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);  // Configuro el acelerometro
+
+    while (true) {
+        float x, y, z;
+        x = abs(acc.getAccX());
+        y = abs(acc.getAccY());
+        z = abs(acc.getAccZ());
+        switch(estado_sistema) {
+            case DESACTIVADO:                       // Led parpadea cada 250msf
+                if(tsi.readPercentage() == 0) {
+                    switch(estado_led) {
+                        case LED_ON:
+                            lv = 0;
+                            if(aux == 0) {
+                                tiempo_led = 25;
+                                aux = 1;
+                                estado_led = LED_ON;
+                            }
+                            if(tiempo_led == 0)
+                                estado_led = LED_OFF;
+                            break;
+                        case LED_OFF:
+                            lv = 1;
+                            if(aux == 1) {
+                                tiempo_led = 25;
+                                estado_led = LED_OFF;
+                                aux = 0;
+                            }
+                            if(tiempo_led == 0)
+                                estado_led = LED_ON;
+                            break;
+                    }
+                }
+                if(tsi.readPercentage() != 0)
+                    estado_sistema = ACTIVADO;
+                break;
+            case ACTIVADO:                      // Led prendido 200ms y apagado 1500ms
+                switch(estado_led) {
+                    case LED_ON:
+                        lv = 0;
+                        if(aux == 0) {
+                            tiempo_led = 20;
+                            aux = 1;
+                            estado_led = LED_ON;
+                        }
+                        if(tiempo_led == 0)
+                            estado_led = LED_OFF;
+                        break;
+                    case LED_OFF:
+                        lv = 1;
+                        if(aux == 1) {
+                            tiempo_led = 150;
+                            estado_led = LED_OFF;
+                            aux = 0;
+                        }
+                        if(tiempo_led == 0)
+                            estado_led = LED_ON;
+                        break;
+                }
+                if(tsi.readPercentage() != 0)
+                    estado_sistema = DESACTIVADO;
+                if(newdata) {
+                    newdata = false;
+
+                    switch(estado) {                 // Inicia maquina de estado del sistema
+                        case INICIO:
+                            if (c == '#') {
+                                vector[0] = c;
+                                estado = ORDEN;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case ORDEN:
+                            if(c == 'E') {
+                                vector[1] = c;
+                                estado = ACELEROMETRO;
+                                c = '\0';
+                            }
+                            if(c == 'A') {
+                                vector[1] = c;
+                                estado = ANALOGICA;
+                                c = '\0';
+                            }
+                            if(c == 'D') {
+                                vector[1] = c;
+                                estado = DIGITAL;
+                                c = '\0';
+                            }
+                            if(c != '\0' && c != 'E') {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case ACELEROMETRO:
+                            if(c == 'X') {
+                                vector[2] = c;
+                                estado = X;
+                                c = '\0';
+                            }
+                            if(c == 'Y') {
+                                vector[2] = c;
+                                estado = Y;
+                                c = '\0';
+                            }
+                            if(c == 'Z') {
+                                vector[2] = c;
+                                estado = Z;
+                                c = '\0';
+                            }
+                            if(c != 'X' && c != 'Y' && c != 'Z' && c != '\0') {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case ANALOGICA:
+
+                            adc = ana*3.3;                      // Conversión adc
+                            cuenta_ana = adc*10;
+                            unidades_ana = cuenta_ana%10;       // Separo en unidades
+                            decenas_ana = cuenta_ana/10;        // Separo en decenas
+                            vector[3] = decenas_ana + 0x30;     // Convierto a ascii
+                            vector[4] = unidades_ana + 0x30;    // Convierto a ascii
+                            if(c == '1') {
+                                vector[2] = c;
+                                estado = UNO;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case DIGITAL:
+                            in = dig;
+                            cuenta_dig = in*10;
+                            unidades_dig = cuenta_dig%10;       // Separo en unidades
+                            decenas_dig = cuenta_dig/10;        // Separo en decenas
+                            vector[3] = decenas_dig + 0x30;     // Convierto a ascii
+                            vector[4] = unidades_dig + 0x30;    // Convierto a ascii
+                            if(c == '1') {
+                                vector[2] = c;
+                                estado = UNO;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case X:
+                            cuenta_x = x*10;
+                            unidades_x = cuenta_x;          // Separo en unidades
+                            decenas_x = cuenta_x/10;        // Separo en decenas
+                            vector[3] = decenas_x + 0x30;   // Convierto a ascii
+                            vector[4] = unidades_x + 0x30;  // Convierto a ascii
+                            if(c == '$') {
+                                vector[5] = c;
+
+                                estado = FIN;
+                                newdata = true;
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case Y:
+                            cuenta_y = y*10;
+                            unidades_y = cuenta_y;              //  Separo en unidades
+                            decenas_y = cuenta_y/10;            //  Separo en decenas
+                            vector[3] = decenas_y + 0x30;       //  Convierto a ascii
+                            vector[4] = unidades_y + 0x30;      //  Convierto a ascii
+                            if(c == '$') {
+
+                                estado = FIN;
+                                newdata = true;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case Z:
+                            cuenta_z = z*10;
+                            unidades_z = cuenta_z;          // Separo en unidades
+                            decenas_z = cuenta_z/10;        // Separo en decenas
+                            vector[3] = decenas_z + 0x30;   // Convierto a ascii
+                            vector[4] = unidades_z + 0x30;  // Convierto a ascii
+                            if(c == '$') {
+                                estado = FIN;
+                                newdata = true;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case UNO:
+                            if(c == '$') {
+                                newdata = true;
+                                estado = FIN;
+                                c = '\0';
+                            } else {
+                                estado = INICIO;
+                                c = '\0';
+                            }
+                            break;
+                        case FIN:
+                            vector[5] = (vector[0] ^ vector [1] ^ vector[2] ^ vector[3] ^ vector[4]);
+                            vector[6] = 36;
+                            for(int b = 0; b <= 8; b++) {       // Recorro el vector
+                                if(b != 5)
+                                    printf("%c", vector[b]);    // Imprimo las posiciones
+                                if(b == 5)
+                                    printf("%x", vector[b]);    // Imprimo la posicion 5 en hexa
+                            }
+                            estado = INICIO;
+                            printf("\r\n");
+                            c = '\0';
+                            break;
+                    }
+                }
+                break;
+        }
+    }
+}
+