Skip to main content

OLED-scherm

Op een OLED-scherm van 128 × 64 pixels zet je tekst en getallen, zodat je op de robot zelf ziet wat hij meet.

Materiaal​

Een OLED-scherm laat je tekst en getallen zien op je robot, zonder dat hij aan de laptop hoeft te hangen. Ideaal om sensorwaardes te volgen tijdens het rijden. Het scherm praat via I2C (pinnen SDA en SCL).

  • Nano op het shieldArduino Nano RP2040 Connect op het Leaphy Murphy ShieldHet Leaphy Murphy Shield, de groene printplaat waar de Nano in past
  • OLED-scherm128 × 64 pixelsOLED-scherm van 128 bij 64 pixels met vier pinnen
  • SDA/SCL-moduleEen multiplexer, aanbevolenSDA/SCL-module voor het Leaphy Murphy shield

Verder: 4-pins jumperkabel female/female

Het uiterlijk van het scherm verschilt per merk, maar de aansluitingen zijn hetzelfde: VCC, GND, SDA, SCL. De multiplexer heb je nodig als je ook TOF-sensoren gebruikt: dan werkt alles tegelijk.

Controlevraag

Hoeveel pinnen heeft het OLED-scherm minimaal nodig op de microcontroller?

Antwoord

Vier: VCC (3,3V), GND, SDA (A4) en SCL (A5).

Aansluiten​

Aansluitschema: het OLED-scherm op channel 7 van de multiplexer, met SCL, SDA, VCC en GND elk op de pin met dezelfde naam

Sluit het OLED-scherm via een 4-pins jumperkabel aan op de multiplexer, die in de bus rechts op het shield steekt:

  • VCC → VCC op channel 7 van de multiplexer
  • GND → GND op channel 7 van de multiplexer
  • SDA → SDA op channel 7 van de multiplexer
  • SCL → SCL op channel 7 van de multiplexer

Op het scherm zit SCL boven SDA, op de multiplexer andersom: die twee draden kruisen. In dit voorbeeld zit het scherm dus op channel 7. Steek het in een ander kanaal? Pas dan het getal in de code aan.

Code​

Voorbeeld​

from leaphymicropython.actuators.oled_screen import OLEDSH1106

oled = OLEDSH1106(width=128, height=64, channel=7)

oled.fill("white")
oled.text('Hello, World 1!', x=0, y=0)
oled.text('Hello, World 2!', x=0, y=10)
oled.text('Hello, World 3!', x=0, y=20)
oled.show()

Op het scherm verschijnen nu drie regels.

Uitleg​

oled = OLEDSH1106(width=128, height=64, channel=7)
  • width: breedte in pixels (128).
  • height: hoogte in pixels (64).
  • channel: het channel van de multiplexer waar het scherm op zit.
oled.text('Hallo!', x=0, y=0)
oled.show()
  • text() zet tekst klaar op positie (x, y). Een letter is 8 bij 8 pixels.
  • show() stuurt alles wat je klaargezet hebt naar het scherm. Vergeet deze niet, anders blijft het scherm leeg.

Andere handige functies​

Scherm leeg maken​

oled.fill("white") # alles wit
oled.show()
oled.fill("black") # alles zwart
oled.show()

Tekst is standaard zwart. Op een wit scherm zie je hem meteen. Maak je het scherm zwart, geef je tekst dan color="white" mee, anders zet je zwart op zwart:

oled.fill("black")
oled.text('Wit op zwart', x=0, y=0, color="white")
oled.show()

Een getal tonen​

Getallen zet je in een f-string om ze als tekst te tonen:

temperatuur = 22.5
oled.fill("white")
oled.text(f'Temp: {temperatuur}C', x=0, y=40)
oled.show()
Opdracht: teller op het scherm

Laat het scherm elke seconde een teller een nummer hoger laten zien (0, 1, 2, 3, ...).

Tip

Maak elke ronde het scherm leeg met oled.fill("white") en zet de nieuwe waarde erop met oled.text(...). Vergeet oled.show() niet.

Oplossing
from leaphymicropython.actuators.oled_screen import OLEDSH1106
from time import sleep

oled = OLEDSH1106(width=128, height=64, channel=7)

teller = 0
while True:
oled.fill("white")
oled.text(f'Teller: {teller}', x=0, y=0)
oled.show()
teller = teller + 1
sleep(1)

Grotere tekst​

Een meetwaarde lees je van een afstand beter als hij groot op het scherm staat. Met scale maak je de letters groter: bij scale=2 wordt elke pixel een blokje van 2 bij 2, en is een letter 16 bij 16 pixels.

from leaphymicropython.actuators.oled_screen import OLEDSH1106

oled = OLEDSH1106(width=128, height=64, channel=7)

oled.fill("white")
oled.text('Klein', x=0, y=0)
oled.text('Groot', x=0, y=16, scale=2)
oled.show()

Hoe groter de letters, hoe minder er op een regel past:

scaleEen letterTekens op een regel
18 × 8 pixels16
216 × 16 pixels8
324 × 24 pixels5

Wat niet past, valt van het scherm af: de tekst gaat niet verder op een nieuwe regel. Zet een volgende regel ook verder omlaag, minstens 8 × scale pixels. scale is een heel getal, dus 1, 2 of 3. Met scale=1.5 krijg je een foutmelding.

Opdracht: een grote teller

Maak de teller van de vorige opdracht groot: het woord Teller klein bovenaan, en het getal eronder met scale=3.

Tip

Dat zijn twee keer oled.text(...). Het woord is 8 pixels hoog, dus het getal kan op y=16.

Oplossing
from leaphymicropython.actuators.oled_screen import OLEDSH1106
from time import sleep

oled = OLEDSH1106(width=128, height=64, channel=7)

teller = 0
while True:
oled.fill("white")
oled.text('Teller', x=0, y=0)
oled.text(f'{teller}', x=0, y=16, scale=3)
oled.show()
teller = teller + 1
sleep(1)

Met scale=3 passen er vijf cijfers op een regel, dus tot 99999.