Composants · 5 min de lecture

Utiliser un écran OLED (SSD1306) : texte, formes et graphiques avec Arduino

Comment utiliser un écran OLED I2C de 0,96 pouce (SSD1306) ? Câblage et adresse I2C (0x3C), bibliothèques Adafruit SSD1306 et GFX, texte, formes, valeurs de capteurs et images bitmap, et code MicroPython pour ESP32 et Pico.

À peine plus grand qu'un bout de doigt, l'écran OLED de 0,96 pouce affiche pourtant une image nette de 128×64 pixels et compte parmi les écrans préférés des projets Arduino. Contrairement aux LCD à caractères, il ne dessine pas que des lettres : aussi des lignes, des cercles, des icônes, des graphiques et même de petits jeux. Il est idéal pour les montres connectées, les stations météo, les télécommandes et les appareils de mesure portables. Presque tous ces écrans utilisent la puce de commande SSD1306 et se branchent avec seulement deux fils de données (I2C).

Écran OLED I2C 0,96 pouce SSD1306
Écran OLED I2C de 0,96 pouce : 128×64 pixels, contrôleur SSD1306 et seulement 4 broches (GND, VCC, SCL, SDA).

Qu'est-ce qu'un OLED et en quoi diffère-t-il d'un LCD ?

Dans un écran OLED (Organic Light Emitting Diode), chaque pixel produit sa propre lumière ; il n'y a pas de rétroéclairage. Le noir est donc vraiment noir, le contraste très élevé, l'écran reste net sous tous les angles et il consomme très peu quand l'image est surtout sombre. Ses 128×64 pixels permettent graphiques, icônes et dessins impossibles sur un LCD à caractères.

CaractéristiqueOLED 0,96"OLED 0,91"LCD 16x2
Résolution128×64 pixels128×32 pixels16×2 caractères
Graphiques et icônesOuiOuiNon (caractères seulement)
RétroéclairageInutileInutileNécessaire
ConnexionI2C (versions SPI aussi)I2C4 fils avec module I2C
En plein soleilDifficile à lireDifficile à lirePlus lisible

Caractéristiques techniques

CaractéristiqueValeur
Puce de commandeSSD1306
Écran0,96" 128×64 (la version 0,91" fait 128×32)
CouleurMonochrome : blanc, bleu, ou jaune en haut et bleu en bas
Alimentation3,3–5 V (régulateur sur la carte)
ConsommationEnviron 10–25 mA (selon le nombre de pixels allumés)
Adresse I2C0x3C (0x3D sur certains modèles)
BrochesGND, VCC, SCL, SDA

Câblage de l'écran OLED

Broche OLEDArduino UnoESP32Raspberry Pi Pico
GNDGNDGNDGND
VCC5V ou 3.3V3V33V3
SCLA5GPIO 22GP5
SDAA4GPIO 21GP4
Sur certains modules OLED, l'ordre des broches est VCC, GND, sur d'autres GND, VCC. Lis toujours les inscriptions de la carte avant de brancher : inverser l'alimentation détruit l'écran instantanément.

Sur les modèles bicolores, les 16 lignes du haut s'affichent en jaune et le reste en bleu ; ces couleurs ne se changent pas par logiciel, il est donc judicieux de concevoir la partie haute comme une barre de titre. Si tu n'es pas sûr de l'adresse de l'écran, utilise le scanner I2C de l'article Utiliser un écran LCD I2C.

Installer les bibliothèques

  1. Ouvre le gestionnaire de bibliothèques de l'Arduino IDE et cherche Adafruit SSD1306.
  2. Quand l'installation propose les dépendances, choisis Install all pour installer aussi Adafruit GFX et Adafruit BusIO.
  3. Si tu veux, ouvre Fichier > Exemples > Adafruit SSD1306 > ssd1306_128x64_i2c et essaie-le avec l'adresse 0x3C.

Premier programme : écrire du texte à l'écran

Arduino (C++)
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}
La bibliothèque dessine d'abord tout dans un tampon en mémoire ; pour le voir à l'écran, il faut appeler display.display(). Oublier cette commande est la cause la plus fréquente d'un « écran vide ». Sur l'Uno, placer les textes fixes dans F("...") économise aussi de la RAM.

Dessiner des formes : les fonctions d'Adafruit GFX

FonctionCe qu'elle dessine
drawPixel(x, y, couleur)Un pixel
drawLine(x0, y0, x1, y1, couleur)Une ligne
drawRect / fillRect(x, y, largeur, hauteur, couleur)Un rectangle ou rectangle plein
drawCircle / fillCircle(x, y, rayon, couleur)Un cercle ou disque
drawRoundRect(x, y, largeur, hauteur, coin, couleur)Un rectangle aux coins arrondis
drawTriangle(x0, y0, x1, y1, x2, y2, couleur)Un triangle
drawBitmap(x, y, tableau, largeur, hauteur, couleur)Une image (bitmap)

Le coin supérieur gauche de l'écran est (0, 0), le coin inférieur droit (127, 63). Comme couleur, on utilise SSD1306_WHITE (allumé), SSD1306_BLACK (éteint) ou SSD1306_INVERSE (inverser).

Afficher une valeur de capteur : un thermomètre en direct

La force de l'OLED, c'est d'afficher des mesures en grands chiffres et en graphiques. Le code ci-dessous écrit en gros la température lue sur un DHT11 et affiche l'humidité en dessous sous forme de barre. Pour le branchement du capteur, vois Capteur de température et d'humidité DHT11.

Arduino (C++)
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}

Dessiner ta propre icône : les bitmaps

Pour afficher un logo ou une icône, on convertit l'image en tableau d'octets : chaque bit est un pixel. Des outils de conversion comme image2cpp transforment directement une image noir et blanc en tableau Arduino. Tu peux aussi écrire les petites icônes à la main ; le tableau 8×8 ci-dessous dessine un cœur :

Arduino (C++)
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();

L'OLED avec l'ESP32 et le Raspberry Pi Pico

Sur l'ESP32, le même code Arduino et les mêmes bibliothèques fonctionnent ; les broches I2C sont GPIO 21 (SDA) et 22 (SCL). Comme l'ESP32 a beaucoup de mémoire, les animations et les graphiques rafraîchis rapidement sont bien plus fluides. Sur le Pico en MicroPython, il suffit de copier le fichier pilote ssd1306.py (de micropython-lib) sur le Pico :

MicroPython
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 screen

Durée de vie et marquage (burn-in)

Les pixels OLED perdent de la luminosité avec l'usage. Si la même image reste affichée sans changement pendant des mois, une ombre légère peut apparaître sur les pixels les plus souvent allumés. Pour l'éviter, éteins l'écran quand il ne sert pas (display.ssd1306_command(SSD1306_DISPLAYOFF)), baisse la luminosité (display.dim(true)), décale de temps en temps le contenu fixe de quelques pixels, ou n'allume l'écran que lorsque quelqu'un est à proximité grâce à un capteur PIR.

Idées de projets avec un écran OLED

  • Mini-station météo : affiche température, humidité et pression avec des icônes.
  • Jeux de poche : joue à Pong ou au T-Rex avec des boutons ou un joystick.
  • Écran météo : affiche avec des icônes la météo récupérée sur Internet par un ESP32.
  • Afficheur de radar de recul : montre en chiffres et en barre la distance mesurée par un HC-SR04.
  • Traceur de signal : dessine les valeurs d'analogRead sous forme de courbe défilante.
  • Horloge de bureau : réunis l'heure Internet, la date et la météo du jour sur un seul écran.

Erreurs fréquentes et solutions

  • L'écran reste vide : display.display() n'est pas appelé, l'adresse est fausse (0x3D au lieu de 0x3C), ou SDA et SCL sont inversés.
  • « SSD1306 allocation failed » : l'Uno manque de RAM ; le tampon d'un écran 128×64 occupe 1 Ko. Écris les textes avec F(), place les grands tableaux en PROGMEM ou utilise la bibliothèque U8g2, plus économe.
  • L'image est déformée ou à moitié affichée : un écran 128×32 a été déclaré en 128×64 (ou l'inverse) ; indique la bonne taille dans le code.
  • L'image est à l'envers : fais-la pivoter de 180 degrés avec display.setRotation(2).
  • Inverser VCC et GND : cela détruit l'écran définitivement ; lis les inscriptions des broches avant de brancher.
  • Blocages aléatoires : fils I2C longs et mal fixés ; garde des fils courts et baisse la vitesse I2C si besoin.

Un écran OLED est le moyen le moins cher de donner une allure professionnelle à ton projet. Pour afficher seulement des nombres, un afficheur 7 segments est un bon choix, et pour du texte lisible au soleil, un LCD I2C. Dans l'application BlueGrays, tu trouveras des jeux Pong et T-Rex sur OLED, un écran météo ESP32, un radar de recul et un enregistreur de température, avec schémas et code.

Questions fréquentes

Mon écran OLED est-il à l'adresse 0x3C ou 0x3D ?

La plupart des modules OLED 128×64 utilisent 0x3C ; certains passent en 0x3D via une résistance au dos de la carte. Si le dos indique « 0x78 », c'est la notation sur 8 bits, qui correspond à 0x3C dans le code. Pour en être sûr, lance le scanner I2C.

L'écran OLED fonctionne-t-il en 5 V ?

La plupart des modules SSD1306 ont un régulateur sur la carte : on peut les alimenter en 3,3 V ou en 5 V et les brancher directement sur un Arduino Uno. Sur l'ESP32 et le Pico, alimenter le module par la broche 3V3 maintient aussi les lignes I2C en 3,3 V.

Pourquoi l'erreur « SSD1306 allocation failed » apparaît-elle ?

La bibliothèque veut réserver un tampon d'image de 1 Ko pour un écran 128×64 ; si les 2 Ko de RAM de l'Arduino Uno sont occupés par d'autres variables, la place manque. Écris les textes fixes avec la macro F(), place les grands tableaux en PROGMEM ou utilise la bibliothèque U8g2, qui dessine page par page.

Un écran OLED peut-il afficher des lettres accentuées ?

La police par défaut d'Adafruit GFX ne contient pas les lettres accentuées en UTF-8 comme é, è ou ç. La bibliothèque U8g2 peut les afficher grâce à sa prise en charge de l'UTF-8 et à des polices aux jeux de caractères étendus ; avec Adafruit GFX, il faut créer une police personnalisée ou dessiner les lettres en bitmap.

Existe-t-il des écrans OLED couleur ?

Les écrans SSD1306 sont monochromes ; même sur les modèles bicolores, les couleurs sont fixes. Pour des images en couleur, on utilise des OLED couleur à contrôleur SSD1331 ou SSD1351, ou des écrans TFT couleur comme le ST7789 et l'ILI9341.

Peut-on brancher deux écrans OLED sur un même Arduino ?

Oui. En passant l'adresse d'un écran à 0x3D grâce à la résistance au dos, les deux peuvent partager le même bus I2C. Si l'adresse n'est pas modifiable, utilise un second bus I2C sur l'ESP32 et le Pico, ou ajoute un multiplexeur I2C comme le TCA9548A.

Voir tous les projets
Jeu de pong - SSD1306
#86Intermédiaire
Premium

Jeu de pong - SSD1306

Le jeu Pong classique construit à l'aide d'Arduino et d'un écran OLED SSD1306, équipé d'une intelligence artificielle (CPU) autonome qui suit instantanément les mouvements de la balle et réagit en fon

4.5(47)
65
OLED T-Rex Run : Jeu de dinosaures Arduino 🦖
#87Avancé
Premium

OLED T-Rex Run : Jeu de dinosaures Arduino 🦖

Nous avons transposé le légendaire jeu de dinosaures "No Internet" sur un support matériel ! Transformez l'excitation du jeu rétro en une mini console physique avec ce projet que nous avons développé

4.7(33)
53
ESP32 HTTPClient + API météo (avec écran OLED SSD1306)
#134Avancé
Premium

ESP32 HTTPClient + API météo (avec écran OLED SSD1306)

Dans ce projet, nous effectuons un appel à l'API REST de la météo (wttr.in) via Internet à l'aide de l'ESP32 et de la bibliothèque `HTTPClient.h`. Contrairement à la version précédente avec écran LCD I2C, nous utilisons ici un écran OLED SSD1306 (128×64) — ce qui permet d’afficher une police de grande taille, des icônes vectorielles et une présentation visuelle riche sur un seul écran. Sept icônes vectorielles différentes représentant les conditions météorologiques (ensoleillé, partiellement nua

4.3(10)
18
Mode veille profonde de l'ESP32 — Économie de batterie (OLED + compteur RAM RTC)
#135Avancé
Premium

Mode veille profonde de l'ESP32 — Économie de batterie (OLED + compteur RAM RTC)

Le mode « Deep Sleep » de l'ESP32 réduit la consommation de courant à environ 10 µA en désactivant le processeur et la plupart des périphériques, ce qui revêt une importance cruciale pour les appareils IoT fonctionnant sur batterie. Dans ce projet, nous utilisons trois sources de réveil différentes : une minuterie (timer, 15 s), une broche externe (EXT0 — bouton GPIO 33) et un capteur tactile (T0/GPIO 4). Les variables marquées avec `RTC_DATA_ATTR` sont conservées pendant le mode Deep Sleep — le

4.3(10)
16
Compteur de rak'ahs pour la prière avec ESP32 (HC-SR04 + écran OLED SSD1306 + 2 boutons)
#136Avancé
Premium

Compteur de rak'ahs pour la prière avec ESP32 (HC-SR04 + écran OLED SSD1306 + 2 boutons)

Vous arrive-t-il parfois d'oublier à quelle rak'ah vous en êtes lorsque vous priez ? Ce projet consiste à fabriquer un compteur de rak'ahs que l'on place à côté du tapis de prière et qui compte les prosternations lorsque vous approchez votre main. Le capteur de distance à ultrasons HC-SR04 détecte l'approche de la main, l'écran OLED SSD1306 affiche le nombre de rak'ahs, et deux boutons permettent de sélectionner 2, 3 ou 4 rak'ahs et de remettre le compteur à zéro. Grâce à une machine à états int

4.8(11)
14
Lampe à mélangeur de couleurs ESP32 (3 potentiomètres + LED RVB + écran OLED)
#138Avancé
Premium

Lampe à mélangeur de couleurs ESP32 (3 potentiomètres + LED RVB + écran OLED)

Une lampe mélangeuse de couleurs intelligente qui vous permet de créer la couleur de votre choix en tournant 3 potentiomètres grâce à l'ESP32 ! À mesure que vous tournez les potentiomètres rouge, vert et bleu, la LED RVB à cathode commune change de couleur en temps réel. L'écran OLED SSD1306 affiche en temps réel la valeur de chaque couleur sur une plage de 0 à 255, des barres de remplissage visuelles et le code couleur HEX (#FF8040, par exemple). Un mini-studio de couleur professionnel — il per

4.7(6)
10
Éclairage Intelligent ESP32 (PIR + LDR + Relais + OLED)
#141Avancé
Premium

Éclairage Intelligent ESP32 (PIR + LDR + Relais + OLED)

Transformez votre couloir, votre salle de bain ou votre garde-manger en éclairage intelligent avec l'ESP32 ! En utilisant un capteur de mouvement PIR, un capteur de lumière LDR et un module relais, nous construisons le scénario classique "la lumière s'allume lorsqu'un mouvement est détecté dans l'obscurité" — si l'environnement est déjà lumineux, le mouvement N'ACTIVE PAS la lumière, économisant ainsi de l'énergie pendant la journée. La lumière reste allumée pendant 30 secondes ; si le mouvement

4.3(6)
11
Enregistreur de Température ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avancé
Premium

Enregistreur de Température ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Construis un enregistreur de température horodaté avec ESP32 ! Lis la température/humidité du DHT22 toutes les 10 secondes, obtiens l'heure réelle du DS1307 RTC et enregistre sur carte microSD au format CSV. L'OLED affiche en direct la température (grande police), le pourcentage d'humidité, l'horodatage et le compteur. Le fichier `/temp_log.csv` sur la carte SD s'ouvre dans Excel, Google Sheets ou Python pandas pour analyse — parfait pour surveillance de serre, suivi de température à domicile, c

4.7(7)
12

Apprends à brancher sur un Arduino un écran OLED minuscule mais très net, à dessiner du texte et des formes, à afficher des mesures avec une barre, à ajouter tes propres icônes et à prolonger la vie de l'écran.

Utiliser un écran OLED (SSD1306) : texte, formes et graphiques avec Arduino | BlueGrays