Realizzare un interruttore WiFi con un Wemos D1 e gestirlo da pagina Web.

Grazie alle ESP8266 possiamo creare tantissimi progetti sfruttando la rete WiFi di casa, come ad esempio creare un interruttore WiFi per accendere o spegnere qualsiasi dispositivo ad esso connesso. Per il progetto odierno adopereremo una dev-board dotata di ESP8266 (Wemos D1) per gestire un relè Songle da un’apposita pagina Web. Questo sistema lo adopereremo per accendere e spegnere una ventola da 120mm a 12V che si verrà montata dentro un armadio rack.

Progetto

Come descritto precedentemente, adopereremo un Wemos D1 per controllare un relè ed attivare una ventola, gestendo tutto tramite il web browser. Per gestirlo al meglio creeremo un DNS per la dev-board per poterci collegare facilmente, senza ricorrere all’indirizzo IP. Premettiamo che non adopereremo un modulo relè, ma saremo noi a creare un sistema di controllo del relè tramite un Transistor NPN che comunicherà con il Wemos D1.

Componenti

Per creare il nostro interruttore WiFi ci serviranno in primis un Wemos D1, scelto per le ridotte dimensioni, un relè Songle che funziona a 5V, due led (uno rosso ed uno verde), due resistenza da 220 OHM, un diodo IN4007, un pulsante, uno switch, una presa Micro-USB femmina, un transistor NPN 2n2222, pin header femmina, jumper, una scheda forata 80×60 e un alimentatore a 5V.

Come molti sapranno, il transistor ci aiuterà a gestire il relè, che necessità per funzionare di tensione a 5V e di un diodo per evitare i c.d. ritorni di corrente e danneggiarlo. Aggiungiamo due led che adopereremo per controllare l’arrivo di corrente elettrica nel circuito (led verde) e l’attivazione del relè (led rosso). Lo switch avrà il compito di spegnere e accendere il sistema, mentre la presa Micro-USB verrà usata per immettere corrente dall’alimentatore.

Lista componenti su Amazon:

Lista componenti su Aliexpress:



Collegamenti

Per creare il nostro interruttore WiFi dobbiamo eseguire con molta precisione i collegamenti riportati nell’immagine sottostante. Partendo dall’alimentazione, il Vcc del connettore Micro-USB va al primo pin dello switch, mentre dallo stesso facciamo partire un collegamento che porta la tensione al led verde a cui abbiamo messo una resistenza; il suo Ground si collega al GND della presa Micro-USB. Dal secondo pin dello switch partirà la tensione elettrica per alimentare il resto del sistema. I 5V di tensione si separano andando all’omonimo pin del Wemos D1 e arrivando al anche al pin di alimentazione del relè. Al pin dei 5V del relè colleghiamo il diodo e un led rosso; serviranno da ponte per il pin del ground del relè e serviranno per evitare ritorni di corrente e avvisarci quando il relè si attiva.

Interruttore WiFi

Ponete attenzione a come collegare il diodo, poichè se sbagliate il verso esso non farà passare la corrente: il catodo (riconoscibile dalla striscia bianca) va connesso al Vcc del relè, mentre l’anodo al GND. Passiamo ora al collegamento del transistor: abbiamo tre pin di connessione, da sinistra verso destra troviamo Emittente, Base e Collettore. L’Emettitore va connesso al GND, la Base al pin D2 del Wemos, mentre il Collettore va connesso al ground del relè. Nei collegamenti realizzati con Fritzing, abbiamo usato il cavo verde per il collegamento del Collettore, mentre il cavo blu per la Base.

Abbiamo collegato anche un pulsante per resettare il sistema, collegandolo al pin RST (Reset) del Wemos. Se tutti i collegamenti sono stati eseguiti correttamente, quando inseriamo l’alimentatore nella presa Micro-USB, il led verde si accenderà per avvisare che arriva tensione. Spostiamo lo switch per permettere alla corrente di passare e alimentare il sistema. Potete provare a caricare lo sketch di prova per far accendere o spegnere un led (trovate un esempio QUI), ricordandovi che il pin che va programmato è il D2. Se tutto è andato a buon fine, il relè inizierà ad accendersi e spegnersi.

Per la parte elettrica dedicata al relè, abbiamo adoperato il pin del NO (normalmente aperto), in modo tale che l’interruttore sia nella posizione per non far passare corrente. Rammentate, inoltre, che il relè in queste immagine è come visto da sotto e non da sopra, immaginate cioè che sia rovesciato.



Per fare un esempio che ci semplifica la comprensione del lavoro che stiamo svolgendo, immaginate che dobbiamo dare corrente ad un motore, scegliendo di fornirle solo se il relè è attivo. La corrente dal generatore (in questo esempio, una batteria) entra nel COM e solo quando il relè sarà attivo, spostando il contatto sul NO, il motore si avvierà.

Codice

Iniziamo inserendo la libreria per configurare la ESP8266 per la connessione WiFi e la libreria mDNS per creare il mDNS a cui collegarci, poi l’SSID e la password della nostra WiFi di casa. Ricordiamo infine che la porta su cui lavorerà la ESP8266 è la porta 80 del protocollo http. Lo sketch completo lo potete scaricare a questo LINK.


#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>

const char* ssid = "nome_wifi";
const char* password = "password";

WiFiServer server(80);

Nel VOID SETUP diamo la direzione al pin digitale D2, impostando anche come spento il segnale, dopodiché avviamo prima il monitor seriale a 9600 e avviamo la connessione WiFi; finché non sarà connesso verrà stampato un punto ogni mezzo secondo.


pinMode(D2,OUTPUT); // Direzione del pin D2
digitalWrite(D2,LOW); // Disponiamo come spento il relè

Serial.begin(9600);
Serial.print("Connessione alla rete WiFi ");
Serial.println(ssid);

WiFi.begin(ssid, password);
Serial.print("Connessione");
while( WiFi.status() != WL_CONNECTED ){
delay(500);
Serial.print(".");
}

Una volta avvenuta la connessione, avviamo il “server” e creiamo il nostro mDNS chiamandolo “relay”, cosicché potremo accedere da web browser digitando http://relay.local/


Serial.println("Connessione WiFi avvenuta!");
Serial.print("Indirizzo IP: ");
Serial.println(WiFi.localIP() );

server.begin();

// Crea un nome con cui trovare facilmente la scheda in rete
if (MDNS.begin("relay")) {
Serial.print("RELAY online: ");
Serial.println("http://relay.local/");

}

Nel VOID LOOP aggiorneremo il mDNS e verificheremo se sia connesso o no un client, che dovrà inviare una richiesta (attiva o disattivare il relè nel nostro caso) che chiameremo “quero” e la impostiamo come stringa.


MDNS.update(); // Aggiorna il MDNS

// Verifica che sia connesso un client
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(10);
}

// Legge la richiesta
String quero = client.readStringUntil('\r');
Serial.println(quero);
client.flush();

La richiesta “quero” si svilupperà in due casi, ossia il caso in cui il relè sia spento e il caso in cui il relè sia spento. Avendo impostato da prima che il relè risulterà disattivato e che è stato scelto di configurarlo sul NO (normalmente aperto), vaglieremo questo primo caso e poi il caso in cui sia attivo. Creiamo una variabile intera “stato” per memorizzare lo stato in cui si trova il relè, dopodiché se questo cambierà, si aprirà una pagina che termina con “RELAY=ON” in cui viene inviato un segnale digitale per attivare il relè. Al contrario, quando lo stato passa da HIGH a LOW, si aprirà una pagina che termina con “RELAY=OFF” ed il relè sarà spento.


int stato = LOW;
if (quero.indexOf("/RELAY=ON") != -1) {
digitalWrite(D2, HIGH);
stato = HIGH;
}
if (quero.indexOf("/RELAY=OFF") != -1) {
digitalWrite(D2, LOW);
stato = LOW;
}

Passiamo alla creazione delle pagine dedicate all’accensione e spegnimento del relè. Ogni volta  che il valore di “stato” varia creiamo una pagina in cui apparirà un pulsante per attivare o disattivare il relè. Se il valore è LOW si crea la pagina con “REALY=OFF” contenente il pulsante “Attiva” per attivare il relè che, una volta premuto, cambierà pagina passando a quella contenente “REALY=ON” ed il relativo pulsante “Disattiva” per disattivare il relè e passare nuovamente alla pagina per attivarlo. Il client si disconnetterà e ricomincia da capo il loop.

</p>
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");

client.print("<h1>WI-FI RELAY: </h1>");

// se il valore è LOW...
if(stato == LOW) {
client.print("<h1 style='color:red'>OFF</h1>");
client.println("<a href=\"/RELAY=ON\"\"><button style='height:100px;width:200px;font-size:2vw'>Attiva </button></a>"); // il relè è spento e crea il pulsante Attiva

}

else {
client.print("<h1 style='color:green'>ON</h1>");
client.println("<a href=\"/RELAY=OFF\"\"><button style='height:100px;width:200px;font-size:2vw'>Disattiva </button></a><br />"); // il relè è acceso e crea il pulsante Disattiva
}

client.println("</html>");

delay(1);
Serial.println("Client disconnesso.");
Serial.println("");

Abbiamo collegato una ventola da 120mm a 12V al nostro interruttore WiFi, testandone il comportamento; ad ogni interazione tramite il web browser, potevamo accendere o spegnere la ventola.

Conclusioni

Il progetto dell’interruttore WiFi è un piccolo sistema economico che possiamo creare in casa per gestire tutti i dispositivi elettrici comodamente da pagina web. Nonostante non sia di enorme complessità, realizzarlo richiede pazienza e conoscenze di base ben sviluppate e quindi non è un progetto adatto a chi è alle prime armi. In tal caso, è possibile sostituire gran parte del progetto con un modulo relè già pronto e facile da connettere alla nostra dev-board, senza dover cambiare il codice dello progetto. Infine, per rendere più elegante il nostro progetto, abbiamo anche realizzato in stampa 3D un piccolo case che potete scaricare a questo LINK.