Olá amigos!

Estou com o seguinte problema, no código abaixo a ideia é ligar o led manualmente ou via web com resposta do status na web:

Porem uma vez que eu aciono via web e desligo via pushButton ou (vice-versa) em um primeiro momento prevalece o acionamento do pushButton mas quando dá o refresh na pagina web o Led fica com a ultima condição de acionamento da Web !

Alguém tem uma ideia do que posso fazer para resolver a situação?

Segue o código:

#include <SPI.h>
#include <String.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 151 };
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 0, 1 };

EthernetServer server(80);

String readString = String(30);
String A = "Status da Lampada";
boolean statusled = true;

int Pin1 = 2;
int Pin2 = 3;
int LDR = 0;
const int S1 = 11;
const long DEBOUNCE_DELAY = 100;

int leitura_anterior = 1;
int leitura_anterior_db = 1;
long time_ultimo_debounce = 0;

int debounce_ok = 1;


void setup() {

pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(LDR, INPUT);
pinMode(S1,INPUT);
// Inicia a conexão Ethernet e o servidor:
Ethernet.begin(mac, ip);
server.begin();
}

void loop() {
botao_1();
}
void botao_1(){
int leitura_atual = digitalRead(S1);
if (leitura_atual != leitura_anterior ) { time_ultimo_debounce = millis(); debounce_ok = 0; }
if ( (millis() - time_ultimo_debounce) > DEBOUNCE_DELAY ) { debounce_ok = 0; }

if (debounce_ok = 1){
if (leitura_atual == 0 && leitura_anterior_db == 1){ digitalWrite(Pin1, !digitalRead(Pin1)); }


leitura_anterior_db = leitura_atual;
}
leitura_anterior = leitura_atual;


EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100) {
readString += (c);
}
if (c == '\n') {


client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Refresh: 5");
client.println();
client.println("<doctype html>");
client.println("<html>");
client.println("<body>");
client.println("<center>");
client.println("</script>");
client.println("<H1>TESTE LED</H1>");
client.println("<hr />");
client.println("<br />");

if (analogRead(LDR)> 100)
{
client.print(A);
client.print(" - Ligada");
client.println("<a href=\"/?led1off\"\">Desligar</a>");
client.println("<br />");

} else {
client.print(A);
client.print(" - Desligada");
client.println("<a href=\"/?led1on\"\">Ligar</a><br />");
client.println("<br />");
}

client.println("<a href=\"/?led2on\"\">Ligar o led2</a>");
client.println("<a href=\"/?led2off\"\">Desligar o led2</a><br />");
client.println("<br />");
client.println("<a href=\"/?led3on\"\">Ligar o led3</a>");
client.println("<a href=\"/?led3off\"\">Desligar o led3</a><br />");
client.println("<br />");
client.println("</center>");
client.println("</HTML>");
delay(1);
client.stop();

if(readString.indexOf("?led1on") > 0){
digitalWrite(Pin1, HIGH);

}
if(readString.indexOf("?led1off") > 0){
digitalWrite(Pin1, LOW);
}
if(readString.indexOf("?led2on") > 0){
digitalWrite(Pin2, HIGH);
}
if(readString.indexOf("?led2off") > 0){
digitalWrite(Pin2, LOW);
}

readString="";

}
}
}
}
}

Obrigado!

Exibições: 373

Responder esta

Respostas a este tópico

Possivelmente o erro está aqui:

client.println("Refresh: 5");

você está dando um refresh de acordo como a página está, o correto é você chmar a página limpa novamente, seria assim:

client.println("<meta http-equiv=\"refresh\" content=\"3; URL=http://192.168.0.151\">");

com isso ele vai chamar sua página inicial de acordo com o status da web ou do pushbutton, sem o último comando da web feito

se for resolvido anuncie no titulo do tópico

abraços

Caro Eduardo

Boa tarde!

Em primeiro lugar muito obrigado pela ajuda, sua solução ficou muito legal, só um detalhe o comportamento ficou assim:

1º - Quando acionado pela web no momento que desligo ou ligo o led o status passa a ser atualizado conforme a leitura do LDR, na propria Pagina.

2º - Quando faço acionamento manual não atualiza o status da pagina em tempo real, mas se eu fechar a pagina e abrir ela novamente, já traz o status do acionamento manual, conforme a leitura do LDR.

3º - Porem como o refresh ocorre sempre que faz o acionamento via web, se eu acionar o pushbutton e forçar uma atualização da pagina o Led volta na condição em que foi acionado pela web ignorando o acionamento manual pelo pushbutton.

Estou tentando imaginar a possibilidade de quando eu acionar o pushbutton também atualize o status do led na pagina quando ela estiver aberta, tem alguma ideia de como eu poderia fazer isso?

Desde-já muito grato pelo apoio!!

Vlw, Abraço!!!!

Caro Eduardo!

Felizmente consegui resolver o problema usando sua solução e acrescentando o código abaixo para forçar atualizar o status caso o Pushbutton seja acionado:

{
if (leitura_atual = digitalRead(S1));
client.println("<meta http-equiv=\"refresh\" content=\"3; URL=http://192.168.0.151\">");
}

Se tiver uma idéia melhor, fique a vontade, rs!!

Valeu pela força!!

Grande abraço

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço