martedì 25 agosto 2015

Internet Of(little) Things





E' da qualche mese uscito sul mercato ed ha subito interessato gli Arduinomani per via delle sue potenzialità: Si chiama ESP8266.
Si tratta di un piccolo gioiello. La versione in foto, che misura 1.4x2.5cm(!!!) è la prima uscita sul mercato ed ora nota col nome di ESP-01. Ora ce ne sono diverse altre in vendita con più GPIO,ADC, FT232 integrato, ecc.
 Quanto costerà questa meraviglia, capolavoro di miniaturizzazione disponibile per il mondo consumer? 3$. Tre dollari, T-R-E DOLLARI!
I miei li ho presi su Bangood.com, un sito di e-commerce cinese affidabile e che ho trovato più veloce del famoso dx.com. Parliamo sempre di ALMENO venti giorni per l'arrivo dei prodotti comunque...
A questo indirizzo http://www.banggood.com/buy/Esp8266.html  troverete i diversi tipi di ESP8266 in vendita.

E' possibile programmare il gioiellino in diversi ambienti. Anzi, è anche possibile utilizzarlo SENZA programmarlo. Nativamente infatti accetta comandi AT+ che possono essere inviati via FT232(in versione 3.3V) o via Arduino tramite l'UART integrata.
Una lista esaustiva è possibile trovarla qui: https://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/

I puristi amanti del C troveranno su https://github.com/esp8266/esp8266-wiki/wiki/Toolchain il compilatore gcc e le istruzioni per installarlo sotto Linux Debian.

Oppure si può installare sull'ESP il firmware NodeMCU partendo da qui: http://nodemcu.com/index_en.html  e poi programmarlo interattivamente da una console con tanto di command prompt in LUA, un linguaggio di scripting Arduino-like.

Infine si può utilizzare l'Arduino environment, grazie al porting del toolchain nell'IDE Arduino, e quindi usare la vastità di librerie già disponibili.
Qui https://github.com/esp8266/Arduino troverete le istruzioni per integrare nell'IDE Arduino l'ESP8266.

Per il mio primo progetto ho usato quest'ultima soluzione, anche perchè sono decisamente un pessimo programmatore C/C++ e buona parte del codice usato è stato trovato in rete e riadattato all'uso.

Lo scopo del progetto è quello di avere un piccolo modulo standalone in grado di rilevare umidità e temperatura ed inviare le informazioni in rete.
Il sensore utilizzato è un Sensirion SHT11. E' un sensore di temperatura ed umidità di precisione, con uscita digitale. Molto più preciso ed efficiente del più popolare DHT11.
E' alimentato a 3.3V e utilizza un protocollo di comunicazione seriale sincrono(dati+clock) simile a i2c un po' complicato da configurare. Ma per fortuna è reperibile qui https://github.com/practicalarduino/SHT1x la libreria già pronta all'uso.

 Per l'invio dei dati avevo due possibilità: tirare su un webserver che ricevesse le informazioni o usare una soluzione pronta. Naturalmente ho optato per la seconda.
https://thingspeak.com/ nasce proprio per l'Internet Of Things. E' possibile registrarsi gratuitamente, ricevere la propria chiave API di scrittura ed inserirla nel proprio codice per avere il proprio canale aggiornato con le informazioni inviate da sensori remoti.



Ecco lo schema del circuito:
Il circuito è piuttosto semplice. A sinistra si vede la parte di regolazione di tensione, realizzabile in vari modi. nel mio progetto ho usato un TLV1117-3.3 della Texas Instruments senza mettere il condensatore d'ingresso perchè da Datasheet non risulta necessario.
Il sensore ha connesso il pin DAT su GPIO0 e CLK su GPIO2.
Per riferimento ho messo anche i collegamenti all'FT232 per la programmazione e il collegamento del pulsante per la programmazione. Per programmare l'ESP bisogna mettere a massa GPIO0, per farlo entrare in Program Mode. Una volta partita la programmazione si può rilasciare il pulsante. Io per praticità e pigrizia ho usato un filo volante che mettevo a massa prima di avviare la programmazione.
Il codice necessario al funzionamento della baracca è disponibile qui. Vediamone alcune parti...
    
                     String writeAPIKey = "WriteAPIKey";
In questa sezione andrà messa la PROPRIA chiave API disponibile sul sito thingspeak.com dopo essersi registrati.
            WiFiClient client;
            const char* ssid = "SSID";
            const char* password ="CHIAVE"; 
Andrà riempito col proprio SSID e la propria chiave. L'ESP supporta la cifratura fino a WPA2, quindi non dovreste avere problemi nell'utilizzo domestico.

          if (client.connect(thingSpeakAddress, 80)){
            client.print("POST /update HTTP/1.1\n");
            client.print("Host: api.thingspeak.com\n");
            client.print("Connection: close\n");
            client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
            client.print("Content-Type: application/x-www-form-urlencoded\n");
            client.print("Content-Length: ");
            client.print(tsData.length());
            client.print("\n\n");
            client.print(tsData);
            lastConnectionTime = millis();
            
            updateThingSpeak("field1="+temp+"&field2="+humid);
Questa è la fase in cui vengono inviati i dati a thingspeak mediante il metodo HTTP POST. I campi temp e humid vengono dalla routine di lettura dati TempHum() dell'SHT11.
Ecco il risultato della mia realizzazione:
 

Decisamente artigianale. Veloce da realizzare e affidabile.
Il sensore è montato esternamente alla scatolina con un connettore così da poterlo separare con una piattina e ad esempio mettere il sensore all'esterno e il circuito all'interno.
E' presente l'header per la programmazione e il filo blu volante è il "pulsante" per la programmazione...

Direi che è tutto. C'è la spiegazione, lo schema elettrico creato con lo spelndido Fritzing, il codice commentato, la mia realizzazione pratica.
Una piccola raccomandazione per chiudere: usate pure liberamente le informazioni in questo post, il codice ecc. L'unica cortesia che vi chiedo è di citarmi. Buon divertimento!
 



2 commenti:

Unknown ha detto...

Hi! I was just trying to accomplish the same thing with an ESP8266 module and an SHT11 sensor. Unfortunately my SHT11 is just reading garbage when I connect it to the ESP module. Have you applied any modifications to the SHT library? I was suspecting that the timing isn't correct.

elettrofreak ha detto...

I used the original library linked in the post without any modification. Just make sure you are not using the cheaper and less precise dht11 module, which uses a different protocol.