webserver e temporizzazioni

Salve a tutti!
Volevo un parare su un progetto che vorrei realizzare su arduino.

Vorrei usare arduino per controllare degli altri circuiti in bassa tensione. Il mio problema è che vorrei che l'utente possa controllare cosa sta facendo arduino via browser.

Il mio dubbio sta nel fatto che alcune uscite saranno attivate o disattivate a tempo. Alcune in base a degli ingressi (pulsanti ecc), quindi assolutamente asincrono come controllo.
E poi l'accesso via browser, ancora più asincrono.

Può quindi arduino rispondere via http a prescindere dal fatto che in quel momento debba disattivare un ingresso o riceva un segnale in ingresso?

Come posso fare? Gestendo tutto via interrupt?

Grazie mille
Alessandro

uhm bisogna vedere come intendi mettere su il webserver.. hai qualche modulo extra, o magari una ethernet shield o cosa ? Hai un server di appoggio a cui connettere (fisicamente) l'arduino o vuoi connetterla direttamente al router/modem/etc?

ciao

se usi lo shield ethernet è piuttosto facile da fare..

alla fine il main loop di arduino viene eseguito cosi velocemente che puoi ottenere delle risoluzioni piuttosto precise senza problemi (precisione di un secondo almeno).

un'applicazione basata sul tempo richiederebbe un rtc da aggiungere all'arduino per fare delle temporizzazioni precise

m

Si, volevo usare una ethernet shield.

La questione è che il webserver starebbe nell'arduino stesso.
Ad ogni modo prenderò a breve l'ethernet shield e la proverò.

Grazie

Ps: sarebbe possibile collegare, sempre allo stesso arduino, un lettore di schede sd? Oltre alla shield dico... Mi piacerebbe che l'arduino all'avvio, caricare la "configurazione" dall'sd e poi avviasse il webserver e tutto il resto.

attenzione!

L'ethernet shield non ha il lettore SD.... è possibile ma devi aspettare che esca l'arduino con l'atmega328 perche quella ha il doppio di memoria programma e ci sta anche il codice per la scheda sd...

comunque l'arduino ha 512byte di flash che vanno benissimo per memorizzare la configurazione...

negli esempi dell'ethernet shield c'è un mini webserver

m

So che sulla ethernet shield non c'è il lettore sd, lo avrei realizzato io a parte.

Ok, allora proverò magari a configurarlo direttamente dal browser...
Grazie mille

Sto lavorando sul webserver. Ho realizzato un codice sorgente molto più articolato e pratico per gestire più pagine sull'arduino.
Se interessa a qualcuno posso pubblicarlo da qualche parte.

L'unico mio problema è che non ci sta tutto il codice che a me servirebbe... Tutta colpa del codice HTML che ci voglio scrivere dentro :stuck_out_tongue:

complimenti progetto molto interessante
hai provato ad upgradare all 328 hai 32k di spazio per il programma anzichè 16k che hai di solito(circa 14 considerato il bootloader)

metti il codice sul playground, c'è ancora molto da fare sulla scheda ethernet ed il tuo esempio sarebbe molto utile.

m

Ma riesci a gestire sia richieste GET che POST? (fondamentale per una pagina di log-in)... per caso hai anche modo di "vedere" l'IP del client connesso?

anyway... complimenti e se puoi... condividi, sarebbe utilissimo :slight_smile:

Farò l'upgrade del chip sicuramente ma al momento mi accontento di quello che ho :wink:

Attualmente riesco a prelevare i parametri passati in GET anche se non ho ancora fatto niente per analizzarli. Quelli in POST invece non sono gestiti. Non dovrebbe essere un problema enorme da superare (cambiando qualche riga si dovrebbe riuscire a gestirli ma per mancanza di tempo non ci ho lavorato su.

Non ho mai pensato di leggere l'ip del client. Non mi sono posto il problema :slight_smile:

Non riesco a registrarmi su Playground... Qualcuno può aiutarmi?

Missione compiuta :slight_smile:

http://www.arduino.cc/playground/Code/WebServer

grande!

anche se ho avuto l'anteprima :stuck_out_tongue: ...ci sto lavorando su da ieri... ho implementato le richieste POST e la "cattura" delle variabili, oltre ad aver semplificato la gestione delle pagine (limitata solo nell'ambiente di conf iniziale), credo di uppare domani :wink:

bravo!

però firmatevi sul playground, non fate gli eroi ignoti :slight_smile:

Il mio nome sta nel commento iniziale del codice :slight_smile:

Vai bebbo, facce vedé ;D

è tutto pronto... tranne un piccolo problema che mi sta facendo diventare matto:

    // select the page from the buffer (GET and POST) [start]
    for(i = 0; i < NUM_PAGES; i++) {
      strcpy_P(load, (char*)pgm_read_word(&(http_uris[i])));
      // GET
      strcpy(compare,"GET ");
      strcat(compare,load);
      strcat(compare," ");
      Serial.print("GET compare: "); // DEBUG
      Serial.println(compare); // DEBUG
      if (strncmp(buffer,compare, strlen(load)+5)==0) {
        http_def.pages = i+1;
        break;
      }
      
      // POST
      strcpy(compare,"POST ");
      strcat(compare,load);
      strcat(compare," ");
      Serial.print("POST compare: "); // DEBUG
      Serial.println(compare); // DEBUG
      if (strncmp(buffer,compare, strlen(load)+6)==0) {
        http_def.pages = i+1;
        break;
      }
      
    }
    // select the page from the buffer (GET and POST) [stop]

così funziona tutto... ma se elimino i Serial.print e Serial.println... non funziona più nulla! qualche suggerimento? o sapete dirmi perchè?

Potrebbe essere un problema di tempi, anche se non ne capisco il motivo.
Prova a mettere qualche delay al posto delle Serial.print...

Mi pare strano che si risolva così ma non saprei che altro pensare...

avevo già provato... ma niente, anche con delay di 100 nn va :\ please help!

A mali estremi, lascia i Serial.print... se nessuno li va a leggere dal monitor, nessuno sa della loro esistenza ;D

Potrebbe essere un problema di memoria RAM, che spiegherebbe l'andamento illogico... però non c'è un modo per risolverlo...

sono stato un pò incasinato questi giorni... lavoro lavoro lavoro!

ma ho messo oline il code: Arduino Playground - WebServer
fondamentalmente ho:

  • implementato richieste POST
  • implementato la lettura delle variabili via POST
  • implementata una configurazione più scalabile e facile da gestire

let me know :wink: