mercoledì 21 febbraio 2018

Simple HTTP REST Server on ESP8266








My follower and my friends know that I am not a fan of Web Server on ESP8266 as this has negative architectural implications. In any case this is not the topic of this post.

In the past few days I have received some requests on how to create a Web Server on ESP8266.

As the typical use for ESP8266 is mostly as IoT device I think it make much more sense to show how to create a simple HTTP REST server on ESP8266 in order to manage some resources.

In this post I show how to manage 1 Led through a RESTful API on ESP8266.


Testing Circuit


The testing circuit is quite simple and is shown below











Code


The code of the REST server is available on my GitHub here











Testing


In order to test the REST server I use the curl command from command line (for the one who prefer a graphical interface I suggest the great  postman)

GET ROOT


The first command I execute is a HTTP GET of the server's root

The IP address will be certainly different in your case, so please replace it with your own (it is printed on Serial Monitor during ESP boot).






As you can see the string defined on line 118 is provided back by the server.


GET leds


Now time to query the REST server for leds resource through a HTTP GET





As you can see the HTTP code 204 is provided back meaning that the resource is neither available nor is empty.




POST leds


Now let's create the resource by providing a JSON body as part of the HTTP POST request. The JSON contains the following information:

  • id: a unique identifier of the resource
  • gpio: GPIO number on which the resource (led) is connected
  • status: resource's status (0 or LOW)





Now the server replies back with a 201 meaning that the resource has been successfully created.


Now I query again the resource through GET and this time server replies with 200 and with the JSON representation of the resource.




PUT leds


Now that the resource is available it is possible to modify it with a HTTP PUT


Also in this case I need to pass a JSON representation in the body of the request in which I set the status to 1(HIGH).






The server replies with a 200 code meaning that the update is successful and the led is turning on





In the same manner I can updated it with status = 0






and the led turns off





In the sample code I also manage other cases.

As an example if I update (PUT) a resource with id = 2





Server replies with 404 telling me that the resource is not existing 


I let to the reader the implementation of the DELETE method.

That's it folks!!! :)













Simple HTTP REST Server con ESP8266








Chi mi segue e conosce sa che non sono un supporter dell'implementazione di un Web Server su un modulo IoT come ESP8266. Fondamentalmente e' per ragioni architetturali che non discuto qui.

Tuttavia nei giorni passati ho ricevuto alcune richieste da utenti che inizia a cimentarsi con ESP8266 sul come realizzare un Web Server con ESP8266.

Ritengo che dato l'uso tipico di un dispositivo come ESP8266 nei progetti sia più' appropriato far vedere come si implementa un semplice HTTP REST server in modo da poter gestire delle risorse.

In questo articolo faccio vedere come gestire 1 Led tramite un API REST con ESP8266.


Circuito di Prova


Il circuito di prova e' banale e raffigurato qui sotto










Codice


Il codice e' disponibile sul mio GitHub qui











Test


Per fare il test uso il comando curl da linea di comando (per chi preferisce un client grafico puo' usare l'ottimo postman)

GET ROOT


il primo comando che eseguo e' un HTTP GET della root del server

L'indirizzo IP sara' certamente diverso nella vostra rete e quindi dovete sostituirlo con il vostro (viene stampato sul monitor seriale al boot del ESP8266)






Come si vede ci viene restituita la stringa definita nel codice nella linea 118

GET leds


Adesso interrogo la mia risorsa chiamata leds tramite una HTTP GET




Come si vede mi viene restituito uno stato uguale a 204 indicando che la risorsa non e' disponibile.



POST leds


Adesso creo la risorsa leds fornendo nel body del HTTP POST un json che contiene i seguenti attributi:

  • id: un numero identificastivo univoco
  • gpio: il numero di GPIO su cui la mia risorsa (led) e' collegato
  • status: lo stato della risorsa (0 o LOW)





Come si vede il server mi risponde con un codice 201 indicandomi che la mia risorsa e' stata creata correttamente.


Ora se invio nuovamente un GET sulla risorsa il server mi risponde con 200 e mi fornisce come risposta il JSON che rappresenta la risorsa





PUT leds


Ora che la risorsa esiste posso modificarla con un HTTP PUT.

Anche in questo caso nel body della richiesta inserisco un JSON in cui imposto status a 1 (HIGH)






il server mi risponde con  200 indicando che l'update della risorsa e' andato a buon fine e come si vede sotto il led si accende e rimane acceso.




Analogamente se invio un update con status = 0 





il led si spegne e rimane spento.




Nel codice di esempio ho anche gestito altri casi.

Per esempio se faccio l'update (PUT) di una risorsa con id = 2




ottengo un 404 indicandomi che tale risorsa non esiste.


Lascio al lettore l'implementazione del metodo DELETE.












martedì 20 febbraio 2018

Programmare ESP8266-01 con Arduino Uno








Con il passaggio a Windows 10 l'adattatore USB to TTL (1x PL2302HX USB to TTL converter) che usavo per programmare lo ESP8266-01 non funziona più'.

Questo perché'  il chip usato nell'adattatore e' "falso" e non riconosciuto dal driver di windows.

A questo punto avevo due cose da fare: o comprare un nuovo adattatore o ingegnarmi.
Allora ho pensato: "ma in fondo ho una scheda Arduino a casa che sicuramente potrà' aiutarmi"

In effetti dopo un po' di prove ecco come ho rimpiazzato l'adattatore USB - TTL con una scheda Arduino Uno (simile per altre schede Arduino)


Arduino come adattatore Seriale


L'idea e' di utilizzare l'adattatore USB - Serial già' a bordo di Arduino Uno per poter programmare lo ESP8266-01 tramite l'IDE Arduino.

Per fare cio' e' necessario bypassare il bootloader dell'Atmega e far si che su Arduino non giri nessun programma.

Cio' si fa' semplicemente collegando il pin RST (Reset) a  GND. 

Sotto lo schema su breadboard dei collegamenti necessari per poter programmare correttamente lo ESP8266-01 con Arduino.


Nota:

lo ESP8266-01 e' perfettamente tollerante a segnali seriali da 5V

Il lettore che per qualche ragione pensasse che ciò' non e' sicuro e' invitato a non realizzare il circuito.

In ogni caso la responsabilità' del buon funzionamento di Arduino e dello ESP8266 e' demandata al lettore.














Qui sotto il relativo schema elettrico







e la realizzazione su breadboard






Uso dei pulsanti

Come e' possibile notare dallo schema elettrico sono presenti due pulsanti collegati nel seguente modo:


  • SW Reset: sul pin RST di ESP8266
  • SW Flash: sul pin GPIO0 di ESP8266


Questo e' necessario in quanto per poter programmare correttamente lo ESP8266-01 e' necessario portarlo nello stato UART Download Mode (piu' informazioni qui)


Questo si ottiene con la seguente procedura:


  1. si mantiene premuto il pulsante SW Flash
  2. si preme e si rilascia il pulsante SW Reset
  3. si rilascia il pulsante SW Flash

Suggerisco di effettuare tale procedura solo alcuni secondi prima dell'inizio del caricamento dello sketch dal PC allo ESP8266-01










ESP8266-01 Dev Board

Siccome i pin dello ESP8266-01 non sono compatibili con una breadboard io utilizzo una dev board realizzata da me.

Potete trovare tutti i dettagli qui se volete divertirvi a costruirla.






Test

Qui un semplice Sketch di test per verificare che in effetti si riesce a caricare uno sketch su EPS8266-01




Qui sotto il dettaglio di cosa dovreste ottenere nel vostro ambiente se il caricamene avviene con successo.