Controller

Possiamo gestire la multipresa con ESP32 realizzando un controller dotato di display touch-screen con ESP8266

Recentemente abbiamo realizzato una multipresa WiFi con ESP32 per gestire fino a 5 relè. Per poter interagire con essa ci eravamo affidati solamente al browser, con il quale accedere tramite PC o smartphone. Per rendere ancora più pratica e veloce la gestione abbiamo pensato di creare un controller dotato anch’esso di WiFi per connettersi alla medesima LAN e interagire con la multipresa.

Progetto

Il progetto vede adoperata una Wemos D1 Mini per sfruttarne la connettività WiFi e accedere alla rete locale, su cui è anche connessa la nostra multipresa con ESP32. Per gestire la Wemos adopereremo un display TFT con touch-screen per attivare e disattivare i singoli relè, creando 5 pulsanti a due stati per riconoscere la stato di attivazione o disattivazione. Abbiamo progettato il controller affinché sia dotato di una batteria che possa sopperire ad una eventuale mancanza di corrente e che possa fornire, quindi, una certa autonomia.

Componenti

Per il controller abbiamo pensato di adoperare una Wemos D1 Mini e di interfacciarla con il display TFT da 2.4″ touch-screen della LOLIN che abbiamo visto tempo fa in questo ARTICOLO. Il display in questione è una comodissima shield studiata proprio per la Wemos D1 Mini, azzerando così i collegamenti da fare e permettendoci di concentrarci di più sulla programmazione. Rammentiamo che questa shield è dotata di un chip ILITEK ILI9341, molto semplice da programmare.

Per alimentare sia la dev-board che il display abbiamo bisogno dei 3,7V, erogati sia dalla batteria a litio da 2000mAh e sia dal modulo di ricarica TP4056 con ingresso Micro-USB a 5V, ideale per essere adoperato con i caricabatterie degli smartphone. Il led rosso indica lo stato di carica, mentre un led blu si accenderà quando la batteria è carica.

Lista componenti su Amazon:

Lista componenti su Aliexpress:



Collegamenti

Il collegamenti del controller sono estremamente semplici e ridotti a quelli elettrici. Infatti, come descritto prima, trattandosi di una shield, la Wemos va applicata sul display, seguendo solamente le voci indicate sulle piedinature. Ad ogni modo, vi lasciamo la tabella con indicati i collegamenti:

Lolin Shield Display TFT 2.4"Wemos D1 MINI
TFT_LEDNC*(D1/D2/D3/D4)
TFT_RSTRST*(D1/D3/D4)
TFT_DCD8
MOSID7
MISOD6
SCKD5
TFT_CSD0
TS_CSD3*(D1/D2/D4)

Per i collegamenti elettrici, sul modulo sono presenti delle indicazioni precise: dove indicato B+ e B- andranno saldati, rispettivamente, il polo positivo e negativo della batteria; mentre, dove troviamo la scritte OUT+ e OUT- ovviamente i 3,3V che arrivano alla Wemos D1 Mini e il GND.

Controller

Codice

Nel codice che abbiamo scritto adopereremo le librerie ESP8266WiFi.h e ESP8266HTTPClient.h per attivare il WiFi della Wemos D1 Mini e effettuare una richiesta tramite protocollo HTTP alla multipresa, sulla quale abbiamo configurato un IP statico. Per la gestione del display TFT ci affidiamo alla libreria Adafruit_ILI9341.h e alla libreria Adafruit_GFX.h, mentre il touch-screen funzionerà con la libreria XPT2046_Touchscreen.h. Potete scaricare sia lo sketch che le librerie e altro ancora a questo LINK. Non dimentichiamo la libreria SPI.h.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include <Adafruit_ILI9341.h>
#include <Adafruit_GFX.h>
#include <XPT2046_Touchscreen.h>
#include <SPI.h>

Il passo successivo è definire i pin da adoperare per il display e il touch-screen, creare gli oggetto per programmare il display e il touch-screen, inserire SSID e password della rete WiFi e dichiarare una serie di variabili per controllare lo stato del pulsanti e dei tocchi.


#define TFT_CS D0
#define TFT_DC D8
#define TFT_RST -1

#define TS_CS D3

XPT2046_Touchscreen ts(TS_CS);

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

const char* ssid = "nome-rete";
const char* password = "password";

bool state1 = 0;
bool touch1 = 0;
bool state2 = 0;
bool touch2 = 0;
bool state3 = 0;
bool touch3 = 0;
bool state4 = 0;
bool touch4 = 0;
bool state5 = 0;
bool touch5 = 0;

Nel VOID SETUP avviamo il monitor seriale, avviamo il display e impostiamo la sua rotazione, facciamo collegare la Wemos alla rete WiFi di casa (richiederà qualche secondo di attesa), avviamo anche il touch-screen e, come per il display, impostiamo la rotazione, infine impostiamo uno sfondo nero e richiamiamo la funzione Home() per disegnare linee e contorni bianchi che faranno da cornice al display e ai pulsanti.


Serial.begin(115200);

tft.begin();
tft.setRotation(3);

WiFi.begin(ssid, password);

Serial.println("In attesa di connessione");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");

}

Serial.println("Connesso!");
delay(500);

ts.begin();
ts.setRotation(1);
Serial.println("Touch inizializzato!");
delay(500);
tft.fillScreen(ILI9341_BLACK);
Home();

Nel VOID LOOP verifichiamo se il touch-screen viene adoperato. Andiamo a impostare le coordinate in cui, se avviene un tocco, deve essere compiuta un’azione precisa. Impostiamo così 5 diverse coordinate corrispondenti alle aree in cui appaiono i nostri pulsanti a doppio stato.


if (ts.touched()) {
TS_Point p = ts.getPoint();
Serial.print("x = ");
Serial.print(p.x);
Serial.print("/ty = ");
Serial.print(p.y);
Serial.print("/tz = ");
Serial.println(p.z);</pre>
if (p.x > 665 && p.x < 1465 && p.y > 2650 && p.y < 3560) {
state1 = 0;
touch1 = !touch1;
}

if (p.x > 1770 && p.x < 2550 && p.y > 2710 && p.y < 3560) {
state2 = 0;
touch2 = !touch2;
}

if (p.x > 2860 && p.x < 3580 && p.y > 2550 && p.y < 3560) {
state3 = 0;
touch3 = !touch3;
}

if (p.x > 1130 && p.x < 1990 && p.y > 520 && p.y < 1510) {
state4 = 0;
touch4 = !touch4;
}

if (p.x > 2240 && p.x < 3070 && p.y > 520 && p.y < 1420) {
state5 = 0;
touch5 = !touch5;
}

} 



Proseguiamo nel VOID LOOP disegnando i 5 pulsanti. Per ogni pulsante disegniamo due stati, uno verde per lo stato ON e uno rosso per lo stato OFF. Andiamo ogni volta a verificare se c’è un cambiamento nello stato e nel tocco. Se cambia lo stato del tocco viene cambiamo il colore del pulsante e avviata una funzione per inviare la richiesta tramite protocollo HTTP. Riportiamo qui il codice del primo pulsante.


// RL01
if (state1 == 0 &amp;amp;&amp;amp; touch1 == 0) {
tft.fillRoundRect(15, 11, 88, 78, 5, ILI9341_RED);
tft.setCursor(43, 42);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("R01");
state1 = 1;
rl1_off();
delay(200);
}

if (state1 == 0 &amp;amp;&amp;amp; touch1 == 1) {
tft.fillRoundRect(15, 11, 88, 78, 5, ILI9341_GREEN);
tft.setCursor(43, 42);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("R01");
state1 = 1;
rl1_on();
delay(200);
}

Per l’invio della richiesta abbiamo dovuto creare 10 funzioni, ognuna corrispondete ad uno stato e ad uno specifico pulsante. In ognuna viene controllato se la connessione è ancora attiva, dopodiché si avviamo la connessione alla pagina HTTP appositamente creata sulla multipresa WiFi. In esempio, vi riportiamo solo funzione del primo pulsante che serve per attivare il relè della multipresa.


void rl1_on(){
if (WiFi.status() == WL_CONNECTED) {

HTTPClient http;

http.begin("http://192.168.1.153/Relay01/on");
int httpCode = http.GET();


http.end();

}

Basterà caricare lo sketch dalla IDE di Arduino, selezionando come scheda la LOLIN(WEMOS) D1 R2 & Mini. Una volta avviamo, premete uno dei pulsanti per verificare che la multipresa attivi o disattivi il relativo relè. Per abbellire maggiormente il nostro controller abbiamo realizzato in stampa 3D una scocca a forma di prisma a base triangolare e lo abbiamo posizionato sulla scrivania per gestire comodamente la multipresa.