example

Dependencies:   sgam-lib

Committer:
AndersonIctus
Date:
Fri Jun 07 03:00:08 2019 +0000
Revision:
18:422bbe7a7e47
Parent:
17:a5e2d3e6a634
- ultima mudanca !

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndersonIctus 0:2713c2f0904f 1 #include "mbed.h"
AndersonIctus 12:04b0ccb40acc 2 #include "Temperature.h"
AndersonIctus 17:a5e2d3e6a634 3 #include "Gyroscope.h"
AndersonIctus 17:a5e2d3e6a634 4
AndersonIctus 17:a5e2d3e6a634 5 #define ONE_SEC 1000
AndersonIctus 12:04b0ccb40acc 6
AndersonIctus 12:04b0ccb40acc 7 Serial pc(USBTX, USBRX); // SAIDA SERIAL PADRÃO
AndersonIctus 12:04b0ccb40acc 8
AndersonIctus 17:a5e2d3e6a634 9 Temperature temp(A1); // Instancia de Temperatura
AndersonIctus 12:04b0ccb40acc 10
AndersonIctus 17:a5e2d3e6a634 11 I2C i2c(I2C_SDA, I2C_SCL); // PORTA I2C
AndersonIctus 17:a5e2d3e6a634 12 Gyroscope giro(i2c); // Instancia do Giroscopio
AndersonIctus 17:a5e2d3e6a634 13 GyroscopeData* data_anterior; //Guarda a ultima leitura apra ter uma base das mudanças !!
AndersonIctus 17:a5e2d3e6a634 14 int mudancas = 0;
AndersonIctus 15:acf6c9c6b15d 15
AndersonIctus 15:acf6c9c6b15d 16 // LEDs para serem acesas
AndersonIctus 17:a5e2d3e6a634 17 DigitalOut led1 (LED1); // LED 1 de 3 DO BOARD
AndersonIctus 17:a5e2d3e6a634 18 DigitalOut led2 (LED2); // LED 2 de 3 DO BOARD
AndersonIctus 17:a5e2d3e6a634 19 DigitalOut led3 (LED3); // LED 3 de 3 DO BOARD
AndersonIctus 17:a5e2d3e6a634 20 DigitalOut led_dig(D6); // LED 1 da porta Digital 6 (A placa tem D6 e D8)
AndersonIctus 12:04b0ccb40acc 21
AndersonIctus 17:a5e2d3e6a634 22 #define LOG(args...) pc.printf(args)
AndersonIctus 12:04b0ccb40acc 23
AndersonIctus 12:04b0ccb40acc 24 // --------------------------------------------------------------------------------- //
AndersonIctus 17:a5e2d3e6a634 25 // HEADERS das funcoes !!
AndersonIctus 17:a5e2d3e6a634 26 void sem_movimento_leds();
AndersonIctus 17:a5e2d3e6a634 27 void sinaliza_led(int num_led);
AndersonIctus 17:a5e2d3e6a634 28 bool comparaPosicao(int16_t data, int16_t data_ant, int16_t dif);
AndersonIctus 12:04b0ccb40acc 29
AndersonIctus 17:a5e2d3e6a634 30 void recebeTemperatura(float* temperatura);
AndersonIctus 17:a5e2d3e6a634 31 void fazLeituraGyroscopio(GyroscopeData* data);
AndersonIctus 12:04b0ccb40acc 32
AndersonIctus 17:a5e2d3e6a634 33 // METODO PRINCIPAL !!
AndersonIctus 12:04b0ccb40acc 34 // --------------------------------------------------------------------------------- //
AndersonIctus 12:04b0ccb40acc 35 int main() {
AndersonIctus 17:a5e2d3e6a634 36 LOG("!!!INICIO!!!\r\n");
AndersonIctus 17:a5e2d3e6a634 37 sem_movimento_leds();
AndersonIctus 12:04b0ccb40acc 38
AndersonIctus 12:04b0ccb40acc 39 //////////////////
AndersonIctus 12:04b0ccb40acc 40 // 1 -> Fazer um temporizador que fica lendo a temperatura a cada 5 segundos !!
AndersonIctus 17:a5e2d3e6a634 41 // Chama o callback a cada 4 SEGUNDOS !
AndersonIctus 17:a5e2d3e6a634 42 temp.setCallbackReadOcurred(&recebeTemperatura, 4*ONE_SEC);
AndersonIctus 12:04b0ccb40acc 43
AndersonIctus 17:a5e2d3e6a634 44 //////////////////
AndersonIctus 12:04b0ccb40acc 45 // 2 - Verificar se houve alguma mudança no Giroscópio
AndersonIctus 17:a5e2d3e6a634 46 giro.setCallbackReadOcurred(&fazLeituraGyroscopio, ONE_SEC); // leituras a cada um segundo !
AndersonIctus 17:a5e2d3e6a634 47
AndersonIctus 17:a5e2d3e6a634 48 //////////////////
AndersonIctus 17:a5e2d3e6a634 49 // 3 - INICIALIZA AS TASKS ASSINCRONAS !!
AndersonIctus 17:a5e2d3e6a634 50 giro.initializeTask();
AndersonIctus 17:a5e2d3e6a634 51 temp.initializeTask();
AndersonIctus 12:04b0ccb40acc 52
AndersonIctus 17:a5e2d3e6a634 53 LOG("!!!FIM DE INICIALIZACAO!!!\r\n");
AndersonIctus 17:a5e2d3e6a634 54 int count = 0;
AndersonIctus 17:a5e2d3e6a634 55 while(count++ < 6) wait(10); // WAIT ONE MINUTE
AndersonIctus 17:a5e2d3e6a634 56
AndersonIctus 17:a5e2d3e6a634 57 temp.~Temperature();
AndersonIctus 17:a5e2d3e6a634 58 giro.~Gyroscope();
AndersonIctus 17:a5e2d3e6a634 59 pc.printf("!!! ----------- TEMINADO -----------!!!\r\n");
AndersonIctus 17:a5e2d3e6a634 60
AndersonIctus 17:a5e2d3e6a634 61 // APAGANDO LEDS !
AndersonIctus 17:a5e2d3e6a634 62 led_dig = 0;
AndersonIctus 17:a5e2d3e6a634 63 sem_movimento_leds();
AndersonIctus 12:04b0ccb40acc 64 }
AndersonIctus 0:2713c2f0904f 65
AndersonIctus 17:a5e2d3e6a634 66 // Outros metodos !!
AndersonIctus 17:a5e2d3e6a634 67 // --------------------------------------------------------------------------------- //
AndersonIctus 17:a5e2d3e6a634 68 // Pisca os led para informar q está sem movimento !!
AndersonIctus 17:a5e2d3e6a634 69 void sem_movimento_leds() {
AndersonIctus (anderson.ictus@gmail.com) 2:b6bb08a9723d 70 int count = 0;
AndersonIctus 17:a5e2d3e6a634 71 while(count++ >= 2) {
AndersonIctus (anderson.ictus@gmail.com) 2:b6bb08a9723d 72 led1 = 0;
AndersonIctus 17:a5e2d3e6a634 73 led2 = 0;
AndersonIctus 17:a5e2d3e6a634 74 led3 = 0;
AndersonIctus 17:a5e2d3e6a634 75 ThisThread::sleep_for(1000);
AndersonIctus 17:a5e2d3e6a634 76 led1 = 1;
AndersonIctus 17:a5e2d3e6a634 77 led2 = 1;
AndersonIctus 17:a5e2d3e6a634 78 led3 = 1;
AndersonIctus 17:a5e2d3e6a634 79 ThisThread::sleep_for(1500);
AndersonIctus (anderson.ictus@gmail.com) 2:b6bb08a9723d 80 }
AndersonIctus (anderson.ictus@gmail.com) 2:b6bb08a9723d 81 led1 = 0;
AndersonIctus 17:a5e2d3e6a634 82 led2 = 0;
AndersonIctus 17:a5e2d3e6a634 83 led3 = 0;
AndersonIctus (anderson.ictus@gmail.com) 4:60f2a8b3727c 84 }
AndersonIctus (anderson.ictus@gmail.com) 4:60f2a8b3727c 85
AndersonIctus 17:a5e2d3e6a634 86 // Vai ligar o LED conforme o que tiver mudado
AndersonIctus 17:a5e2d3e6a634 87 void sinaliza_led(int num_led) {
AndersonIctus 17:a5e2d3e6a634 88 led1 = 0;
AndersonIctus 17:a5e2d3e6a634 89 led2 = 0;
AndersonIctus 17:a5e2d3e6a634 90 led3 = 0;
AndersonIctus 17:a5e2d3e6a634 91 switch(num_led) {
AndersonIctus 17:a5e2d3e6a634 92 case 1: led1 = 1; break;
AndersonIctus 17:a5e2d3e6a634 93 case 2: led2 = 1; break;
AndersonIctus 17:a5e2d3e6a634 94 case 3: led3 = 1; break;
AndersonIctus 17:a5e2d3e6a634 95 default:
AndersonIctus 17:a5e2d3e6a634 96 break;
AndersonIctus 17:a5e2d3e6a634 97 }
AndersonIctus 0:2713c2f0904f 98 }
AndersonIctus 3:a02fcd753ae3 99
AndersonIctus 17:a5e2d3e6a634 100 // faz a comparação para saber se estar dentro dos parâmetros esperados !!
AndersonIctus 17:a5e2d3e6a634 101 bool comparaPosicao(int16_t data, int16_t data_ant, int16_t dif) {
AndersonIctus 17:a5e2d3e6a634 102 float menor = 0;
AndersonIctus 17:a5e2d3e6a634 103 float maior = 0;
AndersonIctus 17:a5e2d3e6a634 104 if(data_ant < 0) {
AndersonIctus 17:a5e2d3e6a634 105 maior = data_ant + (dif*-1);
AndersonIctus 17:a5e2d3e6a634 106 menor = data_ant - (dif*-1);
AndersonIctus 17:a5e2d3e6a634 107 } else {
AndersonIctus 17:a5e2d3e6a634 108 maior = data_ant + dif;
AndersonIctus 17:a5e2d3e6a634 109 menor = data_ant - dif;
AndersonIctus 17:a5e2d3e6a634 110 }
AndersonIctus 6:ea945b2ea724 111
AndersonIctus 17:a5e2d3e6a634 112 if( data > maior || data < menor ) {
AndersonIctus 17:a5e2d3e6a634 113 return true; // Se a data estiver fora em algum dos limites percentuais
AndersonIctus 17:a5e2d3e6a634 114 }
AndersonIctus 6:ea945b2ea724 115
AndersonIctus 17:a5e2d3e6a634 116 return false;
AndersonIctus 17:a5e2d3e6a634 117 }
AndersonIctus 17:a5e2d3e6a634 118
AndersonIctus 17:a5e2d3e6a634 119 void fazLeituraGyroscopio(GyroscopeData* data) {
AndersonIctus 17:a5e2d3e6a634 120 int mud = 0;
AndersonIctus 17:a5e2d3e6a634 121 if(data_anterior == NULL) {
AndersonIctus 17:a5e2d3e6a634 122 data_anterior = data;
AndersonIctus 17:a5e2d3e6a634 123 mud = 0;
AndersonIctus 17:a5e2d3e6a634 124 } else if( comparaPosicao(data->gz, data_anterior->gz, 300) ) {
AndersonIctus 17:a5e2d3e6a634 125 data_anterior = data;
AndersonIctus 17:a5e2d3e6a634 126 mud = 3;
AndersonIctus 17:a5e2d3e6a634 127 } else if( comparaPosicao(data->gy, data_anterior->gy, 300)) {
AndersonIctus 17:a5e2d3e6a634 128 data_anterior = data;
AndersonIctus 17:a5e2d3e6a634 129 mud = 2;
AndersonIctus 17:a5e2d3e6a634 130 } else if( comparaPosicao(data->gx, data_anterior->gx, 800) ) {
AndersonIctus 17:a5e2d3e6a634 131 data_anterior = data;
AndersonIctus 17:a5e2d3e6a634 132 mud = 1;
AndersonIctus 17:a5e2d3e6a634 133 } else {
AndersonIctus 17:a5e2d3e6a634 134 // SEM MOVIMENTACAO ...
AndersonIctus 6:ea945b2ea724 135 }
AndersonIctus 3:a02fcd753ae3 136
AndersonIctus 17:a5e2d3e6a634 137 switch(mud) {
AndersonIctus 17:a5e2d3e6a634 138 default:
AndersonIctus 17:a5e2d3e6a634 139 case 0: // sem mudanças (imprime somente uma vez a cada 10 vezes sem mudanças consecutivas !!)
AndersonIctus 17:a5e2d3e6a634 140 if( mudancas++ >= 10 ) {
AndersonIctus 17:a5e2d3e6a634 141 LOG("Sem movimento! \r\n");
AndersonIctus 17:a5e2d3e6a634 142 mudancas = 0;
AndersonIctus 17:a5e2d3e6a634 143 sem_movimento_leds();
AndersonIctus 17:a5e2d3e6a634 144 }
AndersonIctus 17:a5e2d3e6a634 145 break;
AndersonIctus 17:a5e2d3e6a634 146 case 1: // mudou eixo X
AndersonIctus 17:a5e2d3e6a634 147 LOG("Movimentou X .... gy_x = %d\r\n", data->gx);
AndersonIctus 17:a5e2d3e6a634 148 break;
AndersonIctus 17:a5e2d3e6a634 149 case 2: // Mudou eixo Y
AndersonIctus 17:a5e2d3e6a634 150 LOG("Movimentou Y .... gy_y = %d\r\n", data->gy);
AndersonIctus 17:a5e2d3e6a634 151 break;
AndersonIctus 17:a5e2d3e6a634 152 case 3: // Mudou eixo Z
AndersonIctus 17:a5e2d3e6a634 153 LOG("Movimentou Z .... gy_z = %d\r\n", data->gz);
AndersonIctus 17:a5e2d3e6a634 154 break;
AndersonIctus 3:a02fcd753ae3 155 }
AndersonIctus (anderson.ictus@gmail.com) 4:60f2a8b3727c 156
AndersonIctus 17:a5e2d3e6a634 157 if(mud != 0)
AndersonIctus 17:a5e2d3e6a634 158 mudancas = 0;
AndersonIctus 17:a5e2d3e6a634 159
AndersonIctus 17:a5e2d3e6a634 160 sinaliza_led(mud);
AndersonIctus 17:a5e2d3e6a634 161
AndersonIctus 17:a5e2d3e6a634 162 // LOG("*** GIRO -> (g_x = %03d; g_y = %03d; g_z = %03d) ***\r\n", data->gx, data->gy, data->gz);
AndersonIctus 3:a02fcd753ae3 163 }
AndersonIctus 7:310098916153 164
AndersonIctus 17:a5e2d3e6a634 165 void recebeTemperatura(float* temperatura) {
AndersonIctus 17:a5e2d3e6a634 166 LOG("** Temperatura RECEBIDA => %02.02f\r\n", *temperatura );
AndersonIctus 17:a5e2d3e6a634 167 if(*temperatura > 30) { // ASCENDER LED !!
AndersonIctus 17:a5e2d3e6a634 168 LOG("** Temperatura ACIMA DO PERMITIDO !!\r\n");
AndersonIctus 17:a5e2d3e6a634 169 led_dig = 1;
AndersonIctus 17:a5e2d3e6a634 170 } else { // APAGA O LED
AndersonIctus 17:a5e2d3e6a634 171 led_dig = 0;
AndersonIctus 17:a5e2d3e6a634 172 }
AndersonIctus 17:a5e2d3e6a634 173 }