LusoRobótica - Robótica em Português

Software => C/C++ => Tópico iniciado por: m2snd em 03 de Outubro de 2011, 22:50

Título: Ajuda com millis
Enviado por: m2snd em 03 de Outubro de 2011, 22:50
Sabem-me dizer o que está mal no código?
estou a tentar modificar este código:
 http://arduino.cc/forum/index.php/topic,3674.msg28270.html#msg28270 (http://arduino.cc/forum/index.php/topic,3674.msg28270.html#msg28270)

O objectivo é, depois de fazer o UP no cliente,  passados 4 segundos desligar sozinho, ou seja,  HIGH passar a LOW, automaticamente passados os 4 segundos. O meu código é este:

Código: [Seleccione]
#include <SPI.h>
#include <Ethernet.h>

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

byte state1 = 0;
long end1;
int val = 0;

Server server(80);
byte sampledata=50;

//luzes da casa
int estore = 7; 

String readString = String(30);
boolean luzCozinhaON = false;                 

void setup(){
  Ethernet.begin(mac, ip, subnet);
  pinMode (estore,OUTPUT); 
  Serial.begin(9600);
}
//--------------------------inicio codigo
void loop()
{
  Client client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 30)
        {
          readString.concat(c);
        }

        Serial.print(c);

        if (c == '\n') {
          //---------------------------------                 
          switch (state1) {
          case 0:

            Serial.print(   val   );
            if (readString.substring(6,11) == "L7=UP")
            {       
              digitalWrite (estore, HIGH);
              end1 = millis () + 4000;       // Activar for 4 segundos
              state1 = 1;
            } 
            break;

          case 1:
            if (end1 <= millis ()) {
              digitalWrite (estore, LOW);     // depois dos 4 segundos desligar
              state1 = 0;
            }
            break;
          }
         //-----------------------------------------------------------------------------------------------

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.println("<h1><center>CASA</center></h1>");
          client.println("<font color='black'>");
          client.println("<br />");

         
          client.println("<form method=get name=LED><input type=submit name=L7 value=UP>  Persiana<form>");
          client.println("<form method=get name=  LED><input type=submit name=L7 value=DOWN  ><form>");
          if (luzCozinhaON)
          {
            client.print("<font color='green' size='3'> UP");
          }
          else
          {
            client.print("<font color='red' size = '3'> DOWN");
          }
          client.println("<font color='black' <br /><br>");

          //procedimento final
          client.println("</body></html>");

          readString="";

          client.stop();
        }
      }
    }
  }

}

O que está acontecer, (tenho um led a testar o pino 7), ele acende quando clico no UP, mas decorrido o tempo, o led não desliga
Título: Re: Ajuda com millis
Enviado por: senso em 03 de Outubro de 2011, 23:01
Experimenta mudar o long para unsigned long, que é esse o tipo de dados para guardar o millis(), de resto parece estar certo.
Já agora, ele está a compilar ao teres a chamada á função com um espaço entre o nome e os parentises?
Cá para mim existe uma variavel com esse nome algures e ele só te está a dar um warning que o IDE do arduino não mostra e os () são ignorados pelo parser, por isso remove lá o espaço que nunca vi ninguem a chamar funções com um espaço pelo meio.
Título: Re: Ajuda com millis
Enviado por: m2snd em 03 de Outubro de 2011, 23:25
Refereste ao espaço entre o millis e o parenteses?ja retirei e modifiquei o long para unsigned long. Continua na mesma.....
Título: Re: Ajuda com millis
Enviado por: senso em 03 de Outubro de 2011, 23:35
Troca isto:
Código: [Seleccione]
            if (end1 <= millis ()) {
Por isto:
Código: [Seleccione]
if( (millis() >= end1) ){
Título: Re: Ajuda com millis
Enviado por: m2snd em 04 de Outubro de 2011, 00:02
continua na mesma Senso...

Não sei onde estará o erro...testei o código que indiquei no link em cima e funciona....passados o tempo, o led desliga-se sozinho.
Título: Re: Ajuda com millis
Enviado por: senso em 04 de Outubro de 2011, 00:05
E não é isso que é suposto?
Título: Re: Ajuda com millis
Enviado por: m2snd em 04 de Outubro de 2011, 00:13
Não é isso....o que quero dizer é que o código que adaptei e o qual me estas a dar a ajuda, não esta a funcionar, ao contrario deste, http://arduino.cc/forum/index.php/topic,3674.msg28270.html#msg28270 (http://arduino.cc/forum/index.php/topic,3674.msg28270.html#msg28270), onde fui tirar a ideia...
Título: Re: Ajuda com millis
Enviado por: m2snd em 05 de Outubro de 2011, 15:37
FINALMENTE!!!!   :D  :D
Descobri qual era o problema!!!!
O browser precisa de uma actualização decorrido o tempo pretendido, então foi só acrescentar:

Código: [Seleccione]
client.println("<META HTTP-EQUIV=REFRESH CONTENT=1;url=http://192.168.1.66/>");

E pronto, mais um passo adiante....obrigado senso e XicoMBD pela disponibilidade.....