View on GitHub

matrix

Calliope I²C Erweiterung für OLED Displays 128x128 und 128x64 Pixel. Linien, Kreise, Text und eigene Bilder pixelgenau positionieren. Auch als Animation. Analoge Uhr. Zwei Displays gleichzeitig.

Diese Seite bei https://calliope-net.github.io/matrix/ öffnen.

Calliope I²C Erweiterung für OLED Displays 128x128 und 128x64 Pixel

optional: Qwiic EEPROM 64 KByte an I²C anstecken

  • speichert ASCII Zeichensatz + Umlaute und spart Programmspeicher
  • kann 256 Zeichen je 8x8 Pixel speichern (anstatt 96 Zeichen je 5x8 Pixel)
  • viele Bilder speichern und direkt aus dem EEPROM in die Matrix kopieren
  • umgekehrt den Inhalt der Matrix im EEPROM speichern und wieder verwenden
  • orange EEPROM Blöcke sind in der Erweiterung calliope-net/matrix enthalten

Auf dem Foto läuft das folgende Programm mit Hardware v2 und den Erweiterungen:

Die Erweiterung calliope-net/matrix unterstützt zwei OLED Displays am I²C-Bus gleichzeitig. Folgende wurden getestet und können beliebig kombiniert werden:

Dieses Repository kann als Erweiterung in MakeCode hinzugefügt werden.

Beschreibung der Erweiterung ‘Matrix’

RAM

RAM ist der Datenspeicher im Computer. Im Gegensatz zum ROM (Read-Only-Memory) können die Daten im RAM jederzeit vom Programm geändert werden.

de.wikipedia.org/wiki/Random-Access_Memory

Die Calliope mini Versionen haben unterschiedliche RAM Speicher Kapazität: 1.3=16KB | 2.0 und 2.1=32KB | 3.0=128KB. Der RAM wird auch vom Betriebssystem benutzt, so dass für eigene Programme nicht viel übrig bleibt. Beim Calliope mini 1.3 reichen die 16KB jedenfalls nicht, um 1KB für die Matrix zu reservieren.

Technische Spezifikation

1K steht für 2^10 = 1024 und B für Byte. 1 Byte hat immer 8 Bit. 1KB sind also 8192 Bit, so viele Pixel hat das 128x64 Display. Und Pixel sind die kleinen Punkte, die leuchten oder nicht. Weil Bits im RAM nicht leuchten, müssen sie an ein Display gesendet werden. Das macht die Erweiterung ‘Matrix’.

Der für die Pixel reservierte RAM wird in dieser Beschreibung ‘Matrix’ genannt.

I²C

calliope-net.github.io/i2c

Matrix speichert alle Pixel im RAM. Zur Kommunikation mit dem Display über den I²C-Bus gibt es nur 3 Blöcke (hellblau):

Blöcke und Parameter

Matrix

Block I²C beim Start (Display-Größe, invert, drehen, I²C-Adresse)

Wenn zwei Displays angeschlossen sind, muss der Block beim Start zweimal aufgerufen werden, mit verschiedenen I²C-Adressen. RAM wird für das größere Display reserviert. Es gibt nur eine Matrix im RAM, die sich beide Displays teilen. Um verschiedene Bilder auf zwei Displays anzuzeigen, wird die Matrix gelöscht, neu gezeichnet und mit dem folgenden Block (mit Parameter I²C-Adresse) an ein bestimmtes Display gesendet.

Block I²C Matrix auf Display anzeigen (Zeilen von, bis, I²C-Adresse)

Die Zeilen in der Matrix und auf dem Display sind fest zugeordnet. Sie können nicht an eine andere Stelle geschrieben werden.

Block I²C Animation auf Display anzeigen befindet sich im Menüpunkt Bilder Array und wird dort beschrieben.

Matrix: für Pixel reservierter RAM

Block Matrix löschen (Zeilen von, bis)

Um das Display zu löschen, muss eine gelöschte Matrix noch mit dem hellblauen Block Matrix auf Display anzeigen über den I²C-Bus an das Display gesendet werden.

Block set Pixel (x, y, EIN/AUS)

Block get Pixel (x, y) : boolean

Text in Matrix zeichnen

Block Zahl/Zeit (Zeile, Spalte, Text:any, Abstand x, y, überschreiben, vergrößern x, y)

Hier werden nur die Zeichen Leerzeichen 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - . als Image generiert. Der Zweck ist, Programmspeicher zu sparen. Der Compiler meldet einen Fehler, wenn viele Blöcke benutzt werden und im Hintergrund der ganze ASCII Zeichensatz im Code steht. Wenn keine Buchstaben angezeigt werden sollen, ist dieser Block zu bevorzugen. Der orange Text Block aus EEPROM kann den Programmspeicher komplett einsparen, wenn ein EEPROM angeschlossen ist.

Block Text (Zeile, Spalte, Text:any, Abstand x, y, überschreiben, vergrößern x, y)

Die lila Blöcke brauchen den Zeichensatz im Programmspeicher, den der Compiler mit in die HEX Datei einpackt. Diese wird oft zu groß für den Calliope v2. Es gibt deshalb drei Blöcke zum Text schreiben.

  1. Ist der EEPROM angeschlossen, sollte ausschließlich der orange Text Block aus EEPROM benutzt werden.
  2. Der blaue Block Zahl/Zeit braucht weniger Programmspeicher, weil auf die Buchstaben verzichtet wird.
  3. Der lila Block Text verbraucht den meisten Programmspeicher. Werden viele Blöcke in MakeCode benutzt, kann der Compiler möglicherweise keine HEX Datei erzeugen.

Bilder

Im Menüpunkt Bilder können Bilder (Image-Objekte) aus verschiedenen Quellen erzeugt und in Variablen gespeichert werden. Mit dem oberen Block zeichne Bild muss jedes Image-Objekt (Variable) dann an einer bestimmten Position (x, y) in die Matrix gezeichnet werden. Blöcke für eine Folge von Bildern (Text, Animation) befinden sich im Menüpunkt Bilder Array.

ein Bild in Matrix zeichnen

Block zeichne Bild (Image-Objekt, x, y, überschreiben, vergrößern x, y)

Block 8x8 drehen (Image-Objekt, drehen oder spiegeln)

ein Zeichen in Bild 5x8 umwandeln

Die folgenden Blöcke generieren ein Image-Objekt und weisen das direkt einer Variable zu. Der Name der Variable bild wird bei wiederholter Verwendung mit einer Ziffer ergänzt, so dass immer neue Variablen-Namen entstehen. Diese Variablen sind im Menüpunkt Variablen zu finden und können in Blöcken wie zeichne Bild, 8x8 drehen oder Image[] anhängen verwendet werden.

Block setze bild auf ‘Leerzeichen’ (zeichen)

Block setze bild auf Bild aus ASCII-Code (charCode)

Bild aus Hexadezimalzahl

Eine Ziffer einer Hexadezimalzahl kann 16 Werte annehmen: (0 1 2 3 4 5 6 7 8 9 A B C D E F). Das entspricht genau 4 Bit. Für ein Byte (8 Bit) werden 2 HEX-Ziffen geschrieben. 5 Byte entstehen also aus 10 HEX-Ziffern und 8 Byte entstehen aus 16 HEX-Ziffern.

Block setze bild auf Bild 5x8 aus HEX (Hexadezimalzahl)

Block setze bild auf Bild 8x8 aus HEX (Hexadezimalzahl)

Image Objekte

Block setze bild auf Bild 8x8 (MATRIX)

Bilder 8 16 | Bilder 32 | Bilder 64

In den Menüpunkten Bilder xx stehen Blöcke zur Verfügung, in die eigene Bilder verschiedener Größe mit dem MakeCode Editor gemalt werden können. Die blauen Blöcke geben ein Image-Objekt zurück, das entweder einer Variablen bild zugewiesen wird, oder in einem der Blöcke zeichne Bild, 8x8 drehen oder Image[] anhängen direkt verwendet werden kann.

Folgende Bild-Größen (Breite x Höhe in Pixel) stehen zum selbst Malen zur Verfügung:

Jede Vorlage kann mehrmals verwendet und verschiedenen Variablen zugewiesen werden. Die zahlreichen Image-Objekte können dann mit zeichne Bild wie Kacheln an verschiedenen Stellen in die Matrix gezeichnet werden. Dabei können kleine Bilder auch vergrößert werden.

Die Bilder (Image-Objekte) können aber auch im Menüpunkt Bilder Array im internen Array Image[] gesammelt werden. Sie können dort über den Index einzeln abgerufen oder als Animation auf dem Display angezeigt werden.

Bilder Array

Bilder-Array ist ein Array im RAM mit Elementen vom Typ Image. Image ist in MakeCode ein Typ. In den Blöcken ist dieses interne Array mit Image[] bezeichnet. Ein Image-Objekt kann eine bestimmte Anzahl Pixel in Breite und Höhe speichern, also ein Bild. (1 Bit pro Pixel.)

Block I²C Animation auf Display anzeigen (Image[], Position x, y, vergrößern x, y, Pause(ms), Zeilen von, bis, I²C-Adresse)

Image[]: Array für Bilder

Block Image[] löschen

Block Image[] Länge

Block Image[] anhängen (Image-Objekt)

Block setze bild auf Image[] (index)

Image[] in Matrix zeichnen

Block zeichne Bilder (Image[], Position x, y, Abstand x, y, überschreiben, vergrößern x, y)

Um die in die Matrix gezeichneten Bilder auf dem Display anzuzeigen, muss noch der hellblaue Block Matrix auf Display anzeigen aufgerufen werden.

Block 8x8 drehen (Image-Objekt, drehen oder spiegeln)

Text in Bilder 5x8 umwandeln

Block Image[] füllen aus Zahl/Zeit (Text:any)

Block Image[] füllen aus Text (Text:any)

Animation Beispiele

Geometrie

Linie, Fläche in Matrix zeichnen

Block Linie (von x, y, bis x, y, Pixel EIN/AUS)

Block Rechteck (von x, y, bis x, y, Pixel EIN/AUS)

Block Kreis (Mittelpunkt x, y, Radius, Pixel EIN/AUS)

→ Für Linie und Kreis wird der Bresenham-Algorithmus verwendet: de.wikipedia.org/wiki/Bresenham-Algorithmus

Uhr Zeiger in Matrix zeichnen

Block 12 Stunden (Stunde, Mittelpunkt x, y, Linie von, bis, Pixel EIN/AUS)

Block 60 Minuten (Minute, Mittelpunkt x, y, Linie von, bis, Pixel EIN/AUS)

→ Die Funktionen für die Uhrzeiger hat ein Schüler im GTA programmiert.

Analog Uhr in Matrix zeichnen

Block zeichne Uhr (Mittelpunkt x, y, Radius, Stunde, Minute)

EEPROM

Die orange Blöcke funktionieren nur, wenn ein SparkFun Qwiic EEPROM Breakout - 512Kbit an den I²C-Bus angesteckt ist. Bestellt werden kann der EEPROM bei digikey.de oder mouser.de. Zwei Qwiic Cable - Grove Adapter müssen extra bestellt werden.

Text in Matrix zeichnen

Block Text (Zeile, Spalte, Text:any, Abstand x, y, überschreiben, vergrößern x, y, EEPROM Startadresse, I²C Adresse)

Wenn ein EEPROM mit Zeichensatz angeschlossen ist, sollte ausschließlich der orange Text Block benutzt werden. Der blaue und lila Text Block würden Speicherplatz verschwenden, der beim Programmspeicher fehlt. Auf einem MakeCode Bildschirm sollten also nie lila und orange Blöcke gleichzeitig sein!

Text in Bilder 8x8 umwandeln

Block Image[] füllen aus Text (Text:any, EEPROM Startadresse, I²C Adresse)

Block setze bild auf Bild aus ASCII-Code (charCode, EEPROM Startadresse, I²C Adresse)

Bild aus EEPROM in Matrix zeichnen (128 Byte pro Zeile)

Block zeichne aus EEPROM (EEPROM Startadresse, Zeilen von, bis, I²C Adresse)

Um die Daten aus dem EEPROM auf dem Display zu sehen, muss die Matrix noch mit dem hellblauen Block Matrix auf Display anzeigen über den I²C-Bus an das Display gesendet werden.

Test Funktionen

Block zeichne alle Text-Zeichen vom EEPROM in Matrix

Block vergleiche 128 Byte ab (EEPROM Startadresse, Byte, I²C Adresse)

Block F800

Zeilen aus Matrix im EEPROM speichern

Block EEPROM ab (EEPROM Startadresse, Zeilen von, bis, Bytes, Code, I²C Adresse)

Mit dem folgenden MakeCode Programm kann der Zeichensatz aus dem Programmspeicher in einen EEPROM programmiert werden.

  • Das Programmieren würde auch ohne angeschlossenes Display funktionieren, weil nur die Matrix im RAM als Zwischenspeicher gebraucht wird.
  • Wichtig ist beim Start 128x128 einzustellen, damit die Matrix mit maximaler Größe 2KByte angelegt wird.
  • Knopf A+B geklickt programmiert den EEPROM. Bei Erfolg leuchtet die RGB-LED grün.
  • Knopf B geklickt schreibt das Ergebnis vom Leertest auf das Display. Leer ist ein EEPROM, wenn alle 128 Bytes den Wert 255 haben bzw. alle Bits im EEPROM sind 1.)

Erweiterungen

Upates für Erweiterungen; Erweiterungen aus einem Projekt löschen.

Alle I²C-Erweiterungen für MakeCode von calliope-net (Software).

Calliope-Apps, .hex-Dateien, Bildschirmfotos mit Blöcken

Alle Beispiel-Projekte für MakeCode von calliope-net (Calliope-Apps).

GitHub-Profil calliope-net: https://github.com/calliope-net

Bezugsquellen

Alle I²C-Module und Bezugsquellen (Hardware).

Blocks preview Build status badge

This image shows the blocks code from the last commit in master. This image may take a few minutes to refresh.

A rendered view of the blocks

Metadaten (verwendet für Suche, Rendering)