"Ajuda" WebServer: Arduino UNO com WiFi ESP01

Prezados Boa noite!

Estou precisando de uma ajuda. Não consigo colocar para funcionar o projeto. Retirei deste site

WebServer: Arduino UNO com WiFi ESP01 - Fernando K Tecnologia.

Quando clico no botão para ligar o rele nada acontece.

Poderiam me ajudar?

Agradeço desde já.

Abaixo o código:

Para carregar no ESP01:

#include <ESP8266WiFi.h>

//Troque pelos dados da sua rede
const char* ssid = "SSID";
const char* password = "SENHA";
const char* ip = "192.168.0.177";

//Timeout da conexão
#define TIMEOUT 500
#define MAX_BUFFER 300

//Server na porta 80 (padrão http)
WiFiServer server(80);
//Buffer onde serão gravados os bytes da comunicação
uint8_t buffer[MAX_BUFFER];

void setup() {
Serial.begin(115200);

//Envia a informação da rede para conectar
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

//Espera a conexão com o access point
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

//Configura o IP
IPAddress ipAddress;
ipAddress.fromString(ip);
WiFi.config(ipAddress, WiFi.gatewayIP(), WiFi.subnetMask());

//Inicializa o server
server.begin();
}

void loop() {
//Verifica se alguem se conectou
WiFiClient client = server.available();
if (!client) {
//Se ninguém conectou apenas retorna sem fazer nada
return;
}

//Marca o tempo que o cliente se conectou e a quantidade
//de bytes lidos
uint32_t connectedTime = millis();
int bytesRead = 0;

//Enquanto o cliente estiver conectado
while(client.connected())
{
//Tempo agora
uint32_t now = millis();
//Quanto tempo passou desde a conexão com o cliente
uint32_t ellapsed = now - connectedTime;

//Se o tempo passou do tempo máximo e não leu nenhum byte
if(ellapsed > TIMEOUT && bytesRead == 0)
{
  //Fecha a conexão com o cliente
  client.stop();
  break;
}

int available = client.available();

//Se o cliente possui bytes a serem lidos
if(available)
{
  int bufferSize = available < MAX_BUFFER ? available : MAX_BUFFER;
  int readCount = client.read(buffer, bufferSize);
  //Envia os bytes pela serial e aumenta o contador de bytes lidos
  Serial.write(buffer, readCount);
  Serial.flush();
  bytesRead += readCount;
}

available = Serial.available();

//Se a serial possui bytes a serem lidos
if(available)
{
  int bufferSize = available < MAX_BUFFER ? available : MAX_BUFFER;
  //Lê os bytes
  Serial.readBytes(buffer, bufferSize);

  //Se for o byte que define a finalização da conexão
  if(buffer[bufferSize-1] == 127)
  {
    client.write(buffer, bufferSize-1);
    //Envia o que ainda não tenha sido enviado
    client.flush();
    //Espera um tempo para o cliente receber
    delay(100);
    //Fecha a conexão com o cliente e sai do 'while'
    client.stop();
    break;
  }

  //Envia os bytes para o cliente
  client.write(buffer, bufferSize);
}
}//while(client.connected())
}//loop

Para carregar no Arduino Uno:

#define FIRST_PIN 2 //Pino onde está o primeiro relê
#define PINS_COUNT 5 //Quantos pinos serão utilizados

//Mantém o estado atual dos pinos (HIGH ou LOW)
int pinsStatus[PINS_COUNT];

void setup()
{
Serial.begin(115200);

//Inicializa os pinos
setupPins();
}

void setupPins()
{
//Coloca os pinos que estão ligados os relês como saída
for(int i=0; i<PINS_COUNT; i++)
{
pinsStatus[i] = LOW;
int pinNumber = FIRST_PIN + i;
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, pinsStatus[i]);
}
}

void loop()
{
//Verifica se há um novo cliente
if (Serial.available())
{ 
//Faz a leitura da requisição
char* request = readRequest();

//Se a requisição não for para o favicon
if(strstr(request, "favicon") == NULL)
{
  //Executamos a ação com o valor passado na requisição
  execute(getAction(request), getValue(request));

  //Envia a resposta ao cliente
  sendResponse();
}
else
{
  Serial.print(
  "HTTP/1.1 404 Not Found\r\n"
  "Content-Length: 0\r\n"
  "Connection: close\r\n"
  "\r\n");
}

Serial.write(127);
}
}

//Faz a leitura da primeira linha da requisição
char* readRequest()
{
bool currentLineIsBlank = true;
char request[50];
int i = 0;
bool firstLine = true;

while (true){
while(!Serial.available());
char c = Serial.read();

//Apenas a primeira linha da requisição nos interessa
if(firstLine){
  request[i] = c;
  i++;
}

if (c == '\n'){
    //A última linha da requisição é um \r\n sozinho, após o \r\n da linha anterior
    if(currentLineIsBlank){
        //Se chegou aqui é porque a requisição foi lida por completo
        break;
    }

    currentLineIsBlank = true;
    firstLine = false;
}
else if (c != '\r'){
    //Se leu qualquer caracter que não for \n e \r significa que a linha não está em branco
    currentLineIsBlank = false;
}
}

return request;
}

//Envia o HTML para o cliente
void sendResponse()
{
//Envia o cabeçalho HTTP
Serial.print(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n"
"Connection: close\r\n"
"\r\n");

Serial.println("<!DOCTYPE HTML>");
Serial.println("<html>");
head();//Envia o cabeçalho do HTML
body();//Envia o corpo do HTML
Serial.println("</html>");
}

//Envia o CSS para modificar a aparência da página
void head()
{
Serial.println(F("<head>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
"<style>"
    "body{"
        "text-align: center;"
        "font-family: sans-serif;"
        "font-size: 14px;"
    "}"
    "p{"
        "color:#555;"
        "font-size: 12px;"
    "}"
    ".button{"
        "outline: none;"
        "display: block;"
        "border: 1px solid #555;"
        "border-radius:18px;"
        "width: 150px;"
        "height: 30px;"
        "margin: 10px;"
        "margin-left: auto;"
        "margin-right: auto;"
        "cursor: pointer;"
    "}"
    ".button_off{"
        "background-color:#FFF;"
        "color: #555;"
    "}"
    ".button_on{"
        "background-color:#2C5;"
        "color: #fff;"
    "}"
"</style>"
"</head>"));
}

//Exibe os dados dos sensores e cria os botões
void body()
{
Serial.println("<body>");

String buttons = "";

//Cria um botão para cada pino que possui um relê
for(int i=0; i<PINS_COUNT; i++)
{
    buttons.concat(button(i));
}

Serial.println(buttons);
Serial.println("</body>");
}

//Cria um botão com a aparência e ação correspondente ao estado atual do relê
String button(int number)
{
String label = String(number + 1);
String className = "button ";
className += pinsStatus[number] == HIGH ? "button_on" : "button_off";
String action = pinsStatus[number] == HIGH ? "off" : "on";
return "<button class=\"" + className + "\"onclick=\"location.href='?" + action + "=" + label + "'\">" + label + "</button>";
}

//Retorna a ação que o cliente deseja executar (on off)
String getAction(char *request)
{
return getStringBetween(request, '?', '=');
}

//Retorna o valor (numero do relê) que a ação será executada
String getValue(char *request)
{
return getStringBetween(request, '=', ' ');
}

//Retorna a string que fica entre o primeiro caractere 'start' e o primeiro caractere 'end'
String getStringBetween(char* input, char start, char end)
{
String str = "";
//retorna o endereço de memória do caractere 'start'
char* c = strchr(input, start);

//Se não achou o caractere
if(c == NULL)
{
  return "";
}

//Vai para o próximo caractere
c++;

//Enquanto não chegar ao caractere 'end' ou ao final da string
while(*c != end && *c!='\0')
{
  str += *c;
  c++;
}

return str;
}

//Executada a ação junto ao valor (número do relê)
void execute(String action, String value)
{
//Se é uma das duas ações que esperamos
if(action == "on" || action == "off")
{
//Os relês são numerados a partir do 1, max o array começa do 0
//então tiramos 1
int index = value.toInt() - 1;
//O número do pino será o índice mais o número do pino onde os relês
//começam. Os relês devem estar em sequência a partir do pino inicial (FIRST_PIN)
int pinNumber = FIRST_PIN + index;
int status = action == "on" ? HIGH : LOW;
digitalWrite(pinNumber, status);
pinsStatus[index] = status;
}
}

Precisa explicar melhor se quiser alguma ajuda.
Uma foto do seu circuito seria o básico, pois se apenas usou o código sem modicar o problema é sua conexão elétrica.

Você conseguiu solução? Também estou com o mesmo problema e estou quebrando a cabeça pra entender o que está errado com o código

O que consegui ver é que a função, abaixo desse código retorna -1 Se alguém souber me ajudar em como posso ler a requisição de outra maneira, lembrando que esse código está no Arduino e não no esp8266

//Faz a leitura da primeira linha da requisição
char* readRequest()
{
bool currentLineIsBlank = true;
char request[50];
int i = 0;
bool firstLine = true;

while (true){
while(!Serial.available());
char c = Serial.read();

//Apenas a primeira linha da requisição nos interessa
if(firstLine){
request = c;

  • i++;*
  • }*
  • if (c == '\n'){*
  • //A última linha da requisição é um \r\n sozinho, após o \r\n da linha anterior*
  • if(currentLineIsBlank){*
  • //Se chegou aqui é porque a requisição foi lida por completo*
  • break;*
  • }*
  • currentLineIsBlank = true;*
  • firstLine = false;*
  • }*
  • else if (c != '\r'){*
  • //Se leu qualquer caracter que não for \n e \r significa que a linha não está em branco*
  • currentLineIsBlank = false;*
  • }*
  • }*
  • return request;*
    }