Erste Versuche mit dem Raspberry Pi Pico und dem 0.96"-Display mit I2C-Schnittstelle

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen

Der Testaufbau[Bearbeiten | Quelltext bearbeiten]

So so sieht mein erster Testaufbau mit dem Raspi Pico und dem SSD1306 0.96" Display aus:

Mypi0002.jpg

Ich habe da noch 2 Displays draufgesteckt, die ich auch noch testen möchte.

Zuerst wird das Treiber-Modul für dieses Display benötigt. Beim Raspi Pico lässt es sich mit Thonny bequem aus dem Internet laden und in den Ordner lib im internen Dateisysteem des Raspi Pico kopieren. Beim ESP32 bietet Thonny diesen Service leider nicht an. Da muß man es manuell erledigen.

Es gibt verschiedene Treibermodule für dieses Display. Ich habe mich für den Anfang für das Modul ssd1306.py entschieden.

>>> import ssd1306
>>> dir(ssd1306)
    ['__class__', '__name__', 'const', '__file__', 'framebuf', 'SET_CONTRAST', 'SET_ENTIRE_ON', 'SET_NORM_INV', 'SET_DISP', 'SET_MEM_ADDR', 'SET_COL_ADDR', 'SET_PAGE_ADDR', 'SET_DISP_START_LINE', 'SET_SEG_REMAP', 'SET_MUX_RATIO', 'SET_COM_OUT_DIR', 'SET_DISP_OFFSET', 'SET_COM_PIN_CFG', 'SET_DISP_CLK_DIV', 'SET_PRECHARGE', 'SET_VCOM_DESEL', 'SET_CHARGE_PUMP', 'SSD1306', 'SSD1306_I2C', 'SSD1306_SPI']

Aus dieser Fülle von Angeboten interessiert uns vorerst nur die Klasse SSD1306_I2C die wir benötigen um eine Instanz mit I2C-Schnittstelle für unser Display zu erzeugen. Diese Klasse enthält die interessanten Methoden, die wir auf unser Display anwenden können:

>>> dir(ssd1306.SSD1306_I2C)
    ['__class__', '__init__', '__module__', '__name__', '__qualname__', '__bases__', '__dict__', 'blit', 'fill', 'fill_rect', 'hline', 'invert', 'line', 'pixel', 'rect', 'scroll', 'text', 'vline', 'init_display', 'write_cmd', 'show', 'poweroff', 'poweron', 'contrast', 'write_data']

Der erste Versuch[Bearbeiten | Quelltext bearbeiten]

Nun zum ersten Test. Als Erstes müssen die erforderlichen Module importiert werden:

from machine import Pin, I2C
import ssd1306

Um mit dem Display arbeiten zu können benötigen zuerst einmal Zugriff auf eine I2C-Schnittstelle.

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400_000)

Dann können wir die Instanz für unser Dispaly erzeugen:

display = ssd1306.SSD1306_I2C(128, 64, i2c)

Die erste Ausgabe:

display.text('Hello, World!', 0, 0, 1)
display.show()

Mypi0003.jpg

Grundsätzlich funktioniert es!

Einen Löschbefehl gibt es nicht. Das Display kann aber mit:

display.fill(0)

komplett schwarz beschrieben werden. Wird statt der 0 eine 1 übergeben, so wird das ganze Display weiss.

Erste Verbesserungen[Bearbeiten | Quelltext bearbeiten]

Nun möchte ich eine formatierte mehrzeilige Ausgabe versuchen. Hier ein Beispiel für ein Netzgerät:

from machine import Pin, I2C
import time
import ssd1306

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400_000)

display = ssd1306.SSD1306_I2C(128, 64, i2c)

display.text('Hello, World!', 0, 0, 1)
display.text('SSD 1306 - Test', 0,12, 1)
display.text('RPi_SSD1306_003.py', 0, 24, 1)
display.show()

time.sleep(2)

display.fill(0)
display.text('  USV 100 - 01',1, 2, 1)
display.text('192.168.100.128', 1, 10, 1)
display.rect(0, 0, 127, 19, 1)
display.text(' 3.345V/19.950A', 0, 24, 1)
display.text(' 4.945V/12.950A', 0, 35, 1)
display.text('12.345V/ 9.950A', 0, 46, 1)
display.text(' 5.045V/ 0.123A', 0, 57, 1)
display.show()

Hier das komplette Programm mit Kommentaren heruntergeladen werden:[RPi_SSD1306_003.py]

Mipy0004.jpg

Das sieht ja schon ganz ordentlich aus. Leider gibt es nur die eine Schriftgröße. Dadurch ist die Gestaltungsmöglichkeit doch sehr eingeschränkt.

Die Methoden des Modules ssd1306.py[Bearbeiten | Quelltext bearbeiten]

Basis Funktionen[Bearbeiten | Quelltext bearbeiten]

display.poweroff()
power off the display, pixels persist in memory
display.poweron()
power on the display, pixels redrawn
display.contrast(0)
dim
display.contrast(255)
bright
display.invert(1)
display inverted
display.invert(0)
display normal
display.rotate(True)
rotate 180 degrees
display.rotate(False)
rotate 0 degrees
display.show()
write the contents of the FrameBuffer to display memory

Ausgabefunktionen[Bearbeiten | Quelltext bearbeiten]

display.fill(0)
fill entire screen with colour=0
display.pixel(0, 10)
get pixel at x=0, y=10
display.pixel(0, 10, 1)
set pixel at x=0, y=10 to colour=1
display.hline(0, 8, 4, 1)
draw horizontal line x=0, y=8, width=4, colour=1
display.vline(0, 8, 4, 1)
draw vertical line x=0, y=8, height=4, colour=1
display.line(0, 0, 127, 63, 1)
draw a line from 0,0 to 127,63
display.rect(10, 10, 107, 43, 1)
draw a rectangle outline 10,10 to 117,53, colour=1
display.fill_rect(10, 10, 107, 43, 1)
draw a solid rectangle 10,10 to 117,53, colour=1
display.text('Hello World', 0, 0, 1)
draw some text at x=0, y=0, colour=1
display.scroll(20, 0)
scroll 20 pixels to the right

Weitere Informationen zur I2C-Schnittstelle des Raspi Pico[Bearbeiten | Quelltext bearbeiten]

Der Raspi Pico hat 2 Hardware I2C Schnittstellen.

Parameter:[Bearbeiten | Quelltext bearbeiten]

ID der Hardware I2C-Schnittstellen:

    0 = I2C0
    1 = I2C1

zulässige Pins für I2C0:

    SDA: GP0, 4, 8, 12, 16, 20
    SCL: GP1, 5, 9, 13, 17, 21

Zusässige Pins für I2C1:

    SDA: GP2, 6, 10,14,18,26
    SCL: GP3, 7, 11, 15, 19, 27

I2C Bustakt:

    freq : 100000, 400000



Zurück