Skip to Content

Controlla il condizionatore via IR con ESP32 o ESP8266

Controlla il condizionatore via IR con ESP32 o ESP8266

In questo articolo imparerai come controllare un condizionatore d’aria tramite IR con un microcontrollore ESP32 o ESP8266.

La maggior parte delle unità di condizionamento moderne è dotata di un telecomando che invia segnali a infrarossi (IR) per controllare l’unità. Tuttavia, spesso la funzionalità del telecomando e del condizionatore è limitata. E se volessi accendere il condizionatore a un orario specifico? E se volessi regolare il condizionatore in base alle previsioni meteo? O se volessi controllarlo da un’altra stanza? Forse hai semplicemente perso il telecomando e vuoi costruirne uno più potente?

Nota che a partire da gennaio 2024 il IRRemoteESP8266 library utilizzato per generare i segnali IR per il controllo del condizionatore does not compile for the ESP32 and Arduino 3.0.0. Ho provato, ma non sono riuscito a farlo funzionare. Tuttavia, una volta che la libreria sarà sistemata, il codice in questo articolo dovrebbe funzionare di nuovo con l’ESP32.

Tutto questo e molto altro può essere realizzato se usiamo un microcontrollore per controllare il condizionatore da soli. Iniziamo.

Componenti necessari

In questa sezione sono elencati i componenti necessari. Oltre a un ESP32 o ESP8266 e alcuni componenti minori, ti servirà un condizionatore che possa essere controllato tramite segnali a infrarossi. Puoi trovare la lista dei Aircons supportati qui.

Per quanto riguarda il microcontrollore, userò specificamente l’ESP8266 ESP-12F Mini (WEMOS LOLIN D1 mini) elencato qui sotto, ma la maggior parte delle schede ESP8266 e ESP32 dovrebbe funzionare altrettanto bene. Ho anche elencato l’ESP32 lite per il suo basso costo e il connettore per batteria con capacità di ricarica. Questo può essere utile se vuoi costruire un telecomando alimentato a batteria.

A seconda della versione del progetto che stai realizzando, ti servirà solo un sottoinsieme dei componenti elencati qui.

ESP8266 ESP-12F Mini

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cavo dati USB

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

Kit di resistori e LED

Transistor MOSFET kit

Kit di transistor

Ricevitore e trasmettitore IR

Diodo trasmettitore IR

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Tecnologia a infrarossi e condizionatori

La tecnologia a infrarossi (IR) è ampiamente utilizzata in varie applicazioni, inclusi i telecomandi per dispositivi elettronici come televisori, lettori DVD e condizionatori. Permette la comunicazione wireless tra dispositivi trasmettendo segnali sotto forma di luce infrarossa.

I condizionatori, essendo uno degli elettrodomestici più comuni, spesso sono dotati di un telecomando che utilizza la tecnologia IR. Questi telecomandi inviano segnali IR specifici all’unità per controllarne le funzioni, come la regolazione della temperatura, della velocità della ventola e della modalità.

IR Aircon with remote and receiver
Condizionatore IR con telecomando e ricevitore

I condizionatori sono dotati di un ricevitore IR che può rilevare e interpretare questi segnali. Quando viene ricevuto un comando, il condizionatore risponde di conseguenza, modificando la temperatura, regolando la velocità della ventola o eseguendo qualsiasi altra azione associata al comando.

Se vuoi saperne di più sui segnali infrarossi e su come generarli, dai un’occhiata ai nostri tutorial su How to build a universal, programmable IR remote, How to control an ESP32 with an IR Remote, e How to Control a Servo with an IR Remote.

Condizionatori supportati

È importante notare che diversi modelli e marche di condizionatori possono utilizzare protocolli e codici IR differenti. Pertanto, prima di procedere con il progetto, dovresti identificare la marca del tuo condizionatore. Useremo il IRRemoteESP8266 library e la lista dei Aircons supportati può essere trovata qui.

Una volta verificato che il tuo condizionatore è supportato, puoi procedere collegando l’ESP32/ESP8266 a un diodo IR e programmando l’invio dei segnali appropriati. Questo ti permetterà di controllare il condizionatore da remoto tramite un’interfaccia web.

Sistema generale

L’immagine qui sotto mostra il sistema generale che andremo a costruire. Una pagina web che gira in un browser e controlla l’ESP32/ESP8266 via Wi-Fi, che a sua volta controlla il condizionatore usando segnali IR.

System to control Aircon from ESP8266/ESP32 via Wi-Fi and IR
Sistema per controllare il condizionatore da ESP8266/ESP32 via Wi-Fi e IR

Nella prossima sezione ti mostrerò come collegare l’ESP32/ESP8266 a un trasmettitore IR

Collegare l’ESP32/ESP8266 a un trasmettitore IR

Per inviare segnali a infrarossi (IR) dobbiamo collegare l’ESP32 o ESP8266 a un trasmettitore IR. Di seguito ti mostrerò tre modi diversi per farlo. Il primo è il più semplice e utilizza uno di quei pratici moduli trasmettitori IR. Per il secondo circuito useremo un diodo trasmettitore IR e un resistore, un po’ più laborioso ma che può offrire una portata migliore. L’ultimo circuito usa un MOSFET aggiuntivo, che ci permette di aumentare ulteriormente la portata.

Modulo trasmettitore IR

Il modo più semplice è usare un modulo trasmettitore IR. Questi moduli sono molto semplici e solitamente consistono in un diodo IR e un resistore su una scheda breakout. Di solito hanno tre pin: massa (GND o ‘-‘), alimentazione (VCC o ‘+’) e segnale (S o DAT). Vedi il modulo qui sotto.

IR Transmitter Module
Modulo trasmettitore IR

Collegare il modulo trasmettitore IR

Collegare il modulo è semplice. Collega la massa (G) del tuo ESP32/ESP8266 al pin meno (-/GND) del modulo (filo nero). Poi collega un pin GPIO (qui usiamo D2) al pin segnale (S/DAT) del modulo (filo giallo). Infine collega +5V (o +3.3V) del microcontrollore al pin centrale (+/VCC) del modulo (filo rosso). Nota: non collegare il modulo ai pin TX o RX, potrebbe interferire con la comunicazione seriale.

Circuit for connecting the IR sender module to the ESP8266
Collegare il modulo trasmettitore IR all’ESP8266

Nel circuito di esempio sopra, uso un Wemos Lolin D1 mini che offre un’uscita a 5V o 3.3V. Quale usare per alimentare il modulo di solito non importa. L’ingresso a 5V o 3.3V al modulo IR a volte non viene usato affatto o serve solo per indicare alimentazione o trasferimento segnale. Generalmente non influisce sulla portata del trasmettitore IR.

Anche se funziona ed è comodo per testare la funzione, la portata è piuttosto limitata. Ottengo tra 1 e 2 metri di portata e dipende dal resistore sul modulo. Alcuni moduli offrono portate maggiori ma probabilmente usano un circuito non corretto. Vedi la sezione successiva.

Moduli senza resistore di limitazione corrente

Attenzione! Alcuni moduli economici non hanno resistore di limitazione corrente, il che fa sì che il diodo IR assorba circa 180mA di corrente. Questo è troppo alto per un’uscita GPIO di un ESP8266, che dovrebbe essere intorno a 10mA! Se colleghi queste schede ottieni un’ottima portata ma rischi di danneggiare la tua scheda!

Ecco una foto di un modulo del genere. Se guardi attentamente puoi vedere che il resistore R1 manca e la scheda ha solo un diodo IR. Puoi usare queste schede ma devi aggiungere un resistore al circuito.

IR Transmitter board without current limiting Resistor
Scheda trasmettitore IR senza resistore di limitazione corrente

Nella prossima sezione ti mostro come collegare tu stesso il diodo trasmettitore IR e un resistore. Questo ci dà un miglior controllo sulla corrente e sulla portata.

Diodo trasmettitore IR e resistore

Come vedi sotto, il circuito che usa un diodo trasmettitore IR e un resistore è ancora molto semplice. Collega il pin più corto del diodo IR a massa e il pin più lungo al resistore. L’altro pin del resistore va collegato a un’uscita GPIO, qui scelgo D2.

Connecting the IR Diode and Resistor to the ESP8266
Collegare il diodo IR e il resistore all’ESP8266

Possiamo calcolare il valore del resistore necessario così. Abbiamo 3.3 Volt in uscita dal GPIO, vogliamo assorbire non più di 10 mA, e il diodo IR ha una tensione diretta di 1.2V a 1.5V (facciamo 1.3V). Quindi per un resistore da 220Ω otteniamo una corrente di 9mA:

(3.3V – 1.3V)/220Ω = 9mA

Dato che il segnale IR è un impulso breve, potremmo scendere fino a 100Ω, per cui avremmo (3.3V – 1.3V)/100Ω = 20mA. Questo aumenterebbe un po’ la portata ma diventa rischioso. Una soluzione migliore è pilotare il diodo IR tramite un transistor o MOSFET. Ed è quello che faremo nella prossima sezione.

Diodo trasmettitore IR e MOSFET

La portata del nostro trasmettitore IR è limitata perché possiamo fornire in sicurezza solo 10mA al diodo IR usando direttamente un’uscita GPIO dell’ESP8266. Il diodo IR potrebbe essere alimentato fino a 100mA, aumentando drasticamente la portata del trasmettitore. Lo schema seguente mostra come fare.

Schematic to control an IR Diode with a MOSFET
Schema per controllare un diodo IR con un MOSFET

In questo circuito il diodo IR è collegato a una batteria da 9V con un resistore di limitazione corrente R1 da 100Ω. Questo ci dà una corrente di (9V-1.3V)/100Ω = 77mA attraverso il diodo IR, che è ben entro il limite di 100mA. Con questa configurazione ottengo una portata di circa 8-10 metri.

Il MOSFET agisce come un interruttore. Se l’uscita GPIO (D2) dell’ESP8266 va alta, il Gate (G) del MOSFET apre la connessione tra Drain (D) e Source (S) e la corrente può fluire dalla batteria da 9V, attraverso il diodo IR verso massa (GND).

Il 2N7000 MOSFET che uso qui può commutare fino a 60V e 200mA in continuo. Questo è sufficiente per i 70mA di corrente assorbiti dal nostro diodo IR.

Il resistore da 100Ω (R2) nel circuito è un altro resistore di limitazione corrente per proteggere il GPIO. Il secondo resistore (R1) da 10KΩ è un resistore di pulldown che assicura che il MOSFET si spenga quando il gate non è connesso. Se vuoi saperne di più sui MOSFET e su come usarli per controllare carichi elettrici, dai un’occhiata al nostro tutorial How To a Control Fan using Arduino.

Circuito completo su breadboard

L’immagine qui sotto mostra il circuito completo su breadboard.

Complete Circuit with MOSFET on Breadboard
Circuito completo con MOSFET su breadboard

Il circuito sulla breadboard segue lo schema presentato sopra. Inizia inserendo il MOSFET e il diodo IR nella breadboard. Fai attenzione all’orientamento corretto del 2N7000 e del diodo IR. Collega la batteria da 9V per ultima e fai attenzione alla polarità corretta. Non dimenticare che batteria e ESP8266 devono avere massa comune (filo di massa dell’ESP8266 collegato alla batteria)!

Per testare il circuito potresti usare prima il blink sketch e un LED normale prima di eseguire il programma più complesso che discuteremo nelle prossime sezioni. Iniziamo dalla pagina web necessaria per controllare il condizionatore.

Pagina web per il telecomando

Vogliamo controllare il nostro ESP32/ESP8266 tramite una pagina web. Le pagine web sono tipicamente costruite usando il linguaggio HTML. Il codice HTML seguente descrive il layout, i colori e il contenuto della nostra pagina web.

<!DOCTYPE html> 
<html> 
<head> 
  <title>Aircon</title> 
  <style> 
    body { text-align: center; font-family: Arial, sans-serif; } 
    button { background-color: slateblue; color: white; border: none; width: 50px; height: 30px; } 
    button:hover { background-color: darkslateblue; } 
    button:active { background-color: mediumslateblue; } 
  </style> 
</head> 
<body>
  <h1>Aircon</h1>
  <p>Power: 
    <a href="/power/on"><button>ON</button></a> 
    <a href="/power/off"><button>OFF</button></a> 
  </p>
</body> 
</html>

Se copiassi questo codice HTML in un file chiamato “test.html” e lo caricassi nel tuo browser tramite Drag&Drop, vedresti la seguente pagina web.

Webpage to control ESP32/ESP8266 and Aircon
Pagina web per controllare ESP32/ESP8266 e condizionatore

Puoi facilmente identificare gli elementi nel codice HTML e gli elementi corrispondenti nella pagina web. Il titolo è nel tag “h1“, “p” definisce il paragrafo, che contiene il testo “Power” e due elementi “button” con hyperlink “a“. La sezione “style” specifica i colori e il layout della pagina. Se vuoi saperne di più su HTML, ecco un buon HTML Tutorial.

Per mostrare questa pagina web in un browser dobbiamo eseguire un webserver che la serva al browser. Questo webserver girerà sul nostro ESP32/ESP8266 e discuteremo il codice nella prossima sezione.

Programmare l’ESP32/ESP8266 per il controllo del condizionatore

Di seguito c’è il codice completo che ti permette di controllare un condizionatore tramite infrarossi usando una pagina web servita da un webserver che gira sul tuo ESP32 o ESP8266. È un blocco di codice piuttosto grande, ma lo divideremo in parti gestibili e lo spiegheremo in dettaglio. Dai un’occhiata prima per avere una panoramica.

Nota che questo codice è per un DAIKIN condizionatore. Ma puoi adattare facilmente il codice al tuo condizionatore cambiando il protocollo di comunicazione rilevante (cerca la variabile ac.next.protocol nel codice). Puoi trovare una lista dei Aircons supportati qui.

// Control Aircon via Infrared Signals using a Webpage
// served by a Webserver running on an ESP32/ESP8266

#if defined(ESP8266)
#include "ESP8266WiFi.h"
#elif defined(ESP32)
#include "WiFi.h"
#else
#error "This ain't a ESP8266 or ESP32"
#endif

#include "Arduino.h"
#include "IRremoteESP8266.h"  // ESP32 and ESP8266
#include "IRac.h"
#include "IRutils.h"


const int irPin = D2;
const char* ssid = "*****";
const char* password = "*****";

const char* html = R""""(
HTTP/1.1 200 OK
Content-type:text/html

<!DOCTYPE html> 
<html> 
<head> 
  <title>Aircon</title> 
  <style> 
    body { text-align: center; font-family: Arial, sans-serif; } 
    button { background-color: slateblue; color: white; border: none; width: 50px; height: 30px; } 
    button:hover { background-color: darkslateblue; } 
    button:active { background-color: mediumslateblue; } 
  </style> 
</head> 
<body>
  <h1>Aircon</h1>
  <p>Power: 
    <a href="/power/on"><button>ON</button></a> 
    <a href="/power/off"><button>OFF</button></a> 
  </p>
</body> 
</html>
)"""";


WiFiServer server(80);
IRac ac(irPin);


void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();
}

void setup_ac() {
  pinMode(irPin, OUTPUT);

  ac.next.protocol = decode_type_t::DAIKIN;       // Set a protocol to use. Here a DAIKIN Aircon
  ac.next.model = 1;                              // Some A/Cs have different models. Try just the first.
  ac.next.mode = stdAc::opmode_t::kCool;          // Run in cool mode initially.
  ac.next.celsius = true;                         // Use Celsius for temp units. False = Fahrenheit
  ac.next.degrees = 25;                           // 25 degrees.
  ac.next.fanspeed = stdAc::fanspeed_t::kMedium;  // Start the fan at medium.
  ac.next.swingv = stdAc::swingv_t::kOff;         // Don't swing the fan up or down.
  ac.next.swingh = stdAc::swingh_t::kOff;         // Don't swing the fan left or right.
  ac.next.light = false;                          // Turn off any LED/Lights/Display that we can.
  ac.next.beep = false;                           // Turn off any beep from the A/C if we can.
  ac.next.econo = false;                          // Turn off any economy modes if we can.
  ac.next.filter = false;                         // Turn off any Ion/Mold/Health filters if we can.
  ac.next.turbo = false;                          // Don't use any turbo/powerful/etc modes.
  ac.next.quiet = false;                          // Don't use any quiet/silent/etc modes.
  ac.next.sleep = -1;                             // Don't set any sleep time or modes.
  ac.next.clean = false;                          // Turn off any Cleaning options if we can.
  ac.next.clock = -1;                             // Don't set any current time if we can avoid it.
  ac.next.power = false;                          // Initially start with the unit off.
}

void ac_power(bool isOn) {
  ac.next.power = isOn;
  ac.sendAc();
}

void execute(String& command) {
  if (command.endsWith("GET /power/on")) {
    ac_power(true);
  }
  if (command.endsWith("GET /power/off")) {
    ac_power(false);
  }
}

void run_server() {
  WiFiClient client = server.accept();
  if (client) {
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println(html);
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
        execute(currentLine);
      }
    }
    client.stop();
  }
}

void setup() {
  Serial.begin(9600);
  setup_ac();
  setup_wifi();
}

void loop() {
  run_server();
}

Per capire il codice in dettaglio, dividiamolo in parti.

Librerie

Per prima cosa install e includiamo le librerie necessarie per ESP32 e funzionalità IR. A seconda del microcontrollore (ESP32 o ESP8266) dobbiamo includere una libreria Wi-Fi diversa. Lo facciamo usando un conditional include (#if, #elif, #endif).

#if defined(ESP8266)
#include "ESP8266WiFi.h"
#elif defined(ESP32)
#include "WiFi.h"
#else
#error "This is not a ESP8266 or ESP32"
#endif

#include "Arduino.h"
#include "IRremoteESP8266.h"  // ESP32 and ESP8266
#include "IRac.h"
#include "IRutils.h"

Nonostante il nome, la libreria IRremoteESP8266.h funziona sia per ESP8266 che per ESP32 – almeno in teoria. Come detto nell’introduzione, attualmente (gennaio 2024) la library does not compile for ESP32.

Costanti e variabili

Definiamo la costante irPin che specifica a quale pin è collegato il trasmettitore IR. Definiamo anche le variabili ssid e password per le credenziali della rete Wi-Fi. Dovrai inserire qui SSID e password della tua rete Wi-Fi locale. L’SSID è il nome della tua rete Wi-Fi domestica, ad esempio “my_home_wifi”, e la password è quella che usi normalmente per connetterti a questa rete (con telefono o computer).

const int irPin = D2;
const char* ssid = "*****";
const char* password = "*****";

Codice HTML per la pagina web

Abbiamo già introdotto questa parte del codice. È il codice HTML che sarà servito dal webserver. Descrive gli elementi, i colori e il layout della pagina web.

const char* html = R""""(
HTTP/1.1 200 OK
Content-type:text/html

<!DOCTYPE html> 
<html> 
<head> 
  <title>Aircon</title> 
  <style> 
    body { text-align: center; font-family: Arial, sans-serif; } 
    button { background-color: slateblue; color: white; border: none; width: 50px; height: 30px; } 
    button:hover { background-color: darkslateblue; } 
    button:active { background-color: mediumslateblue; } 
  </style> 
</head> 
<body>
  <h1>Aircon</h1>
  <p>Power: 
    <a href="/power/on"><button>ON</button></a> 
    <a href="/power/off"><button>OFF</button></a> 
  </p>
</body> 
</html>
)"""";

Fai particolare attenzione alla sezione che definisce i pulsanti. Se vuoi aggiungere più pulsanti e funzionalità alla tua pagina web, questo è il posto giusto (dovrai anche aggiungere codice più avanti). Per esempio, se vuoi anche accendere o spegnere le luci del condizionatore, questo è ciò che aggiungeresti:

<p>Power: 
   <a href="/power/on"><button>ON</button></a> 
   <a href="/power/off"><button>OFF</button></a> 
</p> 
<p>Lights: 
   <a href="/light/on"><button>ON</button></a> 
   <a href="/light/off"><button>OFF</button></a> 
</p> 

Configurazione Wi-Fi

La funzione setup_wifi() è responsabile della connessione dell’ESP32 alla rete Wi-Fi. Chiamiamo WiFi.begin(ssid, password) per iniziare la connessione Wi-Fi con le credenziali fornite (SSID, password). Poi aspettiamo in un ciclo finché non ci connettiamo controllando WiFi.status().

void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();
}

Una volta connessi, stampiamo l’indirizzo IP del webserver (che gira sul nostro ESP8266). Verrà mostrato nel monitor seriale e dovrai copiarlo, perché ti serve per connetterti alla pagina web dal tuo computer.

Infine chiamiamo server.begin(), che avvia il webserver. Se non riesci a connetterti al Wi-Fi, controlla SSID e password!

Configurazione del condizionatore

Nella funzione setup_ac(), impostiamo prima il pin del trasmettitore IR come uscita (pinMode(irPin, OUTPUT)). Poi impostiamo lo stato iniziale del condizionatore. Come vedi, ci sono molte funzioni del condizionatore che puoi attivare o disattivare. Queste sono per un condizionatore DAIKIN, un modello molto comune.

void setup_ac() {
  pinMode(irPin, OUTPUT);

  ac.next.protocol = decode_type_t::DAIKIN;       // Set a protocol to use.
  ac.next.model = 1;                              // Some A/Cs have different models. Try just the first.
  ac.next.mode = stdAc::opmode_t::kCool;          // Run in cool mode initially.
  ac.next.celsius = true;                         // Use Celsius for temp units. False = Fahrenheit
  ac.next.degrees = 25;                           // 25 degrees.
  ac.next.fanspeed = stdAc::fanspeed_t::kMedium;  // Start the fan at medium.
  ac.next.swingv = stdAc::swingv_t::kOff;         // Don't swing the fan up or down.
  ac.next.swingh = stdAc::swingh_t::kOff;         // Don't swing the fan left or right.
  ac.next.light = false;                          // Turn off any LED/Lights/Display that we can.
  ac.next.beep = false;                           // Turn off any beep from the A/C if we can.
  ac.next.econo = false;                          // Turn off any economy modes if we can.
  ac.next.filter = false;                         // Turn off any Ion/Mold/Health filters if we can.
  ac.next.turbo = false;                          // Don't use any turbo/powerful/etc modes.
  ac.next.quiet = false;                          // Don't use any quiet/silent/etc modes.
  ac.next.sleep = -1;                             // Don't set any sleep time or modes.
  ac.next.clean = false;                          // Turn off any Cleaning options if we can.
  ac.next.clock = -1;                             // Don't set any current time if we can avoid it.
  ac.next.power = false;                          // Initially start with the unit off.
}

Cambia la variabile ac.next.protocol = decode_type_t::DAIKIN con il modello del tuo condizionatore. I nomi dei diversi modelli sono elencati here e le costanti corrispondenti si trovano here. Cerca questo pezzo di codice:

enum decode_type_t {
  UNKNOWN = -1,
  UNUSED = 0,
  RC5,
  RC6,
  NEC,
  SONY,
  PANASONIC,
  ...
}

A seconda del modello, alcune di queste funzioni potrebbero non essere disponibili e potresti non dover impostare tutte queste variabili. Il codice sopra si basa sulla libreria this example of the IRremoteESP8266. Troverai molti altri esempi e informazioni lì.

Dai un’occhiata in particolare ai wrapper per alcuni condizionatori. Usarli potrebbe darti meno opzioni ma semplifica il codice. Per esempio, per il condizionatore DAIKIN c’è la classe wrapper ir_Daikin.h, che fornisce funzioni per controllare il condizionatore. Ecco un example:

ac.on();
ac.setFan(1);
ac.setTemp(25);

Usare queste funzioni significa che non dovremmo scrivere le nostre come facciamo nella prossima sezione.

Controllo del condizionatore

Definiamo la funzione ac_power() che si occupa di accendere o spegnere il condizionatore impostando la proprietà power dell’oggetto ac e inviando il segnale IR.

void ac_power(bool isOn) {
  ac.next.power = isOn;
  ac.sendAc();
}

Se vuoi controllare più funzioni del tuo condizionatore, aggiungeresti funzioni aggiuntive. Per esempio, una funzione per accendere o spegnere le luci del condizionatore potrebbe essere così:

void ac_light(bool isOn) {
  ac.next.light = isOn;
  ac.sendAc();
}

Esecuzione comandi

Abbiamo poi la funzione execute() che elabora il comando HTTP ricevuto e esegue l’azione corrispondente. In questo caso, accende o spegne il condizionatore in base al comando. Nota che le stringhe in “GET /power/on” devono corrispondere agli hyperlink href="/power/on" nella pagina web. Questo collega il pulsante alla funzione eseguita quando il pulsante viene premuto.

void execute(String& command) {
  if (command.endsWith("GET /power/on")) {
    ac_power(true);
  }
  if (command.endsWith("GET /power/off")) {
    ac_power(false);
  }
}

Se vuoi controllare anche le luci oltre all’alimentazione, aggiungeresti la funzione ac_light() così:

void execute(String& command) {
  if (command.endsWith("GET /power/on")) {
    ac_power(true);
  }
  if (command.endsWith("GET /power/off")) {
    ac_power(false);
  }
  if (command.endsWith("GET /light/on")) {
    ac_light(true);
  }
  if (command.endsWith("GET /light/off")) {
    ac_light(false);
  }
}

Web server

La funzione run_server() gestisce le richieste dei client in arrivo e serve la pagina HTML. Chiama anche la funzione execute() per elaborare i comandi.

Il codice qui sotto si basa in gran parte sull’esempio SimpleWiFiServer fornito da WiFi library. Se ti servono informazioni più dettagliate o applicazioni, dai un’occhiata lì.

void run_server() {
  WiFiClient client = server.accept();
  if (client) {
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println(html);
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
        execute(currentLine);
      }
    }
    client.stop();
  }
}

Setup e loop

Infine, nella funzione setup() inizializziamo la comunicazione seriale, configuriamo il condizionatore e connettiamo il Wi-Fi.

void setup() {
  Serial.begin(9600);
  setup_ac();
  setup_wifi();
}

E la funzione loop() esegue continuamente il webserver per gestire le richieste in arrivo.

void loop() {
  run_server();
}

E questo è tutto! Ora hai un controller web completamente funzionante per il tuo condizionatore. Nella prossima sezione ti mostro come usarlo realmente.

Usare il webserver

Se resetti il tuo ESP32/ESP8266 e apri il monitor seriale, dovresti vedere un testo che mostra l’indirizzo IP del tuo ESP32/ESP8266. Nel mio caso, per il mio ESP32 è 192.168.1.168, per esempio.

IP-address of ESP32/ESP8266 in Serial Monitor
Indirizzo IP di ESP32/ESP8266 nel monitor seriale

Vedrai un indirizzo IP diverso, quello assegnato alla tua scheda ESP32/ESP8266. Copia quell’indirizzo nella barra di ricerca del browser. Dovresti vedere la pagina web che il webserver sul tuo ESP32/ESP8266 crea:

Web page to control Aircon
Pagina web per controllare il condizionatore

Ora puoi premere i pulsanti per accendere o spegnere il condizionatore da una pagina web.

Per riassumere, ecco come funziona il sistema complessivo. L’ESP8266/ESP32 esegue un webserver che viene servito a un browser web. Browser e webserver comunicano via Wi-Fi attraverso il tuo router Wi-Fi. L’ESP8266/ESP32 controlla il condizionatore tramite segnali infrarossi (IR) che imitano i comandi che il telecomando invierebbe. Questo significa anche che puoi continuare a usare il tuo telecomando.

System to control an Aircon via IR from a Webserver
Sistema per controllare un condizionatore via IR da un webserver

Nota che la pagina web è abbastanza sicura, poiché è accessibile solo all’interno della tua rete Wi-Fi locale. Non è accessibile pubblicamente da internet! Se vuoi questo, servirà più lavoro e misure di sicurezza, perché è rischioso aprire la tua rete Wi-Fi a internet!

Altrimenti, è tutto!

Conclusione

In questo post del blog abbiamo imparato come controllare un condizionatore usando segnali infrarossi (IR) e un microcontrollore ESP32/ESP8266. Seguendo la guida passo passo, puoi automatizzare il tuo sistema di raffreddamento e goderti la comodità del controllo remoto.

Il codice in questo tutorial è solo un inizio. C’è molto di più che puoi fare! A partire dal controllo di più funzioni del tuo condizionatore, potresti aggiungere sensori aggiuntivi (movimento, temperatura, umidità) per controllare automaticamente il condizionatore in base alle condizioni ambientali. Praticamente qualsiasi funzione mancante nel tuo condizionatore puoi costruirtela da solo.

Divertiti!

Domande frequenti

Ecco alcune domande frequenti sul controllo di un condizionatore usando segnali infrarossi e un microcontrollore ESP32/ESP8266:

D: Posso usare qualsiasi scheda ESP32/ESP8266 per questo progetto?

R: Sì, puoi usare qualsiasi scheda ESP32/ESP8266 per questo progetto purché abbia i pin GPIO necessari per collegare il diodo IR e un modulo Wi-Fi integrato.

D: Come controlla l’ESP32/ESP8266 il condizionatore usando segnali infrarossi?

R: L’ESP32/ESP8266 è programmato per generare i segnali infrarossi necessari che imitano i segnali del telecomando del condizionatore. Collegando il diodo IR all’ESP32/ESP8266 e programmando di conseguenza, puoi inviare comandi IR specifici al condizionatore, come cambiare temperatura, modalità o velocità della ventola.

D: Posso controllare più condizionatori con un singolo ESP32/ESP8266?

R: Sì, puoi controllare più condizionatori con un singolo ESP32/ESP8266 usando codici IR diversi per ciascun condizionatore. Programmando l’ESP32/ESP8266 per inviare i codici IR appropriati per ogni condizionatore, puoi controllarli individualmente o simultaneamente.

D: Come aumento la portata del trasmettitore IR?

R: Puoi usare due (o più) trasmettitori IR controllati in parallelo ma collegati a due pin GPIO diversi del tuo ESP8266 o ESP32. L’opzione migliore è alimentare il trasmettitore IR separatamente e usare un MOSFET (o transistor) per controllarlo. Se ancora non basta, puoi collegare un secondo diodo IR e controllarli entrambi tramite il MOSFET. Ti servirà comunque un solo pin GPIO. Ecco uno schema di esempio:

Schema per un MOSFET che controlla due diodi IR

Queste sono alcune delle domande frequenti riguardo al controllo di un condizionatore usando segnali infrarossi e un microcontrollore ESP32/ESP8266. Se hai altre domande, sentiti libero di chiedere nella sezione commenti qui sotto.