Participe do Nosso Blog

Conectando ideias

Conectando o ESP8266 ao STM32F103C8: Criando um Servidor da Web

Conectando o ESP8266 ao STM32F103C8: Criando um Servidor da Web

Se você pensa em tecnologias futuras, os dois nomes, que vêm imediatamente à sua mente, são Inteligência Artificial (AI) e Internet das Coisas (IoT). A IA ainda está em seu estágio inicial e há muito mais a ser desenvolvido. Mas a IoT está no estágio de crescimento e muitos produtos baseados na IoT já estão lá no mercado. Além disso, existem muitas ferramentas e hardware disponíveis no mercado para fazer seu produto falar com “coisas” na internet. Entre eles, o ESP8266 é o módulo mais popular, barato e fácil de usar, que pode conectar seu hardware à Internet.

Desenvolvemos muitos projetos de IoT usando o ESP8266, que não inclui apenas interface básica com outros microcontroladores como Arduino, PIC, AVR, mas também inclui muitos projetos inteligentes, como monitoramento de poluição do ar baseado em IOT, rastreamento de veículos no Google Maps, automação residencial controlada por voz baseada em IOT Hoje, neste tutorial, usamos o ESP8266 para conectar o STM32F103C8 à Internet. Aqui, faremos a interface do módulo Wi-Fi ESP8266 com a placa Blue Pill STM32F103C8 e enviaremos os dados para uma página da Web hospedada no servidor ESP8266.

 

Conteúdo

Componentes necessários:

  • Blue Pill STM32F103C8 board ou equivalente com o mesmo processador
  • Módulo ESP8266 Wi-Fi
  • Laptop & Wi-Fi ponto de acesso

 

Módulo Wi-Fi ESP8266

A maioria das pessoas chama ESP8266 como um módulo WIFI, mas na verdade é um microcontrolador. ESP8266 é o nome do microcontrolador desenvolvido pela Espressif Systems, uma empresa sediada em Xangai. Este microcontrolador tem a capacidade de realizar atividades relacionadas ao WIFI, portanto, é amplamente utilizado como um módulo WIFI.

ESP8266
ESP8266

  • 1) GND, terra (0V)
  • 2) TX, transmitir bit de dados X
  • 3) GPIO 2, entrada/saída de uso geral n°2
  • 4) CH_PD, desligamento do chip
  • 5) GPIO 0, entrada/saída de uso geral n°0
  • 6) RST, Reset
  • 7) RX, receber bit de dados X
  • 8) VCC, tensão (+3,3 V)

 

O comando AT é usado para se comunicar com o ESP8266. A tabela abaixo mostra alguns dos comandos AT úteis

AT COMMANDS USO
AT A confirmação retorna ‘OK’
AT+RST Restarta o Modulo
AT+GMR Mostra DETALHES DO FIRMWARE
AT+CWMODE=1 or 2 or 3 Modo Wi-Fi 1-Estação, 2 AP, 3-Ambos
AT+CWLAP Listar o AP
AT+CWJAP=”SSID”,”PASSWORD” Ingressa no AP
AT+CWQAP Sai do AP
AT+CIFSR Obtém o endereço IP
AT+CIPMUX= 0 or 1 Definir conexão múltipla 0 – Única, 1 múltipla
AT+CIPSTART AT+CIPSTART=<type>,<address>,<port> AT+CIPSTART=<id>,<type>,<address>,<port> Configurar conexão TCP / UDP Endereço – Endereço IP Endereço porta-porta do ip Conexão única: Type-TCP, UDP Conexão múltipla: Id-0 a 4, Tipo TCP, UDP
AT+CIPSEND AT+CIPSEND=<length> AT+CIPSEND=<id>,<length> Envia dados Conexão única, comprimento – comprimento dos dados Conexão múltipla, Id =0 a 4
AT+CIPSTATUS Obtém o status da conexão
AT+CIPSERVER=<mode>,<port> Definir como servidor 0-servidor fechar, 1-porta aberta
AT+CIPCLOSE Feche a conexão TCP ou UDP

 

Diagrama de circuito e conexões

O esquema abaixo mostra a conexão entre o módulo Wifi STM32 e o ESP8266.

Esp8266 e STM32

 

Consulte a tabela abaixo para conectar os pinos ESP8266 aos pinos STM32:

ESP8266 STM32
VCC 3.3V
GND G
CH_PD 3.3V
TX PA3
RX PA2

 

O SMT32F103C8 possui três conjuntos de comunicação serial UART. Na imagem abaixo, você pode ver os seguintes pinos para o mesmo:

Porta serial Pinos Tolerante
Serial1 (TX1,RX1) PA9,PA10 PB6,PB7 5V
Serial2 (TX2,RX2) PA2,PA3 3.3V
Serial3 (TX3,RX3) PB10,PB11 5V

 

STM32

 

O ESP8266 usa comunicação serial para interagir com o microcontrolador. Então aqui TX e RX do ESP8266 estão conectados à porta serial2 (PA2 e PA3) da placa STM32.

 

Explicação sobre trabalho e código

O trabalho de interface do ESP8266 com o STM32 é muito simples. Você pode encontrar o trabalho completo no vídeo fornecido no final deste tutorial, juntamente com o código.

Usamos o arduino IDE para escrever e fazer upload do código no STM32

 

Primeiro, precisamos fazer as conexões do circuito, como mostrado acima no diagrama de circuitos. Após o upload do código, abra o Serial Monitor (Ferramentas >> Serial Monitor) para ver o que está acontecendo. Você verá o endereço IP no monitor serial, copie o endereço IP do monitor serial e cole-o no navegador e clique em Enter para ver nossa página da web. Lembre-se de conectar seu computador e o módulo ESP8266 na mesma rede Wi-Fi.

O código completo é fornecido no final e bem explicado pelos comentários, aqui estamos explicando poucas partes importantes dele.

 

Primeiro, iniciamos a comunicação serial para o monitor serial e para o ESP8266, usando as duas instruções a seguir:

Serial.println(cmd);
Serial2.println(cmd);

NOTA: Utilizei pinos (PA2, PA3) da porta Serial2 do STM32 porque é tolerante a 3,3V.

 

Então, precisamos preparar o ESP8266 saindo de qualquer AP conectado antigo, redefinindo-o e configurando o modo Wi-Fi como AP e STA

connect_wifi("AT",100);  //Envia o comando AT com o tempo (comando para confirmação)
connect_wifi("AT+CWMODE=3",100);   //Envia o comando AT com o tempo (para definir o modo de Wi-Fi)
connect_wifi("AT+CWQAP",100);  //Envia o comando AT com hora (para Sair do AP)
connect_wifi("AT+RST",5000);   //Envia o comando AT com o tempo (para RESETTING WIFI)

 

Em seguida, conecte o ESP8266 à rede Wi-Fi. Você deve preencher seus detalhes de Wi-Fi, conforme mostrado no código abaixo:

connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000);  //forneça seu nome de usuário e senha WiFi aqui

 

Em seguida, obtemos o endereço IP do módulo ESP8266 e o mostramos no monitor serial usando o código abaixo

Serial2.println("AT+CIFSR");           //OBTER IP NO COMANDO
if(Serial2.find("STAIP,"))             //Encontra o STAIP que é o ENDEREÇO IP ESTÁTICO do ESP8266
Serial.print(IP);                      //imprime o endereço IP no monitor serial

 

Em seguida, escreveremos o código HTML para a página da web. Para converter código HTML em código Arduino, você pode usar este link.

webpage = "<h1>Bem Vindo ao CapSistema</h1><body bgcolor=f0f0f0>"; //Esta é a linha do cabeçalho com a cor da fonte preta
String name="<p>CapSistema</p><p>Uma comunidade de estudantes de eletricidade, eletrônica e programação</p>";
String data="<p>Dados recebidos com sucesso.....</p>";     //Essas duas linhas são de dois parágrafos
webpage = "<a href=\"http://capsistema.com.br/\"";
webpage+="\">Clique aqui para entrar no capsistema.com.br</a>"; //Por fim, inserimos o hiperlink para vincular o endereço do site

 

Em seguida, na função void send(), imprimimos HTML usando a função sendwebdata e fechamos a conexão do servidor usando AT+CIPCLOSE=0

void Send()                                        //This function contains data to be sent to local server
{
      webpage = "<h1>Bem Vindo ao CapSistema</h1><body bgcolor=f0f0f0>";
      sendwebdata(webpage);
      webpage=name;
      sendwebdata(webpage);
      delay(1000);
      webpage = "<a href=\"http://capsistema.com.br/\"";
      webpage+="\">Clique aqui para entrar no capsistema.com.br</a>";
      webpage+=data;
      sendwebdata(webpage);
      Serial2.println("AT+CIPCLOSE=0");                  //Fecha a conexão do servidor
}

 

Depois de todo o trabalho, você pode testar o funcionamento abrindo o IP do ESP8266 em qualquer navegador da Web e clique no link mostrado na página da Web, clique aqui para entrar no capsistema.com.br

Depois de clicar no link, você verá um texto na página da Web dizendo “Dados recebidos com sucesso …..”

 

Código:

//Interfacing ESP8266 Wi-Fi with STM32F103C8
//CAPSISTEMAS
//NOTE: Serial é um monitor serial com taxa de transmissão (9600)
//NOTE: Serial2 (TX2, RX2) é conectado ao ESP8266 (RX, TX), respectivamente, à taxa de transmissão (9600)

String webpage="";                                   //Variável de string para armazenar caracteres
int i=0,k=0,x=0;                                     //variáveis inteiras
String readString;                                   //usando o recurso readString para ler caracteres

boolean No_IP=false;                                 //variáveis booleanas
String IP="";                                        //Variável de cadeia para armazenar dados
char temp1='0';                                      //variável de caractere


String name="<p>CapSistema</p><p>Uma comunidade de estudantes de eletricidade, eletrônica e programação</p>";
String data="<p>Dados recebidos com sucesso.....</p>";     //Essas duas linhas são de dois parágrafos
    
void check4IP(int t1)                                //Uma função para verificar o ip do ESP8266
{
  int t2=millis();
  while(t2+t1>millis())
  {
    while(Serial2.available()>0)
    {
      if(Serial2.find("WIFI GOT IP"))
      {
        No_IP=true;
      }
    }
  }
}

void get_ip()                                      //Depois do IP de baixo custo, esta é uma função para obter o endereço IP
{
  IP="";
  char ch=0;
  while(1)
  {
    Serial2.println("AT+CIFSR");                   //OBTER IP NO COMANDO
    while(Serial2.available()>0)        
    {
      if(Serial2.find("STAIP,"))                   //Encontra o STAIP que é o ENDEREÇO IP ESTÁTICO do ESP8266
      {
        delay(1000);
        Serial.print("IP Address:");
        while(Serial2.available()>0)
        {
          ch=Serial2.read();                      //Serial2 lê ESP8266
          if(ch=='+')
          break;
          IP+=ch;
        }
      }
      if(ch=='+')
      break;
    }
    if(ch=='+')
    break;
    delay(1000);
  }
  Serial.print(IP);                                //imprime o endereço IP no monitor serial
  Serial.print("Port:");
  Serial.println(80);
}

void connect_wifi(String cmd, int t)                  //Esta função é para conectar o ESP8266 à rede wifi usando os comandos AT
{
  int temp=0,i=0;
  while(1)
  {
    Serial.println(cmd);                  //Envia para o monitor serial
    Serial2.println(cmd);                 //envia para o ESP8266 via comunicação serial
    while(Serial2.available())
    {
      if(Serial2.find("OK"))
      i=8;
    }
    delay(t);
    if(i>5)
    break;
    i++;
  }
  if(i==8)
  Serial.println("OK");
  else
  Serial.println("Error");
}

void wifi_init()                                //Esta função contém comandos AT que passam para connect_wifi()
{
      connect_wifi("AT",100);                   //Enviar comando AT com o tempo (comando para confirmação)
      connect_wifi("AT+CWMODE=3",100);          //Envia o comando AT com o tempo (para definir o modo Wifi)
      connect_wifi("AT+CWQAP",100);             //Envia o comando AT com o tempo (para Sair do AP)
      connect_wifi("AT+RST",5000);              //Envia o comando AT com o tempo (para RESETTING WIFI)
      check4IP(5000);
      if(!No_IP)
      {
        
        Serial.println("Connecting Wifi....");
        connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000);         //forneça seu nome de usuário e senha WiFi aqui
   
      }
      else   {}
      
	  Serial.println("Wifi conectado"); 
      get_ip();
      
      connect_wifi("AT+CIPMUX=1",100);                          //Envia o comando AT com o tempo (para criar várias conexões)
      connect_wifi("AT+CIPSERVER=1,80",100);                    //Envia o comando AT com o tempo (para configurar o servidor com porta 80)
}

void sendwebdata(String webPage)                          //Esta função é usada para enviar dados da página da web para o servidor local
{
    int ii=0;
     while(1)
     {
      unsigned int l=webPage.length();
      Serial.print("AT+CIPSEND=0,");
      Serial2.print("AT+CIPSEND=0,");
      Serial.println(l+2);
      Serial2.println(l+2);
      delay(100);
      Serial.println(webPage);                        //envia dados da página da web para o monitor serial
      Serial2.println(webPage);                       //envia dados da página da Web para serial2 ESP8266
      while(Serial2.available())
      {
       
        if(Serial2.find("OK"))
        {
          ii=11;
          break;
        }
      }
      if(ii==11)
      break;
      delay(100);
     }
}

void setup() 
{
   Serial.begin(9600);                //inicia monitor serial com taxa de transmissão 9600
   Serial2.begin(9600);               //inicia a comunicação serial com o esp8266 com taxa de transmissão 9600 (altere de acordo com o módulo do esp8266)
   wifi_init();
   Serial.println("Sistema pronto ..");
}

void loop() 
{
  k=0;
  Serial.println("Atualize sua página");
  while(k<1000)
  {
    k++;
   while(Serial2.available())
   {
    if(Serial2.find("0,CONNECT"))
    {
      Serial.println("Iniciar impressão");
      Send();
      Serial.println("Impressão concluída");
      delay(1000);
    }
  }
  delay(1);
 }
}

void Send()                                        // Esta função contém dados a serem enviados ao servidor local
{
    webpage = "<h1>Bem Vindo ao CapSistema</h1><body bgcolor=f0f0f0>";
    sendwebdata(webpage);
    webpage=name;
    sendwebdata(webpage);
    delay(1000);
    webpage = "<a href=\"http://capsistema.com.br/\"";
    webpage+="\">Clique aqui para entrar no capsistema.com.br</a>";
    webpage+=data;
    sendwebdata(webpage);
    Serial2.println("AT+CIPCLOSE=0");                  //Fecha a conexão do servidor
}

Informações de contato

Contate-nos por e-mail ou redes sociais
contato@arduinoeautomacao.com.br

Inscreva-se em nossa newsletter