Oppure

Loading
24/02/15 12:52
alex1995
salve, devo conservare dei dati e purtroppo non posso farlo sulla scheda sd o sull eeprom quindi devo conservarli in una variabile il codice è questo:
#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

String stato = "on";

IPAddress ip(192, 168, 1, 177);

EthernetServer server(90);

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.println("server is at ");
  Serial.println(Ethernet.localIP());
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  SD.begin(4);
  String stato = "on";
}

void rispondiClient(String risposta, EthernetClient ethclient)
{
  ethclient.println("HTTP/1.1 200 OK");
  ethclient.println("Content-Type: text/html");
  ethclient.println("Connection: close");// the connection will be closed after completion of the response
  ethclient.println("Refresh: 5");// refresh the page automatically every 5 sec
  ethclient.println();
  ethclient.println("<!DOCTYPE HTML>");
  ethclient.println("<html><body>");
  ethclient.println(risposta);
  ethclient.println("</body></html>");
}

void loop()
{
  Serial.println(stato);
  String getRequest = String();
  char requestChar;

  EthernetClient HTTPClient = server.available();
  if (HTTPClient)
  {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;
    while (HTTPClient.connected())
    {
      if (HTTPClient.available())
      {
        while (HTTPClient.available())
        {
          char requestChar = HTTPClient.read();
          getRequest += requestChar;
          if (requestChar == '\n')
          {
            while (HTTPClient.available())
            {
              char requestChar = HTTPClient.read();
              getRequest += requestChar;
              if (requestChar == '\n')
              {
                break;
              }
            }
            break;
          }
        }

        if (getRequest.indexOf("on") != -1)
        {
          String stato = "on";
          digitalWrite(8, HIGH);
          rispondiClient(stato, HTTPClient);
        }
        if (getRequest.indexOf("off") != -1)
        {
          String stato = "off";
          digitalWrite(8, LOW);
          rispondiClient(stato, HTTPClient);
        }
      }

      break;

    }

  }

  if(stato = "on")
  {
    digitalWrite(8, HIGH);
  }

  if(stato = "off")
  {
    digitalWrite(8, LOW);
  }

}

  HTTPClient.stop();
  delay(100);
  Serial.println("client disconnected");


}


la variabile cambia stato quando invio la richiesta ma poi torna al valore che ha nel setup, come mai?
aaa
24/02/15 13:08
nessuno
Quante volte dichiari la variabile stato?

Va fatto solo una volta all'inizio

String stato = "on";

Nel resto del codice devi solo cambiarne il valore con

stato = "on";

oppure

stato = "off";

NON devi usare nuovamente String stato ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
24/02/15 16:41
Roby94
Mi permetto di sottolineare un altro problema di carattere meno tecnico
if (getRequest.indexOf("on") != -1)

Questo, no! Non puoi adoperarlo in questo caso, il tuo marcatore è composto da 2 caratteri, se provi a stampare la request che arriva ad Arduino ti accorgi subito del perché. La request è composta da più di un centinaio di caratteri (come minimo), la percentuale di falsi positivi è troppo alta, a parer tuo quanto è probabile trovare in un testo di 100char casuali almeno una ricorrenza di "on"? Non è facilissimo, ma nemmeno cosi improbabile da poterlo tralasciare.
Sfrutta il fatto che la request HTTP inizia con una riga contenente
GET /paginarichiesta HTTP/1.1

(Di solito il POST su Arduino non si usa)

PS perché non passi ad Ajax?
Ultima modifica effettuata da Roby94 24/02/15 16:46
aaa
04/03/15 19:47
alex1995
lo so è questione di casualità se lui funziona correttamente, hai una soluzione per questo?
perche passare ad ajax?
aaa
04/03/15 20:46
Roby94
Te l'ho scritto
if (getRequest.indexOf("GET /on HTTP/1.1") != -1)


Su Arduino si preferisce usare AJAX in quanto bisogna aggiornare spesso i valori e ricaricare la pagina completa con un alta frequenza è impossibile.
aaa
07/03/15 10:37
alex1995
ah grazie scrivere la richiesta completa, in effetti ho usato uno script in js che dopo aver scritto la risposta sui file con php aggiorna la pagina, non conosco il js però ora che mi ci fai pensare sarebbe meglio far leggere il file con le informazioni di continuo a js senza aggiornare la pagina con un redirect alla pagina stessa. grazie 1000 :)
aaa