<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>display &#8211; Makerblog.at</title>
	<atom:link href="https://www.makerblog.at/tag/display/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.makerblog.at</link>
	<description>Arduino Projekte, Tutorials, 3D-Druck und die Maker-Szene</description>
	<lastBuildDate>Sat, 04 Oct 2025 07:41:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.makerblog.at/wp-content/uploads/cropped-logo-100x100-2-32x32.jpg</url>
	<title>display &#8211; Makerblog.at</title>
	<link>https://www.makerblog.at</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flappy Bird am Arduino mit OLED Display</title>
		<link>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/</link>
					<comments>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/#respond</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Thu, 02 Oct 2025 06:34:13 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[flappy bird]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[oled]]></category>
		<category><![CDATA[retro]]></category>
		<category><![CDATA[retro game]]></category>
		<guid isPermaLink="false">https://www.makerblog.at/?p=1853</guid>

					<description><![CDATA[Flappy Bird kennen wahrscheinlich alle. Der Prototyp eines Casual Games wurde 2013 vom vietnamesischen Entwickler Dong Nguyen als Mobile App für Android und iOS veröffentlicht, war ein sensationeller Erfolg und zog unzählige ähnliche Spiele nach sich. Flappy Bird ist dabei]]></description>
										<content:encoded><![CDATA[
<p>Flappy Bird kennen wahrscheinlich alle. Der Prototyp eines Casual Games wurde 2013 vom vietnamesischen Entwickler Dong Nguyen als Mobile App für Android und iOS veröffentlicht, war ein sensationeller Erfolg und zog unzählige ähnliche Spiele nach sich. </p>



<p>Flappy Bird ist dabei ein sehr simples Spiel. Gesteuert wird die Spielfigur am Smartphone durch Tippen auf eine beliebige Stelle des Touchscreens. Das eignet sich ideal zur Umsetzung am Arduino, da neben dem Display nur ein Pushbutton benötigt wird.</p>



<p>Meine einfache Implementierung entspricht vom Verhalten her sicher nicht 1:1 dem Original, aber der Programmcode ist einfach zu verstehen und kann leicht an eigene Bedürfnisse (Schwierigkeitsgrad, Erweiterung um Buzzer für Soundeffekte) angepasst werden.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Flappy Bird am Arduino mit OLED Display - Tutorial" width="700" height="394" src="https://www.youtube.com/embed/d1sZDezaHHs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Hardware-Anforderungen</h2>



<p>Das Das Projekt stellt minimale Anforderungen an die Hardware, mit einem Arduino Uno R3 (oder kompatiblem Klon), einem kleinen OLED Display mit SSD1306-Controller und einem Pushbutton ist man schon dabei.</p>



<p>Für den Nachbau werden folgende Komponenten benötigt:</p>



<ul class="wp-block-list">
<li><strong>OLED I2C Display 128×64 mit SSD1306</strong>&nbsp;(separat erhältlich, z.B.&nbsp;<a href="https://amzn.to/3XJfjRi" target="_blank" rel="noreferrer noopener">hier im 3er Pack bei Amazon</a>)</li>
</ul>



<p>und die folgende Teile, die in jedem&nbsp;<a href="https://amzn.to/4iHWCFJ" target="_blank" rel="noreferrer noopener">Arduino Starter Kit</a>&nbsp;enthalten sind:</p>



<ul class="wp-block-list">
<li><strong>Arduino UNO R3 (oder kompatibel) mit Breadboard</strong></li>



<li><strong>Push-Buttons</strong>für die Steuerung</li>



<li><strong>Ein paar Kabel</strong>&nbsp;zur Verbindung der Komponenten</li>
</ul>



<h2 class="wp-block-heading">Verkabelung am Breadboard</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="834" src="https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-1024x834.png" alt="" class="wp-image-1867" srcset="https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-1024x834.png 1024w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-300x244.png 300w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine-768x625.png 768w, https://www.makerblog.at/wp-content/uploads/2025/10/OLED-Flappy-Bird_Steckplatine.png 1226w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Komponente</td><td>Arduino Pin</td></tr><tr><td>OLED SDA</td><td>A4</td></tr><tr><td>OLED SCL</td><td>A5</td></tr><tr><td>OLED VCC</td><td>5V</td></tr><tr><td>OLED GND</td><td>GND</td></tr><tr><td>Push Button</td><td>D2 und GND</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Der Arduino Sketch und ein paar Anmerkungen</h2>



<p>Den kompletten Quellcode findest du gut dokumentiert hier auf Github <a href="https://github.com/adidax/oled-flappy-bird-arduino/tree/main" target="_blank" rel="noreferrer noopener">https://github.com/adidax/oled-flappy-bird-arduino/tree/main</a></p>



<p>Mit einem Arduino Uno R3 (oder kompatibel) und bei korrektem Aufbau der Schaltung am Breadboard sollte der Sketch ohne Änderungen funktionieren. Solltest du ein anderes Arduino Modell oder eine andere Belegung der Pins verwenden, dann sind eventuell kleine Anpassungen notwendig.</p>



<p>Der Sketch ist zwar gut dokumentiert, hier aber trotzdem ein paar kurze Anmerkungen zur Struktur. </p>



<figure class="wp-block-image size-large is-style-default"><img decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1024x683.jpg" alt="" class="wp-image-1856" srcset="https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/10/DSC08761_title-1.jpg 2040w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>Gleitkommafrei durch Skalierung</strong></h4>



<p>Wie schon beim ähnlichen Projekt <a href="https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/" data-type="post" data-id="1839">Retro Racer</a> werden auch hier alle Koordinaten am Spielfeld um den Faktor 10 hochskaliert und mit dem Datentyp <code>int</code> gespeichert. Damit können aufwändige Gleitkomma-Berechnungen vermieden werden, aber Spielmechaniken wie eine Änderung der Spielposition um 0,5 Pixel pro Frame sind trotzdem möglich. Das Display hat im Programmcode also nicht 128×64, sondern 1280×640 Pixel. Vor der Darstellung auf dem Display werden die Werte dann durch 10 geteilt, um diese auf die Koordinaten des OLED umzurechnen.</p>



<h4 class="wp-block-heading">Fixe Framerate für gleichmäßigen Spielablauf</h4>



<p>Damit das Spiel auf dem Arduino gleichmäßig läuft, wird versucht mit einer festen Bildwiederholrate von <strong>25 FPS</strong> zu arbeiten. Das heißt: Die loop()-Funktion berechnet und zeichnet nur dann ein neues Frame, wenn mindestens <strong>40 Millisekunden</strong> seit dem letzten vergangen sind:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">const</span> int FRAME_TIME = <span class="hljs-number">40</span>; <span class="hljs-comment">// 40 ms per frame = 25 FPS</span>
<span class="hljs-keyword">if</span> (millis() - lastFrameTime &lt; FRAME_TIME) <span class="hljs-keyword">return</span>;
lastFrameTime = millis();</code></span></pre>


<p>Das verhindert Timing-Probleme und sorgt dafür, dass Bewegung und Spielgeschwindigkeit stets konstant bleiben, unabhängig davon, wie schnell der Mikrocontroller gerade rechnet. Sollte die Berechnung und Ausgabe eines Frames länger als 40ms dauern, dann kommt es aber natürlich trotzdem zu Unregelmäßigkeiten im Ablauf. Das dürfte hier aber nicht der Fall sein.</p>



<h4 class="wp-block-heading"><strong>Spielfigur fliegt bei Knopfdruck</strong></h4>



<p>Die Steuerung ist einfach. Pro Frame erhöht sich die Sinkgeschwindigkeit der Spielfigur um den Wert von <code>GRAVITY</code> und der Vogel bewegt sich nach unten. Wird der Pushbutton gedrückt, dann steigt der Vogel um den Wert von <code>JUMP_STRENGTH</code> und bewegt sich nach oben.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">        <span class="hljs-comment">// Wenn Button gedrückt, negative Beschleunigung (nach oben) addieren</span>
        <span class="hljs-keyword">if</span> (digitalRead(BUTTON_PIN) == LOW) {
            velocity = JUMP_STRENGTH;
        }
        velocity += GRAVITY; <span class="hljs-comment">// Schwerkraft anwenden (positiver Wert = nach unten)</span>
        velocity = constrain(velocity, <span class="hljs-number">-50</span>, <span class="hljs-number">50</span>); <span class="hljs-comment">// Begrenzung, damit Spielfigur nicht zu schnell fällt oder steigt</span>

        <span class="hljs-comment">// Position des Spielers berechnen</span>
        birdY += velocity;</code></span></pre>


<p>So entsteht das typische “Flap”-Gefühl mit steigender und fallender Bewegung.</p>



<h4 class="wp-block-heading">Gnädige Kollisionsabfrage:&nbsp;</h4>



<p>Die Spielfigur ist rund, die Hitbox zur Kollisionsabfrage aber rechteckig. Daher habe ich bei der Berechnung der möglichen Kollision einen kleinen Spielraum von 2px berücksichtig. </p>


<pre class="wp-block-code"><span><code class="hljs language-xml">if ((birdY - 2 * SCALE_FACTOR) <span class="hljs-tag">&lt; <span class="hljs-attr">pipes</span>&#91;<span class="hljs-attr">i</span>]<span class="hljs-attr">.height</span> || 
    (<span class="hljs-attr">birdY</span> + <span class="hljs-attr">2</span> * <span class="hljs-attr">SCALE_FACTOR</span>) &gt;</span> pipes&#91;i].height + PIPE_GAP)</code></span></pre>


<p>Damit fühlt sich das Spiel deutlich fairer an, die Spielfigur kann auch an einem Rohr &#8222;anstreifen&#8220;, ohne sofort eine Kollision zu melden.</p>



<h2 class="wp-block-heading">Vorbereitung der Spielgrafik</h2>



<p>Da das OLED-Display nur&nbsp;<strong>Schwarz-Weiß-Grafiken</strong>&nbsp;unterstützt, müssen Bilder in ein passendes&nbsp;<strong>Bitmap-Format</strong>&nbsp;umgewandelt und im Programmcode eingebunden werden. Dafür habe ich das kostenlose Online-Tool&nbsp;<a href="https://javl.github.io/image2cpp/" target="_blank" rel="noreferrer noopener"><strong>Image2CPP</strong></a>&nbsp;verwendet.</p>



<p><strong>Schritt-für-Schritt-Anleitung für eigene Grafiken:</strong></p>



<ol class="wp-block-list">
<li>Lade das gewünschte&nbsp;<strong>PNG-Bild</strong>&nbsp;hoch.</li>



<li>Stelle die&nbsp;<strong>Bildgröße</strong>&nbsp;passend zur benötigten Pixelgröße ein (z. B. 10×8 Pixel für ein Auto).</li>



<li>Wähle als&nbsp;<strong>Ausgabeformat</strong>&nbsp;→&nbsp;<strong>Arduino Code</strong>.</li>



<li>Kopiere den generierten&nbsp;<strong>PROGMEM-Code</strong>&nbsp;in das Arduino-Projekt.</li>



<li>Nutze display.drawBitmap(x, y, bitmap, width, height, SSD1306_WHITE); zur Anzeige des Bildes.</li>
</ol>



<p>Diese Methode ermöglicht es, eigene Icons oder Sprites für das Spiel zu erstellen und ins&nbsp;<strong>Flash-Speicher</strong>&nbsp;(PROGMEM) des Arduino zu laden. Dabei muss man aber immer beachten, dass der Speicherplatz des Arduino sehr begrenzt ist :)</p>



<h2 class="wp-block-heading"><strong>Spielprinzip und Steuerung</strong></h2>



<ul class="wp-block-list">
<li>Die Spielfigur (ein Vogel) fliegt von links nach rechts durch das Bild. Die Flughöhe des Vogels verringert sich laufend durch die Schwerkraft, der Spieler kann über den Drucktaster einen Flügelschlag auslösen, welcher die Flughöhe wieder erhöht. </li>



<li>Gleichzeitig bewegen sich die Rohre als Hindernisse auf den Vogel zu. Die Spielfigur muss durch die Lücken in den Rohren gesteuert werden.</li>



<li>Kollidiert der Spieler mit einem Hindernis, ist das Spiel vorbei.</li>



<li>3 Sekunden nach Game over wird die Highscore-Liste angezeigt.</li>



<li>Ein Druck auf eine beliebige Taste startet das Spiel neu.</li>
</ul>



<h2 class="wp-block-heading">Was mir am Projekt gefällt</h2>



<p>Wie schon beim <a href="https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/" data-type="post" data-id="1839">Retro Racer</a> sieht man auch bei dieser Flappy Bird Variante, wie man klassische Spielideen mit einfachster Hardware und etwas Programmcode nachbauen kann und damit ein vollständiges, unterhaltsames Spiel entsteht. Die Kombination aus Spielphysik, Animation und einfachster Steuerung macht Flappy Bird zum perfekten Arduino-Projekt, egal ob zum Lernen, Lehren oder einfach zum Spaß.</p>



<p>Den kompletten Quellcode findest du gut dokumentiert hier auf Github <a href="https://github.com/adidax/oled-flappy-bird-arduino/tree/main" target="_blank" rel="noreferrer noopener">https://github.com/adidax/oled-flappy-bird-arduino/tree/main</a></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2025/10/flappy-bird-am-arduino-mit-oled-display/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Retro Racer mit OLED Display 128&#215;64 – Ein Arcade-Klassiker auf dem Arduino</title>
		<link>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/</link>
					<comments>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 07:36:44 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[oled]]></category>
		<category><![CDATA[retro]]></category>
		<category><![CDATA[retro game]]></category>
		<guid isPermaLink="false">https://www.makerblog.at/?p=1839</guid>

					<description><![CDATA[Der Retro Pixel Racer ist ein kleines Arcade-Spiel für den Arduino UNO, das auf einem 128&#215;64 OLED-Display läuft. Angelehnt an die klassischen Rennspiele der 80er-Jahre steuerst du als Spieler ein Fahrzeug über mehrere Fahrspuren und musst dabei den anderen Fahrzeugen]]></description>
										<content:encoded><![CDATA[
<p>Der Retro Pixel Racer ist ein kleines Arcade-Spiel für den Arduino UNO, das auf einem 128&#215;64 OLED-Display läuft. Angelehnt an die klassischen Rennspiele der 80er-Jahre steuerst du als Spieler ein Fahrzeug über mehrere Fahrspuren und musst dabei den anderen Fahrzeugen ausweichen. Das Projekt nutzt einfache Hardware-Komponenten und zeigt eindrucksvoll, wie auch mit minimalistischen Mikrocontrollern halbwegs flüssige Animationen realisiert werden können.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Arduino Projekt Retro Racer – Mini Arcade-Spiel mit OLED-Display" width="700" height="394" src="https://www.youtube.com/embed/cnEbV9q5bLI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Trotz des einfachen Aufbaus des Projekts zu geringen Kosten ist das Ergebnis recht spannend und eignet sich auch gut für Gruppenprojekte, z.B. in der Schule.</p>



<h2 class="wp-block-heading"><strong>Hardware-Anforderungen</strong></h2>



<p>Neben dem Arduino samt Breadboard, das in vielen Starter Kits enthalten ist, benötigt man lediglich ein zusätzliches OLED-Display mit SSD1306-Controller sowie zwei Push-Buttons für die Steuerung. Ein optionaler Buzzer sorgt für Soundeffekte.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1024x683.jpg" alt="" class="wp-image-1847" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-startscreen-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Für den Nachbau werden folgende Komponenten benötigt:</p>



<ul class="wp-block-list">
<li><strong>OLED I2C Display 128&#215;64 mit SSD1306</strong> (separat erhältlich, z.B. <a href="https://amzn.to/3XJfjRi" target="_blank" rel="noreferrer noopener">hier im 3er Pack bei Amazon</a>)</li>
</ul>



<p>und die folgende Teile, die in jedem <a href="https://amzn.to/4iHWCFJ" target="_blank" rel="noreferrer noopener">Arduino Starter Kit</a> enthalten sind:</p>



<ul class="wp-block-list">
<li><strong>Arduino UNO R3 (oder kompatibel) mit Breadboard</strong></li>



<li><strong>Zwei Push-Buttons</strong> für die Steuerung (links/rechts)</li>



<li>Optionaler <strong>Buzzer</strong> für Soundeffekte</li>



<li><strong>Ein paar Kabel</strong> zur Verbindung der Komponenten</li>
</ul>



<h2 class="wp-block-heading"><strong>Verkabelung:</strong></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="756" src="https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-1024x756.png" alt="" class="wp-image-1841" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-1024x756.png 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-300x222.png 300w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine-768x567.png 768w, https://www.makerblog.at/wp-content/uploads/2025/03/OLED-Racer_Steckplatine.png 1351w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Der Buzzer an D6 kann auch einfach weggelassen werden, im Programmcode sind dazu keine Änderungen notwendig.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Komponente</th><th>Arduino Pin</th></tr><tr><td>OLED SDA</td><td>A4</td></tr><tr><td>OLED SCL</td><td>A5</td></tr><tr><td>OLED VCC</td><td>5V</td></tr><tr><td>OLED GND</td><td>GND</td></tr><tr><td>Button Links</td><td>D2 und GND</td></tr><tr><td>Button Rechts</td><td>D3 und GND</td></tr><tr><td>Buzzer</td><td>D6 und GND</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><strong>Arduino Programmcode und technische Besonderheiten</strong></h2>



<p>Der komplette Quellcode ist gut dokumentiert auf&nbsp;<a href="https://github.com/adidax/oled-retro-pixel-racer" target="_blank" rel="noreferrer noopener"><strong>GitHub</strong>&nbsp;(oled_racer_de.ino)</a> verfügbar. Am einfachsten beim grünen Button rechts oben &#8222;Download ZIP&#8220; wählen und entpacken &#8211; oder den Sketch einfach über die Zwischenablage in ein neues Arduino Programmfenster kopieren.</p>



<h3 class="wp-block-heading">Einige wichtige Aspekte zum Verständnis des Codes:</h3>



<h4 class="wp-block-heading"><strong>Optimierung durch Integer-Skalierung:&nbsp;</strong></h4>



<p>Rechenoperationen mit Gleitkommazahlen sind aufwändig und das wollte ich vermeiden. An manchen Stellen, zum Beispiel bei der Geschwindigkeit des Spielerautos, braucht man aber die Möglichkeit, diese in feineren Schritten zu erhöhen. Deswegen habe ich Koordinaten von Objekten am Display und Geschwindigkeiten um den Faktor 10 hochskaliert und als&nbsp;int&nbsp;gespeichert. Das Display hat also im Programmcode nicht 128&#215;64, sondern 1280&#215;640 Pixel. So sind präzisere Berechnungen ohne Performance-Einbußen durch Float-Operationen möglich. Vor der Darstellung auf dem Display werden die Werte dann durch 10 geteilt.<br><strong>Beispiel:<br></strong><code>playerSpeed = 25</code>&nbsp;bedeutet eine Bewegung von 2.5 Pixeln pro Frame.<br>Ein Hindernis mit&nbsp;<code>x = 150</code>&nbsp;befindet sich an Position x = 15.0 auf dem Display.</p>



<h4 class="wp-block-heading">Spielzustände verwalten:&nbsp;</h4>



<p>Der Code nutzt eine&nbsp;<code>enum GameState</code>, um zwischen den verschiedenen Zuständen zu wechseln:<br><code>STARTSCREEN</code>: Intro-Animation mit Titel.<br><code>PLAYING</code>: Das eigentliche Spiel läuft (oder zeigt &#8222;Game over an&#8220;)<br><code>HIGHSCORE</code>: Nach Game Over wird eine Highscore-Liste angezeigt.<br>Dadurch bleibt der Code sauber strukturiert und einfach erweiterbar.</p>



<h4 class="wp-block-heading">Flüssige Animationen mit Timer-Steuerung:&nbsp;</h4>



<p>Das Spiel nutzt&nbsp;millis(), um eine konstante Framerate von 25 FPS zu halten. Statt&nbsp;delay()&nbsp;wird der Zeitunterschied zum letzten Frame berechnet, sodass die Spiellogik immer genau zur richtigen Zeit aktualisiert wird.</p>



<h4 class="wp-block-heading">Adaptive Gegner-Spawns:&nbsp;</h4>



<p>Die Gegner (Hindernisse) erscheinen mit steigender Spielzeit immer häufiger. Zu Beginn gibt es nur einen Gegner gleichzeitig, später bis zu zehn, je nach zurückgelegter Distanz.</p>



<h4 class="wp-block-heading">Blinkende Highscore-Anzeige:&nbsp;</h4>



<p>Falls der aktuelle Score in die Top-10 kommt, wird dieser blinkend hervorgehoben.</p>



<h2 class="wp-block-heading">Vorbereitung der Spielgrafik</h2>



<p>Da das OLED-Display nur <strong>Schwarz-Weiß-Grafiken</strong> unterstützt, müssen Bilder in ein passendes <strong>Bitmap-Format</strong> umgewandelt und im Programmcode eingebunden werden. Dafür habe ich das kostenlose Online-Tool <a href="https://javl.github.io/image2cpp/" target="_blank" rel="noreferrer noopener"><strong>Image2CPP</strong></a> verwendet.</p>



<p><strong>Schritt-für-Schritt-Anleitung für eigene Grafiken: </strong></p>



<ol class="wp-block-list">
<li>Lade das gewünschte <strong>PNG-Bild</strong> hoch.</li>



<li>Stelle die <strong>Bildgröße</strong> passend zur benötigten Pixelgröße ein (z. B. 10&#215;8 Pixel für ein Auto).</li>



<li>Wähle als <strong>Ausgabeformat</strong> → <strong>Arduino Code</strong>.</li>



<li>Kopiere den generierten <strong>PROGMEM-Code</strong> in das Arduino-Projekt.</li>



<li>Nutze display.drawBitmap(x, y, bitmap, width, height, SSD1306_WHITE); zur Anzeige des Bildes.</li>
</ol>



<p>Diese Methode ermöglicht es, eigene Icons oder Sprites für das Spiel zu erstellen und ins <strong>Flash-Speicher</strong> (PROGMEM) des Arduino zu laden. Dabei muss man aber immer beachten, dass der Speicherplatz des Arduino sehr begrenzt ist :) </p>



<h2 class="wp-block-heading"><strong>Spielprinzip und Steuerung</strong></h2>



<ul class="wp-block-list">
<li>Der Spieler kann sich mit den beiden Buttons&nbsp;<strong>nach links und rechts</strong>&nbsp;bewegen.</li>



<li>Gegner erscheinen zufällig auf den Spuren und bewegen sich auf den Spieler zu.</li>



<li>Kollidiert der Spieler mit einem Hindernis, ist das Spiel vorbei.</li>



<li>3 Sekunden nach Game over wird die Highscore-Liste angezeigt.</li>



<li>Ein Druck auf eine beliebige Taste startet das Spiel neu.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1024x683.jpg" alt="" class="wp-image-1846" srcset="https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1024x683.jpg 1024w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-300x200.jpg 300w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-768x512.jpg 768w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-1536x1024.jpg 1536w, https://www.makerblog.at/wp-content/uploads/2025/03/oled-racer-ingame-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Was mir am Projekt gefällt</strong></h2>



<p>Dieses kleine Projekt zeigt, dass auch mit begrenzten Ressourcen spannende Retro-Spiele auf dem Arduino möglich sind. Der Code ist modular und halbwegs verständlich &#8211; auf Objektklassen oder komplexere Konstrukte habe ich bewusst verzichtet &#8211; und kann leicht verändert oder erweitert werden – beispielsweise mit mehr Soundeffekten oder zusätzlichen Hindernissen.</p>



<p><a href="https://github.com/adidax/oled-retro-pixel-racer" target="_blank" rel="noreferrer noopener">Der&nbsp;<strong>komplette Quellcode</strong>&nbsp;ist auf&nbsp;<strong>GitHub</strong>&nbsp;verfügbar.</a> Viel Spaß beim Nachbauen!</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2025/03/retro-racer-mit-oled-display-128x64-ein-arcade-klassiker-auf-dem-arduino/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>LCD Displays mit I²C am Arduino</title>
		<link>https://www.makerblog.at/2025/02/lcd-displays-mit-i%c2%b2c-am-arduino/</link>
					<comments>https://www.makerblog.at/2025/02/lcd-displays-mit-i%c2%b2c-am-arduino/#respond</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Fri, 07 Feb 2025 08:10:22 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[i2c]]></category>
		<category><![CDATA[lcd]]></category>
		<guid isPermaLink="false">https://www.makerblog.at/?p=1806</guid>

					<description><![CDATA[LCD Displays am Arduino sind eine praktische Möglichkeit, damit man Daten nicht immer nur über die serielle Schnittstelle ausgeben muss und lassen auch kleine Projekte gleich professioneller aussehen. Besonders das 1602 Display mit 2 Zeilen à 16 Zeichen ist in fast jedem Arduino Starter Kit zu]]></description>
										<content:encoded><![CDATA[
<p>LCD Displays am Arduino sind eine praktische Möglichkeit, damit man Daten nicht immer nur über die serielle Schnittstelle ausgeben muss und lassen auch kleine Projekte gleich professioneller aussehen.</p>



<p>Besonders das <strong>1602 Display</strong> mit 2 Zeilen à 16 Zeichen ist in fast jedem <strong><a href="https://amzn.to/4hJAJW4" target="_blank" rel="noreferrer noopener">Arduino Starter Kit</a></strong> zu finden. Diese Displays sind praktisch und kostengünstig, haben jedoch einen Nachteil: Sie werden standardmäßig <strong>parallel angesteuert</strong> und benötigen dadurch mindestens 6 Digitalpins am Arduino und eventuell auch noch eine Potentiometer am Breadboard.</p>



<p>Das kann problematisch werden, wenn weitere&nbsp;Sensoren oder Module&nbsp;angeschlossen werden sollen. Hinzu kommt der&nbsp;Kabelsalat&nbsp;auf dem Breadboard, der bei komplexeren Projekten schnell unübersichtlich wird.</p>



<h2 class="wp-block-heading">Die Lösung: Die I²C-Schnittstelle für LCD Displays</h2>



<p>Die&nbsp;<strong>I²C-Schnittstelle</strong>&nbsp;(Inter Integrated Circuit) bietet eine einfache Lösung für dieses Problem. I²C&nbsp;ist ein Protokoll zur seriellen Kommunikation zwischen elektronischen Bauteilen. Es benötigt nur&nbsp;zwei Leitungen und damit nur 2 Digitalpins am Arduino:</p>



<ul class="wp-block-list">
<li><strong>SDA</strong>&nbsp;(Serial Data Line) für die Datenübertragung</li>



<li><strong>SCL</strong>&nbsp;(Serial Clock Line) für den Takt</li>
</ul>



<p>Jedes I²C-Gerät hat eine&nbsp;<strong>eindeutige Adresse</strong>. Dadurch können über dieselben zwei Pins mehrere Module wie Sensoren oder Displays angesprochen werden.</p>



<p>Für Standard-LCDs gibt es kleine&nbsp;I²C-Adapterplatinen, die einfach an die 16 Anschlusspins des Displays gelötet werden. Diese verwenden meist den PCF8574, einen I/O Expander, der serielle Daten in parallele Signale für das LCD umwandelt. Diese Adapter stellen dann die&nbsp;4 I²C-Anschlüsse&nbsp;(VCC, GND, SDA, SCL) zur Verfügung. Ein&nbsp;Potentiometer zur Helligkeitssteuerung&nbsp;der Anzeige ist oft noch zusätzlich auf der Platine integriert.</p>



<p>Diese Erweiterungen sind praktisch, machen das Modul jedoch etwas unhandlicher. Aus diesem Grund gibt es inzwischen auch <strong>LCD Displays mit integrierter I²C-Schnittstelle</strong>, die direkt auf dem Modul verbaut ist und so den gewohnten Formfaktor beibehält.</p>




<div class="aawp">
    <div class="aawp-grid aawp-grid--col-3">

            
        <div class="aawp-grid__item">
            
<div class="aawp-product aawp-product--vertical aawp-product--bestseller aawp-product--ribbon"  data-aawp-product-asin="B0B76Z83Y4" data-aawp-product-id="4236" data-aawp-tracking-id="makerblogwp-21" data-aawp-product-title="FREENOVE I2C IIC LCD 1602 Module  2 Pack  New Type TWI Serial 16x2 Display Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" data-aawp-local-click-tracking="1">

    <span class="aawp-product__ribbon aawp-product__ribbon--bestseller">Bestseller Nr. 1</span>
    <a class="aawp-product__image--link aawp-product__image"
       href="https://www.amazon.de/dp/B0B76Z83Y4?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="FREENOVE I2C IIC LCD 1602 Module (2 Pack), New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" rel="nofollow noopener sponsored" target="_blank">
        <img decoding="async" class="aawp-product__image" src="https://www.makerblog.at/wp-content/plugins/aawp/public/image.php?url=YUhSMGNITTZMeTl0TG0xbFpHbGhMV0Z0WVhwdmJpNWpiMjB2YVcxaFoyVnpMMGt2TlRFeFIzTnJZMUpZUmt3dVgxTk1NVFl3WHk1cWNHYz18MTc3MzQ1NzY0Mw=" alt="FREENOVE I2C IIC LCD 1602 Module (2 Pack), New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266"  />
    </a>

    <div class="aawp-product__content">
        <a class="aawp-product__title" href="https://www.amazon.de/dp/B0B76Z83Y4?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="FREENOVE I2C IIC LCD 1602 Module (2 Pack), New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" rel="nofollow noopener sponsored" target="_blank">
            FREENOVE I2C IIC LCD 1602 Module (2 Pack), New...        </a>

        <div class="aawp-product__meta">
            
                    </div>
    </div>

    <div class="aawp-product__footer">

        <div class="aawp-product__pricing">

            
                            <span class="aawp-product__price aawp-product__price--current">12,95 EUR</span>
                    </div>

                <a class="aawp-button aawp-button--buy aawp-button aawp-button--amazon aawp-button--icon aawp-button--icon-black" href="https://www.amazon.de/dp/B0B76Z83Y4?tag=makerblogwp-21&#038;linkCode=ogi&#038;th=1&#038;psc=1&#038;keywords=lcd%20i2c" title="Bei Amazon kaufen" target="_blank" rel="nofollow noopener sponsored">Bei Amazon kaufen</a>
            </div>
</div>
        </div>

            
        <div class="aawp-grid__item">
            
<div class="aawp-product aawp-product--vertical aawp-product--bestseller aawp-product--ribbon"  data-aawp-product-asin="B0B76YGDV4" data-aawp-product-id="4237" data-aawp-tracking-id="makerblogwp-21" data-aawp-product-title="Freenove I2C IIC LCD 1602 Module New Type TWI Serial 16x2 Display Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" data-aawp-local-click-tracking="1">

    <span class="aawp-product__ribbon aawp-product__ribbon--bestseller">Bestseller Nr. 2</span>
    <a class="aawp-product__image--link aawp-product__image"
       href="https://www.amazon.de/dp/B0B76YGDV4?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="Freenove I2C IIC LCD 1602 Module, New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" rel="nofollow noopener sponsored" target="_blank">
        <img decoding="async" class="aawp-product__image" src="https://www.makerblog.at/wp-content/plugins/aawp/public/image.php?url=YUhSMGNITTZMeTl0TG0xbFpHbGhMV0Z0WVhwdmJpNWpiMjB2YVcxaFoyVnpMMGt2TlRGNlpISkxUVk5pTFV3dVgxTk1NVFl3WHk1cWNHYz18MTc3MzQ1NzY0Mw=" alt="Freenove I2C IIC LCD 1602 Module, New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266"  />
    </a>

    <div class="aawp-product__content">
        <a class="aawp-product__title" href="https://www.amazon.de/dp/B0B76YGDV4?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="Freenove I2C IIC LCD 1602 Module, New Type TWI Serial 16x2 Display, Compatible with Arduino Raspberry Pi Pico ESP32 ESP8266" rel="nofollow noopener sponsored" target="_blank">
            Freenove I2C IIC LCD 1602 Module, New Type TWI...        </a>

        <div class="aawp-product__meta">
            
                    </div>
    </div>

    <div class="aawp-product__footer">

        <div class="aawp-product__pricing">

            
                            <span class="aawp-product__price aawp-product__price--current">8,95 EUR</span>
                    </div>

                <a class="aawp-button aawp-button--buy aawp-button aawp-button--amazon aawp-button--icon aawp-button--icon-black" href="https://www.amazon.de/dp/B0B76YGDV4?tag=makerblogwp-21&#038;linkCode=ogi&#038;th=1&#038;psc=1&#038;keywords=lcd%20i2c" title="Bei Amazon kaufen" target="_blank" rel="nofollow noopener sponsored">Bei Amazon kaufen</a>
            </div>
</div>
        </div>

            
        <div class="aawp-grid__item">
            
<div class="aawp-product aawp-product--vertical aawp-product--bestseller aawp-product--ribbon"  data-aawp-product-asin="B0FPQM3ZJR" data-aawp-product-id="4238" data-aawp-tracking-id="makerblogwp-21" data-aawp-product-title="APKLVSR 2004 LCD Display Modul,4 Stück 20x4 Zeichen LCD I2C Display mit Blauer Hintergrundbeleuchtung,Kompatibel mit Arduino/Ras-pberry Pi Pico/ESP32/ESP8266 Blau/2004" data-aawp-local-click-tracking="1">

    <span class="aawp-product__ribbon aawp-product__ribbon--bestseller">Bestseller Nr. 3</span>
    <a class="aawp-product__image--link aawp-product__image"
       href="https://www.amazon.de/dp/B0FPQM3ZJR?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="APKLVSR 2004 LCD Display Modul,4 Stück 20x4 Zeichen LCD I2C Display mit Blauer Hintergrundbeleuchtung,Kompatibel mit Arduino/Ras-pberry Pi Pico/ESP32/ESP8266(Blau/2004)" rel="nofollow noopener sponsored" target="_blank">
        <img decoding="async" class="aawp-product__image" src="https://www.makerblog.at/wp-content/plugins/aawp/public/image.php?url=YUhSMGNITTZMeTl0TG0xbFpHbGhMV0Z0WVhwdmJpNWpiMjB2YVcxaFoyVnpMMGt2TlRGWlFVRnZjVEp3UTB3dVgxTk1NVFl3WHk1cWNHYz18MTc3MzQ1NzY0Mw=" alt="APKLVSR 2004 LCD Display Modul,4 Stück 20x4 Zeichen LCD I2C Display mit Blauer Hintergrundbeleuchtung,Kompatibel mit Arduino/Ras-pberry Pi Pico/ESP32/ESP8266(Blau/2004)"  />
    </a>

    <div class="aawp-product__content">
        <a class="aawp-product__title" href="https://www.amazon.de/dp/B0FPQM3ZJR?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=lcd%20i2c" title="APKLVSR 2004 LCD Display Modul,4 Stück 20x4 Zeichen LCD I2C Display mit Blauer Hintergrundbeleuchtung,Kompatibel mit Arduino/Ras-pberry Pi Pico/ESP32/ESP8266(Blau/2004)" rel="nofollow noopener sponsored" target="_blank">
            APKLVSR 2004 LCD Display Modul,4 Stück 20x...        </a>

        <div class="aawp-product__meta">
            
                    </div>
    </div>

    <div class="aawp-product__footer">

        <div class="aawp-product__pricing">

            
                            <span class="aawp-product__price aawp-product__price--current"></span>
                    </div>

                <a class="aawp-button aawp-button--buy aawp-button aawp-button--amazon aawp-button--icon aawp-button--icon-black" href="https://www.amazon.de/dp/B0FPQM3ZJR?tag=makerblogwp-21&#038;linkCode=ogi&#038;th=1&#038;psc=1&#038;keywords=lcd%20i2c" title="Bei Amazon kaufen" target="_blank" rel="nofollow noopener sponsored">Bei Amazon kaufen</a>
            </div>
</div>
        </div>

    
    </div>
</div>




<h2 class="wp-block-heading">Anschluss eines I²C-LCD Displays an den Arduino</h2>



<p>Der Anschluss eines I²C-LCD Displays an den Arduino UNO ist denkbar einfach:</p>



<ol start="1" class="wp-block-list">
<li><strong>VCC</strong>&nbsp;an&nbsp;<strong>5V</strong></li>



<li><strong>GND</strong>&nbsp;an&nbsp;<strong>GND</strong></li>



<li><strong>SDA</strong>&nbsp;an&nbsp;<strong>A4</strong>&nbsp;(Arduino UNO)</li>



<li><strong>SCL</strong>&nbsp;an&nbsp;<strong>A5</strong>&nbsp;(Arduino UNO)</li>
</ol>



<p><strong>Hinweis:</strong> Bei anderen Mikrocontrollern können die I²C-Pins variieren.</p>



<ul class="wp-block-list">
<li>Arduino UNO/Nano: SDA an A4, SCL an A5.</li>



<li>Arduino Micro: SDA an D2, SCL an D3.</li>



<li>Arduino Mega 2560: SDA an D20, SCL an D21.</li>



<li>ESP8266 (NodeMCU): SDA an GPIO4 (D2), SCL an GPIO5 (D1).</li>



<li>ESP32: SDA an GPIO21, SCL an GPIO22.</li>



<li>Raspberry Pi (Model 3 &amp; 4): SDA an GPIO2 (Pin 3), SCL an GPIO3 (Pin 5).</li>



<li>STM32 (Blue Pill): SDA an PB7, SCL an PB6.</li>



<li>Teensy 4.x: SDA an Pin 18, SCL an Pin 19.</li>
</ul>



<h2 class="wp-block-heading"><strong>LCD Display, Zeichensatz und Sonderzeichen</strong></h2>



<p>LCD-Displays wie das 1602 oder 2004 verwenden oft einen HD44780-kompatiblen Controller, der einen festgelegten Zeichensatz (Character Generator ROM, CGROM) integriert hat. Dieser Zeichensatz basiert auf dem erweiterten ASCII-Code und enthält neben den englischen Buchstaben, Zahlen und Symbolen auch einige Sonderzeichen wie Pfeile oder mathematische Symbole. Allerdings fehlen häufig länderspezifische Sonderzeichen, etwa deutsche Umlaute (ä, ö, ü) oder das „ß“.</p>



<p>Für individuelle Anpassungen bietet der Controller einen benutzerdefinierten Zeichensatz (CGRAM), in dem bis zu acht eigene Zeichen definiert werden können. Diese Zeichen werden als 8&#215;5-Pixel-Matrix erstellt und können zur Darstellung von Sonderzeichen oder Symbolen genutzt werden. Wenn jedoch mehr als acht Sonderzeichen benötigt werden, müssen diese dynamisch neu definiert werden, was bei häufiger Nutzung den Code komplexer macht.</p>



<p>Eine sehr gute Library zur Anzeige deutscher Umlaute samt umfangreicher Erklärung:<br><a href="https://werner.rothschopf.net/202003_arduino_liquid_crystal_umlaute.htm">https://werner.rothschopf.net/202003_arduino_liquid_crystal_umlaute.htm</a></p>



<h2 class="wp-block-heading">Einfacher Sekundenzähler auf einem LCD Display</h2>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#include &lt;LCDI2C_Multilingual_MCD.h&gt;</span>

LCDI2C_Latin lcd(<span class="hljs-number">0x27</span>, <span class="hljs-number">16</span>, <span class="hljs-number">2</span>); <span class="hljs-comment">// I2C Adresse: 0x27; Display: 16x2</span>

void setup() {
  lcd.init(); <span class="hljs-comment">// Display initialisieren</span>
  lcd.backlight(); <span class="hljs-comment">// Hintergrundbeleuchtung einschalten</span>
  lcd.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// Cursor auf erstes Zeichen in erster Zeile</span>
  lcd.<span class="hljs-keyword">print</span>(<span class="hljs-string">"Sekunden:"</span>); <span class="hljs-comment">// Text in erster Zeile ausgeben</span>
}

void loop() {
    unsigned long seconds = millis() / <span class="hljs-number">1000</span>;
 
    lcd.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>); <span class="hljs-comment">// Cursor auf erstes Zeichen in zweiter Zeile</span>
    lcd.<span class="hljs-keyword">print</span>(seconds); <span class="hljs-comment">// Zeit seit Start in Sekunden ausgeben</span>
    lcd.<span class="hljs-keyword">print</span>(<span class="hljs-string">"s   "</span>); <span class="hljs-comment">// s für Sekunden und ein paar Leerzeichen zum Überschreiben alter Werte</span>
    delay(<span class="hljs-number">500</span>); <span class="hljs-comment">// Leichte Verzögerung, damit nicht dauernd geschrieben wird</span>
}</code></span></pre>


<h2 class="wp-block-heading">I²C-Adressen verstehen und ändern</h2>



<p>Da alle über I²C angesteuerten Geräte über einen gemeinsamen Datenbus angesprochen werden, benötigt jedes Gerät eine eindeutige Adresse. Die <strong>Standardadresse</strong> für viele LCD-I²C-Module ist <strong>0x27</strong> (hexadezimal).</p>



<p>Wenn mehrere Displays verwendet werden sollen oder es einen Adresskonflikt mit anderen Geräten gibt, dann müssen unterschiedliche Adressen vergeben werden. Auf der Rückseite des I²C-Moduls befinden sich dazu drei Pins: <strong>A0, A1 und A2</strong>. Diese Pins steuern die letzten 3 Bits der I²C-Adresse.</p>



<ul class="wp-block-list">
<li><strong>Offen (HIGH)</strong>: Das Bit ist auf&nbsp;<strong>1</strong>&nbsp;gesetzt.</li>



<li><strong>Kurzgeschlossen (LOW)</strong>: Das Bit wird auf&nbsp;<strong>0</strong>&nbsp;gesetzt.</li>
</ul>



<p>Beispiel (I²C Adressen in 7 Bit)</p>



<ul class="wp-block-list">
<li><strong>A0 geschlossen</strong>: Ändert die Adresse von <strong>0x27</strong> <strong>(0b0100111)</strong>&nbsp;auf&nbsp;<strong>0x26 (0b0100110)</strong>.</li>



<li><strong>A1 geschlossen</strong>: Ändert die Adresse von&nbsp;<strong>0x27 (0b0100111)</strong>&nbsp;auf&nbsp;<strong>0x25 (0b0100101)</strong>.</li>



<li><strong>Alle geschlossen</strong>: Adresse ändert sich von&nbsp;<strong>0x27 (0b0100111)</strong>&nbsp;auf&nbsp;<strong>0x20 (0b0100000)</strong>.</li>
</ul>



<p>So lassen sich mehrere Displays mit unterschiedlichen Adressen am selben I²C-Bus betreiben.</p>



<h3 class="wp-block-heading">Drei Displays gleichzeitig ansteuern</h3>



<p>In diesem Beispiel werden drei Displays über den I²C-Bus gleichzeitig angesteuert. Die Displays zeigen unterschiedliche Informationen an.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#include &lt;LCDI2C_Multilingual_MCD.h&gt;</span>

LCDI2C_Latin lcd1(<span class="hljs-number">0x25</span>, <span class="hljs-number">16</span>, <span class="hljs-number">2</span>); <span class="hljs-comment">// I2C Adresse: 0x25; Display: 16x2</span>
LCDI2C_Latin lcd2(<span class="hljs-number">0x26</span>, <span class="hljs-number">16</span>, <span class="hljs-number">2</span>); <span class="hljs-comment">// I2C Adresse: 0x26; Display: 16x2</span>
LCDI2C_Latin lcd3(<span class="hljs-number">0x27</span>, <span class="hljs-number">20</span>, <span class="hljs-number">4</span>); <span class="hljs-comment">// I2C Adresse: 0x27; Display: 20x4</span>

unsigned long lastSecond = <span class="hljs-number">0</span>; <span class="hljs-comment">// Zwischenspeicher für Fortschrittsbalken</span>
int progressBar = <span class="hljs-number">0</span>; <span class="hljs-comment">// Aktuelle Länge des Fortschrittbalkens</span>

void setup() {
  lcd1.init(); <span class="hljs-comment">// Display1 initialisieren</span>
  lcd1.backlight(); <span class="hljs-comment">// Hintergrundbeleuchtung einschalten</span>
  lcd1.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// Cursor auf erstes Zeichen in erster Zeile</span>
  lcd1.<span class="hljs-keyword">print</span>(<span class="hljs-string">"Sekunden:"</span>); <span class="hljs-comment">// Text in erster Zeile ausgeben</span>

  lcd2.init(); <span class="hljs-comment">// Display 2 initialisieren</span>
  lcd2.backlight(); 
  lcd2.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>); 
  lcd2.<span class="hljs-keyword">print</span>(<span class="hljs-string">"Millisekunden:"</span>); 

  lcd3.init(); <span class="hljs-comment">// Display 3 initialisieren</span>
  lcd3.backlight(); 
  lcd3.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>); 
  lcd3.<span class="hljs-keyword">print</span>(<span class="hljs-string">"Fortschrittsbalken:"</span>); 
}

void loop() {

    unsigned long currentMillis = millis();
    unsigned long currentSeconds = currentMillis / <span class="hljs-number">1000</span>;

    <span class="hljs-comment">// Display 1 - aktuelle Zeit in Sekunden</span>
    lcd1.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>); <span class="hljs-comment">// Cursor auf erstes Zeichen in zweiter Zeile</span>
    lcd1.<span class="hljs-keyword">print</span>(currentSeconds); <span class="hljs-comment">// Zeit seit Start in Sekunden ausgeben</span>
    lcd1.<span class="hljs-keyword">print</span>(<span class="hljs-string">"s"</span>); <span class="hljs-comment">// sec für Sekunden</span>

    <span class="hljs-comment">// Display 2 - Zeit in Millisekunden</span>
    lcd2.setCursor(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>);
    lcd2.<span class="hljs-keyword">print</span>(currentMillis); <span class="hljs-comment">// Zeit seit Start in Millisekunden ausgeben</span>
    lcd2.<span class="hljs-keyword">print</span>(<span class="hljs-string">"ms"</span>);


    <span class="hljs-comment">// Display 3: Fortschrittsbalken aktualisieren (60 Zeichen pro Minute)</span>
    <span class="hljs-keyword">if</span> (lastSecond != currentSeconds) { <span class="hljs-comment">// Nur aktualisieren, wenn sich der Inhalt geändert hat</span>
        progressBar = currentSeconds % <span class="hljs-number">60</span>; <span class="hljs-comment">// Fortschritt von 0 bis 59</span>
        lastSecond = currentSeconds;
        
        <span class="hljs-comment">// Fortschrittsbalken leeren bei Neuanfang</span>
        <span class="hljs-keyword">if</span> (progressBar == <span class="hljs-number">0</span>) {
          <span class="hljs-keyword">for</span> (int row = <span class="hljs-number">1</span>; row &lt;= <span class="hljs-number">3</span>; row++) {
            lcd3.setCursor(<span class="hljs-number">0</span>, row);
            lcd3.<span class="hljs-keyword">print</span>(<span class="hljs-string">"                    "</span>);
          }
        }

        <span class="hljs-comment">// Fortschrittsbalken zeichnen</span>
        int row = <span class="hljs-number">1</span>;
        int col = <span class="hljs-number">0</span>;
        <span class="hljs-keyword">for</span> (int i = <span class="hljs-number">0</span>; i &lt; progressBar; i++) {
            lcd3.setCursor(col, row);
            lcd3.<span class="hljs-keyword">print</span>(<span class="hljs-string">"#"</span>);
            col++;
            <span class="hljs-keyword">if</span> (col &gt;= <span class="hljs-number">20</span>) { <span class="hljs-comment">// Nächste Zeile nach 20 Zeichen</span>
                col = <span class="hljs-number">0</span>;
                row++;
            }
        }
    }

}</code></span></pre>


<p>Mit einer I²C-Schnittstelle kann man LCD Displays einfach ansteuern und in jedes Projekt integrieren. Anstatt für jedes Display mehrere Pins zu belegen, genügen zwei Pins (SDA und SCL), um mehrere Displays oder Sensoren zu betreiben. Das ermöglicht komplexe Projekte, ohne sich Gedanken über fehlende GPIO-Pins machen zu müssen.</p>



<p>Dank der verfügbaren Libraries und einfacher Adressänderungen ist die Einrichtung von I²C-LCDs schnell erledigt. Ob <strong>ein einzelnes Display</strong> oder <strong>mehrere Module gleichzeitig</strong> – mit I²C sind die Möglichkeiten nahezu unbegrenzt.</p>



<p><br>
<div class="aawp">

            
            
<div class="aawp-product aawp-product--list aawp-product--bestseller aawp-product--ribbon"  data-aawp-product-asin="B01IHCCKKK" data-aawp-product-id="4251" data-aawp-tracking-id="makerblogwp-21" data-aawp-product-title="ELEGOO UNO R3 Ultimate Starter Kit Kompatibel mit Arduino IDE Vollständigster Elektronik Projekt Baukasten mit deutschem Tutorial UNO R3 Mikrocontroller Board und Zubehör  mehr als 200 Teile" data-aawp-local-click-tracking="1">

    <span class="aawp-product__ribbon aawp-product__ribbon--bestseller">Bestseller Nr. 1</span>
    <div class="aawp-product__inner">
        <a class="aawp-product__image-link" href="https://www.amazon.de/dp/B01IHCCKKK?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=arduino%20starter%20kit" title="ELEGOO UNO R3 Ultimate Starter Kit, Kompatibel mit Arduino IDE Vollständigster Elektronik Projekt Baukasten mit deutschem Tutorial, UNO R3 Mikrocontroller Board und Zubehör (mehr als 200 Teile)" rel="nofollow noopener sponsored" target="_blank">
            <img decoding="async" class="aawp-product__image" src="https://www.makerblog.at/wp-content/plugins/aawp/public/image.php?url=YUhSMGNITTZMeTl0TG0xbFpHbGhMV0Z0WVhwdmJpNWpiMjB2YVcxaFoyVnpMMGt2TmpFNVVteHlVSFZZV2t3dVgxTk1NVFl3WHk1cWNHYz18MTc3MzQ1NzY0Mw=" alt="ELEGOO UNO R3 Ultimate Starter Kit, Kompatibel mit Arduino IDE Vollständigster Elektronik Projekt Baukasten mit deutschem Tutorial, UNO R3 Mikrocontroller Board und Zubehör (mehr als 200 Teile)"  />
        </a>
        <div class="aawp-product__content">
            <a class="aawp-product__title" href="https://www.amazon.de/dp/B01IHCCKKK?tag=makerblogwp-21&linkCode=ogi&th=1&psc=1&keywords=arduino%20starter%20kit" title="ELEGOO UNO R3 Ultimate Starter Kit, Kompatibel mit Arduino IDE Vollständigster Elektronik Projekt Baukasten mit deutschem Tutorial, UNO R3 Mikrocontroller Board und Zubehör (mehr als 200 Teile)" rel="nofollow noopener sponsored" target="_blank">ELEGOO UNO R3 Ultimate Starter Kit, Kompatibel mit Arduino IDE Vollständigster Elektronik Projekt Baukasten mit deutschem Tutorial, UNO R3 Mikrocontroller Board und Zubehör (mehr als 200 Teile)</a>
            <div class="aawp-product__teaser">
                            </div>
            <div class="aawp-product__meta">
                
                
                                    <span class="aawp-product__price aawp-product__price--current">52,99 EUR</span>
                
                            </div>
        </div>
    </div>

</div>

    
</div>
</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2025/02/lcd-displays-mit-i%c2%b2c-am-arduino/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
