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