In questa guida vedremo come utilizzare un display OLED con l’Arduino UNO. Il display che utilizzeremo in questo articolo ha una risoluzione di 128×64 pixel, 1 solo colore (bianco e nero). I display OLED ci permettono di visualizzare informazioni per i nostri progetti, come ad esempio temperatura, pressione, tensione ecc. La particolarità di questi display è quella di avere un ottima visibilità e di avere un consumo molto basso. (Strettamente dipendente dai pixel che utilizzeremo: più pixel accesi = più consumo.)
Materiale hardware
Arduino Uno
Cavi Dupont
Display OLED
Breadboard
Materiale Software
- Arduino IDE
- Libreria Adafruit SSD1306
- Libreria Adafruit GFX Library
- Notepad ++
Procedura
Colleghiamo il display all’Arduino UNO come da immagine:
Adesso bisogna scoprire l’indirizzo I2C del display, per farlo ci viene in aiuto un piccolo codice chiamato I2C scanner. Esso cercherà gli indirizzi I2C dei dispositivi connessi tramite I2C all’Arduino e li invierà tramite seriale. Apriamo l’Arduino IDE ed incolliamo e carichiamo il codice dell’I2C scanner:
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }
Una volta terminato apriamo il monitor seriale dove ci verrà visualizzato un risultato del genere:
I2C Scanner Scanning... I2C device found at address 0x3C ! done
In questo caso, l’indirizzo del display è “0x3C”. Prendiamone nota e proseguiamo con il prossimo passo.
Installiamo le librerie necessarie andando su sketch > #include libreria> gestione librerie. Nel box di ricerca cerchiamo “adafruit GFX“, clicchiamo sul risultato “Adafruit GFX library” e installiamo l’ultima versione. Ripetiamo l’operazione per la libreria “Adafruit SSD1306” sempre installando l’ultima versione.
Ora sarà necessario impostare alla libreria Adafruit SSD1306 il tipo di display che stiamo utilizzando (con quale risoluzione), per assicurare il corretto funzionamento del display. Per farlo abbiamo bisogno di aprire la cartella in cui sono salvate le librerie di Arduino. In questa guida indicheremo il percorso da raggiungere su Windows: apriamo l’esplora file e andiamo in documenti > arduino > libraries.
Una volta arrivati alla lista di librerie apriamo la cartella “Adafruit_SSD1306” e apriamo il file “Adafruit_SSD1306.h” con Notepad++. Raggiungiamo la riga 73, dove vedremo le seguenti righe:
// #define SSD1306_128_64 #define SSD1306_128_32 // #define SSD1306_96_16
Di default la risoluzione abilitata è quella di 128×32. Per modificarla in quella utilizzata dal display (128×64) sarà necessario commentare la riga “#define SSD1306_128_32” e rimuovere il commento alla riga “// #define SSD1306_128_64” in questo modo:
#define SSD1306_128_64 // #define SSD1306_128_32 // #define SSD1306_96_16
Ora torniamo all’IDE ed incolliamo e carichiamo il seguente codice modificando l’indirizzo I2C annotato in precedenza . Caricando questo codice sull’Arduino, verrà visualizzata sul display la scritta “LORENZOCASABURO.IT” per modificarla ci basterà modificare la stringa all’interno dell’istruzione “display.println(“LORENZOCASABURO.IT”);“.
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Impostare l'indirizzo i2c annotato in precedenza display.clearDisplay(); //Pulisce il buffer da inviare al display display.setTextSize(1); //Imposta la grandezza del testo display.setTextColor(WHITE); //Imposta il colore del testo (Solo bianco) display.setCursor(0,0); //Imposta la posizione del cursore (Larghezza,Altezza) display.println("LORENZOCASABURO.IT"); //Stringa da visualizzare display.display(); //Invia il buffer da visualizzare al display } void loop() { }
Conclusione
Il testo viene creato nella posizione in cui si trova il cursore, in questo caso è impostato sulle coordinate 0 lunghezza e 0 altezza del display. Per spostarlo e quindi posizionare il testo altrove o aggiungerne degli altri, è necessario modificare l’istruzione “display.setCursor(0,0);” modificando il primo 0 il cursore verrà spostato attraverso l’asse x (lunghezza), il secondo 0 invece sposterà il cursore attraverso l’asse y (altezza). Il punto 0,0 si troverà in alto a sinistra del display.
Inoltre è possibile modificare la grandezza del testo cambiando il valore dell’istruzione “display.setTextSize(1);” modificando il valore 1 la grandezza del testo cambierà.
Per visualizzare un’altra stringa sul display ci basta muovere il cursore e ripetere l’istruzione di stampa. Come da esempio:
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); //Crea l'oggetto display #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Impostare l'indirizzo i2c annotato in precedenza display.clearDisplay(); //Pulisce il buffer da inviare al display display.setTextSize(1); //Imposta la grandezza del testo display.setTextColor(WHITE); //Imposta il colore del testo (Solo bianco) //Riga 1 display.setCursor(0,0); //Imposta la posizione del cursore (Larghezza,Altezza) display.println("LORENZOCASABURO.IT"); //Stringa da visualizzare //Riga 2 display.setCursor(0,10); //Sposta il cursore di 10 pixel piu in basso per non sovrapporre le stringhe display.println("GUIDA DISPLAY OLED"); display.display(); //Invia il buffer da visualizzare al display } void loop() { }