Collegare un Display OLED ad Arduino

Collegare un display OLED ad Arduino

Nella scatola delle meraviglie ho trovato un sacco di componenti ancora confezionati. Tra questi un piccolo display 128×64 pixel. In questo articolo quindi ti mostrerò come è possibile collegare un display OLED ad Arduino e stampare a “video” delle informazioni.

Presentazioni

Partiamo intanto dalla sigla OLED. OLED sta per (Organic Light-Emitting Diode) quindi diodo organico a emissione di luce. A differenza dei display LCD (magari scriverò un articolo anche per loro) che hanno bisogno di una fonte luminosa esterna per essere visibili, questi OLED sono in grado di emettere luce propria e quindi consentono la realizzazione di display dalle ridottissime dimensioni e peso, oltre che alla possibilità di essere piegati.

La maggior parte dei display OLED che troviamo in giro per Arduino, per essere comandati, sfruttano il driver SSD1306 e possono essere interfacciati tramite connessioni SPI e I2C (come nel mio caso).

Oltre alla risoluzione 128×64 esiste anche la versione 128×32 che naturalmente vedrà la parte del display dimezzata. Per quanto riguarda i colori, i più diffusi ed economici sono i modelli monocromatici, che presentato quindi una sola colorazione. Ma ve ne sono alcuni (tipo il mio) che presentano una striscia (quella in alto) del display di un colore e la restante parte dell’altro (generalmente giallo e blu). Questo è comodo per realizzare applicazioni che per esempio mostrano on top informazioni “statiche” come ad esempio la data o l’ora, lo stato della batteria, de segnale etc, lasciando la parte inferiore ai contenuti dell’applicazione.

OLED Display Pinout

La versione I2C del modulo OLED presenta solo quattro pin di connessione, due dedicati all’alimentazione VCC e GND e due per il clock e il bus dati (SCK, SDA). Questi pin dovranno essere collegati ai rispettivi pin I2C di Arduino, che come per l’interfaccia SPI, possono variare in base al modello. L’interfaccia I2C è anche conosciuta con il termine TwoWire (Connection), connessione a due fili.

DisplayArduino
GNDGND
VDD+5 V
SCKA5
SDAA4
Connessioni tra display e Arduino
OLED Display 128×64

Librerie necessarie

In giro esistono svariate librerie in grado di comunicare con il chip SSD1306, io ho deciso di utilizzare la libreria realizzata da Adafruit per i loro display, ma che funziona benissimo con quasi tutti i moduli dello stesso tipo.
La libreria in questione si chiama Adafruit SSD1306 e come al solito è possibile installarla dal library manager di Arduino. Per facilitare la gestione grafica Adafruit ha realizzato un’ulteriore libreria, chiamata GFX Library, grazie alla quale è possibile disegnare primitive geometriche come punti, linee, cerchi, etc… A tal proposito questo è il link alla documentazione ufficiale della libreria, dove potrai trovare un sacco di informazioni utili a riguardo.

Alcune premesse

Grazie a queste librerie è possibile stampare di tutto su questi display, come ad esempio disegnare immagini da file o realizzare animazioni. Ti basterà aprire uno degli esempi che verranno installati assieme alle librerie per scoprire quante cose si riescono a fare.

Questo articolo va inteso come semplice dimostrazione di come stampare a video del testo. Potrebbe essere la base per progetti futuri magari. Per fare questo devi sapere alcune cose base:
Il display va inizializzato passandogli il suo indirizzo I2C che generalmente è stampato dietro al modulo (0x3D o 0x3C in genere). Se non dovessi trovarlo, esistono degli sketch Arduino per eseguire lo scan dei dispositivi I2C collegati. Eccone uno qui.
All’interno del display ci si muove con un cursore su un sistema di coordinate, nella guida Adafruit troverai tutto.
Il display utilizza le funzioni print e println() per scrivere sul suo buffer interno, poi utilizza la funzione display() per mandare a video il contenuto del buffer. Il metodo clearDisplay() serve a ripulire l’intera area di stampa.
Anche nei display monocromatici bisogna settare un colore del testo e questo si fa con la funzione setTextColor() che accetta un uint16_t come valore per il colore. La libreria, al suo interno ha definito delle costanti e per comodità io utilizzerò WHITE anche se il display stampa in giallo o in blu. Non farà alcuna differenza.
Per la dimensione del testo esiste un comodo metodo chiamato setTextSize() che accetta uno o due parametri definendo il livello di ingrandimento del testo sugli assi X e Y. Di default è 1.

Codice

Nel codice, come sempre ampiamente commentato, ho creato delle funzioni per mostrarti diversi esempi di utilizzo. Guardando l’animazione sotto, potrai renderti conto di cosa intendo.

/*
   Collegare un display OLED ad Arduino

   Autore  : Andrea Lombardo
   Web     : http://www.lombardoandrea.com
   Post    : https://wp.me/p27dYH-OS
*/

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

/*
   Definisco le dimensioni del display, serviranno per creare l'istanza del display
   e magari riutilizzarle nel codice qualora dovessero servirmi queste informazioni
*/
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Creo istanza del display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);

void setup() {

  //Provo ad inizializzare il display all'indirizzo 0x3C (il tuo potrebbe essere diverso)
  if (!display.begin( SSD1306_SWITCHCAPVCC, 0x3C)) {
    /*
      Se non sono riuscito ad inizializzare il display
      creo un loop infinito ed impedisco al programma di andare avanti
    */
    while (true);
  }

  // Pulisco il buffer
  display.clearDisplay();

  // Applico la pulizia al display
  display.display();

  //I due passaggi qui sopra evitano di mostrare il logo adafruit all'avvio
}

void loop() {

  stampaTestoSemplice();

  delay(4000);

  stampaFixedHeader();

  delay(4000);

  stampaMotivational();

  delay(4000);

  stampaFixedHeaderAlt();

  delay(4000);

  stampaBig();

  delay(4000);

}


void stampaTestoSemplice() {

  //Ripulisco il buffer
  display.clearDisplay();

  //Setto il colore del testo a "bianco"
  display.setTextColor( WHITE);

  //Setto dimensione del testo
  display.setTextSize(2);

  //Sposto il cursore a metà altezza del display
  display.setCursor(0, SCREEN_HEIGHT / 2);

  //Stampo una scritta
  display.println(" A + B = C ");

  //La mando in stampa
  display.display();

}

//visto il periodo...
void stampaMotivational() {

  //Ripulisco il buffer
  display.clearDisplay();

  //Setto il colore del testo a "bianco"
  display.setTextColor( WHITE);

  //Setto dimensione del testo
  display.setTextSize(1);

  //Sposto il cursore a metà altezza del display
  display.setCursor(0, SCREEN_HEIGHT / 2);

  //Stampo una scritta
  display.println("     #CELAFAREMO");

  //La mando in stampa
  display.display();

}

void stampaFixedHeader() {

  //Ripulisco il buffer
  display.clearDisplay();

  //Creo un rettangolo alto 16px e largo quanto l'intera larghezza del display
  display.fillRect(0, 0, SCREEN_WIDTH, 16, WHITE);

  //Setto il colore del testo invertito
  display.setTextColor(BLACK, WHITE);

  //Setto dimensione del testo
  display.setTextSize(1);

  //Posiziono il cursore a X = 0 e Y = 4
  display.setCursor(0, 4);

  //Stampo l'esempio di quella che potrebbe essere una data / ora
  display.print(" GG/MM/YYYY     HH:mm");

  //Mando in stampa il display
  display.display();
}


void stampaFixedHeaderAlt() {

  //Ripulisco il buffer
  display.clearDisplay();

  /*
    Creo una linea di divisione a 16px (le coordinate partono da 0)
    dalla parte alta del display e per tutta la sua larghezza
  */
  display.drawLine(0, 15, SCREEN_WIDTH, 15, WHITE);

  //Setto il colore del testo
  display.setTextColor( WHITE);

  //Setto dimensione del testo
  display.setTextSize(1);

  //Posiziono il cursore a X = 0 e Y = 4
  display.setCursor(0, 4);

  //Stampo del testo
  display.print("  LOMBARDOANDREA.COM");

  //Mando in stampa il display
  display.display();
}

void stampaBig() {

  //Ripulisco il buffer
  display.clearDisplay();

  //Setto il colore del testo a "bianco"
  display.setTextColor( WHITE);

  //Setto dimensione del testo
  display.setTextSize(5);

  //Sposto il cursore 20 px a destra e ad un terzo dell'altezza del display
  display.setCursor(20, SCREEN_HEIGHT / 3);

  //Stampo una scritta
  display.println("BIG");

  //La mando in stampa
  display.display();

}
Demo delle funzioni presenti nel codice, le linee nere che vedi passare non sono visibili all’occhio umano, sono dovute alla frequenza di registrazione del video.

Schema

Lo schema di collegamento è di estrema facilità, ti ricordo solo di prestare attenzione al tuo modello di Arduino per identificare correttamente quali sono i pin SCK e SDA.

Schema per collegare un display OLED ad Arduino

A fine pagina trovi il link per scaricare il pacchetto con codici e schemi di collegamento. Come sempre ti ricordo che acquistando prodotti Amazon passando attraverso i link del mio sito, io percepisco una piccola commissione (parliamo di centesimi) in buoni regalo. Questi buoni sommati alle eventuali donazioni PayPal, servono a mantenere attivo il sito web e ad acquistare nuovi componenti.


Ricerche che hanno riportato a questa pagina:

Potrebbero interessarti anche...