Termostato Fishino by Cristiano Colligiani

WP_20160327_18_18_07_Pro_LI

Quante volte ci chiediamo quanto sia efficiente il nostro sistema di riscaldamento casalingo? Quante volte vorremmo poterlo controllare da remoto in modo da trovare la casa calda al nostro ritorno? Questo progetto nasce dall’esigenza di supervisionare il nostro sistema di riscaldamento, senza sconvolgere il nostro impianto già esistente, in modo da poter monitorare l’andamento della temperatura e dell’umidità durante la giornata. Inoltre dispone di un ingresso (da collegare al nostro termostato) per vedere in quali momenti esso si attiva e quanto tempo sta acceso nell’arco di una giornata o in un mese. Per concludere è presente anche una uscita che ci permette di azionare l’impianto di riscaldamento da remoto. E per chi non volesse utilizzarlo per questo scopo ci sono svariati altri impieghi, come ad esempio una stazione meteorologica o una semplice scheda di controllo di un carico (ingresso/uscita).

Hardware
Il cuore del sistema è la scheda Fishino che a sua volta contiene il modulo ESP8266 (figura 1) che permette di collegarsi alla nostra rete wifi, il modulo RTC che ci consente di avere sempre a disposizione l’ora corrente anche quando viene interrotta l’alimentazione principale, uno slot per scheda SD che ci permette di ospitare le pagine web e di salvare i dati rilevati.

WP_20160327_18_24_52_Pro_LI

figura 1

Come sensore ho utilizzato il DHT22, molto diffuso e ben documentato. Questo sensore consente di misurare contemporaneamente temperatura e umidità relativa con una risoluzione del decimo di unità. Il DHT22 dialoga con il microcontrollore attraverso il protocollo “One Wire” che permette di comunicare utilizzando un solo filo ed una resistenza di pull-up (R7) da 10 kohm.

La sezione di input è stata progettata per avere un’ampia dinamica di ingresso in particolare come livello logico alto si può utilizzare sia lo “standard” 5V ma anche tensioni più elevate, come 12 o 24 volt, spesso impiegate nei vari apparecchi elettronici. Naturalmente se si sceglie di utilizzare la logica 5V i componenti D1, D3 e R3 possono non essere montati e l’ingresso può essere portato direttamente sul pin 2. Il diodo D3, infatti, serve per impedire che un’inversione di polarità rovini il sistema, la resistenza R4 a portare a massa il pin di ingresso in modo da evitare che rimanga flottante quando non vi è applicato nessun ingresso, mentre la resistenza R3 e lo zener D1 servono per ridurre la tensione ad un valore accettabile dalla scheda Fishino. Supponendo di avere (caso peggiore) una tensione di 24V in ingresso la caduta su R3 sarà e la corrente che scorre dissipando così una potenza . Lo zener in queste condizioni dissipa che anche in questo caso rientra nelle specifiche dello Zener. In questi calcoli non è stata considerata la resistenza R4 in quanto la corrente che scorre al suo interno è trascurabile rispetto a . Se invece applichiamo un segnale di 5 volt questo subirà la caduta di 0,6V dovuta al diodo al silicio D3 e la tensione sul pin D2 verrà letta come 1 logico. Il led LD1 (verde) serve a visualizzare lo stato dell’ingresso e viene comandato via software attraverso il pin D8.

Il led LED2 (giallo,  figura 2) serve a visualizzare lo stato del sistema, in particolare se ci sono errori durante il processo di boot del sistema o durante le procedure di dialogo con le periferiche. Per indicare lo stato del sistema tale led esegue un certo numero di lampeggi, il cui significato è riportato nella tabella qui sotto.

tabella_led

WP_20160327_18_24_01_Pro_LI

figura 2

Per la sezione di uscita è stato utilizzato un transistor BC337 per pilotare un relè da 5 Volt ed il led LED3 (rosso) che indica quando quest’ultimo è eccitato, mentre il diodo D2 sopprime la tensione inversa che si genera quando il transistor passa dallo stato di “ON” alla regione di interdizione.

elenco_componenti

Infine descriviamo la funzione del Jumper JP1. Si noti che non è stata inserita nessuna resistenza di pull-up perché viene inserita (via software) quella contenuta nel microcontrollore. Esso ci permette di passare dalla modalità “normale” (jumper non inserito) alla modalità “termostato” (jumper inserito). Nella prima modalità ingresso e uscita sono completamente indipendenti, sullo storico viene memorizzato lo stato dell’ingresso mentre l’uscita è comandabile attraverso la Home Page. La modalità “termostato”, invece, è concepita per essere utilizzata nella configurazione riportata dallo schema qui sotto. In questo caso l’uscita viene attivata sia se viene effettuato il comando via pagina web sia nel caso in cui l’ingresso vada a livello logico alto. In questo modo sarà possibile lasciare inalterato il funzionamento del nostro impianto di riscaldamento (perché sarà comandato dal nostro termostato) e allo stesso tempo poterlo accendere da remoto.

schema

Schema

 

Preparazione della scheda SD
Per preparare la scheda SD è necessario formattarla con il file system FAT32 e dentro di essa devono essere inseriti, nella directory principale i file delle pagine web. Ci sono due versioni di pagine web. I file contenuti nella cartella “Online” devono essere utilizzati se il pc da cui visioniamo il sistema possiede un accesso ad internet altrimenti dovremo utilizzare quelli della cartella “Offline”. Questi ultimi differiscono dai precedenti perché contengono al loro interno tutte le librerie utilizzate per realizzare le varie pagine web, mentre nel primo caso
questi file vengono caricati attraverso la rete. Ho voluto allegare entrambe le tipologie perché i file “Offline” sono pesanti rispetto agli altri e per caricare una pagina occorrono circa 30 secondi, cosa che può risultare fastidiosa quando andiamo ad interagire con il sistema. Questa lentezza è dovuta a Fishino che è indubbiamente molto lento rispetto ai server che troviamo in rete. Tuttavia può capitare di inserire questo progetto in una rete che non è collegata direttamente ad Internet ed è questo il caso di utilizzare la versione “Offline”.

Per collegare la scheda alla nostra rete domestica deve essere costruito il file “conf.txt”.

conf.txt

Immettere SSID
Immettere Password
-570316608

Questo file può essere creato con un comune blocco note e deve essere così strutturato: la prima riga contiene il nome della nostra rete wifi (SSID) mentre la seconda riga contiene la password. La terza riga contiene l’indirizzo IP in forma signed long e con i byte invertiti. Ad esempio se voglio assegnare l’indirizzo 192.168.1.253 devo considerare come byte più significativo 253 che di conseguenza porterà a un numero negativo, per la precisione -50222912. Ho deciso di rappresentare gli indirizzi IP in questo modo per semplificare la logica interna. La memoria (come vedremo tra poco) è molto limitata e dover manipolare le stringhe per convertirle in numeri risulta molto complesso per il microcontrollore e le funzioni richiedono molte risorse. Così facendo il numero viene acquisito direttamente grazie alla funzione atol() integrata in Arduino e convertito istantaneamente nell’oggetto IPAddress. Siccome la procedura può sembrare complessa, soprattutto per chi è alle prime armi o non è esperto, ho preparato un file excel che consente di calcolare velocemente il numero da mettere nella terza riga. Se volessimo utilizzare la scheda in modalità DHCP, facendo in modo che l’indirizzo venga assegnato automaticamente dal nostro modem, sarà sufficiente mettere 0 nella terza riga.

Software
Il software è composto da due parti: una parte formata da pagine HTML, che consentono di interfacciarsi con la scheda e l’altra è costituita dal software del microcontrollore, creato con l’ambiente Arduino che registra i dati rilevati e li memorizza su file di testo. Vista la scarsità di risorse che la scheda Fishino può offrire in termine di potenza computazionale e di memoria rispetto a un computer, ho scelto di far elaborare i dati al pc attraverso il linguaggio javascript e lasciare a Fishino il semplice compito di “datalogger”. In questo modo Fishino campiona i dati facendone una media e ogni 5 minuti (tempo deciso da me) la salva su un file di testo. Il file è così strutturato: il suo nome indica la data a cui esso fa riferimento (es. 20160320.txt fa riferimento al 20 marzo 2016) e all’interno del file ci sono 288 righe ognuna relativa ad un intervallo di 5 minuti (es. la prima riga contiene i dati dalle 00:00 alle 00:05, la seconda dalle 00:05 alle 00:10 e così via). I dati all’interno della riga sono espressi con numeri interi e separti da virgola: il primo valore che troviamo è la temperatura, poi vi è l’umidità e infine lo stato (es. 123,456,1 sulla riga 3 indica che la temperatura media registrata tra le 00:10 e le 00:15 è di 12,3 °C, l’umidità è 45,6% e lo stato dell’ingresso è ON).

I file vengono generati automaticamente dalla scheda con il passare del tempo scandito dall’RTC e non vengono sovrascritti se il tempo viene mandato indietro cioè vengono preservati i dati raccolti in passato, a meno che non si elimino i file relativi a tale data dalla scheda SD. Se l’orologio RTC non viene impostato oppure perde la data a causa della perdita di alimentazione e dell’assenza della batteria tampone, il processo di salvataggio dei dati si interrompe e viene segalato l’errore RTC (codice 6).

Per questo software sono state utilizzate le seguenti librerie:

  • Fishino (per interagire con il modulo ESP a bordo della scheda)
  • FishinoWebServer (per fornire una connessione http al client)
  • Flash (necessaria per le librerie sopra)
  • DhtLib (per interfacciarsi con il sensore DHT22)
  • RtcLib (per interfacciarsi con il modulo Rtc presente sulla scheda Fishino)
  • SD (per leggere e scrivere i file contenuti nella scheda SD)

Il progetto di partenza è l’esempio WebServerSD che è il cuore del sistema. Esso si occupa di elaborare le richieste HTTP che arrivano e di rispondere automaticamente inviando i file richiesti. In questo modo possiamo inserire direttamente i file nella SD come se Fishino fosse un comune server web e creare pagine web articolate e ricche di contenuti. Questo esempio tuttavia occupa circa il 75% delle risorse della scheda e ciò ha reso molto difficile la programmazione perché immettendo le altre librerie lo sketch diventava troppo grande. Per risolvere questo problema ho preso i sorgenti delle librerie di Fishino e li ho inseriti direttamente nello sketch in modo da poterli modificare. Le modifiche che ho introdotto sono le seguenti:

  • Ho eliminato da tutti i file i riferimenti alla Porta Seriale. Questa viene infatti utilizzata da Fishino per comunicare eventuali errori. Siccome nel nostro caso il pc non sarà collegato alla scheda questa funzione non ha interesse ed eliminandola si risparmia molta memoria.
  • Ho ridotto il buffer di Fishino da 256 caratteri a 128. Questa operazione ridurrà sicuramente la velocità di Fishino ad elaborare le richieste HTTP ma d’altra parte libererà 128 byte di memoria che sono indispensabili per la stabilità del sistema. Senza questa riduzione ho osservato che quando richiedevo una pagina non veniva inviata nessuna risposta perché la funzione malloc() presente nelle varie funzioni non riusciva ad allocare la memoria necessaria per memorizzare la stringa del filename.
  • Ho eliminato del tutto i file “FishinoDebug” che non erano necessari.

Anche la libreria del DHT è stata integrata nel progetto e modificata. In particolare ho cambiato il tipo delle variabili “temperature” e “humidity” da double a int. Questo ha permesso di alleggerire notevolmente il programma perché le operazioni con gli interi sono meno complesse dei numeri in virgola mobile come si specifica anche sul sito di Arduino: https://www.arduino.cc/en/Guide/Troubleshooting#size .

La libreria DHT

    //
//    FILE: dht.h
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.21
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//     URL: http://arduino.cc/playground/Main/DHTLib
//
// HISTORY:
// see dht.cpp file
//

#ifndef dht_h
#define dht_h

#if ARDUINO < 100
#include <WProgram.h>
#include <pins_arduino.h>  // fix for broken pre 1.0 version - TODO TEST
#else
#include <Arduino.h>
#endif

#define DHT_LIB_VERSION "0.1.21"

#define DHTLIB_OK                   0
#define DHTLIB_ERROR_CHECKSUM       -1
#define DHTLIB_ERROR_TIMEOUT        -2
#define DHTLIB_ERROR_CONNECT        -3
#define DHTLIB_ERROR_ACK_L          -4
#define DHTLIB_ERROR_ACK_H          -5

#define DHTLIB_DHT11_WAKEUP         18
#define DHTLIB_DHT_WAKEUP           1

#define DHTLIB_DHT11_LEADING_ZEROS  1
#define DHTLIB_DHT_LEADING_ZEROS    6

// max timeout is 100 usec.
// For a 16 Mhz proc 100 usec is 1600 clock cycles
// loops using DHTLIB_TIMEOUT use at least 4 clock cycli
// so 100 us takes max 400 loops
// so by dividing F_CPU by 40000 we "fail" as fast as possible
#ifndef F_CPU
#define DHTLIB_TIMEOUT 1000  // ahould be approx. clock/40000
#else
#define DHTLIB_TIMEOUT (F_CPU/40000)
#endif

class dht
{
public:
    dht() {};
    int8_t read(uint8_t pin);
    int humidity;
    int temperature;

private:
    uint8_t bits[5];  // buffer to receive data
    int8_t _readSensor(uint8_t pin, uint8_t wakeupDelay, uint8_t leadingZeroBits);
};
#endif
//
// END OF FILE
//

La parte web è stata realizzata con il linguaggio HTML supportato da javascript e anche in questo caso mi sono appoggiato a librerie esistenti:

  • JQueyUI: che mi ha permesso di realizzare Calendari e ProgressBar molto interattive e accattivanti da un punto di vista estetico
  • Highcharts: che permette in modo veloce di realizzare grafici anche molto complessi.

Le pagine fondamentali sono 6:

  1. Home Page (index.htm): riassume lo stato corrente del sistema, in particolare la temperatura, l’umidità e lo stato dell’ingresso in tempo reale. Contiene inoltre i pulsanti per attivare e disattivare l’uscita e lo stato della stessa.
  2. Storico Giornaliero (giorno.htm): Mostra l’andamento dei dati raccolti durante la giornata corrente. In questa pagina è presente anche un calendario che permetterà di scegliere un giorno diverso da quello corrente.
  3. Storico Mensile (mese.htm): Mostra l’andamento della temperatura e dell’umidità nei vari giorni del mese specificando anche il valor massimo e il minimo registrato. Riporta inoltre anche il tempo di accensione dell’ingresso. Quando questa pagina viene aperta sarà presente una barra di caricamento. Questo perché, come spiegavo prima, le pagine web vanno a cercare tutti i file del mese e li elaborano, calcolando ad esempio la temperatura massima o il tempo di accensione.
  4. Storico Annuale (anno.htm): Mostra l’andamento della temperatura e dell’umidità durante l’anno, suddividendola per mesi. Questa operazione può richiedere molto tempo perché devono essere trasferiti 365 file da Fishino al PC.
  5. Impostazioni (settings.htm): Consentono di impostare data e ora e di vedere lo stato del sistema. L’upload dei dati viene effettuato con il metodo PUT dell’HTTP. Per questa funzionalità ho esaminato l’esempio “FileUpload” nella libreria FishinoWebServer.
  6. conf.txt : In realtà questo file (abbiamo visto sopra) contiene la configurazione della nostra rete ma quando viene richiesto via http per motivi di sicurezza non viene visualizzato. Al suo posto viene costruito un file sul momento che viene utilizzato come via di scambio per i dati istantanei. Le pagine infatti vengono aggiornate attraverso il le funzioni XmlHttpRequest che consentono di aggiornare rapidamente la pagina senza provocare il fastidioso fenomeno di “refresh”.

Descrizione del montaggio
Il prototipo è stato realizzato su basetta millefori perché non ho avuto la possibilità di realizzare il PCB. Il montaggio è molto facile in quanto i componenti sono pochi. Ho deciso di lasciare sporgere la millefori sul lato destro di Fishino per poter montare il relè che è il componente più ingombrante. Anche le morsettiere sono state montate in questa sporgenza in modo da poterle raggiungere senza dover rimuovere lo “shield”.

Conclusioni
In realtà questo progetto era stato pensato per sostituire definitivamente un termostato casalingo e quindi curare anche la parte di controllo. Tuttavia per implementare delle regole di accensione, le soglie di temperatura e gli orari occorre tanta memoria sia Flash che RAM che sfortunatamente il nostro microcontrollore non dispone. Proprio per questa ragione ho deciso di trasformare il progetto in un sistema di monitoraggio, che comunque rimane una soluzione molto interessante, con la speranza di poter estendere le sue funzionalità con l’uscita di Fishino Mega e poter costruire un Termostato interamente controllato via web.

Download progetto completo

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu