Anderson Cunha
/
example_smart-grid
example
main.cpp@17:a5e2d3e6a634, 2019-06-06 (annotated)
- Committer:
- AndersonIctus
- Date:
- Thu Jun 06 23:55:57 2019 -0300
- Revision:
- 17:a5e2d3e6a634
- Parent:
- 15:acf6c9c6b15d
Uso da lib sgam para fazer chamada assincronas a partir de call back !!
Who changed what in which revision?
User | Revision | Line number | New 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 | } |