{"id":10985,"date":"2026-04-28T10:00:00","date_gmt":"2026-04-28T08:00:00","guid":{"rendered":"https:\/\/de.elv.com\/elvjournal\/?p=10985"},"modified":"2026-06-12T12:41:14","modified_gmt":"2026-06-12T10:41:14","slug":"raspberry-pi-i2c-python","status":"publish","type":"post","link":"https:\/\/de.elv.com\/elvjournal\/raspberry-pi-i2c-python\/","title":{"rendered":"Einstieg in Python (Teil 14): Bussysteme mit Python programmieren"},"content":{"rendered":"\n<p class=\"has-gray-light-color has-text-color has-link-color has-h-5-font-size wp-elements-fcb118c333a8cfd94c8f94e882f02414\"><strong>Einstieg in Python, Teil 14<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">I\u00b2C-Bus mit Python programmieren<\/h1>\n\n\n\n<p><strong>Bussysteme dienen dazu, Daten zwischen einem Mikrocomputer und angeschlossenen Peripherieger\u00e4ten wie Sensoren, Aktoren oder Displays auszutauschen. Der Raspberry Pi stellt daf\u00fcr verschiedene Bussysteme bereit, die sich in Geschwindigkeit, Komplexit\u00e4t und Einsatzgebiet unterscheiden. Besonders bei kompakten Schaltungen mit mehreren Ger\u00e4ten spielt eine einfache und effiziente Kommunikation eine wichtige Rolle. Ein h\u00e4ufig eingesetztes Bussystem f\u00fcr solche Anwendungen ist der I\u00b2C-Bus, der mit nur zwei aktiven Leitungen auskommt und sich daher ideal f\u00fcr viele Raspberry-Pi-Projekte eignet.<\/strong><\/p>\n\n\n\n<p>Generell ist der I\u00b2C-Bus (I\u00b2C bzw. IIC steht f\u00fcr Inter-Integrated Circuit) eines der am h\u00e4ufigsten genutzten Bussysteme auf dem Raspberry Pi. Er eignet sich besonders zur Anbindung von vielen beliebten und weit verbreiteten Sensoren, Displays und anderen Peripherieger\u00e4ten. Er erm\u00f6glicht die Kommunikation mehrerer Ger\u00e4te \u00fcber nur zwei Leitungen und ist damit platz- und ressourcensparend. In Kombination mit der Programmiersprache Python l\u00e4sst sich der I\u00b2C-Bus auf dem Raspberry Pi einfach konfigurieren und effizient nutzen, was ihn ideal f\u00fcr Einsteiger sowie f\u00fcr schnelle Prototypen im Bereich Embedded- und IoT-Anwendungen macht.<\/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\">Der I\u00b2C-Bus im \u00dcberblick<\/h2>\n\n\n\n<p>Der I\u00b2C-Bus ist ein weit verbreitetes serielles Kommunikationsprotokoll, das speziell f\u00fcr die einfache Verbindung von integrierten Schaltungen entwickelt wurde. Er findet heute in zahlreichen Mikrocontroller- und Einplatinencomputer-Projekten Anwendung, insbesondere beim Raspberry Pi. In Kombination mit der Programmiersprache Python erm\u00f6glicht der I\u00b2C-Bus eine komfortable und effiziente Ansteuerung von Sensoren, Aktoren und Displays. <br>Das zentrale Merkmal des I\u00b2C-Busses ist seine Einfachheit. Er ben\u00f6tigt lediglich <strong>zwei Leitungen<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SDA (Serial Data Line)<\/strong> f\u00fcr die Daten\u00fcbertragung<\/li>\n\n\n\n<li><strong>SCL (Serial Clock Line)<\/strong> f\u00fcr das Taktsignal<\/li>\n<\/ul>\n\n\n\n<p>Zus\u00e4tzlich werden eine gemeinsame Masse (GND) und eine Versorgungsspannung ben\u00f6tigt. Alle angeschlossenen Ger\u00e4te teilen sich diese beiden Datenleitungen, was den Verkabelungsaufwand erheblich reduziert. Besonders bei Projekten mit mehreren Komponenten ist dies ein gro\u00dfer Vorteil gegen\u00fcber anderen Schnittstellen.<\/p>\n\n\n\n<p>Der I\u00b2C-Bus arbeitet nach dem <strong>Master-Slave-Prinzip, heute oft auch als Controller \u2013 Peripheral bezeichnet<\/strong>. Ein Ger\u00e4t fungiert als Master (Controller) und steuert die Kommunikation, w\u00e4hrend ein oder mehrere Slaves (Peripherials) auf Anfragen reagieren. Beim Raspberry Pi \u00fcbernimmt in der Regel der Pi selbst die Rolle des Masters, w\u00e4hrend Sensoren wie der BMP280, BME280 oder Displays, wie das SSD1306, als Slaves arbeiten.<\/p>\n\n\n\n<p>Jedes I\u00b2C-Ger\u00e4t besitzt eine <strong>eindeutige Adresse<\/strong>, typischerweise 7-bit-lang. Diese Adresse erm\u00f6glicht es dem Master, gezielt mit einem bestimmten Slave zu kommunizieren. Typische I\u00b2C-Adressen liegen beispielsweise bei <code>0x76<\/code> oder <code>0x77<\/code> f\u00fcr Drucksensoren oder <code>0x3C<\/code> f\u00fcr OLED-Displays.<\/p>\n\n\n\n<p>Ein gro\u00dfer Vorteil des I\u00b2C-Busses ist es, dass <strong>mehrere Ger\u00e4te gleichzeitig am selben Bus betrieben<\/strong> werden k\u00f6nnen, solange ihre Adressen unterschiedlich sind. Mithilfe des Linux-Werkzeugs <code>i2cdetect<\/code> l\u00e4sst sich leicht \u00fcberpr\u00fcfen, welche Ger\u00e4te am Bus erkannt 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\">Python als ideale Sprache f\u00fcr I\u00b2C-Bus<\/h2>\n\n\n\n<p>Python eignet sich besonders gut f\u00fcr die Arbeit mit dem I\u00b2C-Bus. Die Sprache ist leicht verst\u00e4ndlich, \u00fcbersichtlich und bietet zahlreiche Bibliotheken, die den Zugriff auf die Schnittstelle stark vereinfachen. Besonders verbreitet ist die Bibliothek <code>smbus<\/code>, die eine direkte Kommunikation mit I\u00b2C-Ger\u00e4ten erlaubt. Der I\u00b2C-Bus bietet dabei zahlreiche Vorteile:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sehr geringer Verkabelungsaufwand<\/li>\n\n\n\n<li>Mehrere Ger\u00e4te an einem Bus m\u00f6glich<\/li>\n\n\n\n<li>Weit verbreitet und gut dokumentiert<\/li>\n\n\n\n<li>Ideal f\u00fcr kurze Distanzen auf Leiterplatten oder Breadboards<\/li>\n<\/ul>\n\n\n\n<p>In Verbindung mit Python lassen sich Prototypen besonders schnell realisieren, was den I\u00b2C-Bus zu einer beliebten Wahl f\u00fcr Maker-, IoT- und Schulprojekte macht.<\/p>\n\n\n\n<p>Trotz seiner Vorteile hat der I\u00b2C-Bus auch Einschr\u00e4nkungen. Die Kabell\u00e4ngen sollten m\u00f6glichst kurz bleiben, da l\u00e4ngere Leitungen zu St\u00f6rungen f\u00fchren k\u00f6nnen. Au\u00dferdem ist die Datenrate im Vergleich zu Schnittstellen wie SPI begrenzt. F\u00fcr hochfrequente oder zeitkritische Anwendungen ist I\u00b2C daher weniger geeignet. F\u00fcr typische Sensor- und Steueraufgaben am Raspberry Pi spielen diese Nachteile jedoch meist keine entscheidende Rolle.<\/p>\n\n\n\n<p>Der I\u00b2C-Bus ist somit eine einfache, robuste und vielseitige Schnittstelle, die sich hervorragend f\u00fcr den Einsatz mit dem Raspberry Pi eignet. In Kombination mit Python k\u00f6nnen Sensoren und andere Peripherieger\u00e4te schnell und effizient angebunden werden. Gerade f\u00fcr Einsteiger \u00f6ffnet diese Kombination den Weg in die Welt der Hardware-Programmierung, ohne dabei auf professionelle M\u00f6glichkeiten verzichten zu m\u00fcssen.<\/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\">Auf Raspberry Pi den I\u00b2C-Bus aktivieren<\/h2>\n\n\n\n<p>Der Einsatz des I\u00b2C-Systems in Kombination mit Python bietet zahlreiche Vorteile. F\u00fcr den Betrieb des Bussystems muss zun\u00e4chst der I\u00b2C-Bus auf dem Raspberry Pi aktiviert werden:<\/p>\n\n\n\n<p><code>sudo raspi-config<\/code> \u2192 Interface Options \u2192 I2C \u2192 Enable.<\/p>\n\n\n\n<p>Dann k\u00f6nnen I\u00b2C-f\u00e4hige Komponenten mit zwei Leitungen GND und V<sub>cc<\/sub> an den Raspberry Pi angeschlossen werden. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">OLED-Display anschlie\u00dfen<\/h3>\n\n\n\n<p>In einem fr\u00fcheren Beitrag wurde bereits <a href=\"https:\/\/de.elv.com\/elvjournal\/oled-display-python-raspberry-pi-ssd1306\/\" target=\"_blank\" rel=\"noreferrer noopener\">ein OLED-Display des Typs SSD1306<\/a> eingesetzt. F\u00fcr das SSD1306-Display werden die folgenden Pins verwendet:<\/p>\n\n\n\n<figure class=\"wp-block-table has-text-small-font-size\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>OLED oder Sensor<\/strong><\/td><td><strong>Raspberry Pi Pin<\/strong><\/td><td><strong>Name<\/strong><\/td><\/tr><tr><td>V<sub>cc<\/sub><\/td><td>3.3&nbsp;V (Pin 1)<\/td><td>Stromversorgung<\/td><\/tr><tr><td>GND<\/td><td>GND (z.&nbsp;B. Pin&nbsp;6)<\/td><td>Masse<\/td><\/tr><tr><td>SDA<\/td><td>SDA (Pin&nbsp;3)<\/td><td>I\u00b2C Daten<\/td><\/tr><tr><td>SCL<\/td><td>SCL (Pin&nbsp;5)<\/td><td>I\u00b2C Clock<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Typische Daten des SSD1306:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gr\u00f6\u00dfe: 0,96&#8243; bis 1,3&#8243;<\/li>\n\n\n\n<li>Aufl\u00f6sung: 128&#215;64<\/li>\n\n\n\n<li>Schnittstellen: I\u00b2C (SDA\/SCL)<\/li>\n\n\n\n<li>Betriebsspannung: 3,3&nbsp;V<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Um zu pr\u00fcfen, ob eine I\u00b2C-Komponente wie ein <strong>SSD1306-OLED-Display<\/strong> korrekt am Raspberry Pi angeschlossen ist, kann man einen sogenannten \u201eScan\u201c durchf\u00fchren. <br><br>Hierzu wird zun\u00e4chst das erforderliche Werkzeug installiert: <code>sudo apt install i2c-tools<\/code><br>Dann kann der I\u00b2C-Bus gescannt werden: <code>i2cdetect -y 1 <\/code><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<p>Wird das Display korrekt erkannt, erscheint eine <strong>Hex-Adresse<\/strong> (z. B. 3c oder 3d) in der Ausgabe <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(Bild 1)<\/mark>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignright size-full is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"430\" height=\"179\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t14.jpg\" alt=\"Bild 1: I2C-Komponenten an Adresse 3C erkannt!\" class=\"wp-image-11010\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t14.jpg 430w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild01_python_t14-300x125.jpg 300w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><figcaption class=\"wp-element-caption\">Bild 1: I2C-Komponenten an Adresse 3C erkannt!<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Falls <strong>eine Adresse erkannt wird<\/strong>, ist das Ger\u00e4t korrekt angeschlossen und \u00fcber den I\u00b2C-Bus erreichbar. <strong>Erscheint keine Adresse<\/strong>, liegt meist ein Problem bei Verkabelung, Stromversorgung oder der I\u00b2C-Aktivierung vor. Weitere Details und eine Demonstration mit Python wurden bereits im oben genannten Beitrag ausf\u00fchrlich dargelegt und k\u00f6nnen dort bei Bedarf nochmals nachgelesen 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\">Welche Daten werden beim I\u00b2C-Bus zuerst gesendet?<\/h2>\n\n\n\n<p>Die Kommunikation \u00fcber den I\u00b2C-Bus erfolgt in klar definierten Schritten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Der Master sendet ein <strong>Start-Signal<\/strong><\/li>\n\n\n\n<li>Die Adresse des Zielger\u00e4ts wird \u00fcbertragen<\/li>\n\n\n\n<li>Es folgt ein <strong>Lese- oder Schreibbefehl<\/strong><\/li>\n\n\n\n<li>Daten werden byteweise \u00fcbertragen<\/li>\n\n\n\n<li>Die Kommunikation endet mit einem <strong>Stop-Signal<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Jedes \u00fcbertragene Byte wird vom Empf\u00e4nger mit einem <strong>ACK-Signal<\/strong> best\u00e4tigt. Dadurch ist eine zuverl\u00e4ssige Daten\u00fcbertragung gew\u00e4hrleistet. Die \u00dcbertragungsgeschwindigkeit liegt typischerweise bei 100&nbsp;kHz (Standard Mode) oder 400&nbsp;kHz (Fast Mode), was f\u00fcr Sensoranwendungen mehr als ausreichend ist. Der Raspberry Pi verf\u00fcgt \u00fcber eine <strong>hardwarebasierte I\u00b2C-Schnittstelle<\/strong>, die standardm\u00e4\u00dfig auf den GPIO-Pins&nbsp;2 (SDA) und 3 (SCL) liegt. Vor der Nutzung muss I\u00b2C, wie zuvor aufgef\u00fchrt, einmalig in der Systemkonfiguration aktiviert werden. Danach steht die Schnittstelle allen Programmen zur Verf\u00fcgung. Gerade im Bildungsbereich und bei Einsteigerprojekten ist der Raspberry Pi in Kombination mit I\u00b2C sehr beliebt, da komplexe Hardwareaufbauten vermieden werden k\u00f6nnen. Ein einzelner Pi kann problemlos mehrere Sensoren gleichzeitig auslesen und deren Daten weiterverarbeiten.<\/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\">I\u00b2C Sensoren mit Python auslesen<\/h2>\n\n\n\n<p>Der Raspberry Pi bietet mit dem I\u00b2C-Bus eine einfache und effiziente M\u00f6glichkeit, Sensoren anzuschlie\u00dfen und auszulesen. I\u00b2C (Inter-Integrated Circuit) ist ein serielles Kommunikationsprotokoll, das es erlaubt, mehrere Sensoren \u00fcber nur zwei Leitungen (SDA und SCL) mit dem Raspberry Pi zu verbinden. Mithilfe der Programmiersprache Python k\u00f6nnen die Sensordaten leicht ausgelesen, verarbeitet und weiterverwendet werden. Dadurch eignet sich diese Kombination besonders gut f\u00fcr Mess-, Automatisierungs- und IoT-Projekte sowie f\u00fcr den Einsatz im Bildungsbereich.<br><br><strong>I\u00b2C-Sensoren<\/strong> umfassen eine Vielzahl unterschiedlicher Bauelemente und erm\u00f6glichen die Umsetzung vieler interessanter Projekte. Dazu z\u00e4hlen unter anderem Temperatur-, Feuchtigkeits-, Druck-, Licht- oder Bewegungssensoren. Durch ihre einfache Anbindung \u00fcber den I\u00b2C-Bus lassen sich mehrere Sensoren gleichzeitig betreiben, was sie besonders vielseitig macht. Typische Beispiele sind Wetterstationen, Smart-Home-Anwendungen, Umweltmessungen oder automatische Steuerungssysteme. <\/p>\n\n\n\n<div class=\"wp-block-group has-gray-lightest-100-background-color has-background is-layout-constrained wp-container-core-group-is-layout-283b4700 wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<h3 class=\"wp-block-heading\">Die wichtigsten I\u00b2C-Sensoren und Komponenten sind:<\/h3>\n\n\n\n<p><strong>Temperatur und Luftfeuchtigkeit<\/strong>:<br><strong>BME280<\/strong> \u2013 misst Temperatur und Luftfeuchte<br><strong>HTU21D \/ SHT31 <\/strong>\u2013 pr\u00e4zise Temperatur- und Feuchte-Sensoren<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Luftdruck\/H\u00f6he<\/strong>:<br><strong>BMP280<\/strong> \u2013 Luftdruck- und H\u00f6henmessung sowie Klimaparameter<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Bewegung und Orientierung<\/strong>:<br><strong>MPU-6050<\/strong> \u2013 6-Achsen-Gyroskop und Beschleunigungssensor<br><strong>LSM9DS1<\/strong> \u2013 9-Achsen Inertialsensor<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Displays<\/strong>:<br>Neben den OLED Displays (z. B. 0,96\u2033) k\u00f6nnen auch LCD-Displays mit 16&#215;2 oder 20&#215;4 \u00fcber ein I\u00b2C-Backpack einfach angesteuert<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Mess- und Steuerungskomponenten<\/strong>:<br><strong>ADC (Analog-Digital-Wandler): MCP3008 \/ ADS1115<\/strong> \u2013 analog messen (z. B. Potentiometer, Sensoren)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>IO-Expander<\/strong>:<br><strong>PCF8574 \/ MCP23017<\/strong> \u2013 erweitert GPIO-Pins \u00fcber I\u00b2C<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Real Time Clock (RTC)<\/strong>:<br><strong>DS1307 \/ DS3231<\/strong> \u2013 echte Uhrzeit auch ohne Netzwerk\/Internet<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>EEPROM-Speicher<\/strong>:<br>I\u00b2C-EEPROMs (z. B. 24Cxx) zum Speichern kleiner Datenmengen<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-primary-color has-alpha-channel-opacity has-primary-background-color has-background\"\/>\n\n\n\n<p><strong>Digital-Potentiometer<\/strong>:<br>z. B. <strong>Typ MCP4017<\/strong> zur elektrisch steuerbaren Ver\u00e4nderung von Widerstandswerten<\/p>\n<\/div>\n\n\n\n<p>Das Ansteuern und Auslesen eines I\u00b2C-Sensors soll im Folgenden am Beispiel des Temperatur-, und Drucksensors BMP280 demonstriert werden. Der Anschluss des Sensors ist analog zum OLED Display, wie in obenstehender Tabelle, angegeben. <br><br>Falls noch nicht vorhanden, so muss die smbus-Library installiert werden: <br><code>sudo apt install -y python3-smbus i2c-tools<\/code><br>Danach kann das Modul mit <code>i2cdetect -y 1<\/code> \u00fcberpr\u00fcft werden. <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<p>Wenn sowohl das OLED Display als auch der Sensor angeschlossen sind, werden beide I\u00b2C-Elemente gefunden <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(Bild&nbsp;2)<\/mark>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignright size-full is-resized is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"429\" height=\"179\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t14.jpg\" alt=\"Bild 2: Beide I2C-Elemnte sind verf\u00fcgbar\" class=\"wp-image-11011\" style=\"width:431px;height:auto\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t14.jpg 429w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild02_python_t14-300x125.jpg 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><figcaption class=\"wp-element-caption\">Bild 2: Beide I2C-Elemnte sind verf\u00fcgbar<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Danach kann der Sensor mit dem folgenden Python-Code ausgelesen werden. Im Programm wurden aus Gr\u00fcnden der \u00dcbersichtlichkeit einige Zeilen weggelassen [\u2026]. Die vollst\u00e4ndige Version ist jedoch im Download enthalten (BMP280.py).<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><code>import smbus, time\nbus = smbus.SMBus(1)\nBMP280_ADDR = 0x76  # BMP280-Adresse (0x76 oder 0x77)\nCTRL_MEAS = 0xF4\nPRESS_MSB = 0xF7\nbus.write_byte_data(BMP280_ADDR, CTRL_MEAS, 0x27)\ndef read_calibration():\n    data = bus.read_i2c_block_data(BMP280_ADDR, 0x88, 24)\n    dig_T1 = data&#91;1] &lt;&lt; 8 | data&#91;0]\n    dig_T2 = data&#91;3] &lt;&lt; 8 | data&#91;2]\n        &#91;...]\n    return (dig_T1, dig_T2, dig_T3, dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7,     dig_P8, dig_P9)\ncal = read_calibration()\ndef read_raw():\n    data = bus.read_i2c_block_data(BMP280_ADDR, PRESS_MSB, 6)\n    adc_p = (data&#91;0] &lt;&lt; 12) | (data&#91;1] &lt;&lt; 4) | (data&#91;2] &gt;&gt; 4)\n    adc_t = (data&#91;3] &lt;&lt; 12) | (data&#91;4] &lt;&lt; 4) | (data&#91;5] &gt;&gt; 4)\n    return adc_t, adc_p\ndef compensate_temperature(adc_t):\n    dig_T1, dig_T2, dig_T3 = cal&#91;0:3]\n    var1 = (adc_t \/ 16384.0 - dig_T1 \/ 1024.0) * dig_T2\n    var2 = ((adc_t \/ 131072.0 - dig_T1 \/ 8192.0) ** 2) * dig_T3\n    t_fine = var1 + var2\n    temperature = t_fine \/ 5120.0\n    return temperature, t_fine\ndef compensate_pressure(adc_p, t_fine):\n    dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9 = cal&#91;3:]\n    var1 = t_fine \/ 2.0 - 64000.0\n    var2 = var1 * var1 * dig_P6 \/ 32768.0\n    var2 = var2 + var1 * dig_P5 * 2.0\n    var2 = var2 \/ 4.0 + dig_P4 * 65536.0\n    var1 = (dig_P3 * var1 * var1 \/ 524288.0 + dig_P2 * var1) \/ 524288.0\n    var1 = (1.0 + var1 \/ 32768.0) * dig_P1\n    if var1 == 0:\n        return 0\n    pressure = 1048576.0 - adc_p\n    pressure = (pressure - var2 \/ 4096.0) * 6250.0 \/ var1\n    var1 = dig_P9 * pressure * pressure \/ 2147483648.0\n    var2 = pressure * dig_P8 \/ 32768.0\n    pressure = pressure + (var1 + var2 + dig_P7) \/ 16.0\n    return pressure \/ 100.0  # in hPa\n\nwhile True:\n    raw_temp, raw_press = read_raw()\n    temperature, t_fine = compensate_temperature(raw_temp)\n    pressure = compensate_pressure(raw_press, t_fine)\n    print(f\"Temperatur: {temperature:.2f} \u00b0C\")\n    print(f\"Druck     : {pressure:.2f} hPa\")\n    print(\"----------------------\")\n    time.sleep(1)\n<\/code><\/pre>\n\n\n\n<p>Das Programm liest \u00fcber den I\u00b2C-Bus Messdaten vom BMP280-Sensor aus. Zun\u00e4chst wird der Sensor initialisiert und die im Sensor gespeicherten Kalibrierungswerte ausgelesen. Anschlie\u00dfend werden die Rohdaten f\u00fcr Temperatur und Luftdruck erfasst. Mithilfe einiger Berechnungen werden diese Rohwerte in die tats\u00e4chlichen Messwerte umgerechnet. Anschlie\u00dfend gibt das Programm die aktuelle Temperatur in Grad Celsius sowie den Luftdruck in Hektopascal in der Konsole aus.<\/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\">Praxis-Tipp: Thermo-Barometer im Stand-Alone Betrieb<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Kombiniert man die beiden Programme, erh\u00e4lt man ein kompaktes Thermo-Barometer, bei dem die Sensorwerte direkt auf dem OLED-Display angezeigt werden <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(s. Bild&nbsp;3)<\/mark>. Auf diese Weise kann der Raspberry Pi zusammen mit dem Sensor und dem Display im Stand-Alone-Betrieb betrieben werden, ohne dass ein PC, eine Tastatur oder eine Maus angeschlossen sein m\u00fcssen. Das komplette Programm (BMP280_to_Luma_OLED.py) ist im Download enthalten.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1478\" height=\"1600\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14-1478x1600.jpg\" alt=\"\" class=\"wp-image-11012\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14-1478x1600.jpg 1478w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14-277x300.jpg 277w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14-768x831.jpg 768w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14-1419x1536.jpg 1419w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/bild03_python_t14.jpg 1500w\" sizes=\"auto, (max-width: 1478px) 100vw, 1478px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Mit dem <strong>BME280<\/strong> l\u00e4sst sich zwar keine exakte Wettervorhersage erstellen, jedoch k\u00f6nnen durch die <strong>Beobachtung des Luftdrucks und seiner Ver\u00e4nderung<\/strong> recht zuverl\u00e4ssig Wettertendenzen erkannt werden. Es gelten die folgenden Praxisregeln:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Liegt die Druck\u00e4nderung in den letzten Stunden deutlich im <strong>Plusbereich (+25 bis +50&nbsp;Pa)<\/strong>, bleibt das Wetter meist stabil und sch\u00f6n.<\/li>\n\n\n\n<li>F\u00e4llt der Wert dagegen schnell um <strong>20 bis 50&nbsp;Pa<\/strong>, so deutet dies auf aufkommendes, schlechtes Wetter hin.<\/li>\n\n\n\n<li>Werte ohne <strong>nennenswerte \u00c4nderung<\/strong> sprechen f\u00fcr eher wechselhaftes Wetter.<\/li>\n<\/ul>\n\n\n\n<p>Zum Zeitpunkt der Messung auf dem Display schneite es leicht und das Wetter war eher ver\u00e4nderlich \u2013 der angezeigte Druckabfall von ca. <strong>14&nbsp;hPa<\/strong> innerhalb von ca. 3&nbsp;h ist daf\u00fcr durchaus realistisch. Die Internet-Wettervorhersage sagte f\u00fcr den n\u00e4chsten Tag durchgehend Sonne voraus. Tats\u00e4chlich zeigte der Sensor am Folgetag einen deutlich gestiegenen Luftdruck (<strong>+22&nbsp;hPa).<\/strong> Das passt gut zu einem stabilen Hochdruckgebiet. Die Wettervorhersage kann man grunds\u00e4tzlich nat\u00fcrlich auch auf einem Smartphone ablesen. H\u00e4ufig bietet die kontinuierliche Luftdruckmessung mit dem BME280 aber eine interessante M\u00f6glichkeit, <strong>lokale Wetterentwicklungen selbst zu beobachten und einzuordnen<\/strong>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group has-gray-lightest-100-background-color has-background is-layout-constrained wp-container-core-group-is-layout-ff778368 wp-block-group-is-layout-constrained\" style=\"padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<h2 class=\"wp-block-heading\">Erg\u00e4nzungen, \u00dcbungen und Anregungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mehrere I\u00b2C-Ger\u00e4te an einem Bus betreiben<\/strong><br>Wie k\u00f6nnen neben dem OLED-Display (SSD1306\/SSD1308) und dem BME280 gleichzeitig weitere Sensoren, Displays und Aktoren \u00fcber denselben I\u00b2C-Bus angesprochen werden? Was ist dabei bei der Ger\u00e4teadressierung zu beachten, damit es nicht zu Konflikten kommt?<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sensordaten verst\u00e4ndlich visualisieren<\/strong><br>Wie kann man die Messwerte des BME280 (Temperatur, Luftdruck, Luftfeuchte) \u00fcbersichtlich auf dem OLED-Display darstellen?<br>Ist es m\u00f6glich, die Anzeige durch Symbole, Seitenwechsel oder einfache Diagramme zu erg\u00e4nzen, um beispielsweise die Informationen besser interpretieren zu k\u00f6nnen?<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wettertendenzen erkennen<\/strong><br>Wie kann man den Luftdruck \u00fcber einen l\u00e4ngeren Zeitraum aufzeichnen, um dessen Ver\u00e4nderung genauer zu analysieren? Mit graphischen Anzeigen lassen sich steigende oder fallende Druckwerte bessere erkennen und Aussagen \u00fcber stabile oder wechselhafte Wetterlagen fallen damit wesentlich leichter.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div style=\"height:40px\" 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>In diesem Artikel wurde die Programmierung von I\u00b2C-Komponenten mit Python ausf\u00fchrlich dargestellt. Praktische Anwendungen reichten hierbei vom OLED Display \u00fcber das Auslesen von Sensorwerten bis hin zu einem kompletten Thermo-Barometer. Dabei kam der I\u00b2C-Bus als Bindeglied zwischen dem Raspberry Pi und den Peripherieger\u00e4ten zum Einsatz. Dies verdeutlicht die wichtige Rolle, die Bussysteme in der Programmierung spielen. Mit Python stellt der Einsatz solcher Bussysteme kein Problem dar.<\/p>\n\n\n\n<p>In den folgenden Beitr\u00e4gen sollen weitere Bussysteme, wie SPI, genauer betrachtet werden. Neben den grundlegenden Programmierkonzepten mit Python werden dabei auch wieder praktische Projekte und Einsatzm\u00f6glichkeiten vorgestellt.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Material<\/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>OLED-Display<\/li>\n\n\n\n<li>BMP280 Modul<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-gray-lightest-100-background-color has-background\" 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\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Raspberry Pi bietet zahlreiche Schnittstellen zur Kommunikation mit externen Sensoren, Aktoren und anderen Ger\u00e4ten. Diese Kommunikation erfolgt \u00fcber sogenannte Bussysteme wie I\u00b2C, SPI, UART oder einfache GPIO-Verbindungen. Mithilfe der Programmiersprache Python lassen sich diese Bussysteme einfach und effizient ansprechen, wodurch der Raspberry Pi besonders f\u00fcr Lern-, Prototyping- und IoT-Projekte geeignet ist. Dieser Beitrag gibt einen \u00dcberblick \u00fcber die wichtigsten Bussysteme des Raspberry Pi und zeigt, wie sie mit Python genutzt werden k\u00f6nnen. <\/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":[1661,1662,1665,1666,1656,1657,1655,1660,1658,1664,1659,1663,1330,1667],"post-author":[137],"class_list":["post-10985","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python-micropython","tag-bme280-raspberry-pi-i2c","tag-bmp280-python-auslesen","tag-i2c-adresse-0x3c","tag-i2c-adresse-0x76","tag-i2c-aktivieren-raspberry-pi","tag-i2c-bus-raspberry-pi","tag-i2c-raspberry-pi-python","tag-i2c-tools-installieren","tag-i2cdetect-raspberry-pi","tag-mehrere-i2c-geraete-am-bus","tag-oled-display-i2c","tag-smbus-python-i2c","tag-ssd1306-oled-raspberry-pi","tag-thermo-barometer-raspberry-pi","post-author-dr-guenter-spanner"],"acf":[],"info":{"thumbnail":{"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/header_phyton_teil11.jpg","alt":""},"teaserImage":{"ID":11033,"id":11033,"title":"liste-beitrag_python_t14_neu","filename":"Liste-Beitrag_python_t14_neu.jpg","filesize":97092,"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu.jpg","link":"https:\/\/de.elv.com\/elvjournal\/raspberry-pi-i2c-python\/liste-beitrag_python_t14_neu\/","alt":"","author":"5","description":"","caption":"","name":"liste-beitrag_python_t14_neu","status":"inherit","uploaded_to":10985,"date":"2026-02-19 15:12:14","modified":"2026-02-19 15:12:14","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_t14_neu-250x250.jpg","thumbnail-width":250,"thumbnail-height":250,"medium":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu-300x190.jpg","medium-width":300,"medium-height":190,"medium_large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu.jpg","medium_large-width":433,"medium_large-height":274,"large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu.jpg","large-width":433,"large-height":274,"1536x1536":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu.jpg","1536x1536-width":433,"1536x1536-height":274,"2048x2048":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_neu.jpg","2048x2048-width":433,"2048x2048-height":274,"gform-image-choice-sm":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t14_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_t14_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_t14_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":"28. April 2026","excerpt":"Der Raspberry Pi bietet zahlreiche Schnittstellen zur Kommunikation mit externen Sensoren, Aktoren und anderen Ger\u00e4ten. Diese Kommunikation erfolgt \u00fcber sogenannte Bussysteme wie I\u00b2C, SPI, UART oder einfache GPIO-Verbindungen. Mithilfe der Programmiersprache Python lassen sich diese Bussysteme einfach und effizient ansprechen, wodurch der Raspberry Pi besonders f\u00fcr Lern-, Prototyping- und IoT-Projekte geeignet ist. Dieser Beitrag gibt einen \u00dcberblick \u00fcber die wichtigsten Bussysteme des Raspberry Pi und zeigt, wie sie mit Python genutzt werden k\u00f6nnen. "},"_links":{"self":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/10985","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=10985"}],"version-history":[{"count":10,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/10985\/revisions"}],"predecessor-version":[{"id":14201,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/10985\/revisions\/14201"}],"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=10985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/categories?post=10985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/tags?post=10985"},{"taxonomy":"post-author","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/post-author?post=10985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}