{"id":2728,"date":"2019-05-20T14:29:03","date_gmt":"2019-05-20T14:29:03","guid":{"rendered":"https:\/\/blog.usinainfo.com.br\/?p=2728"},"modified":"2019-08-07T15:55:09","modified_gmt":"2019-08-07T18:55:09","slug":"esp32-wifi-comunicacao-com-a-internet","status":"publish","type":"post","link":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/","title":{"rendered":"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet"},"content":{"rendered":"<p>A conex\u00e3o wireless \u00e9, sem d\u00favidas, um dos principais motivos para diversos entusiastas da eletr\u00f4nica utilizar o <a href=\"https:\/\/www.usinainfo.com.br\/nodemcu\/nodemcu-esp32-iot-com-wifi-e-bluetooth-38-pinos-5346.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>ESP32 Wifi<\/strong><\/a> em seus projetos. Ainda, devido ao seu baixo custo e grande abrang\u00eancia de aplica\u00e7\u00e3o, esse m\u00f3dulo recebe um enfoque especial em aplica\u00e7\u00f5es da Internet of Things &#8211; IoT. Tendo isso em vista, aprenderemos, ao longo desse tutorial, a utilizar a biblioteca WiFi.<\/p>\n<p>Esse tutorial esp32 est\u00e1 organizado da seguinte maneira: primeiramente, iremos conectar a ESP32 em uma rede WiFi; em seguida, veremos como obter o endere\u00e7o MAC da placa; por fim, iremos criar um web browser o qual acionaremos ou desligaremos uma LED.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Wifi.h<\/strong><\/p>\n<p>Essa biblioteca, que j\u00e1 vem instalada na biblioteca do Arduino, fornece diversas fun\u00e7\u00f5es. Estudaremos algumas delas, atrav\u00e9s de exemplos, para que possamos desenvolver projetos b\u00e1sicos. O principal objetivo \u00e9 auxiliar o leitor a iniciar a programa\u00e7\u00e3o referente a comunica\u00e7\u00e3o WiFi.<\/p>\n<p>&nbsp;<\/p>\n<h2>Exemplo 1: <strong>ESP32 Wifi c<\/strong>onectando-se a uma rede WiFi<\/h2>\n<p>Primeiramente, precisamos incluir a biblioteca. Para isso, utilize o comando:<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n#include &lt;WiFi.h&gt;\r\n<\/pre>\n<p>Feito isso, vamos criar duas constantes para armazenar o nome e a senha da rede a qual voc\u00ea ir\u00e1 se conectar. Para isso, substitua o conte\u00fado que est\u00e1 dentro das aspas pelo nome e senha da sua rede, conforme o c\u00f3digo abaixo.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nconst char* ssid = &quot;nome_da_rede&quot;;\r\nconst char* password =  &quot;senha_da_rede&quot;;\r\n<\/pre>\n<p>Em seguida, no void setup, faremos a inicializa\u00e7\u00e3o da comunica\u00e7\u00e3o Serial e da comunica\u00e7\u00e3o WiFi.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nvoid setup() {\r\n Serial.begin(115200);\r\n WiFi.begin(ssid, password);\r\n\r\n while (WiFi.status() != WL_CONNECTED) {\r\n  delay(500);\r\n  Serial.println(&quot;Connecting to WiFi..&quot;);\r\n }\r\n Serial.println(&quot;Connected to the WiFi network&quot;);\r\n}\r\n\r\nvoid loop() {}\r\n<\/pre>\n<p>Na linha 5 encontra-se a fun\u00e7\u00e3o WiFi.status(), que retorna uma constate informando se houve problema de conex\u00e3o ou n\u00e3o. Ela est\u00e1 dentro de uma estrutura de repeti\u00e7\u00e3o, while, que verifica se o status \u00e9 de conectado (WL_CONNECTED). Se n\u00e3o for, ent\u00e3o o haver\u00e1 um tempo de meio segundo e a verifica\u00e7\u00e3o ir\u00e1 se repetir. Caso voc\u00ea tenha inserido algum caracter errado no nome da rede e na senha, o seu c\u00f3digo ficar\u00e1 mostrando apenas &#8220;Connecting to WiFi..&#8221;.<\/p>\n<p>Assim que a ESP32 conectar-se, ser\u00e1 exibido no monitor serial a mensagem &#8220;Connected to the WiFi network&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<h3>WiFi.begin()<\/h3>\n<p>Essa fun\u00e7\u00e3o \u00e9 necess\u00e1ria para que a placa se conecte a rede WiFi. Seu uso normalmente acontece com a passagem de dois par\u00e2metros para a fun\u00e7\u00e3o, o nome e senha da rede. Ela pode tamb\u00e9m ser usada sem eles, conforme uma explica\u00e7\u00e3o detalhada pode ser encontrada na refer\u00eancia da linguagem. Al\u00e9m disso, \u00e9 poss\u00edvel tamb\u00e9m us\u00e1-la passando como par\u00e2metro apenas o nome da rede, ssid, para redes sem senha.<\/p>\n<p>&nbsp;<\/p>\n<h3>WiFi.status()<\/h3>\n<p>Essa fun\u00e7\u00e3o pode retornar, al\u00e9m de &#8220;WL_CONNECTED&#8221; quando a placa estiver conectada a rede, algumas das seguintes constantes:<\/p>\n<ul>\n<li>WL_NO_SSID_AVAIL: quando a rede n\u00e3o for encontrada.<\/li>\n<li>WL_CONNECT_FAILED: quando as tentativas de conex\u00e3o falharem.<\/li>\n<li>WL_DISCONNECTED: quando ela estiver desconectada de uma rede.<\/li>\n<li>WL_CONNECTION_LOST: quando a conex\u00e3o for perdida ou interrompida (deixar de receber\/enviar pacotes).<\/li>\n<li>WL_IDLE_STATUS: quando est\u00e1 ou em processo de tentativas de conex\u00e3o ou as tentativas de conex\u00e3o atingiram um limite e n\u00e3o foi obtido \u00eaxito na conex\u00e3o, ou seja, a WiFi est\u00e1 ativa mas n\u00e3o conectada.<\/li>\n<\/ul>\n<p>Existem outras, tamb\u00e9m, que podem ser conferidas na refer\u00eancia da linguagem. As descritas acima s\u00e3o, entretanto, as mais comuns.<\/p>\n<p>&nbsp;<\/p>\n<h2>Exemplo 2: <strong>ESP32 Wifi o<\/strong>btendo o endere\u00e7o MAC<\/h2>\n<p>Esse endere\u00e7o \u00e9 uma identifica\u00e7\u00e3o \u00fanica de um dispositivo de rede. \u00c9 muito interessante, portanto, que saibamos o endere\u00e7o das placas que usaremos. Observe o c\u00f3digo abaixo.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n#include &lt;WiFi.h&gt;\r\n\r\nvoid setup(){\r\n Serial.begin(115200);\r\n WiFi.mode(WIFI_MODE_STA);\r\n Serial.println(WiFi.macAddress());\r\n}\r\n\r\nvoid loop(){}\r\n<\/pre>\n<p>Duas novas fun\u00e7\u00f5es s\u00e3o executadas. Veremos elas em mais detalhes.<\/p>\n<p>&nbsp;<\/p>\n<h3 style=\"width: 995.2px;\">WiFi.mode()<\/h3>\n<p>Essa fun\u00e7\u00e3o ajusta o modo de opera\u00e7\u00e3o do chip WiFi da placa. A um n\u00edvel mais baixo, ela chama a fun\u00e7\u00e3o interna\u00a0<em>esp_wifi_set_mode()<\/em>, que, por sua vez, aceita como par\u00e2metro quatro modos de opera\u00e7\u00e3o. Veremos eles a seguir.<\/p>\n<ul>\n<li>WIFI_MODE_NULL: nesse modo, a estrutura de dados relativa ao funcionamento de rede n\u00e3o est\u00e1 alocada no chip, ou seja, n\u00e3o foram inicializadas as rotinas nem do modo AP nem do modo STA.<\/li>\n<li>WIFI_MODE_STA: esse, tamb\u00e9m chamado de <em>station mode<\/em>, \u00e9 o modo de opera\u00e7\u00e3o para que o dispositivo funcione como um cliente wireless. Um exemplo de uso \u00e9 quando fizermos um web server: a ESP32 ser\u00e1 conectada a uma rede WiFi e fornecer\u00e1 p\u00e1ginas web no endere\u00e7o dela. Na figura abaixo visualiza-se um exemplo da topologia nesse modo de opera\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/sta_mode-ok.jpg\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2795\" title=\"\" src=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/sta_mode-ok.jpg\" alt=\"\" width=\"506\" height=\"388\" srcset=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/sta_mode-ok.jpg 550w, https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/sta_mode-ok-300x230.jpg 300w\" sizes=\"auto, (max-width: 506px) 100vw, 506px\" \/><\/a><\/p>\n<ul>\n<li>WIFI_MODE_AP: esse, tamb\u00e9m conhecido como <em>Access Point mode<\/em>, \u00e9 o modo de opera\u00e7\u00e3o para que o dispositivo funcione como um servidor\/roteador. Esse modo \u00e9 interessante para o caso de monitoramento de dados provenientes de outras placas ESP32. Voc\u00ea ter como clientes n\u00e3o apenas dispositivos como celular e computadores, mas tamb\u00e9m outras placas que tenham WiFi. Na figura abaixo visualiza-se um exemplo da topologia nesse modo de opera\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/ap_mode-ok.jpg\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2796 size-full\" title=\"\" src=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/ap_mode-ok.jpg\" alt=\"\" width=\"550\" height=\"421\" srcset=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/ap_mode-ok.jpg 550w, https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/ap_mode-ok-300x230.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/p>\n<ul>\n<li>WIFI_MODE_APSTA: esse \u00e9 um modo de coexist\u00eancia entre os modos STA e AP. Note que, nesse modo, o ESP32\u00a0 prioriza o modo STA sob o AP.<\/li>\n<\/ul>\n<h3>WiFi.macAddress()<\/h3>\n<p>Essa \u00e9 uma simples fun\u00e7\u00e3o da classe WiFi, usada para retornar o endere\u00e7o MAC de um dispositivo de rede. O retorno \u00e9 o endere\u00e7o no formato hexadecimal. Por exemplo: &#8220;A4:CF:12:45:AE:CC&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<h2>Exemplo 3: <strong>ESP32 Wifi <\/strong>Executando um WebServer<\/h2>\n<p>Um web server \u00e9, em poucas palavras, um programa que responde a solicita\u00e7\u00f5es HTTP, processando p\u00e1ginas e c\u00f3digos e enviando dados para o cliente. O cliente \u00e9 o quem faz as solicita\u00e7\u00f5es para o web browser, e podem haver diversos clientes fazendo diversas requisi\u00e7\u00f5es em um dado momento. Nesse tutorial, seremos breves quanto ao funcionamento desse sistema. Para realmente compreender cada etapa, \u00e9 necess\u00e1rio ter um aprofundamento de conceitos de Redes. Por\u00e9m, nosso objetivo aqui \u00e9 demonstrar como criar e manipular um servidor, mesmo sem ter pleno conhecimento de arquitetura de redes. Isso \u00e9 poss\u00edvel devido a programa\u00e7\u00e3o de alto n\u00edvel de abstra\u00e7\u00e3o que a biblioteca WiFi.h nos fornece. Em seguida, analisaremos peda\u00e7o por peda\u00e7o do c\u00f3digo que usaremos.<\/p>\n<h3>Cabe\u00e7alho<\/h3>\n<p>Primeiramente, inclu\u00edmos a biblioteca WiFi.h. Voc\u00ea poder\u00e1 ver, em outros c\u00f3digos, bibliotecas adicionais. Elas s\u00e3o muito \u00fateis para aplica\u00e7\u00f5es mais robustas por fornecerem fun\u00e7\u00f5es avan\u00e7adas. Por\u00e9m, n\u00e3o iremos utiliz\u00e1-las no nosso web server devido a baixa complexidade de iniciar um pela WiFi.h.<\/p>\n<p>Em seguida, definimos a rede e a senha da rede a qual a ESP32 ir\u00e1 se conectar. Nessa etapa, voc\u00ea deve substituir o conte\u00fado entre aspas pelas credencias da sua rede. Na sequ\u00eancia, declaramos uma vari\u00e1vel LED para armazenar o pino o qual iremos manipular pela web. Caso voc\u00ea queira mudar o pino, basta alterar o valor da vari\u00e1vel. A \u00faltima linha do cabe\u00e7alho define a porta que o servidor ir\u00e1 utilizar. A mais comum \u00e9 a utiliza\u00e7\u00e3o da porta 80.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n#include &lt;WiFi.h&gt;\r\nconst char* ssid = &quot;SSID da sua rede&quot;;\r\nconst char* password = &quot;Senha da sua rede&quot;;\r\nint LED = 2;\r\nWiFiServer server(80);\r\n<\/pre>\n<h5><\/h5>\n<h3>void setup()<\/h3>\n<p>Explicaremos essa e a pr\u00f3xima se\u00e7\u00e3o de maneira mais dividida, de forma a facilitar o entendimento. No final, voc\u00ea poder\u00e1 encontrar o c\u00f3digo completo caso deseje copi\u00e1-lo.<\/p>\n<p>Nessa se\u00e7\u00e3o, iniciamos a comunica\u00e7\u00e3o serial para visualizarmos, no Serial Monitor, o status da programa\u00e7\u00e3o. Isso servir\u00e1 como uma esp\u00e9cie de log, informando-nos o que est\u00e1 acontecendo no sistema. Em seguida, definimos a porta LED, GPIO 2, como sa\u00edda de dados.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nSerial.begin(115200);\r\npinMode(LED, OUTPUT);\r\n<\/pre>\n<p>A seguir, teremos as primeiras informa\u00e7\u00f5es que aparecer\u00e3o no Monitor Serial quando o c\u00f3digo come\u00e7ar a ser executado. O primeiro println \u00e9 apenas para iniciar a frase abaixo dele em um novo par\u00e1grafo. Ser\u00e1 exibido, o nome da rede a qual a ESP32 ir\u00e1 tentar se conectar e, logo a seguir, a tentativa de conex\u00e3o ser\u00e1 iniciada.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nSerial.println();\r\nSerial.print(&quot;Conectando-se a &quot;);\r\nSerial.println(ssid);\r\nWiFi.begin(ssid, password);\r\n<\/pre>\n<p>Nessa estrutura de repeti\u00e7\u00e3o, while, verificamos se a conex\u00e3o obteve sucesso. Enquanto a fun\u00e7\u00e3o WiFi.status n\u00e3o retornar &#8220;WL_CONNECTED&#8221;, uma constante que define o status da conex\u00e3o como bem sucedida, ser\u00e3o exibidos pontos no Monitor Serial. Portanto, caso voc\u00ea tenha inserido alguma informa\u00e7\u00e3o incorreta nas vari\u00e1veis ssid e password, ent\u00e3o o c\u00f3digo ficar\u00e1 exibindo pontinhos infinitamente.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nwhile (WiFi.status() != WL_CONNECTED) {\r\n delay(500);\r\n Serial.print(&quot;.&quot;);\r\n}\r\nSerial.println(&quot;&quot;);\r\n<\/pre>\n<p>Em caso de sucesso na tentativa de conex\u00e3o, ser\u00e3o exibidas as mensagens abaixo, inclusive o endere\u00e7o IP da NodeMCU. Em seguida, o servidor web ser\u00e1 iniciado, atrav\u00e9s da fun\u00e7\u00e3o server.begin. Como definido anteriormente, a porta a qual esse servidor receber\u00e1 dados ser\u00e1 na porta padr\u00e3o 80.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nSerial.println(&quot;WiFi conectada.&quot;);\r\nSerial.println(&quot;Endere\u00e7o de IP: &quot;);\r\nSerial.println(WiFi.localIP());\r\nserver.begin();\r\n<\/pre>\n<h5><\/h5>\n<h3>void loop()<\/h3>\n<p>Essa fun\u00e7\u00e3o inicializa uma vari\u00e1vel client, que recebe os par\u00e2metros do objeto cliente &#8211; derivado da classe WiFi.h. Em outras palavras, ele verifica se existe um cliente conectado com dados a serem transmitidos.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nWiFiClient client = server.available();\r\n<\/pre>\n<p>Em seguida, caso exista um cliente, ent\u00e3o \u00e9 notificado no Monitor Serial que um novo client se conectou. Em seguida, criamos uma vari\u00e1vel para armazenar a mensagem desse client. A estrutura de repeti\u00e7\u00e3o a seguir, while, mant\u00e9m-se at\u00e9 o cliente ser desconectado. Na sequ\u00eancia, na estrutura de decis\u00e3o if, verificamos se existem bytes, dados, a serem lidos. Caso existam, ent\u00e3o os armazenamos na vari\u00e1vel c e mostramo-os no Monitor Serial. Por fim, verificamos se o caractere \u00e9 um s\u00edmbolo de nova linha, representado por &#8216;\\n&#8217;.<\/p>\n<pre class=\"lang:csharp decode:1 \" > \r\nif (client) {\r\n Serial.println(&quot;Novo client.&quot;);\r\n String currentLine = &quot;&quot;;\r\n while (client.connected()) { \r\n  if (client.available()) {\r\n  char c = client.read();\r\n  Serial.write(c);\r\n   if (c == '\\n') {\r\n<\/pre>\n<p>Em seguida, \u00e9 verificado, atrav\u00e9s da fun\u00e7\u00e3o length, se a mensagem terminou &#8211; ou seja, se n\u00e3o h\u00e1 mais bytes recebidos. Feito isso, \u00e9 dado uma resposta ao cliente, atrav\u00e9s da fun\u00e7\u00e3o client.println, de forma a notific\u00e1-lo que a mensagem foi recebida.<\/p>\n<pre class=\"lang:csharp decode:1 \" > \r\nif (currentLine.length() == 0) { \r\n client.println(&quot;HTTP\/1.1 200 OK&quot;);\r\n client.println(&quot;Content-type:text\/html&quot;);\r\n client.println();\r\n<\/pre>\n<p>Na fun\u00e7\u00e3o client.print, enviamos duas mensagens de texto com marca\u00e7\u00f5es HTML. Nessa se\u00e7\u00e3o, caso voc\u00ea deseje, pode alterar para exibir outras tags de HTML, personalizando a p\u00e1gina. Entretanto, no nosso caso, apenas \u00e9 criado duas frases, uma para acionar a LED e outra para apag\u00e1-la.<\/p>\n<pre class=\"lang:csharp decode:1 \" > \r\nclient.print(&quot;Click &lt;a href=\\&quot;\/H\\&quot;&gt;here&lt;\/a&gt; to turn the LED on pin 2 on.&lt;br&gt;&quot;);\r\nclient.print(&quot;Click &lt;a href=\\&quot;\/L\\&quot;&gt;here&lt;\/a&gt; to turn the LED on pin 2 off.&lt;br&gt;&quot;);\r\n<\/pre>\n<p>Na sequ\u00eancia, mandamos uma linha em branco para notificar o fim da mensagem. Logo ap\u00f3s encerramos o la\u00e7o de repeti\u00e7\u00e3o while, desconectando o client.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\nclient.println();\r\nbreak;\r\n<\/pre>\n<p>Esta estrutura else remete a verifica\u00e7\u00e3o dos caracteres da mensagem recebida pelo cliente.\u00a0 A primeira, impede a string de ficar com espa\u00e7os em branco. A segunda, &#8216;\\r&#8217; significa um caractere de retorno, indicando o in\u00edcio de uma nova linha. Por fim, adicionamos ele a vari\u00e1vel currentLine como parte da mensagem.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n} else {\r\n  currentLine = &quot;&quot;;\r\n  }\r\n } else if (c != '\\r') {\r\n    currentLine += c;\r\n   }\r\n<\/pre>\n<p>Finalmente, verificamos se a requisi\u00e7\u00e3o foi para acionar a LED (H) ou desliga-la (L). Em seguida, finalizamos a conex\u00e3o com o cliente atrav\u00e9s da fun\u00e7\u00e3o client.stop e notificamos no Monitor Serial.<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n  if (currentLine.endsWith(&quot;GET \/H&quot;)) {\r\n   digitalWrite(LED, HIGH);\r\n  }\r\n  if (currentLine.endsWith(&quot;GET \/L&quot;)) {\r\n   digitalWrite(LED, LOW);\r\n  }\r\n }\r\n}\r\n  client.stop();\r\n  Serial.println(&quot;Client Disconnected.&quot;);\r\n }\r\n}\r\n\r\n<\/pre>\n<p>C\u00f3digo Completo do Web Server<\/p>\n<pre class=\"lang:csharp decode:1 \" >\r\n#include &lt;WiFi.h&gt;\r\n\r\nconst char* ssid = &quot;SSID da sua rede&quot;;\r\nconst char* password = &quot;Senha da sua rede&quot;;\r\nint LED = 2;\r\nWiFiServer server(80);\r\n\r\nvoid setup() {\r\n  Serial.begin(115200);\r\n  pinMode(LED, OUTPUT);\r\n\r\n  Serial.println();\r\n  Serial.print(&quot;Conectando-se a &quot;);\r\n  Serial.println(ssid);\r\n  WiFi.begin(ssid, password);\r\n\r\n  while (WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.print(&quot;.&quot;);\r\n  }\r\n\r\n  Serial.println(&quot;&quot;);\r\n  Serial.println(&quot;WiFi conectada.&quot;);\r\n  Serial.println(&quot;Endere\u00e7o de IP: &quot;);\r\n  Serial.println(WiFi.localIP());\r\n\r\n  server.begin();\r\n}\r\n\r\nvoid loop() {\r\n  WiFiClient client = server.available();\r\n  if (client) {\r\n    Serial.println(&quot;New Client.&quot;);\r\n    String currentLine = &quot;&quot;;\r\n    while (client.connected()) {\r\n      if (client.available()) {\r\n        char c = client.read();\r\n        Serial.write(c);\r\n        if (c == '\\n') {\r\n          if (currentLine.length() == 0) {\r\n            client.println(&quot;HTTP\/1.1 200 OK&quot;);\r\n            client.println(&quot;Content-type:text\/html&quot;);\r\n            client.println();\r\n            client.print(&quot;Click &lt;a href=\\&quot;\/H\\&quot;&gt;here&lt;\/a&gt; to turn the LED on pin 2 on.&lt;br&gt;&quot;);\r\n            client.print(&quot;Click &lt;a href=\\&quot;\/L\\&quot;&gt;here&lt;\/a&gt; to turn the LED on pin 2 off.&lt;br&gt;&quot;);\r\n            client.println();\r\n            break;\r\n          } else {\r\n            currentLine = &quot;&quot;;\r\n          }\r\n        } else if (c != '\\r') {\r\n          currentLine += c;\r\n        }\r\n        if (currentLine.endsWith(&quot;GET \/H&quot;)) {\r\n          digitalWrite(LED, HIGH);\r\n        }\r\n        if (currentLine.endsWith(&quot;GET \/L&quot;)) {\r\n          digitalWrite(LED, LOW);\r\n        }\r\n      }\r\n    }\r\n    client.stop();\r\n    Serial.println(&quot;Client Disconnected.&quot;);\r\n  }\r\n}\r\n<\/pre>\n<p>Feito isso, podemos conectar-se \u00e0 p\u00e1gina do web server atrav\u00e9s do computador, indicando o endere\u00e7o IP que foi mostrado na Monitor Serial. Confira abaixo como a p\u00e1gina deve aparecer em um web browser.<\/p>\n<p><a href=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/printwebbrowser.jpg\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2823 aligncenter\" src=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/printwebbrowser.jpg\" alt=\"\" width=\"523\" height=\"312\" \/><\/a><\/p>\n<p>Tamb\u00e9m podemos acess\u00e1-la de um celular ou tablet, como mostra a imagem abaixo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2824\" src=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/WhatsApp-Image-2019-05-01-at-21.44.21-576x1024.jpeg\" alt=\"\" width=\"319\" height=\"568\" \/><\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Por fim, esses foi o primeiro tutorial esp32 envolvendo a comunica\u00e7\u00e3o sem fio com a Internet por meio da placa de desenvolvimento NodeMCU ESP32 Wifi. Apresentamos conceitos essenciais para o desenvolvimento de c\u00f3digos mais complexos e que envolvam mais dispositivos. Em breve, teremos mais projetos envolvendo a ESP. Fique ligado!<\/p>\n<p>Conhe\u00e7a toda Linha\u00a0<a href=\"https:\/\/www.usinainfo.com.br\/esp32-611\" target=\"_blank\" rel=\"noopener noreferrer\">ESP32<\/a>\u00a0e Acess\u00f3rios no site da UsinaInfo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A conex\u00e3o wireless \u00e9, sem d\u00favidas, um dos principais motivos para diversos entusiastas da eletr\u00f4nica utilizar o ESP32 Wifi em seus projetos. Ainda, devido ao seu baixo custo e grande abrang\u00eancia de aplica\u00e7\u00e3o, esse m\u00f3dulo recebe um enfoque especial em aplica\u00e7\u00f5es da Internet of Things &#8211; IoT. Tendo isso em vista, aprenderemos, ao longo desse tutorial, a utilizar a biblioteca WiFi. Esse tutorial esp32 est\u00e1 organizado da seguinte maneira: primeiramente, iremos conectar a ESP32 em uma rede WiFi; em seguida, veremos como obter o endere\u00e7o MAC da placa; por fim, iremos criar um web browser o qual acionaremos ou desligaremos uma LED. &nbsp; Wifi.h Essa biblioteca, que j\u00e1 vem instalada na biblioteca do Arduino, fornece diversas fun\u00e7\u00f5es. Estudaremos algumas delas, [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":2989,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[],"class_list":["post-2728","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp32"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet - Blog Usinainfo<\/title>\n<meta name=\"description\" content=\"ESP32 Wifi conectando \u00e0 Rede Mundial de Computadores Internet com Explica\u00e7\u00e3o Simples e Exemplos de Procedimentos adotados. Vem aprender no Blog UsinaInfo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet - Blog Usinainfo\" \/>\n<meta property=\"og:description\" content=\"ESP32 Wifi conectando \u00e0 Rede Mundial de Computadores Internet com Explica\u00e7\u00e3o Simples e Exemplos de Procedimentos adotados. Vem aprender no Blog UsinaInfo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Usinainfo\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/pt-br.facebook.com\/faceusinainfo\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-20T14:29:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-07T18:55:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/esse.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1620\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gustavo Teixeira\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gustavo Teixeira\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet - Blog Usinainfo","description":"ESP32 Wifi conectando \u00e0 Rede Mundial de Computadores Internet com Explica\u00e7\u00e3o Simples e Exemplos de Procedimentos adotados. Vem aprender no Blog UsinaInfo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/","og_locale":"pt_BR","og_type":"article","og_title":"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet - Blog Usinainfo","og_description":"ESP32 Wifi conectando \u00e0 Rede Mundial de Computadores Internet com Explica\u00e7\u00e3o Simples e Exemplos de Procedimentos adotados. Vem aprender no Blog UsinaInfo.","og_url":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/","og_site_name":"Blog Usinainfo","article_publisher":"https:\/\/pt-br.facebook.com\/faceusinainfo\/","article_published_time":"2019-05-20T14:29:03+00:00","article_modified_time":"2019-08-07T18:55:09+00:00","og_image":[{"width":1620,"height":1080,"url":"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/esse.jpg","type":"image\/jpeg"}],"author":"Gustavo Teixeira","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Gustavo Teixeira","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/","url":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/","name":"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet - Blog Usinainfo","isPartOf":{"@id":"https:\/\/www.usinainfo.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/#primaryimage"},"image":{"@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/#primaryimage"},"thumbnailUrl":"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/esse.jpg","datePublished":"2019-05-20T14:29:03+00:00","dateModified":"2019-08-07T18:55:09+00:00","author":{"@id":"https:\/\/www.usinainfo.com.br\/blog\/#\/schema\/person\/e562b515fae72a8e6663629d55466c6b"},"description":"ESP32 Wifi conectando \u00e0 Rede Mundial de Computadores Internet com Explica\u00e7\u00e3o Simples e Exemplos de Procedimentos adotados. Vem aprender no Blog UsinaInfo.","breadcrumb":{"@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/#primaryimage","url":"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/esse.jpg","contentUrl":"https:\/\/www.usinainfo.com.br\/blog\/wp-content\/uploads\/2019\/05\/esse.jpg","width":1620,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/www.usinainfo.com.br\/blog\/esp32-wifi-comunicacao-com-a-internet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.usinainfo.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"ESP32 WiFi: Comunica\u00e7\u00e3o com a Internet"}]},{"@type":"WebSite","@id":"https:\/\/www.usinainfo.com.br\/blog\/#website","url":"https:\/\/www.usinainfo.com.br\/blog\/","name":"Blog Usinainfo","description":"Usinainfo","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.usinainfo.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/www.usinainfo.com.br\/blog\/#\/schema\/person\/e562b515fae72a8e6663629d55466c6b","name":"Gustavo Teixeira","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.usinainfo.com.br\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d3d23c5cd03ce9d8ef47bc68b083dc7e5f94b7b022f5059e668bf9439c9d4709?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d3d23c5cd03ce9d8ef47bc68b083dc7e5f94b7b022f5059e668bf9439c9d4709?s=96&d=mm&r=g","caption":"Gustavo Teixeira"},"description":"Bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela URI \u2013 Campus de Santo \u00c2ngelo, com experi\u00eancia no desenvolvimento de pesquisas em Rob\u00f3tica e prototipa\u00e7\u00e3o de Sistemas Rob\u00f3ticos.","url":"https:\/\/www.usinainfo.com.br\/blog\/author\/gustavo-teixeira\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/posts\/2728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/comments?post=2728"}],"version-history":[{"count":33,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/posts\/2728\/revisions"}],"predecessor-version":[{"id":3612,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/posts\/2728\/revisions\/3612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/media\/2989"}],"wp:attachment":[{"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/media?parent=2728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/categories?post=2728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.usinainfo.com.br\/blog\/wp-json\/wp\/v2\/tags?post=2728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}