Depois de testar o modulo com vários comandos AT (vale a pena dar uma sapeada no arquivo anexo, bem legal!), parti para fazer o modulo funcionar como Web Server. Partído que tinha aprendido, principalmante com um tutorial do blog FILIPEFLOP:
http://blog.filipeflop.com/wireless/esp8266-arduino-tutorial.html
O Circuito:
O código:
/*************************************************************************
* Web Server with ESP8266
* Based on: FILIPEFLOP http://blog.filipeflop.com/wireless/esp8266-arduino-tutorial.html
* Adapted by Marcelo Jose Rovai
**************************************************************************/
#define esp8266 Serial2
#define CH_PD 4
#define speed8266 115200 // This is the speed that worked with my ESP8266
#define DEBUG true
void setup()
{
esp8266.begin (speed8266);
Serial.begin(9600);
reset8266(); // Pin CH_PD needs a reset before start communication
sendData("AT+RST\r\n", 2000, DEBUG); // reset
sendData("AT+CWJAP=\"ROVAI TIMECAP\",\"mjr747@1\"\r\n", 2000, DEBUG); //Connect network
delay(3000);
sendData("AT+CWMODE=1\r\n", 1000, DEBUG);
sendData("AT+CIFSR\r\n", 1000, DEBUG); // Show IP Adress
sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); // Multiple conexions
sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // start comm port 80
}
void loop()
{
if (esp8266.available()) // check if 8266 is sending data
{
if (esp8266.find("+IPD,"))
{
delay(300);
int connectionId = esp8266.read() - 48;
String webpage = "<head><meta http-equiv=""refresh"" content=""3"">";
webpage += "</head><h1><u>MJRoBot ==> WebServer (ESP8266) </u></h1><h2>Arduino Pin: ";
webpage += "D8 status ==> ";
int a = digitalRead(8);
webpage += a;
webpage += "<h2>Arduino Pin: D9 status ==> ";
int b = digitalRead(9);
webpage += b;
webpage += "<h2>Arduino Pin: A0 data ===> ";
int c = analogRead(0);
webpage += c;
webpage += "</h2>";
String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend += webpage.length();
cipSend += "\r\n";
sendData(cipSend, 1000, DEBUG);
sendData(webpage, 1000, DEBUG);
String closeCommand = "AT+CIPCLOSE=";
closeCommand += connectionId; // append connection id
closeCommand += "\r\n";
sendData(closeCommand, 3000, DEBUG);
}
}
}
/*************************************************/
// Send AT commands to module
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command);
long int time = millis();
while ( (time + timeout) > millis())
{
while (esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
response += c;
}
}
if (debug)
{
Serial.print(response);
}
return response;
}
/*************************************************/
// Reset funtion to accept communication
void reset8266 ()
{
pinMode(CH_PD, OUTPUT);
digitalWrite(CH_PD, LOW);
delay(300);
digitalWrite(CH_PD, HIGH);
}
A web Page:
Note que o endereço da pagina é o segundo IP que aparece no Serial monitor com o comando AT+CIFSR na fase de Set-up (veja a copia do Serial monitor abaixo):
+CIFSR:STAIP,"10.0.1.2"
A saída no Serial Monitor:
1. A conexão com o modulo esp8266
2. A comunicação:
Eu fiz um pequeno vídeo para dar uma visão do WebServer funcionando:
Documento legal com dicas de comandos AT para configurar o esp8266:
ESP8266_WiFi_Module_Quick_Start_Guide_v_1.0.4.pdf
meu Blog:
Comentar
Eu só utilizei o divisor de tensão no pino de recepção. O CH_PD liguei direto sem problemas. Fiz testes com dois 8266 distintos e sempre funcionaram bem com o reset por SW gerado pelo pino 4 do Arduino.
Para comunicação com a internet, acabei migrando para o RaspberryPi. O 8266 é bem "temperamental". Fiz uns projetos de IoT e também de robótica controlado pela Web e o RPi faz com um pé nas costas! ;-)
(esse terminei hoje:
Obrigado pelas dicas, segui exatamente o que vc disse mas continua acontecendo a mesma coisa? Vou comprar outro ESP pra ver se o problema é ele.
Me diga uma coisa, o CH_PD ligado direto no arduino não tem problema? Achei estranho essa ligação, estava fazendo com um divisor de tensão, mas resolvi arriscar desse jeito, e parece que não queimou.
Oi rafael,
Eu rodei no UNO trocando o Port serial e usando a biblioteca softwareSerial () para definir os pinos 2 e 3 como RX e TX respectivamente. Qual a velocidade em que você está trabalhando? (O SoftSerial só funciona com velocidades mais baixas que 19.600bauds)
Só para conferir, abaixo envio novamente o que tinha postado anteriormente:
As definições iniciais no código devem ser alteradas para:
#include <SoftwareSerial.h>
SoftwareSerial esp8266(2,3); //Rx ==> Pin 2; TX ==> Pin3
#define speed8266 9600
O restante do código para o UNO funcionará da mesma maneira que para o MEGA.
O novo circuito:
O vídeo abaixa, mostra o UNO como um WebServer executando o mesmo código anterior:
Bom dia Marcelo, será que vc pode me ajudar! Rodei o seu programa no Uno, fiz as alterações devidas, e ele roda tranquilamente, até a página atualizar. Ou seja, eu acesso o IP, ele mostra a página html, e quando ele atualiza, ou eu mexo nos botões a página cai e não volta mais, só volta com um reset do arduino. Isso acontece tanto com o seu programa quanto do Filipiflop. O que aparece na serial é o seguinte:
OK
AT+CIFSR
+CIFSR:STAIP,"192.168.0.164"
+CIFSR:STAMAC,"18:fe:34:a4:eb:17"
OK
AT+CIPMUX=1
OK
AT+CIPSERVER=1,80
OK
,385:GET / HTTP/1.1
Host: 192.168.0.164
Connection: keep-aliAT+CIPSEND=0,198
OK
> <Ê…‘âjE‹T’É�¹Ñšâ «–'LO]¦JR„½ÑêòèUÖ–W.JQ¨266�½ùzBâKJ«Ëª'hHººs/h2>
SEND OK
AT+CIPCLOSE=0
0,CONNECT FAIL
OK
Obrigado pelos elogios, Me aposentei em dez de 2015.
Terei mais tempo para me distrair com o Lab
Abraços
Gustavo
Oi José Gustavo, muito obrigado pela dica. Eu escreverei novos posts com as modificações e farei os tutoriais. O codigo foi escrito de maneira ser fácil de mudar entre o UNO e o MEGA, so alterando duas linhas lá nas definições e mudando a velocidade. Aproveitando, queria te contar que trabalhei em um terceiro experimento para acionar os GPIOs, acendendo LEDs. Fiz dois tipos de experiências, uma onde o Arduino gera a página web e outro onde a página HTML já existe. Nos dois casos Percebi que só posso acionar os LEDs 5 vezes. Algo a ver com a limitação dos 5 canais que o ESP pode manejar. Mas no fim, descobri que tenho que forçar um "refresh" da página depois de alguns segundos e tudo funcionou a maravilha!
Vou preparar os 3 tutoriais com o UNO. Eu comecei um blog aqui no Chile para ajudar dinossauros que nem eu a re-lembrar a eletrônica ou mesmo aprender. A idéia é ver se vou parando com a vida de executivo e passo a tentar ajudar os iniciantes da area! Acho que é o que voce também faz. Seus posts são excepcionais e sua paixão pela eletrônica contagia! Meus parabéns.
mjrobot.wordpress.com
E mais especificamente na pagina abaixo, coloquei vários videozinhos com experiências que pretendo, melhorar, integrar-las, etc. e ir escrevendo posts sobre os assuntos.
Obrigado e um abraço.
Marcelo , não fiz ainda esse tipo de teste.
Marcelo bom dia,
Ficou muito bom o tutorial.
Sugiro que crie um tutorial usando o Arduino comum. A grande maioria dos makers não tem Arduino Mega.
E divulgue como Tutorial e não blog. Assim ficará mais exposto.
Abraços,
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)