Go Down

Topic: Consiglio libreria Ethernet (Read 15 times) previous topic - next topic

hase091

Salve,
come da titolo avrei bisogno di un consiglio (o meglio, l'instradamento) per la realizzazione di un progetto che prevede l'utilizzo di alcuni sensori tramite la rete locale (offline).

Ho un Arduino Uno con Ethernet Shield e l'attuale scopo del progetto sarebbe quello di:
- poter accendere e spegnere un led cliccando su un bottone nella pagina web e cambiarne i valori di luminosità;
- premere un tasto fisico connesso ad Arduino e far partire un alert (popup/notifica nella pagina web) a schermo.

E' da circa una settimana che scandaglio la rete alla ricerca di un sistema ottimale, ma non sono ancora riuscito a trovare una risposta che sia a me chiara.
Utilizzando solo l'HTML sono riuscito a far accendere/spegnere e cambiarne i valori di luminosità di un led, e leggere la pressione di un bottone con l'aiuto però di un refresh della pagina ogni 3 secondi, ma non è il sistema di cui ho bisogno; il refresh dovrebbe essere dinamico e non totale.

Ho trovato un bel tutorial che spiega come poter gestire le letture/scritture analogiche e digitali tramite l'utilizzo dell'AJAX e Java, ma non essendo pratico di entrambi i linguaggi non riesco a comprendere, e modificare, gran parte del codice...
Ho inoltre trovato le librerie Webduino e TinyWebServer con però poche sipegazioni, e non riesco a riadattarle alle mie esigenze.

Le domande che vorrei porvi sono:
- A livello di semplicità programmativa, quale metodo mi conviene utilizzare?
- E' possibile utilizzare il jquery per il refresh dinamico dei contenuti?
- E' possibile fare pagine separate per la lettura di valori? (Es. pag1.html per accendere e spegnere 2 led / pag2.html per visualizzare lo stato del bottone).

Domanda bonus non essenziale:
- E' possibile, con l'aiuto di un pc e un database locale, utilizzare il PHP con GET e POST per leggere e scrivere i valori?

Grazie in anticipo  ;D

RobertoBochet

#1
Today at 01:19 am Last Edit: Today at 01:20 am by RobertoBochet
Ajax non è un linguaggio, è piu una tecnica, implementata in Javascript, si puoi usare il framework jQuery, ti semplifica il codice, la richiesta piu semplice in Javascript necessita di circa 10 righe di codice, in jQuery si semplifica in appena 10 caratteri.
Puoi tranquillamente rimuovere il refresh, e sostituire il tutto con una richiesta asincrona. Il minimo è conescere almeno le basi di Javascript.

Avrai necessità di gestire piu di un url da Arduino per distinguere una chiamata alla pagina web e una richiesta di dati. Purtroppo Arduino è uno dei sistemi peggiori su cui gestire stringhe dinamiche, affidati a qualcosa di gia fatto. Esiste il metodo classico di Arduino che io trovo poco elegante, ed estensibile(quello del tutorial webserver)
Io uso un codice del genere
Code: [Select]
typedef enum { httpMethodGet, httpMethodPost } httpMethod_t;

typedef struct {
  httpMethod_t method;
  char page[HTTP_REQUEST_PAGE_SIZE];
} httpRequest_t;

httpRequest_t httpRequest;

Code: [Select]
void WaitRequest() {
  byte i = 0;
  char c;
  bool isPage = false;

  do {
    client = server.available();
  } while (!client);
  delay(1);

  while (client.connected()) {
    if (client.available()) {
      c = client.read();

      if (isPage) {
        if (c == ' ' || i == HTTP_REQUEST_PAGE_SIZE - 1) break;
        httpRequest.page[i] = c;
        i++;
      } else {
        if (c == 'G') {
          httpRequest.method = httpMethodGet;
          i = 3;
        } else {
          httpRequest.method = httpMethodPost;
          i = 4;
        }
        isPage = true;
        for (; i != 0; i--) client.read();
      }
    }
  }
  httpRequest.page[i] = '\0';
  client.flush();
}

Code: [Select]
void loop() {
  Serial.println(F("Wait..."));
  WaitRequest();
  Serial.print(F("Method:\t\t"));
  Serial.println(httpRequest.method ? F("POST") : F("GET"));
  Serial.print(F("Request:\t"));
  Serial.println(httpRequest.page);
  Serial.println("");

  if (!strcmp(httpRequest.page, "/js/control.js")) SendPage("text/javascript", "js/control.js");
  else if (!strcmp(httpRequest.page, "/css/control.css")) SendPage("text/css", "css/control.css");
  else if (!strcmp(httpRequest.page, "/css/style.css")) SendPage("text/css", "css/style.css");
  else if (!strcmp(httpRequest.page, "/favicon.png")) SendPage("image/png", "favicon.png");
  else if (!strcmp(httpRequest.page, "/")) SendPage("text/html", "index.htm");
  else if (strstr(httpRequest.page, "/update.json") != 0) {
    if(httpRequest.page[12] == '?') {
      if(httpRequest.page[13] == '0') digitalWrite(7, httpRequest.page[14] == '1');
      else if(httpRequest.page[13] == '1') digitalWrite(3, httpRequest.page[14] == '1');
      else if(httpRequest.page[13] == '2') digitalWrite(2, httpRequest.page[14] == '1');
      else if(httpRequest.page[13] == '3') OCR0A = (httpRequest.page[14] - 48) * 100 + (httpRequest.page[15] - 48) * 10 + (httpRequest.page[16] - 48);
      else if(httpRequest.page[13] == '4') OCR0B = (httpRequest.page[14] - 48) * 100 + (httpRequest.page[15] - 48) * 10 + (httpRequest.page[16] - 48);
    }
    SendUpdate();
  } else SendPage("text/html", "404.htm");

  delay(1);
  client.stop();
}

E un idea di richiesta asincrona mediante Jquery.
Code: [Select]
$(function() {
setInterval(function() {
$.getJSON("update.json", update);
}, 5000);
$("div[data-control-switch]").change(function() {
id = $(this).attr("id");
if(id == "led1") id = 0;
else if(id == "led2") id = 1;
else if(id == "led3") id = 2;

$.getJSON("update.json?" + id + ($(this).attr("data-control-switch") == "true" ? "1" : "0"), update);
});
$("div[data-control-slider]").change(function() {
id = $(this).attr("id");
if(id == "dimmer1") id = 3;
else if(id == "dimmer2") id = 4;

$.getJSON("update.json?" + id + ("00" + $(this).attr("data-control-slider")).slice(-3), update);
});
});


Capisco che ti sto dicendo poco o niente, ma partiamo da quello che ti ho scritto.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy