Arduino – Accendiamo un led da remoto

Ormai siamo sempre più connessi con il mondo che ci circonda e con lo smartphone siamo in grado di controllare qualsiasi oggetto in casa, dalle luci agli elettrodomestici fino ad arrivare all’auto che usiamo per spostarci.
Oggi in quest’articolo voglio mostrare come sia possibile comunicare con Arduino da remoto attraverso una pagina web raggiungibile da qualsiasi parte nel mondo, ovviamente dobbiamo essere muniti di una connessione ad internet cosa che oggigiorno è sempre più presente.

Il progetto di cui oggi vi parlo è molto semplice, realizzeremo una piccola pagina web che ci permetterà di accendere e spegnere un led da remoto. Nonostante il progetto sembra non avere grande utilità al suo interno troveremo le informazioni base per comunicare con Arduino e quindi realizzare qualsiasi applicazione domotica ci verrà in mente.

Cosa ci occorre:

  • Arduino Uno o simili
  • Arduino Ethernet Shield
  • Servizio di hosting dove caricare la pagina web (es: http://it.altervista.org/)

Pagina Web

La pagina che andremo a realizzare è la seguente

ArduinoLedController
Pagina Web – Arduino Led Controller

Partiamo subito con il vedere tutta la struttura del codice e poi ci soffermeremo ad analizzare le parti più importanti.

Notiamo subito che la pagina è costituita semplicemente da due pulsanti ON e OFF che servono appunto per accendere e spegnere il led su Arduino.

Questi pulsanti o meglio button sono di tipo submit infatti sono inseriti all’interno di una form identificata da id = “action”. Entrambi i button hanno id=”status_led” con valori però differenti per ON e per OFF.

L’invio dei dati della form spetta allo script javasript, posto nel head del codice HTML, che si occupa di prelevare il valore del button premuto ed effettuare una chiamata ajax sfruttando la libreria jQuery.

Quando si fa click su un pulsante viene invocata la funzione di submit che come prima cosa esegue il comando

il quale inibisce il normale funzionamento della form permettendo così allo script di decidere come comportarsi, in questo caso si ricava subito il valore del pulsante premuto salvandolo nella variabile dataString

successivamente si effettua la chiamata ajax che grazie alla libreria jQuery risulta essere molto più veloce e, soprattutto, molto più semplice.

All’interno della chiamata ajax possiamo notare diversi parametri:

  • url: (default: URL della pagina corrente) URL della risorsa alla quale viene inviata la richiesta; se omessa verrà contattata la pagina corrente.
  • type: (default: GET) E’ utilizzato per specificare il tipo di richiesta da effettuare, principalmente POST o GET; sono utilizzabili anche altri metodi HTTP (come ad es. PUT, DELETE, …) ma non tutti i browser li supportano.
  • data: Contiene i dati che devono essere inviati alla risorsa che elabora la richiesta; il formato può essere sotto forma di oggetto (contenente delle coppie chiave/valore) oppure sotto forma di semplice stringa &key1=val1&key2=val2.
  • success: Consente di specificare una funzione che verrà eseguita al successo della chiamata.
  • error: Consente di specificare una funzione che verrà eseguita in caso di errore nell’effettuare la chiamata.

Per il parametro data  è stato utilizzato il formato JSON costituito dalla chiave status e il valore del button premuto, mentre nel parametro success è stato inserito un controllo basato sulla risposta ricevuta da Arduino, se response==1 allora viene stampato LED ON nel caso sia verrà stampato LED OFF, tutto questo in poche righe di codice grazie a jQuery.

Sketch Arduino

Ora passiamo al codice da caricare su Arduino necessario per leggere la richiesta fatta dalla pagina web e inviare la relativa risposta.

Anche se il codice è veramente molto commentato voglio soffermarmi principalmente sulla funzione readRequest(EthernetClient& client) che si occupa di leggere la richiesta inviata dal client, ossia dalla pagina web descritta nel paragrafo precedente.

Per meglio comprendere il comportamento della funzione dobbiamo prima vedere come è fatta una richiesta HTTP. 

Qui sopra è mostrato un esempio di richiesta HTTP di tipo  GET e subito balza agli occhi la presenza dei caratteri \r e \n alla fine di ogni riga ma soprattutto alla fine della richiesta.
Quindi per leggerla correttamente tutta bisogna lavorare proprio su questi caratteri, e la variabile bool currentLineIsBlank  ci aiuta proprio in questo, infatti sarà true se la riga corrente è vuota mentre false se è presente un carattere diverso da \rAlla fine della richiesta ci troveremo nella situazione in cui l’ultimo carattere letto sarà \n currentLineIsBlank sarà vero per cui la funzione ritornerà true .

Per concludere parliamo della funzione writeResponse() preposta all’invio della risposta alla pagina web che ne ha fatto richiesta. Si parte subito con l’invio dell’header composto dalle seguenti righe:

e si conclude con una riga che cambia in funzione della richiesta effettuata dalla pagina web, ossia se abbiamo premuto sul pulsante ON (value=1), il carattere ricevuto sarà 49 per cui accenderemo il led e invieremo la stringa 1, in caso di carattere 48, significativo del fatto che abbiamo premuto OFF (value=0), allora spegneremo il led e invieremo la stringa 0.

Da notare nell’header la presenza della riga Access-Control-Allow-Origin: * fondamentale per poter ricevere lato client, ossia la pagina web che ha fatto la richiesta, la risposta di Arduino.
L’utilizzo di questa riga è necessario perché viene fatta una richiesta cross-origin HTTP, in quanto la pagina web e Arduino si trovano su 2 domini differenti e visto che per motivi di sicurezza, i browser limitano le richieste HTTP cross-origine avviate dagli script, con questa intestazione si fa in modo che la risorsa (Arduino) sia accessibile da qualsiasi dominio in modo cross-site.
La notazione usata in questo codice è quella più semplice perché permette l’accesso alla risorsa da qualsiasi dominio se invece si vuole limitare l’accesso solo ad uno in particolare si deve sostituire l’asterisco (*) con il nome di tale dominio.

 Anche questo articolo è terminato spero possa tornare utile a chi sta cercando di trovare un modo per controllare Arduino da remoto, qui sotto trovate il link per scaricare il progetto.

Download
Download

 

 

 

Ti potrebbe interessare

  • Fabio Romagnoli

    ho provato a verificare il tuo codice ma mi da questo errore:

    Arduino:1.6.12 (Windows 7), Scheda:”Arduino/Genuino Uno”

    C:UsersuserDocumentsArduinoled_da_remotoled_da_remoto.ino: In function ‘bool readRequest(EthernetClient&)’:

    led_da_remoto:39: error: ‘currentLinesBlank’ was not declared in this scope

    currentLinesBlank = false; // character of new line

    ^

    exit status 1
    ‘currentLinesBlank’ was not declared in this scope

    Questo report potrebbe essere più ricco di informazioni abilitando l’opzione
    “Mostra un output dettagliato durante la compilazione”
    in “File -> Impostazioni”

    Grazie

    • Emanuele

      Ciao Fabio, ho modificato la riga incriminata ora l’errore non c’è più.
      Grazie

  • Fabio Romagnoli

    si riesce a fare per la scheda: enc28J60 ?
    grazie

    • Emanuele

      Non conosco la scheda enc28J60 ma immagino che devi importare una libreria diversa e quindi il codice va modificato di conseguenza.

  • Zilio Roberto

    Emanuele, non riesco ad accendere il led. Ho caricato lo Sketch su Arduino Uno e funziona. Ho creato su altervista la pagina html caricando il codice da te scritto, si apre la pagina web con i pulsanti ma quando clicco esce il messaggio di errore.
    Mi sfugge qualcosa, devo modificare parti del codice web o aprire porte del router?
    Grazie!

    • Emanuele

      Ciao Roberto, probabilmente l’errore che ti esce è dovuto al fatto che non riesci a raggiungere l’ip di arduino, ti elenco alcuni passi che dovrebbero risolvere il problema.
      1)Nello sketch di arduino devi inserire un ip ad arduino, usa uno libero nella tua rete di casa e ricordati di aprire la porta 80 del router sull’IP che hai scelto per arduino.
      Per verificare se riesci a vedere arduino, collega arduino alla rete, apri il prompt dei comandi e fai il ping all’indirizzo ip di arduino.

      2)Nella pagina web dove vedi ip arduino, inserisci quello che il tuo router presenta sulla rete. Lo puoi trovare su questa pagina https://www.whatismyip.com/it/

      Spero che questo ti possa essere di aiuto.