Ho realizzato diversi sensori di temperatura basati su ESP8266 e DHT22, ormai ho il codice pronto, diversi alimentatori a 5V o 3.3V e posso fare un deploy molto veloce.
Partendo da un sensore che avevo “pronto” e funzionante in ufficio, ho voluto fare alcuni miglioramenti per fare un po’ di esperienza ed imparare qualche cosa. L’obbiettivo che mi sono prefissato è il seguente:
– aggiungere un display 16 x 2 collegato con I2C al micro, per visualizzare umidità e temperatura;
– implementare un client MQTT per visualizzare i dati di consumo elettrico sul display.
I classici display 16×2 sono controllabili attraverso un protocollo che prevede collegamento in parallelo di diverse linee dati. Si trovano alcune interessanti informazioni in questo link. Questo approccio era molto carino ai tempi dei PIC, dove le linee di I/O erano molte. I dispositivi ESP non hanno, a parte rare implementazioni che integrano dei moltiplicatori di I/O, tutte queste linee. Meglio ricorrere ad un convertitore I2C. Sono dispositivi a bassissimo costo che si possono facilmente reperire su Aliexpress o ebay ad un prezzo ridicolo ( da 1 a 2 euro).
Sono basati su PCF8574T, prodotto dalla NXP e catalogato come “Remote 8-bit I/O expander for I2C‑bus with interrupt”: volendone banalizzare il funzionamento, è possibile controllare e leggere lo stato della porte I/O attraverso opportuni comandi sul bus I2C.
Per farlo interagire con ESP8266, mi sono trovato molto bene con la libreria LCD_I2C, nella versione 2.3.0.
L’oggetto LCD è istanziato con poche righe di codice, ed è poi accessibile con delle funzioni per il posizionamento del cursore e la scrittura dei dati:int lcdColumns = 16;
int lcdRows = 2;
LCD_I2C lcd(0x27, 16, 2);
L’unica seccatura è quella di dovere caricare uno sketch dedicato alla scansione del BUS I2C per trovare l’indirizzo dell’expander. In rete si trovano diversi tutorial, completi di codice.
Le funzioni per il posizionamento del cursore e la scrittura dei dati sono molto semplici:lcd.setCursor(0, 0); // Or setting the cursor in the desired position.
lcd.print("T=");
lcd.print(tempe);
In poche parole, il collegamento del display al modulo ESP ha richiesto davvero pochissimo tempo.
La gestione di MQTT ha richiesto un minimo di attenzione in più, soprattutto per capire “come fare cosa” e gestire in modo opportuno funzioni e temporizzazioni. Il broker MQTT è residente su un server linux. Il sensore deve collegarsi al broker, iscriversi ad un canale e mostrare sul display il valore della potenza attualmente impiegata a casa. Non voglio reinventare la ruota, pertanto rimando ad una ricerca su Google il reperimento delle informazioni sul funzionamento del protocollo.
Per il corretto funzionamento della libreria, bisogna prevedere “a monte” la connessione del dispositivo alla rete, via cavo o via wireless, come mostrato da queste righe di codice:WiFiClient WFclient;
PubSubClient client(WFclient);
Una volta istanziato l’oggetto client, occorre connettersi al broker ed essere pronti a ricevere i messaggi pubblicati sul canale di interesse. La connessione è gestita direttamente nel loop, ed occorre assicurarsi che nel loop non ci siano inutili perdite di tempo:void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
Le funzioni accessorie sono la “reconnect”, che gestisce la connessione al broker (ampiamente documentata in rete).
Altra funzione importante la callback che si occupa della ricezione e della visualizzazione del messaggio MQTT:void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
lcd.setCursor(0, 1); // Or setting the cursor in the desired position.
lcd.print("P=");
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
lcd.print((char)payload[i]);
}
Serial.println();
}
Mettendo insieme ESP8266, codice, un level-shifter ed un paio di regolatori, sono riuscito a creare questo “mostro” che legge la temperatura da un sensore DHT, la mostra su un Display e, in calce a questo, mette il valore della potenza “consumata” da casa che gli arriva via MQTT. Come ogni progetto ci sono delle criticità che devo risolvere:
– il display fa schifo. Si tratta di uno dei tanti 16×2 che ho comperato alle fiere ai tempi dei PIC16F84, quando con 50.000 lire ti potevi comperare qualceh 16F84, un paio di 628 e una manciata di display per fare qualche progettino nerd. Per risparmiare prendevo sempre i “non retroilluminati”. Solo che adesso non si legge nulla. Devo mettere un nuovo 16×2 con retroilluminazione o passare ad un OLED.
– la board è alimentata da un trasformatore DIN da 8V, pertanto ho inserito un ponte, un elettrolitico ed un regolatore a 5V. Solo che il regolatore scalda e devo inserire un piccolo dissipatore per evitare che si surriscaldi. Appena lo smonto per mettere il nuovo display, faccio anche questa modifica.
Possibilità di miglioramento:
– inserire un pulsantino per gestire altre visualizzazioni: temperatura esterna, potenza assorbita dalla heat-pump, potenza prodotta dall’impianto FV etc.
– provare un display oled.