Introdução ao ESP32


Neste artigo vamos falar sobre o ESP32, que considero um irmão mais velho do ESP8266. Eu gosto muito deste microcontrolador porque ele tem WiFi. Só para você ter uma ideia, antes do ESP existir, se você precisasse que um Arduino tivesse WiFi, você teria que gastar entre R$200 e R$300 para comprar um adaptador de WiFi. O adaptador para cabo de rede não é tão caro, mas para WiFi sempre foi e continua sendo caro. Mas, felizmente, a Espressif Systems lançou o ESP e está resolvendo a nossa vida.
esp32
Gosto do ESP32 com esse formato que tem uma porta USB. Esse esquema de NodeMCU é fácil de manipular porque não precisa de eletrônica nenhuma. Basta ligar o cabo, alimentar o dispositivo e programá-lo. Ele funciona exatamente como um Arduino.
Enfim, hoje vamos falar dos aspectos gerais do ESP32 e como configurar a IDE do Arduino para programar mais dispositivos do tipo. Também vamos fazer um programa que procura as redes e mostra qual a mais potente.

Características principais

ESP32
- Chip com WiFi embutido: padrão 802.11 B/G/N, operando na faixa de 2.4 a 2.5GHz
- Modos de operação: Client, Access Point, Station+Access Point
- Microprocessador dual core Tensilica Xtensa 32-bit LX6
- Clock ajustável de 80MHz até 240MHz
- Tensão de operação: 3.3 VDC
- Possui SRAM de 512KB
- Possui ROM de 448KB
- Possui memória flash externa de 32Mb (4 megabytes)
- Corrente máxima por pino é de 12mA (recomenda-se usar 6mA)
- Possui 36 GPIOs
- GPIOs com função PWM / I2C e SPI
- Possui Bluetooth v4.2 BR / EDR e BLE (Bluetooth Low Energy)


Comparativo entre ESP32, ESP8266 e Arduino R3

Tabela comparativa entre ESP32, ESP8266 e Arduino R3


Tipos de ESP32

O ESP32 já nasceu com um monte de irmãos. Hoje estou usando o primeiro da esquerda, da Espressif, mas são várias marcas e tipos, inclusive com display Oled embutido. No entanto, diferenças à parte, são todos o mesmo chip: o LX6 da Tensilica, de 2 Core.
Tipos de ESP32


WiFi NodeMCU-32S ESP-WROOM-32

Este é o diagrama do ESP que estamos usando na nossa montagem. Trata-se de um chip que tem muito recurso e poder. São diversos pinos que você escolher se quer trabalhar como análogo digital, digital análogo ou ainda se quer trabalhar a porta como digital.
Diagrama do ESP


Configurando IDE do Arduino (Windows)

Veja agora como configurar a IDE do Arduino para podermos compilar para o ESP32:

 1. Faça o download dos arquivos através do link: https://github.com/espressif/arduino-esp32

  2. Descompacte o arquivo e copie o conteúdo para o seguinte caminho:
C:/Users/[YOUR_USER_NAME]/Documents/Arduino/hardware/espressif/esp32
Obs: caso não exista o diretório “espressif” e “esp32”, basta criá-los normalmente.

  3.  Abra o diretório:
C:/Users/[YOUR_USER_NAME]/Documents/Arduino/hardware/espressif/esp32/tools
Execute o arquivo “get.exe”.
cmd

  4. Após a finalização do “get.exe”, plugue o ESP32, aguarde os drivers serem instalados (ou instale manualmente).
Pronto, agora basta escolher a placa do ESP32 em “ferramentas >> placa” e compilar seu código.
IDE


WiFi Scan

Neste vídeo de Introdução ao ESP32 mostro um programa que serve como um exemplo de como buscar as redes WiFi disponíveis próximas ao ESP-32, assim como a intensidade do sinal de cada uma delas. A cada escaneamento, também podemos descobrir qual a rede com a melhor intensidade de sinal.


Código

Primeiramente vamos incluir a biblioteca “WiFi.h”, ela será necessária para nos permitir trabalhar com a placa de rede do nosso dispositivo.

#include "WiFi.h"

A seguir, vamos declarar duas variáveis que serão utilizadas para guardar o SSID (nome) da rede e a intensidade do sinal.

String redeSSID = "";
int intensidadeSinal = -9999;


Setup

Na função setup(), definiremos o modo de comportamento WiFi do nosso dispositivo. Nesse caso, como o objetivo é procurar por redes disponíveis, vamos configurar nosso dispositivo para trabalhar como “estação”.

void setup()
{
    // Instrução para inicializar o Serial, utilizaremos apenas para log no monitor.
    Serial.begin(115200);

    // configurando o modo de operação do WiFi como estação
    WiFi.mode(WIFI_STA);

    // desconecta do access point caso ele já esteja conectado
    WiFi.disconnect()


Loop

Na função loop(), vamos fazer a busca pelas redes disponíveis e em seguida imprimir no log as redes encontradas. Para cada uma dessas redes faremos a comparação para encontrar a com maior intensidade de sinal.

void loop()
{
//    Serial.println("scan start");

    //realiza o escaneamento das redes disponíveis
    int n = WiFi.scanNetworks();
    Serial.println("Escaneamento realizado");

    //verifica se encontrou alguma rede
    if (n == 0) {
        Serial.println("Nenhuma rede encontrada");
    } else {
        redeSSID = "";
        intensidadeSinal= -9999;
        Serial.print(n);
        Serial.println(" redes encontradas\n");
        for (int i = 0; i < n; ++i) {
          // imprime no log cada uma das redes encontradas
          Serial.print("SSID: ");
          Serial.println(WiFi.SSID(i)); //nome da rede
          Serial.print("SINAL: ");
          Serial.print(WiFi.RSSI(i)); //intensidade do sinal
          Serial.print("\t\tcanal: ");
          Serial.print((int)WiFi.channel(i));
          Serial.print("\t\tMAC: ");
          Serial.print(WiFi.BSSIDstr(i));
          Serial.println("\n\n");
          
          
       
          if(abs(WiFi.RSSI(i)) < abs(intensidadeSinal))
          {
             intensidadeSinal = WiFi.RSSI(i);
             redeSSID = WiFi.SSID(i);
             Serial.print("REDE COM MELHOR SINAL ENCONTRADA: ( ");
             Serial.print(redeSSID);
             Serial.print(" ) - SINAL : ( ");
             Serial.print(intensidadeSinal );
             Serial.println(" )");
          }                        
         
          delay(10);
        }
    }
    Serial.println("\n------------------------------------------------------------------------------------\n");

    // deixa um intervalo de 10 segundos para fazer um novo escaneamento
    delay(5000);
}


“if(abs(WiFi.RSSI(i)) < abs(intensidadeSinal))”

Repare que na instrução acima, utilizamos abs(), essa função pega o valor absoluto (ou seja, não negativo) do número. No nosso caso fizemos isso para achar o menor entre os valores na comparação, pois, a intensidade do sinal é dada como um número negativo e, quanto mais próximo de zero, melhor o sinal.



Arquivos para download:
PDF
INO

8 comentários:

  1. Ola Fernando!! Parabéns pelo seu trabalho! Excelente! Gostaria de saber qual protoboard vicv utiliza para o ES32. Abração!

    ResponderExcluir
  2. não consegui. aparece o erro
    Arduino: 1.8.5 (Windows 10), Placa:"ESP32 Dev Module, QIO, 80MHz, 4MB (32Mb), 921600, None"

    Property line '

    ResponderExcluir
  3. Montei um leitor de smartcard cartão contato com arduino mega 2560 para portão automático, gravo o programa em outro microcontrolador e placa para baratear o projeto no momento e o mais pedido pelo preço, estou atualizando para NFC com checagem de segurança via wifi onde o servidor autenticador que sera um microcontrolador não ira ficar no portão ,no portão só um transmissor para o microcontrolador, os "vagabundos" estavam roubando o sistema e clonando as chaves e o algoritmo de autenticação. Queria saber se Esp32 pode usar bibliotecas criada por mim junto com outras biblioteca criada para mega 2560 e se caso use o Esp32 como projeto final tem como bloquear para não fazer download do hex ou source?

    ResponderExcluir
  4. Boa tarde Professor, após compilar o codigo fonte aparece a seguinte mensagem :
    " leaving...
    Hard reseting "
    O Código ta carregado. Porém eu não consigo visualizar as redes encontradas pelo esp32. Obrigado

    ResponderExcluir
  5. Professor , desculpe a falta de conhecimento, revendo o video vi que tinha que abrir no monitor serial. Porém ao abrir essa janela em vez de mostrar os nomes da redes. Aparece caracteres aleatórios. Por gentileza me ajudar.

    ResponderExcluir
    Respostas
    1. Olá, Helio. Por favor, verifique se a velocidade que usou no Serial.begin(*velocidade*);
      é a mesma que está no serial monitor. Abraço!

      Excluir

Tecnologia do Blogger.