Natale

Adopereremo una ESP8266 (NodeMCU) per collegarci un display da 1,8″, integrato da lettore di MicroSD, per creare una decorazione per l’Albero di Natale e mostrare delle fotografie

Presentiamo un progetto tutto natalizio, utilizzando un NodeMCU con chip ESP8266 per creare una galleria fotografica da piazzare come decorazione sul nostro Albero di Natale. Per realizzare questo progetto, piccolo e semplice, ci servirà un display da 1,8″ che conosciamo già (LINK) e una MicroSD sulla quale caricare i nostri file.

Progetto

Vista l’aria natalizia non potevamo esimerci da realizzare un progetto di piccole dimensioni, ma molto carino, da esporre come decorazione sul nostro Albero di Natale. Quello che faremo è creare una palla decorativa, che poi sarà in realtà un cilindro, dentro al quale porremo un NodeMCU che leggerà dei file in formato bitmap da una MicroSD, per poi stamparli sul Display da 1,8″ ogni 10 secondi circa. In realtà, questo non è un progetto del tutto nuovo, ma ci siamo ispirati ad un nostro precedente progetto che troverete a questo LINK.

Componenti

Come già ripetuto, per il nostro addobbo natalizio tecnologico ci siamo affidati al NodeMCU dotato di chip ESP-12. Ad esso abbiamo collegato un display TFT da 1.8″ con chip ST7735, che integra un lettore di MicroSD. Per alimentare il progetto abbiamo utilizzato una batteria 18650 da 3,7V e 5800mAh, ma potete sostituirla con una batteria da 9V, più reperibile in commercio. Per aprire e chiudere il circuito, useremo uno switch. In ultimo, ma non per importanza, una MicroSD da 1GB che avevamo già in nostro possesso, ma che potete reperire in taglie più grandi.



Abbiamo disposto tutte queste componenti all’interno di una scocca che abbiamo realizzato noi con la nostra stampante 3D; i file li potete scaricare a questo LINK.

Vi preghiamo di adoperare le componenti riportare, perché la scocca su cui va inserito tutto è stata tarata sulle misure uniche dei componenti riportati in elenco. Noi abbiamo utilizzato i jumper per tutti i collegamenti, saldando qua e là dove possibie, ma vi consigliamo, se avete maggiore esperienza, di adoperare una scheda forata e saldare ogni componente direttamente su di essa:



Collegamenti

Partiamo dicendo  che il Display TFT e il lettore di MicroSD adoperano gli stessi pin MOSI, MISO e SCLK, mentre i pin CS sono differenti. Ricordiamo pure che i pin con la dicitura 3.3V funzionano anche per ricevere corrente alla medesima tensione, quindi collegheremo il polo positivo della batteria al pin 3.3V , quello negativo al GND.

Natale

Sebbene apparentemente siano semplici, tali collegamenti richiedono particolare attenzione. Lo switch lo abbiamo posto ad interrompere il passaggio di corrente dalla batteria al NodeMCU, il quale poi alimenterà il Display TFT che lavora regolarmente con i 3,3V.

Alcuni pin, come detto sopra, sono condividi tra display e card reader: per questa ragione prestate molta attenzione. Vi riportiamo in tabella i collegamenti nel dettaglio:

TFT Dispaly 1.8" SPIESP8266
VCC3.3V
GNDGND
CLK/SCKD5
SDA/MOSID7
RS/DCD4
RSTD0
CSD8
SD_CSD2
SD_MOSID7
SD_MISOD6
SD_SCKD5



Codice

Per permettere al nostro progetto di funzionare correttamente dovremo adoperare la libreria Adafruit_GFX-Master,  la libreria ST7735 per il display, mentre le librerie Adafruit_SPIFlash, SdFat e  la libreria Adafruit-ImageReader per interagira con la MicroSD. Prima di procedere, però, c’è una cosa da raccomandarvi, ovvero per l’utilizzo di file BITMAP per questo progetto sarà meglio se già nella risoluzione del display che adoperiamo (128×160). Potete scaricare lo sketch QUI.


#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SdFat.h> // SD card FAT filesystem
#include <Adafruit_SPIFlash.h> // SPI / QSPI flash library
#include <Adafruit_ImageReader.h> // Funzione per la lettura dell'immagine

Passiamo poi definendo i pin a cui è connesso il display e il card reader, predisponendo poi la MicroSD all’utilizzo, leggendone il file system e creando gli oggetti SD e reader per la lettura dei file sulla MicroSD.


#define USE_SD_CARD

#define TFT_CS D8
#define TFT_RST D0
#define TFT_DC D1

#define SD_CS D2 // Pin digitale CS SD-Card

#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

#if defined(USE_SD_CARD)
SdFat SD; // File system SD Card
Adafruit_ImageReader reader(SD); // oggetto da creare per la lettura
#else
// SPI o QSPI flash filesystem
#if defined(__SAMD51__) || defined(NRF52840_XXAA)
Adafruit_FlashTransport_QSPI flashTransport(PIN_QSPI_SCK, PIN_QSPI_CS,
PIN_QSPI_IO0, PIN_QSPI_IO1, PIN_QSPI_IO2, PIN_QSPI_IO3);
#else
#if (SPI_INTERFACES_COUNT == 1)
Adafruit_FlashTransport_SPI flashTransport(SS, &amp;SPI);
#else
Adafruit_FlashTransport_SPI flashTransport(SS1, &amp;SPI1);
#endif
#endif
Adafruit_SPIFlash flash(&amp;flashTransport);
FatFileSystem filesys;
Adafruit_ImageReader reader(filesys);
#endif

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

Adafruit_Image img;
int32_t width = 0, height = 0;

Nel VOID SETUP procediamo avviando il monitor seriale, inizializziamo il display predisponendolo alla lettura delle foto, infine inizializziamo il card reader leggendo se è presenta una MicroSD o se ci sono problemi nella lettura della stessa.


ImageReturnCode stat; // Stato dalle funzioni di lettura delle immagini

Serial.begin(9600);

tft.initR(INITR_BLACKTAB);
tft.setRotation(2);
tft.fillScreen(ST77XX_BLACK);

Serial.print(F("Initializing filesystem..."));

#if defined(USE_SD_CARD)
//La scheda SD è piuttosto semplice, una sola chiamata...
if(!SD.begin(SD_CS, SD_SCK_MHZ(10))) {
Serial.println(F("SD begin() failed"));
for(;;); // Errore fatale, non continuare
}
#else
// Il flash SPI o QSPI richiede due passaggi, uno per accedere alla stessa memoria flash
// il secondo per accedere al file system della memoria
if(!flash.begin()) {
Serial.println(F("flash begin() failed"));
for(;;);
}
if(!filesys.begin(&amp;flash)) {
Serial.println(F("filesys begin() failed"));
for(;;);
}
#endif
Serial.println(F("OK!"));

tft.setRotation(2); // Ruoto il display
tft.fillScreen(BLUE); // Coloro di blu il display

delay(2000);

tft.fillScreen(0); // Pulisco lo schermo

Per ultimo, nel VOID LOOP leggiamo i file presenti e li stampiamo a intervalli regolari di 10 secondi, usando la funzione img.draw() per definire il display e le dimensioni.


reader.drawBMP("/01.bmp", tft, 0, 0); // Leggo l'immagine BMP
delay (1000);
img.draw(tft,160,128); // Scrivo l'immagine BMP con risoluzione 240x320
delay(10000);

reader.drawBMP("/02.bmp", tft, 0, 0);
delay (1000);
img.draw(tft,160,128);
delay(10000);

reader.drawBMP("/03.bmp", tft, 0, 0);
delay (1000);
img.draw(tft,160,128);
delay(10000);

reader.drawBMP("/04.bmp", tft, 0, 0);
delay (1000);
img.draw(tft,160,128);
delay(10000);

Caricate correttamente lo sketch sul NodeMCU e quando avrete assemblato tutto, potrete chiudere la scocca usando 4 comunissime viti dal diametro da 2,5mm, le stesse usante per fissare le ventole del PC. Infine, potete riporre la vostra decorazione sul vostro Albero di Natale.