
STM32F746NG controle de relés. Abre um server TCP e conecta um ESP32 (client)
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG
main.cpp@0:83a5d970908c, 2018-09-19 (annotated)
- Committer:
- felipinhom
- Date:
- Wed Sep 19 17:36:16 2018 +0000
- Revision:
- 0:83a5d970908c
Abre um server e aguarda o ESP32, ap?s conectar o controle de rel?s ? habilitado.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
felipinhom | 0:83a5d970908c | 1 | #include "mbed.h" |
felipinhom | 0:83a5d970908c | 2 | #include "TS_DISCO_F746NG.h" |
felipinhom | 0:83a5d970908c | 3 | #include "LCD_DISCO_F746NG.h" |
felipinhom | 0:83a5d970908c | 4 | #include "EthernetInterface.h" |
felipinhom | 0:83a5d970908c | 5 | #include "TCPServer.h" |
felipinhom | 0:83a5d970908c | 6 | #include "TCPSocket.h" |
felipinhom | 0:83a5d970908c | 7 | #include <string> |
felipinhom | 0:83a5d970908c | 8 | |
felipinhom | 0:83a5d970908c | 9 | #define BTN_R1_X 60 //coordenada X do botão relé 1 |
felipinhom | 0:83a5d970908c | 10 | #define BTN_R1_Y 130 //coordenada Y do botão relé 1 |
felipinhom | 0:83a5d970908c | 11 | |
felipinhom | 0:83a5d970908c | 12 | #define BTN_WIDTH 150 //largura do botão dos relés |
felipinhom | 0:83a5d970908c | 13 | #define BTN_HEIGHT 75 //altura do botão dos relés |
felipinhom | 0:83a5d970908c | 14 | |
felipinhom | 0:83a5d970908c | 15 | #define BTN_R2_X 50 + (BTN_R1_X + BTN_WIDTH) //coordenada X do botão relé 2 |
felipinhom | 0:83a5d970908c | 16 | #define BTN_R2_Y 130 //coordenada Y do botão relé 1 |
felipinhom | 0:83a5d970908c | 17 | |
felipinhom | 0:83a5d970908c | 18 | LCD_DISCO_F746NG lcd; //objeto que controla o display |
felipinhom | 0:83a5d970908c | 19 | TS_DISCO_F746NG ts; //objeto que controla o touch do display |
felipinhom | 0:83a5d970908c | 20 | |
felipinhom | 0:83a5d970908c | 21 | TCPSocket *clt_sock; //ponteiro para um socket TCP |
felipinhom | 0:83a5d970908c | 22 | |
felipinhom | 0:83a5d970908c | 23 | //variáveis de controle de estado dos relés |
felipinhom | 0:83a5d970908c | 24 | bool btnRelay1 = false; |
felipinhom | 0:83a5d970908c | 25 | bool btnRelay2 = false; |
felipinhom | 0:83a5d970908c | 26 | |
felipinhom | 0:83a5d970908c | 27 | /* PROTÓTIPO DAS FUNÇÕES */ |
felipinhom | 0:83a5d970908c | 28 | //desenha um um botão na tela com uma escrita no meio |
felipinhom | 0:83a5d970908c | 29 | void drawButton(int x, int y, int width, int height, uint32_t color, char* title); |
felipinhom | 0:83a5d970908c | 30 | //verifica se ocorreu um toque na tela |
felipinhom | 0:83a5d970908c | 31 | void verifyTouch(int x, int y); |
felipinhom | 0:83a5d970908c | 32 | //verifica se o toque foi em algum dos botões |
felipinhom | 0:83a5d970908c | 33 | bool verifyTouchButton(int x, int y, int rectX, int rectY); |
felipinhom | 0:83a5d970908c | 34 | //envia um pacote de comandos para o client |
felipinhom | 0:83a5d970908c | 35 | bool sendPacket(char* packet); |
felipinhom | 0:83a5d970908c | 36 | //escreve na tela o status da conexão (client conectado ou desconectado) |
felipinhom | 0:83a5d970908c | 37 | void writeStatus(char* status, uint32_t color); |
felipinhom | 0:83a5d970908c | 38 | |
felipinhom | 0:83a5d970908c | 39 | |
felipinhom | 0:83a5d970908c | 40 | int main() |
felipinhom | 0:83a5d970908c | 41 | { |
felipinhom | 0:83a5d970908c | 42 | TS_StateTypeDef TS_State; //estado do touch |
felipinhom | 0:83a5d970908c | 43 | uint8_t status; |
felipinhom | 0:83a5d970908c | 44 | |
felipinhom | 0:83a5d970908c | 45 | status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); //inicializa o touch na tela toda |
felipinhom | 0:83a5d970908c | 46 | //se deu erro ao inicializar -> mensagem de falha e pára a execução do programa |
felipinhom | 0:83a5d970908c | 47 | if (status != TS_OK) { |
felipinhom | 0:83a5d970908c | 48 | lcd.Clear(LCD_COLOR_RED); |
felipinhom | 0:83a5d970908c | 49 | lcd.SetBackColor(LCD_COLOR_RED); |
felipinhom | 0:83a5d970908c | 50 | lcd.SetTextColor(LCD_COLOR_WHITE); |
felipinhom | 0:83a5d970908c | 51 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE); |
felipinhom | 0:83a5d970908c | 52 | wait(2); |
felipinhom | 0:83a5d970908c | 53 | return 0; |
felipinhom | 0:83a5d970908c | 54 | } |
felipinhom | 0:83a5d970908c | 55 | |
felipinhom | 0:83a5d970908c | 56 | lcd.Clear(LCD_COLOR_BLUE); //limpa a tela e pinta de azul |
felipinhom | 0:83a5d970908c | 57 | lcd.SetBackColor(LCD_COLOR_BLUE); //cor de fundo de texto |
felipinhom | 0:83a5d970908c | 58 | lcd.SetTextColor(LCD_COLOR_YELLOW); //cor do texto |
felipinhom | 0:83a5d970908c | 59 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE); |
felipinhom | 0:83a5d970908c | 60 | |
felipinhom | 0:83a5d970908c | 61 | |
felipinhom | 0:83a5d970908c | 62 | wait(1); //aguarda um segundo |
felipinhom | 0:83a5d970908c | 63 | lcd.Clear(LCD_COLOR_BLUE); //limpa a tela |
felipinhom | 0:83a5d970908c | 64 | lcd.SetTextColor(LCD_COLOR_WHITE); //seta cor do texto |
felipinhom | 0:83a5d970908c | 65 | lcd.SetFont(&Font24); //seta tamanho da fonte |
felipinhom | 0:83a5d970908c | 66 | lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"AUTOMATION", CENTER_MODE); |
felipinhom | 0:83a5d970908c | 67 | |
felipinhom | 0:83a5d970908c | 68 | lcd.DisplayStringAt(BTN_R1_X, LINE(4), (uint8_t *)"RELAY 1", LEFT_MODE); |
felipinhom | 0:83a5d970908c | 69 | lcd.DisplayStringAt(BTN_R2_X, LINE(4), (uint8_t *)"RELAY 2", LEFT_MODE); |
felipinhom | 0:83a5d970908c | 70 | |
felipinhom | 0:83a5d970908c | 71 | //cria os botões |
felipinhom | 0:83a5d970908c | 72 | drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF"); |
felipinhom | 0:83a5d970908c | 73 | drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, LCD_COLOR_RED, "OFF"); |
felipinhom | 0:83a5d970908c | 74 | |
felipinhom | 0:83a5d970908c | 75 | //objeto que controla a rede ethernet |
felipinhom | 0:83a5d970908c | 76 | EthernetInterface eth; |
felipinhom | 0:83a5d970908c | 77 | eth.connect(); //conecta à rede |
felipinhom | 0:83a5d970908c | 78 | |
felipinhom | 0:83a5d970908c | 79 | string ip = eth.get_ip_address(); //pega o IP recebido |
felipinhom | 0:83a5d970908c | 80 | lcd.SetBackColor(LCD_COLOR_BLUE); |
felipinhom | 0:83a5d970908c | 81 | lcd.SetFont(&Font8); |
felipinhom | 0:83a5d970908c | 82 | //verifica se o IP é válido |
felipinhom | 0:83a5d970908c | 83 | if(ip.length() <= 16 && ip.length() >= 7 ) { |
felipinhom | 0:83a5d970908c | 84 | uint8_t text[18]; |
felipinhom | 0:83a5d970908c | 85 | sprintf((char*)text, "%s", eth.get_ip_address()); |
felipinhom | 0:83a5d970908c | 86 | lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); //imprime na tela o IP |
felipinhom | 0:83a5d970908c | 87 | } else { |
felipinhom | 0:83a5d970908c | 88 | lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"IP Invalido", LEFT_MODE); |
felipinhom | 0:83a5d970908c | 89 | } |
felipinhom | 0:83a5d970908c | 90 | |
felipinhom | 0:83a5d970908c | 91 | |
felipinhom | 0:83a5d970908c | 92 | TCPServer srv; //objeto de controle do server |
felipinhom | 0:83a5d970908c | 93 | |
felipinhom | 0:83a5d970908c | 94 | //abre um server na rede |
felipinhom | 0:83a5d970908c | 95 | srv.open(ð); |
felipinhom | 0:83a5d970908c | 96 | //configura a porta TCP 80 para o server |
felipinhom | 0:83a5d970908c | 97 | srv.bind(eth.get_ip_address(), 80); |
felipinhom | 0:83a5d970908c | 98 | /* Can handle 1 simultaneous connections */ |
felipinhom | 0:83a5d970908c | 99 | //aguarda uma única conexão |
felipinhom | 0:83a5d970908c | 100 | srv.listen(1); |
felipinhom | 0:83a5d970908c | 101 | |
felipinhom | 0:83a5d970908c | 102 | while(1) { |
felipinhom | 0:83a5d970908c | 103 | writeStatus("Desconectado", LCD_COLOR_RED); //imprime o estado de desconectado |
felipinhom | 0:83a5d970908c | 104 | TCPSocket socket; //objeto TCPsocket |
felipinhom | 0:83a5d970908c | 105 | SocketAddress clt_addr; |
felipinhom | 0:83a5d970908c | 106 | clt_sock = &socket; |
felipinhom | 0:83a5d970908c | 107 | printf("waiting \n"); |
felipinhom | 0:83a5d970908c | 108 | //fica aguardando um client conectar |
felipinhom | 0:83a5d970908c | 109 | srv.accept(clt_sock, &clt_addr); |
felipinhom | 0:83a5d970908c | 110 | printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port()); |
felipinhom | 0:83a5d970908c | 111 | |
felipinhom | 0:83a5d970908c | 112 | //char buffer[3]; |
felipinhom | 0:83a5d970908c | 113 | //int n = clt_sock->recv(buffer, sizeof(buffer)); |
felipinhom | 0:83a5d970908c | 114 | //printf("N : %d\n",n); |
felipinhom | 0:83a5d970908c | 115 | //buffer[n] = '\0'; |
felipinhom | 0:83a5d970908c | 116 | //printf("Received message from Client : %s\n",buffer); |
felipinhom | 0:83a5d970908c | 117 | |
felipinhom | 0:83a5d970908c | 118 | |
felipinhom | 0:83a5d970908c | 119 | writeStatus("Conectado", LCD_COLOR_GREEN); //imprime o estado de conectado |
felipinhom | 0:83a5d970908c | 120 | clt_sock->set_timeout(5000); //seta o timeout para o socket |
felipinhom | 0:83a5d970908c | 121 | //enquanto o socket estiver aberto |
felipinhom | 0:83a5d970908c | 122 | while(clt_sock != NULL) { |
felipinhom | 0:83a5d970908c | 123 | ts.GetState(&TS_State); //registra o estado do touch |
felipinhom | 0:83a5d970908c | 124 | //se algum toque na tela foi detectado |
felipinhom | 0:83a5d970908c | 125 | if (TS_State.touchDetected) { |
felipinhom | 0:83a5d970908c | 126 | uint8_t idx; |
felipinhom | 0:83a5d970908c | 127 | //ao tocar a tela, pode ser que múltiplos toques foram dados, portanto faremos uma verificação |
felipinhom | 0:83a5d970908c | 128 | for (idx = 0; idx < TS_State.touchDetected; idx++) { |
felipinhom | 0:83a5d970908c | 129 | //se o evento do toque foi PRESS |
felipinhom | 0:83a5d970908c | 130 | if(TS_State.touchEventId[idx] == TOUCH_EVENT_PRESS_DOWN) { |
felipinhom | 0:83a5d970908c | 131 | verifyTouch(TS_State.touchX[idx], TS_State.touchY[idx]);//verifica se tocou em algum botão |
felipinhom | 0:83a5d970908c | 132 | break; |
felipinhom | 0:83a5d970908c | 133 | }//if |
felipinhom | 0:83a5d970908c | 134 | }//for |
felipinhom | 0:83a5d970908c | 135 | }//if |
felipinhom | 0:83a5d970908c | 136 | }//while NULL |
felipinhom | 0:83a5d970908c | 137 | |
felipinhom | 0:83a5d970908c | 138 | }//while 1 |
felipinhom | 0:83a5d970908c | 139 | } |
felipinhom | 0:83a5d970908c | 140 | |
felipinhom | 0:83a5d970908c | 141 | //desenha um um botão na tela com uma escrita no meio |
felipinhom | 0:83a5d970908c | 142 | void drawButton(int x, int y, int width, int height, uint32_t color, char* title) |
felipinhom | 0:83a5d970908c | 143 | { |
felipinhom | 0:83a5d970908c | 144 | lcd.SetFont(&Font24); |
felipinhom | 0:83a5d970908c | 145 | lcd.SetTextColor(color); |
felipinhom | 0:83a5d970908c | 146 | lcd.SetBackColor(color); |
felipinhom | 0:83a5d970908c | 147 | lcd.FillRect(x, y, width, height); |
felipinhom | 0:83a5d970908c | 148 | lcd.SetTextColor(LCD_COLOR_WHITE); |
felipinhom | 0:83a5d970908c | 149 | uint8_t text[30]; |
felipinhom | 0:83a5d970908c | 150 | sprintf((char*)text, "%s", title); |
felipinhom | 0:83a5d970908c | 151 | lcd.DisplayStringAt(x+50, y+(height/2)-10, (uint8_t *)&text, LEFT_MODE); |
felipinhom | 0:83a5d970908c | 152 | } |
felipinhom | 0:83a5d970908c | 153 | |
felipinhom | 0:83a5d970908c | 154 | //verifica se ocorreu um toque na tela |
felipinhom | 0:83a5d970908c | 155 | void verifyTouch(int x, int y) |
felipinhom | 0:83a5d970908c | 156 | { |
felipinhom | 0:83a5d970908c | 157 | bool response = false; //guarda o status do envio da mensagem para o client |
felipinhom | 0:83a5d970908c | 158 | //verifica se tocou no botão do relé 1 |
felipinhom | 0:83a5d970908c | 159 | if( verifyTouchButton(x, y, BTN_R1_X, BTN_R1_Y) ) { |
felipinhom | 0:83a5d970908c | 160 | char* text; |
felipinhom | 0:83a5d970908c | 161 | uint32_t color; |
felipinhom | 0:83a5d970908c | 162 | //se o relé está ligado então desliga |
felipinhom | 0:83a5d970908c | 163 | if(btnRelay1) { |
felipinhom | 0:83a5d970908c | 164 | text = "OFF"; |
felipinhom | 0:83a5d970908c | 165 | color = LCD_COLOR_RED; |
felipinhom | 0:83a5d970908c | 166 | response = sendPacket("#R1|0"); //envia comando para desligar o relé |
felipinhom | 0:83a5d970908c | 167 | } else { |
felipinhom | 0:83a5d970908c | 168 | //se relé está desligado, então liga |
felipinhom | 0:83a5d970908c | 169 | text = "ON"; |
felipinhom | 0:83a5d970908c | 170 | color = LCD_COLOR_GREEN; |
felipinhom | 0:83a5d970908c | 171 | response = sendPacket("#R1|1");//envia comando para ligar o relé |
felipinhom | 0:83a5d970908c | 172 | } |
felipinhom | 0:83a5d970908c | 173 | //se o envio foi confirmado |
felipinhom | 0:83a5d970908c | 174 | if(response) { |
felipinhom | 0:83a5d970908c | 175 | drawButton(BTN_R1_X, BTN_R1_Y, BTN_WIDTH, BTN_HEIGHT, color, text); //atualiza o botão |
felipinhom | 0:83a5d970908c | 176 | btnRelay1 = !btnRelay1; |
felipinhom | 0:83a5d970908c | 177 | } |
felipinhom | 0:83a5d970908c | 178 | |
felipinhom | 0:83a5d970908c | 179 | } |
felipinhom | 0:83a5d970908c | 180 | //verifica se tocou no botão do relé 1 |
felipinhom | 0:83a5d970908c | 181 | else if( verifyTouchButton(x,y,BTN_R2_X,BTN_R2_Y) ) { |
felipinhom | 0:83a5d970908c | 182 | char* text; |
felipinhom | 0:83a5d970908c | 183 | uint32_t color; |
felipinhom | 0:83a5d970908c | 184 | //se o relé está ligado então desliga |
felipinhom | 0:83a5d970908c | 185 | if(btnRelay2) { |
felipinhom | 0:83a5d970908c | 186 | text = "OFF"; |
felipinhom | 0:83a5d970908c | 187 | color = LCD_COLOR_RED; |
felipinhom | 0:83a5d970908c | 188 | response = sendPacket("#R2|0"); //envia comando para desligar o relé |
felipinhom | 0:83a5d970908c | 189 | } else { |
felipinhom | 0:83a5d970908c | 190 | //se relé está desligado, então liga |
felipinhom | 0:83a5d970908c | 191 | text = "ON"; |
felipinhom | 0:83a5d970908c | 192 | color = LCD_COLOR_GREEN; |
felipinhom | 0:83a5d970908c | 193 | response = sendPacket("#R2|1");//envia comando para ligar o relé |
felipinhom | 0:83a5d970908c | 194 | |
felipinhom | 0:83a5d970908c | 195 | } |
felipinhom | 0:83a5d970908c | 196 | //se o envio foi confirmado |
felipinhom | 0:83a5d970908c | 197 | if(response) { |
felipinhom | 0:83a5d970908c | 198 | drawButton(BTN_R2_X, BTN_R2_Y, BTN_WIDTH, BTN_HEIGHT, color, text);//atualiza o botão |
felipinhom | 0:83a5d970908c | 199 | btnRelay2 = !btnRelay2; |
felipinhom | 0:83a5d970908c | 200 | } |
felipinhom | 0:83a5d970908c | 201 | } |
felipinhom | 0:83a5d970908c | 202 | } |
felipinhom | 0:83a5d970908c | 203 | |
felipinhom | 0:83a5d970908c | 204 | //verifica se o toque foi em algum dos botões |
felipinhom | 0:83a5d970908c | 205 | bool verifyTouchButton(int x, int y, int rectX, int rectY) |
felipinhom | 0:83a5d970908c | 206 | { |
felipinhom | 0:83a5d970908c | 207 | printf("tocou : %d,%d %d,%d\n",x,y,rectX,rectY); |
felipinhom | 0:83a5d970908c | 208 | if( (x >= rectX) && (x <= rectX + BTN_WIDTH) ) { |
felipinhom | 0:83a5d970908c | 209 | if( (y >= rectY) && (y <= rectY + BTN_HEIGHT) ) |
felipinhom | 0:83a5d970908c | 210 | return true; |
felipinhom | 0:83a5d970908c | 211 | } |
felipinhom | 0:83a5d970908c | 212 | return false; |
felipinhom | 0:83a5d970908c | 213 | } |
felipinhom | 0:83a5d970908c | 214 | |
felipinhom | 0:83a5d970908c | 215 | //envia um pacote de comandos para o client |
felipinhom | 0:83a5d970908c | 216 | bool sendPacket(char* packet) |
felipinhom | 0:83a5d970908c | 217 | { |
felipinhom | 0:83a5d970908c | 218 | char buffer[256]; |
felipinhom | 0:83a5d970908c | 219 | clt_sock->send(packet, strlen(packet)); //envia o comando |
felipinhom | 0:83a5d970908c | 220 | int n = clt_sock->recv(buffer, sizeof(buffer)); //aguarda confirmação |
felipinhom | 0:83a5d970908c | 221 | printf("N : %d\n",n); |
felipinhom | 0:83a5d970908c | 222 | //se não chegou bytes então client não recebeu o pacote |
felipinhom | 0:83a5d970908c | 223 | if (n <= 0) { |
felipinhom | 0:83a5d970908c | 224 | clt_sock->close(); //fecha o socket |
felipinhom | 0:83a5d970908c | 225 | clt_sock = NULL; |
felipinhom | 0:83a5d970908c | 226 | return false; |
felipinhom | 0:83a5d970908c | 227 | } |
felipinhom | 0:83a5d970908c | 228 | // print received message to terminal |
felipinhom | 0:83a5d970908c | 229 | buffer[n] = '\0'; |
felipinhom | 0:83a5d970908c | 230 | printf("Received message from Client : %s\n",buffer); |
felipinhom | 0:83a5d970908c | 231 | return true; |
felipinhom | 0:83a5d970908c | 232 | } |
felipinhom | 0:83a5d970908c | 233 | |
felipinhom | 0:83a5d970908c | 234 | //escreve na tela o status da conexão (client conectado ou desconectado) |
felipinhom | 0:83a5d970908c | 235 | void writeStatus(char* status, uint32_t color) |
felipinhom | 0:83a5d970908c | 236 | { |
felipinhom | 0:83a5d970908c | 237 | lcd.SetTextColor(color); |
felipinhom | 0:83a5d970908c | 238 | lcd.SetBackColor(LCD_COLOR_BLUE); |
felipinhom | 0:83a5d970908c | 239 | lcd.SetFont(&Font16); |
felipinhom | 0:83a5d970908c | 240 | lcd.ClearStringLine(16); //limpa a linha que escreveremos |
felipinhom | 0:83a5d970908c | 241 | uint8_t text[30]; |
felipinhom | 0:83a5d970908c | 242 | sprintf((char*)text, "%s", status); |
felipinhom | 0:83a5d970908c | 243 | lcd.DisplayStringAtLine(16, (uint8_t *)&text); |
felipinhom | 0:83a5d970908c | 244 | } |
felipinhom | 0:83a5d970908c | 245 | |
felipinhom | 0:83a5d970908c | 246 | |
felipinhom | 0:83a5d970908c | 247 | |
felipinhom | 0:83a5d970908c | 248 |