Abbiamo esposto una metodologia volta a copiare i codici dei telecomandi IR nella lezione precedente, adesso vedremo come utilizzarli. Un modo rapido di sincerarsi su quali siano i "telecomandi" supportati, riferendoci in special modo ai condizionatori, è sbirciare nelle cartelle della libreria IRremoteESP8266 dopo averla installata da Arduino IDE. Su Windows i file della libreria si trovano in Documenti/Arduino/Libraries/IRremoteESP8266. Nella sottocartella src sono presenti tutti i files header (h) e sorgente (cpp) dei vari modelli di telecomando/protocollo. Sono tutti i files che iniziano per ir_. Nei files header è possibile trovare, all'inizio, le definizioni utilizzate per costruire i comandi dei condizionatori.
Panoramica dei metodi utilizzati per la trasmissione
Apriamo l'esempio IRsendDemo al fine di comprendere i vari sistemi utilizzati per l'invio dei codici. Notiamo che, in tutti i casi, bisogna sempre inserire i due header <IRremoteESP8266.h> e <IRsend.h>. Nel loop possiamo subito vedere:
irsend.sendNEC(0x00FFE01FUL);
La parola irsend, seguita dal metodo relativo al telecomando/protocollo, permette di inviare il codice esadecimale. Esempi di metodi sono: sendNEC, sendRC5, sendSony, ecc. Il nome del metodo è in pratica composto dalla parola send seguita dal nome del marchio o protocollo. Il nome del marchio o protocollo è anche possibile leggerlo alla voce Encoding mostrata nel dump relativo allo sketch della lezione precedente.
irsend.sendSony(0xa90, 12, 2);
Questo della Sony è un caso particolare perché i dispositivi Sony prevedono che il codice sia ripetuto tre volte. Quindi gli argomenti da passare sono: codice (A90 nell'esempio), il numero di bit (12, che viene mostrato nel dump tra parentesi di fianco al codice) e il numero di ripetizioni (2, il codice verrà ripetuto altre due volte dopo il primo invio, quindi sarà inviato in totale tre volte). In realtà tutti i metodi, oltre al sendSony, supportano gli altri due parametri, per cui se fosse necessario potremo usare questo sistema non solo per il protocollo Sony ma anche per altri.
irsend.sendRaw(rawData, 67, 38);
Il metodo classico da utilizzare quando la codifica non è conosciuta è sendRaw. Andremo a scrivere un array con un nome univoco per ogni comando preso dal dump, usando i rawData. Nell'esempio l'array rawData è definito nello sketch di esempio. Seguono quindi il numero di elementi dell'array (67) e la frequenza della portante (38KHz). Quando la frequenza non è nota possiamo tentate prima con 38KHz e, qualora sia necessario, anche con 36KHz o 40KHz.
irsend.sendSamsungAC(samsungState);
Questo è il comando di invio che si utilizza generalmente per i condizionatori dei quali è stato ricevuto correttamente il codice. L'argomento della funzione è l'array con i codici di stato ricevuti nel dump. Nell'esempio è stato richiamato il metodo samsungStateAC, che è relativo a un condizionatore Samsung (i metodi utilizzabili per i protocolli dei condizionatori presentano alla fine il suffisso AC). Un buon modo per conoscere la sintassi completa di tutti i metodi è quello di sbirciare nel file IRsend.h dove sono definiti i prototipi funzione.
Metodi specifici per condizionatori
I metodi visti sino a ora sono i metodi "classici" da utilizzare con questa libreria, che non richiedono l'inclusione di header specifici tranne i due di base della libreria. Per i condizionatori in particolare, come è stato accennato nella lezione precedente, è possibile "costruire" il comando da inviare. Apriamo l'esempio TurnOnDaikinAC.
Notiamo, all'inizio dello sketch, che viene innanzitutto incluso, oltre <IRremoteESP8266.h> e <IRsend.h>, anche il file header proprio del condizionatore in oggetto (#include <ir_Daikin.h>), viene quindi istanziata la libreria con IRDaikinESP ac(kIrLed). Il valore kIrLed tra parentesi identifica il GPIO4 (D2 sul NodeMCU) come specificato alla riga precedente. Nel loop di esempio viene quindi costruito il comando:
ac.on(); ac.setFan(1); ac.setMode(kDaikinCool); ac.setTemp(25); ac.setSwingVertical(false); ac.setSwingHorizontal(false);
È facile comprendere che il comando da inviare sia: accensione, velocità ventola al minimo, modalità raffreddamento, temperatura a 25°C, swing disattivato. Nell'esempio seguono altri due parametri che impostano il timer. Dopodiché il comando viene inviato semplicemente con ac.send(). Ogni condizionatore ha la sua sintassi tuttavia possiamo anche utilizzare comandi "semplici", senza costruirli, utilizzando il codice di stato recuperato con il dump. Costruire il comando può essere utile, ad esempio, per fare controlli remoti più complessi e dettagliati o quando non disponiamo del ricevitore IR con il quale eseguire il dump.
Il Circuito
Fatte queste premesse possiamo realizzare l'esempio per controllare il condizionatore tramite la rete Wi-Fi. Andremo a realizzare il circuito seguente.
Utilizzeremo un comune led a infrarossi, con case trasparente, che emette a 940nm. Il transistor BC337 è necessario perchè i GPIO del NodeMCU non sono in grado di fornire la corrente necessaria per pilotarlo. In realtà si potrebbe provare a collegare il led direttamente al pin solo nel caso in cui il trasmettitore sia vicinissimo al condizionatore ma non è un'opzione consigliata. I led IR difatti assorbono circa 100mA di corrente. Adopoerando il circuito proposto il led viene pilotato con una corrente di circa 75mA e alimentato dalla linea a 5V. Nello schema è collegato a VU, che è la tensione di 5V presa dal connettore USB. Se alimentate il NodeMCU con una sorgente a 5V su VIN, collegherete il led a VIN piuttosto che VU. La resistenza da 47Ω in serie al led, dal momento che si trova a dissipare qualcosa oltre i 0.25W, dovrebbe essere da 1/2W anzichè da 1/4W come è adottata normalmente per i nostri circuiti. In realtà non è strettamente necessario inserire una resistenza di maggiore potenza perchè la corrente che la attraverserà è impulsiva (un treno di onde quadre) e dura una frazione di secondo. Utilizzando il BC337, come nello schema, possiamo anche aggiungere un altro led, sempre con resistenza, in parallelo al primo, magari montato con un'angolazione differente rispetto al primo per coprire un range più esteso al fine di poter pilotare il nostro apparecchio. Oppure possiamo mettere in parallelo un led a luce visibile (ad esempio un led rosso da 3mm, con una resistenza in serie da 220Ω) per osservare quando si verifica trasmissione. Utilizzando un altro modello di transistor il circuito che stiamo descrivendo non sarà più funzionale.
Il programma
Il programma di esempio da caricare su NodeMCU con Arduino IDE è stato realizzato per un condizionatore Riello che utilizza la stessa codifica della Hayer come rilevato dallo sketch IrRecvDumpV2. E' possibile scaricare questo esempio qui. Sono stati memorizzati unicamente quattro comandi: spegnimento, modalità deumidificatore e freddo (entrambi a 25°) oltre che la modalità caldo (30°), tutti con ventola al minimo, per cui dalla riga 49 sono definiti quattro array relativi ai codici di stato rilevati in precedenza. Nell'esempio non viene quindi inclusa la libreria specifica del modello ma bastano le due di base.
Nella procedura di Callback è controllato il messaggio ricevuto nel topic su cui ci siamo messi in ascolto alla ricerca delle parole: dry, cold, hot e off che verranno utilizzate, rispettivamente, per inviare, con il metodo sendHaierACYRW02 (relativo a questa particolare codifica), i codici di stato per le modalità deumidificazione, freddo, caldo e spegnimento. Se utilizzate un diverso condizionatore o un diverso dispositivo, chiaramente andrà modificato il tutto, codici e metodi. Questo è solo un esempio volto a illustrare una delle possibbili implementazioni che si hanno a disposizione per ottenere lo scopo. Il programma rimanente è identico a quanto visto in precedenza.
Lato Node-Red andremo a realizzare un'interfaccia munita di quattro tasti. Potete scaricare il sorgente qui ed importarlo in Node-Red con i metodi già illustrati nelle lezioni precedenti.
I quattro tasti hanno nel payload il comando da inviare via MQTT al topic di esempio per il condizionatore. Ognuno ha un colore diverso. Abbiamo anche aggiunto un'icona nel campo icon. E' possibile scegliere le icone da alcuni set di base di Node-Red, in particolare sono state scelte le icone del set Font Awesome. Node-Red include le icone Font Awesome versione 4.07, il cui elenco è disponibile a questo link. Per utilizzarle nei campi icon dei vari controlli è necessario anteporre il prefisso fa- al nome dell'icona che leggete nell'elenco. Per cui, se vogliamo utilizzare l'icona chiamata power-off, nel campo icon del tasto andremo a scrivere fa-power-off. Tutti e quattro i tasti sono quindi collegati a un nodo Input/MQTT che pubblica sul topic esempio/ac. Tale topic è configurato nello sketch di esempio alla stringa mqtt_topic_set.
Anticipazioni
Potremmo voler accendere il condizionatore, o qualsiasi altro dispositivo, in automatico a un orario prestabilito. Nella prossima lezione vedremo come implementare un semplice timer.