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.
- 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.
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 |
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 }