domenica 14 gennaio 2018

JSON Web Service con ESP8266 e DHT11

Ho già usato l'ESP8266 in un'altra applicazione per trasmettere dati in real-time nel Cloud (Firebase) attraverso una connessione alla rete internet. L'ESP8266 è un dispositivo economico e allo stesso tempo ricco di potenzialità! Con il ricetrasmettitore WiFi integrato e i pin General Purpose Input/Output dove poter collegare gli svariati sensori esistenti è possibile dare libero sfogo ad ogni tipo di fantasia nerd 😎 ahaha!

L'ESP8266 può funzionare in tre modi diversi: come stazione WiFi, come Access Point oppure entrambe le modalità contemporaneamente. In questo caso l'ho usato come Access Point per creare un Web Server JSON che restituisce temperatura ed umidità quando interrogato.

Per il codice del Web Service JSON ho usato lo stesso IDE che si usa per programmare di Arduino. Qui di seguito riporto qualche riga del codice occorrente anche se in rete si trovano svariati e tutorial. 

// E' la libreria che si occupa del Web Server
#include<ESP8266WebServer.h>

// Un'istanza del Web Server su porta 80
ESP8266WebServer server(80);

void setup(void){

// Inizializzazione HW e connessione WiFi
...

// Codice eseguito dal server all'indirizzo/jsonservice
server.on("/jsonservice", [](){
char buffer[200];
StaticJsonBuffer<200> jsonBuffer;
JsonObject& weather = jsonBuffer.createObject();
gettemperature(); // Leggo dal sensore DHT11 weather["ipaddress"] = WiFi.localIP().toString();
weather["temperature"] = String(temp_c);
weather["humidity"] = String(humidity);
weather["last_update"] = getCurrentTime();
server.send(200, "text/plain", buffer);
});
server.begin(); // Avvia il server
Serial.println("HTTP server started"); }
void loop(void){
// Il server si mette in ascolto di richieste HTTP GET o POST dei client
server.handleClient(); }


Il codice precedentemente riportato è evidentemente solo una parte: occorre aggiungere il codice per l'inizializzazione HW, la connessione alla rete WiFi ed il codice per gestire il sensore che si trova facilmente in rete. Occorre a questo punto solo programmare il dispositivo, connettersi alla rete WiFi e fare la prima chiamata al Web Server. Il sensore DHT11 è molto lento e poco preciso e quindi bisogna attendere un pochino prima di avere dati significativi.

Per interrogare il Web Server si possono usare vari client: un browser ad esempio, un programma specializzato oppure un'App. Si usano a tal proposito le richieste HTTP GET o POST.

Le richieste HTTP POST sono usate per inviare dati e riceverli, ad esempio il tuo username e password quando fai il login ad un sito. Le informazioni inviate al server con il metodo POST sono elaborate e possono determinare anche delle operazioni di modifica lato server o azioni da eseguire in base ai dati di input.

Le richieste HTTP GET sono usate per ricevere dati dal server, ad esempio una pagina web o come nel mio caso dei dati formattati JSON. Sono solo richieste e non cambiano nulla lato server.

La stringa che occorre per usare il Web Service precedentemente creato è del tipo HTTP GET ed è tipo questa: http://192.168.1.31:80/jsonservice. Usata nella barra degli indirizzi di un browser, se tutto funziona correttamente, restituisce le seguenti informazioni:


JSON Web Service

Con Android Studio ho fatto anche un'App Android che usa lo stesso Web Service. L'App ed ha le seguenti caratteristiche che ritengo siano interessanti:
- Identificazione subnet della rete WiFi alla quale si è effettuato il login 
- Scansione della rete per cercare gli IP dei Web Server live 
- Report, per ogni "server" in rete, delle informazioni restituite dalla HTTP GET
- Metodi asincroni per la scansione della rete e delle query ai Web Server


Come si nota dai print screen ho due dispositivi collegati alla rete WiFi con lo stesso codice SW precedentemente illustrato e caricato a bordo. Hanno evidentemente IP univoco e riportano umidità e temperatura diversa dato che si trovano in due ambienti diversi (diciamo così ahahah 😀 in realtà è il sensore DHT11 che non è molto preciso). Ci sarebbe molto da dire anche per la parte Android, ma questo forse in un'altra puntata!

Per finire metto qualche foto dei dispositivi che ho usato: il NodeMCU e l'ESP01 



Per ulteriori informazioni o chiarimenti non esitate a contattarmi!