STM32F746NG controle de relés. Abre um server TCP e conecta um ESP32 (client)

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

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?

UserRevisionLine numberNew 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(&eth);
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