Come usare un display OLED (SSD1306): testo, forme e grafica con Arduino
Come si usa un display OLED I2C da 0,96 pollici (SSD1306)? Collegamento e indirizzo I2C (0x3C), librerie Adafruit SSD1306 e GFX, testo, forme, valori dei sensori e bitmap, e codice MicroPython per ESP32 e Pico.
Anche se è grande poco più di un polpastrello, il display OLED da 0,96 pollici offre un'immagine nitida da 128×64 pixel ed è uno dei display preferiti nei progetti Arduino. A differenza degli LCD a caratteri non disegna solo lettere, ma anche linee, cerchi, icone, grafici e persino piccoli giochi. È ideale per smartwatch, stazioni meteo, telecomandi e strumenti di misura portatili. Quasi tutti questi display usano il chip di controllo SSD1306 e si collegano con soli due fili dati (I2C).

Cos'è un OLED e in cosa si differenzia da un LCD?
In un display OLED (Organic Light Emitting Diode) ogni pixel produce la propria luce; non c'è retroilluminazione. Per questo il nero è davvero nero, il contrasto è altissimo, lo schermo è nitido da ogni angolazione e consuma pochissimo quando gran parte dell'immagine è scura. I suoi 128×64 pixel permettono grafici, icone e disegni che gli LCD a caratteri non possono mostrare.
| Caratteristica | OLED da 0,96" | OLED da 0,91" | LCD 16x2 |
|---|---|---|---|
| Risoluzione | 128×64 pixel | 128×32 pixel | 16×2 caratteri |
| Grafica e icone | Sì | Sì | No (solo caratteri) |
| Retroilluminazione | Non serve | Non serve | Serve |
| Collegamento | I2C (esistono anche versioni SPI) | I2C | 4 fili con modulo I2C |
| Sotto il sole | Difficile da leggere | Difficile da leggere | Si legge meglio |
Caratteristiche tecniche
| Caratteristica | Valore |
|---|---|
| Chip di controllo | SSD1306 |
| Schermo | 0,96" 128×64 (la versione da 0,91" è 128×32) |
| Colore | Monocromatico: bianco, blu, oppure giallo in alto e blu in basso |
| Alimentazione | 3,3–5 V (regolatore sulla scheda) |
| Assorbimento | Circa 10–25 mA (in base ai pixel accesi) |
| Indirizzo I2C | 0x3C (0x3D su alcuni modelli) |
| Pin | GND, VCC, SCL, SDA |
Collegamento del display OLED
| Pin OLED | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| GND | GND | GND | GND |
| VCC | 5V o 3.3V | 3V3 | 3V3 |
| SCL | A5 | GPIO 22 | GP5 |
| SDA | A4 | GPIO 21 | GP4 |
Nei modelli bicolore le 16 righe superiori sono gialle e il resto blu; questi colori non si possono cambiare via software, quindi conviene progettare la parte alta come una barra del titolo. Se non sei sicuro dell'indirizzo del display, usa lo scanner I2C dell'articolo Usare un display LCD I2C.
Installare le librerie
- Apri il Gestore librerie dell'Arduino IDE e cerca Adafruit SSD1306.
- Quando durante l'installazione ti chiede delle dipendenze, scegli Install all per installare anche Adafruit GFX e Adafruit BusIO.
- Se vuoi, apri File > Esempi > Adafruit SSD1306 > ssd1306_128x64_i2c e provalo con l'indirizzo 0x3C.
Primo programma: scrivere un testo sul display
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4
5Adafruit_SSD1306 display(128, 64, &Wire, -1); // genişlik, yükseklik, I2C, reset pini yok / width, height, I2C, no reset pin
6
7void setup() {
8 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C adresi / I2C address
9 for (;;); // ekran bulunamadı / display not found
10 }
11 display.clearDisplay();
12 display.setTextColor(SSD1306_WHITE);
13 display.setTextSize(2); // 2 kat büyük / double size
14 display.setCursor(0, 0);
15 display.println(F("BlueGrays"));
16 display.setTextSize(1);
17 display.setCursor(0, 24);
18 display.println(F("OLED 128x64 hazir!"));
19 display.display(); // tamponu ekrana gönder / push the buffer to the screen
20}
21
22void loop() {
23}Disegnare forme: le funzioni di Adafruit GFX
| Funzione | Cosa disegna |
|---|---|
| drawPixel(x, y, colore) | Un singolo pixel |
| drawLine(x0, y0, x1, y1, colore) | Una linea |
| drawRect / fillRect(x, y, larghezza, altezza, colore) | Un rettangolo o rettangolo pieno |
| drawCircle / fillCircle(x, y, raggio, colore) | Un cerchio o cerchio pieno |
| drawRoundRect(x, y, larghezza, altezza, angolo, colore) | Un rettangolo con angoli arrotondati |
| drawTriangle(x0, y0, x1, y1, x2, y2, colore) | Un triangolo |
| drawBitmap(x, y, array, larghezza, altezza, colore) | Un'immagine (bitmap) |
L'angolo in alto a sinistra del display è (0, 0), quello in basso a destra (127, 63). Come colore si usa SSD1306_WHITE (acceso), SSD1306_BLACK (spento) o SSD1306_INVERSE (inverti).
Mostrare il valore di un sensore: un termometro in tempo reale
Il punto di forza dell'OLED è mostrare le misure con cifre grandi e grafici. Il codice qui sotto scrive in grande la temperatura letta da un DHT11 e mostra sotto l'umidità con una barra. Per il collegamento del sensore vedi Sensore di temperatura e umidità DHT11.
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4#include <DHT.h>
5
6Adafruit_SSD1306 display(128, 64, &Wire, -1);
7DHT dht(2, DHT11);
8
9void setup() {
10 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
11 display.setTextColor(SSD1306_WHITE);
12 dht.begin();
13}
14
15void loop() {
16 float t = dht.readTemperature();
17 float h = dht.readHumidity();
18 display.clearDisplay();
19 display.setTextSize(1);
20 display.setCursor(0, 0);
21 display.print(F("Sicaklik / Temp"));
22 display.setTextSize(3);
23 display.setCursor(0, 16);
24 display.print(t, 1);
25 display.print(F("C"));
26 display.drawRect(0, 52, 128, 10, SSD1306_WHITE); // nem çubuğu çerçevesi / humidity bar frame
27 display.fillRect(2, 54, (int)(h / 100.0 * 124), 6, SSD1306_WHITE); // nem oranı kadar dolu / filled by humidity
28 display.display();
29 delay(2000);
30}Disegnare la tua icona: le bitmap
Per mostrare un logo o un'icona trasformi l'immagine in un array di byte: ogni bit è un pixel. Strumenti di conversione come image2cpp trasformano direttamente un'immagine in bianco e nero in un array per Arduino. Le icone piccole si possono scrivere anche a mano; l'array 8×8 qui sotto disegna un cuore:
1const unsigned char PROGMEM heart[] = {
2 0b01100110,
3 0b11111111,
4 0b11111111,
5 0b11111111,
6 0b01111110,
7 0b00111100,
8 0b00011000,
9 0b00000000
10};
11
12// setup() ya da loop() içinde / inside setup() or loop()
13display.drawBitmap(60, 28, heart, 8, 8, SSD1306_WHITE);
14display.display();OLED con ESP32 e Raspberry Pi Pico
Sull'ESP32 funzionano lo stesso codice Arduino e le stesse librerie; i pin I2C sono GPIO 21 (SDA) e 22 (SCL). Poiché l'ESP32 ha molta memoria, animazioni e grafici aggiornati velocemente sono molto più fluidi. Sul Pico con MicroPython basta copiare sul Pico il file driver ssd1306.py (da micropython-lib):
1from machine import Pin, I2C
2import ssd1306 # ssd1306.py Pico'da olmalı / must be on the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5oled = ssd1306.SSD1306_I2C(128, 64, i2c) # adres varsayılan 0x3C / default address 0x3C
6
7oled.fill(0) # ekranı temizle / clear the screen
8oled.text("BlueGrays", 0, 0)
9oled.text("Pico + OLED", 0, 16)
10oled.rect(0, 40, 128, 20, 1) # çerçeve / frame
11oled.fill_rect(2, 42, 80, 16, 1) # dolu çubuk / filled bar
12oled.show() # ekrana gönder / push to the screenDurata del display e burn-in
I pixel OLED perdono luminosità con l'uso. Se la stessa immagine resta sullo schermo invariata per mesi, sui pixel accesi più spesso può formarsi un'ombra leggera. Per evitarlo, spegni il display quando non serve (display.ssd1306_command(SSD1306_DISPLAYOFF)), abbassa la luminosità (display.dim(true)), sposta ogni tanto di qualche pixel i contenuti fissi, oppure accendi il display solo quando c'è qualcuno vicino con un sensore PIR.
Idee di progetti con il display OLED
- Mini stazione meteo: mostra temperatura, umidità e pressione con le icone.
- Giochi tascabili: gioca a Pong o al T-Rex con pulsanti o con un joystick.
- Display meteo: mostra con le icone il meteo scaricato da Internet con un ESP32.
- Display per sensore di parcheggio: mostra come numero e barra la distanza misurata da un HC-SR04.
- Plotter di segnali: disegna i valori di analogRead come un grafico che scorre.
- Orologio da scrivania: riunisci su un solo display l'ora da Internet, la data e il meteo del giorno.
Errori comuni e come risolverli
- Il display resta vuoto: non viene chiamato display.display(), l'indirizzo è sbagliato (0x3D invece di 0x3C) oppure SDA e SCL sono invertiti.
- "SSD1306 allocation failed": l'Uno ha finito la RAM; il buffer di un display 128×64 occupa 1 KB. Scrivi i testi con F(), sposta gli array grandi in PROGMEM o usa la libreria U8g2, più parsimoniosa.
- L'immagine è rovinata o a metà: un display 128×32 è stato dichiarato come 128×64 (o viceversa); indica la dimensione giusta nel codice.
- L'immagine è capovolta: ruotala di 180 gradi con display.setRotation(2).
- Invertire VCC e GND: distrugge il display per sempre; leggi le scritte dei pin prima di collegare.
- Blocchi casuali: fili I2C lunghi e allentati; usa fili corti e, se serve, abbassa la velocità dell'I2C.
Un display OLED è il modo più economico per dare al tuo progetto un aspetto professionale. Se devi mostrare solo numeri, un display a 7 segmenti è una buona scelta, e per testi da leggere al sole un LCD I2C. Nell'app BlueGrays trovi i giochi Pong e T-Rex su OLED, un display meteo con ESP32, un sensore di parcheggio e un registratore di temperatura, con schemi e codice.
Domande frequenti
L'indirizzo del mio display OLED è 0x3C o 0x3D?
La maggior parte dei moduli OLED 128×64 usa l'indirizzo 0x3C; alcuni diventano 0x3D con una resistenza sul retro della scheda. Se sul retro c'è scritto "0x78", è la notazione a 8 bit e corrisponde a 0x3C nel codice. Per esserne sicuro, esegui lo scanner I2C.
Il display OLED funziona a 5 V?
La maggior parte dei moduli SSD1306 ha un regolatore sulla scheda, quindi si può alimentare a 3,3 V o 5 V e collegare direttamente ad Arduino Uno. Su ESP32 e Pico, alimentare il modulo dal pin 3V3 mantiene a 3,3 V anche le linee I2C.
Perché compare l'errore "SSD1306 allocation failed"?
La libreria vuole riservare un buffer immagine da 1 KB per un display 128×64; se i 2 KB di RAM di Arduino Uno sono occupati da altre variabili, non c'è spazio. Scrivi i testi fissi con la macro F(), sposta gli array grandi in PROGMEM o usa la libreria U8g2, che disegna una pagina alla volta.
Un display OLED può mostrare le lettere accentate?
Il font predefinito di Adafruit GFX non contiene lettere accentate in UTF-8 come à, è o ù. La libreria U8g2 può mostrarle grazie al supporto UTF-8 e a font con set di caratteri estesi; con Adafruit GFX devi creare un font personalizzato o disegnare le lettere come bitmap.
Esistono display OLED a colori?
I display SSD1306 sono monocromatici; anche nei modelli bicolore i colori sono fissi. Per immagini a colori si usano OLED a colori con driver SSD1331 o SSD1351, oppure display TFT a colori come l'ST7789 e l'ILI9341.
Posso collegare due display OLED allo stesso Arduino?
Sì. Se cambi l'indirizzo di un display in 0x3D spostando la resistenza sul retro, i due possono condividere lo stesso bus I2C. Se l'indirizzo non si può cambiare, su ESP32 e Pico puoi usare un secondo bus I2C o aggiungere un multiplexer I2C come il TCA9548A.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
Gioco Pong - SSD1306
Il classico gioco del Pong costruito con Arduino e display OLED SSD1306, dotato di un'intelligenza artificiale (CPU) autonoma che segue istantaneamente i movimenti della palla e reagisce in base alla

OLED T-Rex Run: Gioco del dinosauro con Arduino 🦖
Abbiamo portato il leggendario gioco dei dinosauri "No Internet" su hardware! Trasformate l'emozione del gioco retrò in una mini console fisica con questo progetto che abbiamo sviluppato utilizzando A

ESP32 HTTPClient + API meteo (con display OLED SSD1306)
In questo progetto, utilizzando l'ESP32, effettuiamo una chiamata REST all'API meteo (wttr.in) tramite Internet utilizzando `HTTPClient.h`. A differenza della precedente versione con LCD I2C, qui utilizziamo un display OLED SSD1306 (128×64), che consente di utilizzare caratteri di grandi dimensioni, icone vettoriali e una ricca presentazione visiva su un unico schermo. Per le condizioni meteorologiche, 7 diverse icone vettoriali (soleggiato, parzialmente nuvoloso, nuvoloso, piovoso, nevoso, temp

ESP32 Deep Sleep — Risparmio della batteria (OLED + RTC + contatore RAM)
La modalità Deep Sleep dell'ESP32 riduce il consumo di corrente a circa 10 µA spegnendo la CPU e la maggior parte dei dispositivi periferici ed è di fondamentale importanza per i dispositivi IoT alimentati a batteria. In questo progetto utilizziamo tre diverse fonti di risveglio: il timer (15 secondi), un pin esterno (EXT0 — pulsante GPIO 33) e il sensore tattile (T0/GPIO 4). Le variabili contrassegnate con `RTC_DATA_ATTR` vengono preservate durante la modalità Deep Sleep: il contatore di avvio,

Contatore di raka'at per la preghiera con ESP32 (HC-SR04 + OLED SSD1306 + 2 pulsanti)
Vi capita mai di dimenticare a che raka'at siete mentre pregate? Questo progetto realizza un contatore di raka'at da posizionare accanto al tappetino da preghiera, che conta le prostrazioni quando avvicinate la mano. Il sensore di distanza a ultrasuoni HC-SR04 rileva l'avvicinamento della mano, mentre il display OLED SSD1306 mostra il numero di rak'ah; tramite due pulsanti è possibile selezionare 2/3/4 rak'ah e azzerare il conteggio. Grazie a una macchina a stati intelligente, è presente un debo

Lampada con miscelatore di colori ESP32 (3 potenziometri + LED RGB + OLED)
Una lampada mista colori intelligente che, ruotando i 3 potenziometri con l'ESP32, permette di miscelare il colore desiderato! Man mano che si ruotano i potenziometri rosso, verde e blu, il LED RGB a catodo comune cambia colore istantaneamente. Sul display OLED SSD1306 vengono visualizzati in tempo reale i valori compresi tra 0 e 255 per ogni colore, le barre di riempimento visive e il codice colore HEX (#FF8040, ad esempio). Un mini studio di colore professionale: insegna la teoria dei colori R

Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)
Trasforma il tuo corridoio, bagno o dispensa in illuminazione intelligente con ESP32! Utilizzando un sensore di movimento PIR, un sensore di luce LDR e un modulo relè, costruiamo lo scenario classico "la luce si accende quando viene rilevato movimento al buio" — se l'ambiente è già luminoso, il movimento NON attiva la luce, risparmiando energia durante il giorno. La luce rimane accesa per 30 secondi; se il movimento continua, il timer si azzera e la luce rimane accesa più a lungo. Il display OLE

Data Logger di Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
Costruisci un data logger di temperatura con timestamp usando ESP32! Leggi temperatura/umidità dal DHT22 ogni 10 secondi, ottieni l'ora reale dal DS1307 RTC e registra su scheda microSD in formato CSV. L'OLED mostra dal vivo temperatura (font grande), percentuale di umidità, timestamp e contatore di log. Il file `/temp_log.csv` sulla scheda SD si apre in Excel, Google Sheets o Python pandas per l'analisi — perfetto per il monitoraggio di serre, tracciamento della temperatura domestica, raccolta
Altri articoli
Impara a collegare ad Arduino un display OLED piccolo ma nitidissimo, a disegnare testo e forme, a mostrare i valori dei sensori con una barra, ad aggiungere le tue icone e a far durare di più il display.

