Questo articolo, presenta il firmware per il box termostato. Esso è stato sviluppato con Arduino configurato per la scheda NodeMCU .1.0 (ESP-12E Module).

In calce all’articolo trovate il link per scaricare il codice sorgente pertanto nel corso dell’articolo si farà riferimento a detto codice.

Il progetto è diviso in due files: il primo file BoxTermostato_1.0 è dedicato alle comunicazioni WiFi e al colloquio con il broker MQTT, il secondo file TypicalCmds_1.0 contiene la logica specifica del programma.

Questa suddivisione, oltre ad una maggior chiarezza, rende possibile il riutilizzo del primo file per altre applicazioni basate WiFI e MQTT con modifiche minime. Gli unici legami con il secondo file consistono nelle chiamate alle funzioni setupExt, processInMsg e thermostat e la variabile msgBuf che contiene il messaggio in arrivo dal broker MQTT.

Il programma necessita di quattro parametri che devono essere impostati prima della compilazione:

  • ssid: deve essere impostato con il valore dell’SSID del router WiFi

  • WiFipassword: deve essere impostato con il valore della password del router WiFi

  • inTopic: è costituito dal prefisso ‘in’ seguito da un numero lungo al massimo 19 cifre

  • outTopic: è costituito dal prefisso ‘out’ seguito dallo stesso numero usato per inTopic.

Il numero usato per inTopic e outTopic può essere un numero casuale generato con uno dei programmi presenti sul web.

Il parametro mqtt_server è impostato nel codice al valore ‘broker.emqx.io’ ma in alternativa è indicato anche ‘broker.mqtt-dashboard.com’; entrambi i brokers sono gratuiti e adatti al nostro scopo. Ovviamente può essere utilizzato qualsiasi altro broker MQTT.

Il programma necessita anche di due librerie ESP8266WiFi e PubSubClient, la loro installazione è ampiamente trattata nel web pertanto non viene ripetuta in questa sede.

Nel file TypicalCmds si trovano due parametri ISTERESI impostato al valore di 5 decimi di grado e TIME_OUT impostato al valore di un minuto.

Il parametro ISTERESI definisce lo scostamento dalla temperatura desiderata che determina un cambiamento di stato. Per esempio si pone ISTERESI = 5 decimi di grado e la temperatura di test = 450 decimi di grado, quando la temperatura reale salirà oltre il valore di 45,5 °C si avrà una commutazione dallo stato ON allo stato OFF e viceversa quando scenderà a valori inferiori di 44,5; i valori delle temperature ai quali si avrà effettivamente la commutazione dipendono da ISTERESI e da TIME_OUT secondo le seguenti considerazioni.

Poiché il controllo delle condizioni per la commutazione avviene allo scadere di ogni minuto (o altro intervallo predefinito) la temperatura di commutazione dipende dal valore assunto in quell’istante e sarà tanto più vicina ai valori stabiliti quanto minore sarà la velocità di riscaldamento e quella di raffreddamento. La prima dipende dalla potenza delle lampade, e quindi è facilmente modificabile, e la seconda dall’isolamento termico del box e dalla differenza di temperatura rispetto all’esterno, questi non sono modificabili ma da prove condotte risultano essere adeguati per i nostri scopi.

Per esempio con una lampada da 25 Watt, ISTERESI = 0,5 °C, T0 = 45,0 °C e TIME_OUT = 1 minuto la temperatura interna si mantiene tra 44 e 46 °C.

La funzione setupExt, è chiamata da setup e pone in OUT il pin che comanda il relay e il led rosso che indica lo stato del relay.

La funzione processInMsg è chiamata da callback quando arriva un nuovo messaggio MQTT e imposta i valori della temperatura di prova, in decimi di grado e il tempo di test in minuti.

Il messaggi in arrivo ha la seguente struttura:

  • temperatura di prova espressa in decimi di grado: 3 caratteri
  • separatore: un carattere ‘;’ separa il campo successivo dal precedente
  • durata della prova in minuti: n caratteri, esempio 6000 = 100 ore di test
  • separatore: un carattere ‘;’ chiude il messaggio

Esempio di stringa di comando: “450;600;”

La funzione thermostat è chiamata ciclicamente da loop e verifica periodicamente se è trascorso l’intervallo di timeout e, nel caso, prepara il messaggio in uscita che ha la seguente struttura:

  • temperatura attuale in decimi di grado
  • separatore (/)
  • temperatura impostata in decimi di grado
  • separatore ( – )
  • tempo trascorso dall’inizio del test in minuti
  • separatore (/)
  • tempo di test impostato in minuti
  • separatore ( – )
  • stato del relay (0 = spento, 1 = acceso)

inoltre verifica se esistono le condizioni per un cambio di stato.

IMPIEGO DEL SISTEMA

per l’impiego del sistema si è usato il programma MQTTBox (https://chrome.google.com/webstore/detail/mqttbox/kaajoficamnjijhkeomgfljpicifbkaf).

Per stabilire le comunicazioni è necessario creare un nuovo client con le seguenti impostazioni:

  • MQTT client Name: una stringa scelta liberamente, per .es. broker.emqx.io
  • Protocol: mqtt/tcp
  • Host: broker.emqx.io (o nome di altro broker che si vuole utilizzare)
  • Username e Password: vuoti (possono essere richiesti da altri broker)
  • lasciare i valori di default per gli altri parametri

La figura seguente mostra le impostazioni utilizzate per la definizione del client:

Dopo aver salvato il client, cliccando sul corrispondente riquadro si aprirà la pagina dei messaggi con due riquadri: Topic to publish e Topic to subscribe, nei quali inserito il valore di inTopic (in+ nnn) , creare un nuovo Topic to subscribe cliccando su Add Subscriber e inserire il valore di outTopic (out + nnn).

Dopo aver acceso il box e aver avviato la scheda di controllo, nel riquadro Payload del Topic to publish inserire le impostazioni (per es. 450;600;).

Se tutte le configurazioni sono corrette il messaggio inviato sarà riprodotto nel riquadro Subscriber inTopic e dopo circa un minuto nel riquadro Subscriber outTopic compariranno le risposte inviate dalla scheda di controllo al ritmo di una al minuto.

La figura seguente mostra il messaggio di impostazioni inviato al box e i messaggi di stato che indicano l’aumento progressivo della temperatura dal nono minuto all’undicesimo minuto.

Per ulteriori informazioni sul firmware si rimanda ai commenti presenti nei listati.