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).

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éristique | OLED 0,96" | OLED 0,91" | LCD 16x2 |
|---|---|---|---|
| Résolution | 128×64 pixels | 128×32 pixels | 16×2 caractères |
| Graphiques et icônes | Oui | Oui | Non (caractères seulement) |
| Rétroéclairage | Inutile | Inutile | Nécessaire |
| Connexion | I2C (versions SPI aussi) | I2C | 4 fils avec module I2C |
| En plein soleil | Difficile à lire | Difficile à lire | Plus lisible |
Caractéristiques techniques
| Caractéristique | Valeur |
|---|---|
| Puce de commande | SSD1306 |
| Écran | 0,96" 128×64 (la version 0,91" fait 128×32) |
| Couleur | Monochrome : blanc, bleu, ou jaune en haut et bleu en bas |
| Alimentation | 3,3–5 V (régulateur sur la carte) |
| Consommation | Environ 10–25 mA (selon le nombre de pixels allumés) |
| Adresse I2C | 0x3C (0x3D sur certains modèles) |
| Broches | GND, VCC, SCL, SDA |
Câblage de l'écran OLED
| Broche OLED | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| GND | GND | GND | GND |
| VCC | 5V ou 3.3V | 3V3 | 3V3 |
| SCL | A5 | GPIO 22 | GP5 |
| SDA | A4 | GPIO 21 | GP4 |
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
- Ouvre le gestionnaire de bibliothèques de l'Arduino IDE et cherche Adafruit SSD1306.
- Quand l'installation propose les dépendances, choisis Install all pour installer aussi Adafruit GFX et Adafruit BusIO.
- 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
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}Dessiner des formes : les fonctions d'Adafruit GFX
| Fonction | Ce 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.
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 :
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 :
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 screenDuré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.
Projets à réaliser après cet article
Voir tous les projets
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

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é

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

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

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

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

É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

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
Autres articles
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.

