Afficheurs OLED 128 x 64 (SSD1308Z) et 96 x 96 (SSD1327)

Ce tutoriel explique comment mettre en œuvre un module Grove afficheur I2C OLED 0.96 pouces (128 x 64) ou encore 1.12 pouces (96 x 96) avec MicroPython.
Les pilotes que nous partageons gèrent tous les afficheurs OLED utilisant des contrôleurs SSD1306, SSD1308 et SSD1327 au delà des produits de Seeed Studio ; nous les avons trouvés grâce à l’excellent site Awesome MicroPython qui recense aussi des bibliothèques pour gérer des OLED à base de contrôleurs SH1107, SSD1315, SSD1322 …

Module Grove OLED 0.96” (SSD1308Z) Module Grove OLED 1.12” (SSD1327)
Grove - OLED Display 0.96 inch Grove - OLED Display 1.12 inch

Crédit images : Seeed Studio

Remarque : La gamme des modules afficheurs OLED Grove ne cessant de s’étendre, avec des changements de contrôleurs sans que leur aspect ne soit significativement modifié, nous vous conseillons de lire attentivement leur fiche descriptive sur le site Seeed Studio si nos exemples ne fonctionnent pas avec votre matériel.

Matériel requis

  1. Une carte d’extension de base Grove
  2. La carte NUCLEO-WB55
  3. Un module afficheur OLED 0.96 pouces Grove ou un module afficheur OLED 1.12 pouces Grove

Le module afficheur doit être connecté sur une prise I2C du Grove base shield.

Exemple pour le module afficheur OLED 0.96 pouces (SSD1308Z)

Cet exemple montre comment afficher un texte sur un module OLED contrôlé par un SSD1308 (il fonctionne aussi sur un SSD1306).

Vous pouvez télécharger les scripts MicroPython de ce tutoriel (entre autres) en cliquant ici. Une fois l’archive MODULES.zip téléchargée, décompressez la sur votre disque et allez dans le dossier \MODULES\Afficheurs OLED 1308 & 1327\SSD1308Z\.

Commencez par copier le fichier ssd1308.py qui contient les pilots de l’afficheur OLED sur PYBFLASH.
Editez maintenant le script main.py, copiez-y le contenu ci-dessous et glissez-déplacez le sur le disque PYBFLASH :

# Objet du script :
# Affiche un texte sur un module OLED contrôlé par un SSD1308.

from time import sleep_ms # Pour temporiser
from machine import Pin, I2C # Pilotes des entrées-sorties et du bus I2C
import ssd1308 # Pilote de l'afficheur
import pyb # Pour compatibilité ...

# Initialisation du périphérique I2C
i2c = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Liste des adresses I2C des périphériques présents
print("Adresses I2C utilisées : " + str(i2c.scan()))

# Paramétrage des caractéristiques de l'écran
screen_width_pix = 128
screen_length_pix = 32
oled_display = ssd1308.SSD1308_I2C(screen_width_pix, screen_length_pix, i2c)

# Envoi du texte à afficher sur l'écran OLED
oled_display.text('MicroPython OLED!', 0, 0)
oled_display.text('    I2C   ', 0, 10) 
oled_display.text('Trop facile !!!', 0, 20)
oled_display.show() # Affichage !

sleep_ms(5000) # Temporisation de cinq secondes
oled_display.clear() # On efface l'écran

Manipulation

Enregistrez les modifications avec ([CTRL] + [S] sous Notepad++). Vous pouvez lancer le script avec [CTRL] + [D] sur le terminal PuTTY et observez les messages qui s’affichent sur le module OLED.

Exemple pour le module afficheur OLED 1.12 pouces (SSD1327)

Cet exemple montre comment Il est directement copié depuis le site de son auteur, Mike Causer, situé ici.

Vous pouvez télécharger les scripts MicroPython de ce tutoriel (entre autres) en cliquant ici. Une fois l’archive MODULES.zip téléchargée, décompressez la sur votre disque et allez dans le dossier \MODULES\Afficheurs OLED 1308 & 1327\SSD1327\.

Commencez par copier le fichier ssd1327.py qui contient les pilots de l’afficheur OLED sur PYBFLASH.
Editez maintenant le script main.py, copiez-y le contenu ci-dessous et glissez-déplacez le sur le disque PYBFLASH :

# Cube 3D en rotation
# basé on MicroViewCube.ino de Jim Lindblom @ SparkFun Electronics
# https://github.com/sparkfun/SparkFun_MicroView_Arduino_Library/blob/master/examples/MicroViewCube/MicroViewCube.ino
# Conversion en MicroPython par Mike Causer :
# https://github.com/mcauser/micropython-ssd1327/blob/master/examples/rotating_3d_cube.py

```python
from machine import I2C # Pour piloter l'I2C
from time import sleep # pour temporiser
import ssd1327 # Pilote de l'afficheur Grove - OLED Display 1.12" (96 x 96)
import math
import pyb # Pour compatibilité ...

# On utilise l'I2C n°1 de la carte NUCLEO-WB55 
i2c1 = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep(1)

# Initialisation de l'afficheur
display = ssd1327.SEEED_OLED_96X96(i2c1) 
display.clear() # On efface l'écran

pi = math.pi

size = 700
width = display.width
height = display.height

# Données pour la matrice de rotation
d = 3
px = [-d,  d,  d, -d, -d,  d,  d, -d]
py = [-d, -d,  d,  d, -d, -d,  d,  d]
pz = [-d, -d, -d, -d,  d,  d,  d,  d]

p2x = [0,0,0,0,0,0,0,0]
p2y = [0,0,0,0,0,0,0,0]
r = [0,0,0]

# Optimisation du bytecode pour l'architecture STM32
@micropython.native
def drawCube():

	# Calcul des nouvelles coordonnées des sommets du cube après rotation
	r[0] = r[0] + pi / 180.0
	r[1] = r[1] + pi / 180.0
	r[2] = r[2] + pi / 180.0
	if (r[0] >= 360.0 * pi / 180.0):
		r[0] = 0
	if (r[1] >= 360.0 * pi / 180.0):
		r[1] = 0
	if (r[2] >= 360.0 * pi / 180.0):
		r[2] = 0

	for i in range(8):
		px2 = px[i]
		py2 = math.cos(r[0]) * py[i] - math.sin(r[0]) * pz[i]
		pz2 = math.sin(r[0]) * py[i] + math.cos(r[0]) * pz[i]

		px3 = math.cos(r[1]) * px2 + math.sin(r[1]) * pz2
		py3 = py2
		pz3 = -math.sin(r[1]) * px2 + math.cos(r[1]) * pz2

		ax = math.cos(r[2]) * px3 - math.sin(r[2]) * py3
		ay = math.sin(r[2]) * px3 + math.cos(r[2]) * py3
		az = pz3 - 150

		p2x[i] = width / 2 + ax * size / az
		p2y[i] = height / 2 + ay * size / az

	# Affichage du nouveau cube
	display.fill(0)

	for i in range(3):
		display.framebuf.line(int(p2x[i]),   int(p2y[i]),   int(p2x[i+1]), int(p2y[i+1]), 1)
		display.framebuf.line(int(p2x[i+4]), int(p2y[i+4]), int(p2x[i+5]), int(p2y[i+5]), 1)
		display.framebuf.line(int(p2x[i]),   int(p2y[i]),   int(p2x[i+4]), int(p2y[i+4]), 1)

	display.framebuf.line(int(p2x[3]), int(p2y[3]), int(p2x[0]), int(p2y[0]), 1)
	display.framebuf.line(int(p2x[7]), int(p2y[7]), int(p2x[4]), int(p2y[4]), 1)
	display.framebuf.line(int(p2x[3]), int(p2y[3]), int(p2x[7]), int(p2y[7]), 1)
	display.show()

while True:
	drawCube()

Manipulation

Enregistrez les modifications (avec [CTRL] + [S] sous Notepad++). Vous pouvez lancer le script avec [CTRL] + [D] sur le terminal PuTTY et observez le cube en (lente) rotation sur le module OLED.

Autres exemples

SSD1306, SSD1308 : Consultez par exemple notre tutoriel sur la communication LoRa P2P (Partie 3, script de la base COMMAND_01) pour voir comment afficher des données de température sur un module Grove OLED 0.96 pouces.

SSD1327 : Vous trouverez plein d’autres exemples sur le site de Mike Causer, situé ici !