{"id":14412,"date":"2026-07-21T10:00:00","date_gmt":"2026-07-21T08:00:00","guid":{"rendered":"https:\/\/de.elv.com\/elvjournal\/?p=14412"},"modified":"2026-07-21T15:21:14","modified_gmt":"2026-07-21T13:21:14","slug":"spi-bus-python-raspberry-pi-led-matrix-max7219","status":"publish","type":"post","link":"https:\/\/de.elv.com\/elvjournal\/spi-bus-python-raspberry-pi-led-matrix-max7219\/","title":{"rendered":"Einstieg in Python (Teil 15): SPI-Bus mit Python nutzen"},"content":{"rendered":"\n<p class=\"has-gray-light-color has-text-color has-link-color has-h-5-font-size wp-elements-808a803c67a2e9b20458bae9ccaa857c wp-block-paragraph\"><strong>Einstieg in Python, Teil 15<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">SPI-Bus mit Python nutzen<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Unter Python stehen verschiedene Bussysteme bereit, die sich in Geschwindigkeit, Komplexit\u00e4t und Einsatzgebiet unterscheiden. Besonders bei Anwendungen, die schnelle Daten\u00fcbertragungen oder die Ansteuerung mehrerer Ger\u00e4te erfordern, spielt eine effiziente Kommunikation eine entscheidende Rolle. Ein h\u00e4ufig eingesetztes Bussystem f\u00fcr solche Zwecke ist der <em>SPI-Bus (Serial Peripheral Interface)<\/em>, der eine schnelle, synchrone Daten\u00fcbertragung zwischen einem \u201eMaster\u201c bzw. Controller und angeschlossenen Peripherieger\u00e4ten erm\u00f6glicht. Generell ist der SPI-Bus eines der leistungsf\u00e4higsten Bussysteme auf dem Raspberry Pi. Er eignet sich besonders zur Anbindung von Displays, LED-Matrizen, Speichern oder Sensoren, die hohe Datenraten ben\u00f6tigen. Durch die Nutzung separater Leitungen f\u00fcr Datenrichtung und Takt bietet SPI eine stabile und schnelle Kommunikation. In Kombination mit der Programmiersprache Python l\u00e4sst sich der SPI-Bus auf dem Raspberry Pi einfach konfigurieren und effizient nutzen, wodurch er ideal f\u00fcr Lernprojekte, schnelle Prototypen sowie Embedded- und IoT-Anwendungen ist.<\/strong><\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">OLED Display am Raspberry Pi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der <strong>SPI-Bus <\/strong>arbeitet synchron \u00fcber wenige Leitungen und erm\u00f6glicht so einen direkten Austausch von Daten zwischen dem Raspberry Pi und angeschlossenen Modulen. Mit Python l\u00e4sst sich SPI leicht einrichten und nutzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vorteile des SPI-Busses sind<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Hohe Geschwindigkeit<\/strong>:<br>SPI ist deutlich schneller als I\u00b2C, weil die Kommunikation synchron \u00fcber einen Takt erfolgt und keine Adressierung notwendig ist.<\/li>\n\n\n\n<li><strong>Vollduplex-Kommunikation<\/strong>:<br>Daten k\u00f6nnen gleichzeitig in beide Richtungen flie\u00dfen \u2013 also vom Raspberry Pi zum Ger\u00e4t <strong>und<\/strong> zur\u00fcck.<\/li>\n\n\n\n<li><strong>Einfache Ansteuerung mehrerer Ger\u00e4te<\/strong>:<br>Jedes SPI-Ger\u00e4t hat eine eigene Chip-Select-Leitung, was die Steuerung mehrerer Module erleichtert.<\/li>\n\n\n\n<li><strong>Stabilit\u00e4t bei l\u00e4ngeren Kabeln<\/strong>:<br>SPI arbeitet zuverl\u00e4ssig auch bei h\u00f6heren Datenraten oder l\u00e4ngeren Leitungen, wenn die Hardware korrekt angeschlossen ist.<\/li>\n\n\n\n<li><strong>Flexible Datenbreite<\/strong>:<br>SPI \u00fcbertr\u00e4gt Bytes mit beliebigen Bitmustern. Das ist ideal f\u00fcr Displays, LED-Matrizen oder Sensoren.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild 1<\/mark> zeigt, wie zwei SPI-Ger\u00e4te \u00fcber vier Leitungen miteinander verbunden werden. Die Kommunikation erfolgt synchron, wobei das steuernde Ger\u00e4t (\u201eMaster\u201c oder Controller) den Takt vorgibt. \u00dcber die Leitung SCK (Serial Clock) werden regelm\u00e4\u00dfige Taktimpulse erzeugt, durch die die \u00dcbertragung der einzelnen Bits zeitlich gesteuert wird.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1277\" height=\"718\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t15.jpg\" alt=\"Bild 1: Aufbau des SPI Busses\" class=\"wp-image-14418\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t15.jpg 1277w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t15-300x169.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t15-768x432.jpg 768w\" sizes=\"auto, (max-width: 1277px) 100vw, 1277px\" \/><figcaption class=\"wp-element-caption\">Bild 1: Aufbau des SPI Busses<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die Daten\u00fcbertragung erfolgt parallel in zwei Richtungen. \u00dcber die Leitung MOSI (Master Out Slave In) werden Daten vom steuernden Ger\u00e4t zum angeschlossenen Ger\u00e4t gesendet. Gleichzeitig k\u00f6nnen \u00fcber die Leitung MISO (Master In Slave Out) Daten vom angeschlossenen Ger\u00e4t zur\u00fcck \u00fcbertragen werden. Dadurch wird eine gleichzeitige \u00dcbertragung in beide Richtungen erm\u00f6glicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich wird \u00fcber die Leitung SS bzw. CS (Slave Select \/ Chip Select) festgelegt, welches Ger\u00e4t aktiv ist. Erst wenn diese Leitung aktiviert wird, reagiert das jeweilige Ger\u00e4t auf die anliegenden Daten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Bild ist zu erkennen, dass bei jedem Taktimpuls ein Bit \u00fcbertragen wird. W\u00e4hrend eines Taktsignals wird jeweils ein Bit gesendet und gleichzeitig ein Bit empfangen. Auf diese Weise wird eine schnelle und effiziente Kommunikation zwischen den Ger\u00e4ten realisiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den Anschluss eines SPI-Ger\u00e4tes an den Raspberry Pi werden standardm\u00e4\u00dfig die folgenden Pins verwendet:<\/p>\n\n\n\n<figure class=\"wp-block-table has-text-small-font-size\"><table><tbody><tr><td><strong>SPI Chip<\/strong><\/td><td><strong>Raspberry Pi<\/strong><\/td><td><strong>Pin<\/strong><\/td><\/tr><tr><td>VCC<\/td><td>5 V<\/td><td>(Pin 2 oder 4)<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><td><\/td><\/tr><tr><td>DIN<\/td><td>MOSI<\/td><td>(GPIO 10, Pin 19)<\/td><\/tr><tr><td>CS<\/td><td>CE0<\/td><td>(GPIO 8, Pin 24)<\/td><\/tr><tr><td>CLK<\/td><td>SCLK<\/td><td>(GPIO 11, Pin 23)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">LED-Matrix via SPI am Raspberry Pi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der <strong>MAX7219<\/strong> ist ein kleiner, aber leistungsstarker LED-Treiber, der die Ansteuerung von <strong>8\u00d78 LED-Matrizen<\/strong>, sieben Segmentanzeigen oder einzelnen LEDs vereinfacht. Er \u00fcbernimmt das Multiplexing, sodass der Raspberry Pi die LEDs nicht selbst einzeln steuern muss \u2013 das spart Leitungen und Rechenaufwand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der MAX7219 kommuniziert \u00fcber den <strong>SPI-Bus<\/strong>, wodurch eine schnelle und zuverl\u00e4ssige Daten\u00fcbertragung zwischen Raspberry Pi und LED-Matrix m\u00f6glich ist. \u00dcber <strong>nur f\u00fcnf Leitungen<\/strong> (VCC, GND, DIN, CLK, optional CS) lassen sich damit problemlos bis zu 64 LEDs direkt ansteuern und so auch Animationen anzeigen oder Text scrollen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit <strong>Python<\/strong> lassen sich Zeichen, Muster oder Symbole einfach programmieren. Durch Bibliotheken wie spidev kann der MAX7219 direkt \u00fcber SPI angesprochen werden, ohne dass zus\u00e4tzliche Hardware oder komplexe Libraries n\u00f6tig sind. Der MAX7219 eignet sich daher besonders gut f\u00fcr kreative Hobby-Anwendungen am Raspberry Pi. Der MAX7219 arbeitet mit den folgenden Registern:<\/p>\n\n\n\n<figure class=\"wp-block-table has-text-small-font-size\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Register<\/strong><\/td><td><strong>Bedeutung<\/strong><\/td><\/tr><tr><td>0x09<\/td><td>Decode Mode<\/td><\/tr><tr><td>0x0A<\/td><td>Helligkeit<\/td><\/tr><tr><td>0x0B<\/td><td>Scan Limit<\/td><\/tr><tr><td>0x0C<\/td><td>Shutdown<\/td><\/tr><tr><td>0x0F<\/td><td>Display Test<\/td><\/tr><tr><td>0x01 \u2013 0x08<\/td><td>Zeilen (Digit 0\u20137)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Standardm\u00e4\u00dfig ist auf dem Raspberry Pi bereits ein SPI Treiber vorhanden. Andernfalls kann dieser mit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>pip3 install spidev<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">nachinstalliert werden. In Python erfolgt die Initialisierung des SPI Busses dann \u00fcber<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-d3a23b52be06a4ef58b0f46ff2b4512d\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>import spidev<br>spi = spidev.SpiDev()<br>spi.open(0, 0)&nbsp; # Bus 0, CE0<br>spi.max_speed_hz = 1000000<br>spi.mode = 0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach k\u00f6nnen die Register beschrieben werden:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c89c48a062bb86d8b5d914fac088a1bb\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>def write(register, data):<br>&nbsp;spi.xfer2(&#91;register, data])<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den Betrieb einer LED-Matrix sollten die folgenden Register gesetzt werden:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-42cc09d377598f130fbb043006e887d3\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>write(0x0C, 0x01)&nbsp; # Shutdown \u2192 Normalbetrieb<br>write(0x0F, 0x00)&nbsp; # Test aus<br>write(0x0B, 0x07)&nbsp; # 8 Digits<br>write(0x09, 0x00)&nbsp; # Kein Decode (Pixelmodus)<br>write(0x0A, 0x08)&nbsp; # Helligkeit (0\u201315)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach kann jede Matrix-Zeile mit einem Byte f\u00fcr die 8 LEDs in einer Display-Zeile bin\u00e4r beschrieben werden z. B. f\u00fcr ein \u201eHerz\u201c-Symbol:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9eb089fafd7990712582c09b0350b3cd\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>heart = &#91;<br>&nbsp;\"01100110\",<br>&nbsp;\"11111111\",<br>&nbsp;\"11111111\",<br>&nbsp;\"11111111\",<br>&nbsp;\"01111110\",<br>&nbsp;\"00111100\",<br>&nbsp;\"00011000\",<br>&nbsp;\"00000000\"<br>]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Python-Programm erm\u00f6glicht dann die Ansteuerung einer 8&#215;8 Led-Matrix (LED_Matrix_MAX7219_direct):<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-73f75daaf403b199a87e8186abb99c9b\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>import spidev, time<br><br># SPI initialisieren<br>spi = spidev.SpiDev()<br>spi.open(0, 0)&nbsp; # Bus 0, CE0<br>spi.max_speed_hz = 1000000<br>spi.mode = 0<br><br># Funktion zum Schreiben in MAX7219<br>def write(register, data):<br>&nbsp;&nbsp;&nbsp; spi.xfer2(&#91;register, data])<br><br># Initialisierung MAX7219<br>def init_max7219():<br>&nbsp;&nbsp;&nbsp; write(0x0C, 0x01)&nbsp; # Shutdown aus<br>&nbsp;&nbsp;&nbsp; write(0x0F, 0x00)&nbsp; # Display-Test aus<br>&nbsp;&nbsp;&nbsp; write(0x0B, 0x07)&nbsp; # Scan-Limit: alle 8 Reihen<br>&nbsp;&nbsp;&nbsp; write(0x09, 0x00)&nbsp; # Matrixbetrieb<br>&nbsp;&nbsp;&nbsp; write(0x0A, 0x08)&nbsp; # Helligkeit (0\u201315)<br><br># Display l\u00f6schen<br>def clear():<br>&nbsp;&nbsp;&nbsp; for i in range(1, 9):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(i, 0x00)<br><br># Bitmuster (bin\u00e4r)<br>heart = &#91;<br>&nbsp;&nbsp;&nbsp; \"01100110\",<br>&nbsp;&nbsp;&nbsp; \"11111111\",<br>&nbsp;&nbsp;&nbsp; \"11111111\",<br>&nbsp;&nbsp;&nbsp; \"11111111\",<br>&nbsp;&nbsp;&nbsp; \"01111110\",<br>&nbsp;&nbsp;&nbsp; \"00111100\",<br>&nbsp;&nbsp;&nbsp; \"00011000\",<br>&nbsp;&nbsp;&nbsp; \"00000000\"<br>]<br><br># anzeigen<br>def show_pattern(pattern):<br>&nbsp;&nbsp;&nbsp; for i, row in enumerate(pattern):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = int(row, 2)&nbsp; # Bin\u00e4r \u2192 Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(i + 1, value)<br><br># Hauptprogramm<br>try:<br>&nbsp;&nbsp;&nbsp; init_max7219()<br>&nbsp;&nbsp;&nbsp; clear()<br>&nbsp;&nbsp;&nbsp; show_pattern(heart)<br>&nbsp;<br>except KeyboardInterrupt:<br>&nbsp;&nbsp;&nbsp; clear()<br>&nbsp;&nbsp;&nbsp; spi.close()<br>&nbsp;&nbsp;&nbsp; print(\"Programm beendet.\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das Programm erlaubt die direkte Ansteuerung der LED-Matrix \u00fcber den SPI-Bus. Zu Beginn wird die Bibliothek <code>spidev<\/code> eingebunden, \u00fcber die der Zugriff auf die SPI-Schnittstelle des Raspberry Pi erm\u00f6glicht wird. Zus\u00e4tzlich wird das Modul <code>time<\/code> importiert, um zeitliche Abl\u00e4ufe steuern zu k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anschlie\u00dfend wird eine SPI-Verbindung initialisiert. Hierzu wird ein SPI-Objekt erzeugt und mit <code>spi.open(0, 0)<\/code> der Bus 0 sowie das Ger\u00e4t CE0 ausgew\u00e4hlt. Die Kommunikationsgeschwindigkeit wird auf 1 MHz festgelegt, und mit <code>spi.mode = 0<\/code> wird der SPI-Modus 0 konfiguriert, bei dem Taktpolarit\u00e4t und -phase fest definiert sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zur Vereinfachung der Kommunikation wird eine Funktion <code>write(register, data)<\/code> definiert. In dieser Funktion werden jeweils zwei Bytes \u00fcber den SPI-Bus \u00fcbertragen. Das erste Byte stellt die Registeradresse des MAX7219 dar, w\u00e4hrend das zweite Byte den zugeh\u00f6rigen Wert enth\u00e4lt. Die \u00dcbertragung erfolgt mit <code>spi.xfer2()<\/code>, wodurch die Daten synchron an das angeschlossene Ger\u00e4t gesendet werden. Im n\u00e4chsten Schritt wird der MAX7219 initialisiert. Hierbei werden die oben genannten internen Register des Bausteins gesetzt. Durch das Schreiben in das Shutdown-Register wird der Normalbetrieb aktiviert. Der Display-Testmodus wird deaktiviert, damit die LEDs nicht dauerhaft eingeschaltet sind. \u00dcber das Scan-Limit wird festgelegt, dass alle acht Zeilen der Matrix verwendet werden. Der Decode-Modus wird deaktiviert und somit also eine direkte Ansteuerung einzelner LEDs erm\u00f6glicht. Schlie\u00dflich wird die Helligkeit \u00fcber das Intensit\u00e4tsregister eingestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dabei wird mit 0x00 die geringste und mit 0x0F die maximale Helligkeit gew\u00e4hlt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anschlie\u00dfend wird eine Funktion zum L\u00f6schen des Displays bereitgestellt. Dabei werden alle acht Zeilen nacheinander mit dem Wert Null beschrieben, wodurch s\u00e4mtliche LEDs ausgeschaltet werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das darzustellende Bild wird als Bitmuster in Form einer Liste von Bin\u00e4rstrings definiert. Jede Zeichenkette repr\u00e4sentiert dabei eine Zeile der 8\u00d78 LED-Matrix. Innerhalb der Funktion show_pattern werden diese Bin\u00e4rwerte zeilenweise verarbeitet. Jeder Bin\u00e4rstring wird zun\u00e4chst in eine Ganzzahl umgewandelt und anschlie\u00dfend an das entsprechende Register des MAX7219 \u00fcbertragen. Auf diese Weise wird das gew\u00fcnschte Muster auf der LED-Matrix dargestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Hauptprogramm wird zun\u00e4chst die Initialisierung des MAX7219 durchgef\u00fchrt. Danach wird das Display gel\u00f6scht, um einen definierten Ausgangszustand zu gew\u00e4hrleisten. Anschlie\u00dfend wird das zuvor definierte Muster auf der LED-Matrix angezeigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In der Funktion show_pattern(pattern) wird ein \u00fcbergebenes Bitmuster zeilenweise verarbeitet und auf der LED-Matrix ausgegeben. Dazu wird eine Schleife verwendet, in der mit enumerate() sowohl der Index als auch der Inhalt jeder Zeile ermittelt werden. Der Index i entspricht dabei der aktuellen Zeilennummer, w\u00e4hrend row die zugeh\u00f6rige Bin\u00e4rdarstellung enth\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jede Zeile des Musters liegt als Bin\u00e4rstring vor, beispielsweise &#8222;01100110&#8220;. Dieser String wird mithilfe der Funktion int(row, 2) in eine Ganzzahl umgewandelt. Die Angabe 2 gibt dabei an, dass es sich um eine Bin\u00e4rzahl handelt. Das Ergebnis ist ein Integer-Wert, der direkt \u00fcber die SPI-Schnittstelle \u00fcbertragen werden kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anschlie\u00dfend wird mit write(i + 1, value) der berechnete Wert an den MAX7219 gesendet. Dabei entspricht i + 1 der Registeradresse des Bausteins. Die Register 1 bis 8 stehen jeweils f\u00fcr eine Zeile der LED-Matrix. Der Wert bestimmt, welche LEDs in dieser Zeile eingeschaltet werden. Jedes Bit repr\u00e4sentiert dabei eine einzelne LED: Ein gesetztes Bit (1) schaltet die LED ein, ein nicht gesetztes Bit (0) schaltet sie aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch das schrittweise Beschreiben aller acht Register wird das vollst\u00e4ndige Bild zeilenweise aufgebaut. Da der MAX7219 intern das Multiplexing \u00fcbernimmt, erscheint das Muster f\u00fcr das menschliche Auge als statisches Bild, obwohl die LEDs tats\u00e4chlich schnell nacheinander angesteuert werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abschlie\u00dfend wird die Programmausf\u00fchrung durch eine Ausnahmebehandlung erg\u00e4nzt. Wird das Programm durch den Benutzer unterbrochen, so wird das Display gel\u00f6scht und die SPI-Verbindung ordnungsgem\u00e4\u00df geschlossen. Dadurch wird sichergestellt, dass keine undefinierten Zust\u00e4nde auf der Hardware verbleiben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild 2<\/mark> zeigt die Ausgabe des \u201eHerz\u201c-Icons auf einem 8&#215;8 LED-Matrix-Display.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1029\" height=\"846\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t15.jpg\" alt=\"Bild 2: Graphikausgabe auf der LED-Matrix\" class=\"wp-image-14419\" style=\"aspect-ratio:1.2158180408374257;width:637px;height:auto\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t15.jpg 1029w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t15-300x247.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t15-768x631.jpg 768w\" sizes=\"auto, (max-width: 1029px) 100vw, 1029px\" \/><figcaption class=\"wp-element-caption\">Bild 2: Graphikausgabe auf der LED-Matrix<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Erg\u00e4nzungen, \u00dcbungen und Anregungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wie k\u00f6nnte man eine bestimmte LED gezielt einschalten? Lassen sich dabei Koordinaten (x, y) zur Ansteuerung verwenden?<\/li>\n\n\n\n<li>Stelle verschiedene Smiley-Muster auf der Matrix dar!<\/li>\n\n\n\n<li>Wie k\u00f6nnte man ein Lauflicht programmieren, bei dem eine LED von links nach rechts wandert?<\/li>\n\n\n\n<li>K\u00f6nnte man auch Buchstaben oder Zahlen auf der Matrix darstellen? L\u00e4sst sich dabei das Prinzip von Bitmaps nutzen?<\/li>\n\n\n\n<li>W\u00e4re es m\u00f6glich, einen Text \u00fcber die LED-Matrix laufen zu lassen?<\/li>\n\n\n\n<li>Wie k\u00f6nnte man einfache Animationen auf der Matrix umsetzen? Ist es auch m\u00f6glich, ein z. B. blinkendes Herz oder bewegte Formen darzustellen?<\/li>\n\n\n\n<li>Wie k\u00f6nnte man unterschiedliche Helligkeiten einzelner LEDs realisieren?<\/li>\n\n\n\n<li>Kombiniere mehrere LED-Matrizen zu einer gr\u00f6\u00dferen Anzeige (z. B. 8\u00d78 \u2192 32\u00d78 oder mehr)? <br>Welche Herausforderungen ergeben sich bei der Ansteuerung gro\u00dfer zusammengesetzter Matrizen?<\/li>\n\n\n\n<li>Ist es m\u00f6glich, Sensordaten auf der LED-Matrix darzustellen? Wie k\u00f6nnte man z. B. die Temperatur eines DS18B20 anzeigen?<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beitrag wurden die Grundlagen des SPI-Busses erkl\u00e4rt und gezeigt, wie man ihn mit Python praktisch nutzt. Anhand eines konkreten Beispiels \u2013 der Ansteuerung einer 8\u00d78-LED-Matrix mit dem MAX7219 \u2013 wurde erl\u00e4utert, wie SPI in Python eingesetzt werden kann. Dazu geh\u00f6rten die Initialisierung der SPI-Schnittstelle mit der Bibliothek spidev, das Schreiben von Daten in Register sowie die Darstellung einfacher Muster.<br>Im n\u00e4chsten Beitrag wird gezeigt, wie man mit Python Daten und Werte ins Internet \u00fcbertragen kann. Hierzu kommen verschiedene IoT-Anwendungen (<strong>I<\/strong>nternet <strong>o<\/strong>f <strong>T<\/strong>hings) zum Einsatz. In praktischen Anwendungen sollen dabei Messwerte aus Haus, Garten oder B\u00fcro in \u201edie Cloud\u201c gesendet und dort ansprechend dargestellt werden.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Material&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Raspberry Pi mit Netzteil<\/li>\n\n\n\n<li>Breadboard &amp; Jumper Kabel<\/li>\n\n\n\n<li>MAX7219-Matrix-Display<\/li>\n<\/ul>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-gray-lightest-100-background-color has-background wp-block-paragraph\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><strong>\u00dcber den Autor<br><\/strong>Dr. G\u00fcnter Spanner ist als Autor zu den Themen Elektronik, Sensortechnik und Mikrocontroller einem weiten Fachpublikum bekannt. Schwerpunkt seiner hauptberuflichen T\u00e4tigkeit f\u00fcr verschiedene Gro\u00dfkonzerne wie Siemens und ABB ist die Projektleitung im Bereich Entwicklung und Technologie-Management. Der Dozent fu\u0308r Physik und Elektrotechnik hat zudem zahlreiche Fachartikel und Bu\u0308cher vero\u0308ffentlicht sowie Kurse und Lernpakete erstellt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit Python lassen sich SPI-Ger\u00e4te einfach programmieren, Daten lesen, steuern oder anzeigen. Dadurch wird der Raspberry Pi besonders attraktiv f\u00fcr Lernprojekte, Prototyping und IoT-Anwendungen. In diesem Beitrag wird gezeigt, wie SPI funktioniert, welche Bausteine unterst\u00fctzt werden und wie man die Schnittstelle in Python praktisch nutzt.<\/p>\n","protected":false},"author":5,"featured_media":864,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[34],"tags":[2326,2332,2333,2341,2335,2322,2330,2336,2324,2334,2329,2338,2321,2339,2327,2337,2323,2331,2351,2320,2319,2328],"post-author":[137],"class_list":["post-14412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python-micropython","tag-8x8-led-matrix","tag-ce0","tag-chip-select","tag-embedded-python","tag-gpio","tag-led-matrix","tag-max7219","tag-max7219-python","tag-miso","tag-mosi","tag-python","tag-python-led-matrix","tag-raspberry-pi","tag-raspberry-pi-led-matrix","tag-raspberry-pi-spi","tag-sclk","tag-serial-peripheral-interface","tag-spi-mit-python","tag-spi-schnittstelle","tag-spi-bus","tag-spi-bus-mit-python","tag-spidev","post-author-dr-guenter-spanner"],"acf":[],"info":{"thumbnail":{"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/header_phyton_teil11.jpg","alt":""},"teaserImage":{"ID":14416,"id":14416,"title":"liste-beitrag_python_t15_neu","filename":"Liste-Beitrag_python_t15_neu.jpg","filesize":97170,"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","link":"https:\/\/de.elv.com\/elvjournal\/spi-bus-python-raspberry-pi-led-matrix-max7219\/liste-beitrag_python_t15_neu\/","alt":"","author":"5","description":"","caption":"","name":"liste-beitrag_python_t15_neu","status":"inherit","uploaded_to":14412,"date":"2026-07-01 12:51:11","modified":"2026-07-01 12:51:11","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/elvjournal.elv.com\/wp-includes\/images\/media\/default.png","width":433,"height":274,"sizes":{"thumbnail":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu-250x250.jpg","thumbnail-width":250,"thumbnail-height":250,"medium":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu-300x190.jpg","medium-width":300,"medium-height":190,"medium_large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","medium_large-width":433,"medium_large-height":274,"large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","large-width":433,"large-height":274,"1536x1536":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","1536x1536-width":433,"1536x1536-height":274,"2048x2048":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","2048x2048-width":433,"2048x2048-height":274,"gform-image-choice-sm":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":190,"gform-image-choice-md":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","gform-image-choice-md-width":400,"gform-image-choice-md-height":253,"gform-image-choice-lg":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t15_neu.jpg","gform-image-choice-lg-width":433,"gform-image-choice-lg-height":274}},"categories":[{"id":34,"name":"Python &amp; MicroPython","slug":"python-micropython"}],"authors":[{"id":137,"name":"Dr. G\u00fcnter Spanner","slug":"dr-guenter-spanner"}],"document":false,"epaper":"","date":"21. Juli 2026","excerpt":"Mit Python lassen sich SPI-Ger\u00e4te einfach programmieren, Daten lesen, steuern oder anzeigen. Dadurch wird der Raspberry Pi besonders attraktiv f\u00fcr Lernprojekte, Prototyping und IoT-Anwendungen. In diesem Beitrag wird gezeigt, wie SPI funktioniert, welche Bausteine unterst\u00fctzt werden und wie man die Schnittstelle in Python praktisch nutzt."},"_links":{"self":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/14412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/comments?post=14412"}],"version-history":[{"count":10,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/14412\/revisions"}],"predecessor-version":[{"id":14861,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/14412\/revisions\/14861"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/media\/864"}],"wp:attachment":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/media?parent=14412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/categories?post=14412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/tags?post=14412"},{"taxonomy":"post-author","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/post-author?post=14412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}