<?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>Raspberry &amp; Arduino &#8211; datort.de</title>
	<atom:link href="https://datort.de/thema/raspberry-arduino/feed/" rel="self" type="application/rss+xml" />
	<link>https://datort.de</link>
	<description>Retro, Gaming, Tech: Videos und Berichte</description>
	<lastBuildDate>Wed, 26 Nov 2025 19:33:35 +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://datort.de/wp-content/uploads/2024/10/cropped-datort_computer_isolated-32x32.png</url>
	<title>Raspberry &amp; Arduino &#8211; datort.de</title>
	<link>https://datort.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hugo: Der Troll, den ich nicht spielen durfte</title>
		<link>https://datort.de/retro-computing/1219/hugo-der-troll-den-ich-nicht-spielen-durfte/</link>
					<comments>https://datort.de/retro-computing/1219/hugo-der-troll-den-ich-nicht-spielen-durfte/#comments</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Sat, 01 Nov 2025 22:31:44 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Retro Computing]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Spiele]]></category>
		<guid isPermaLink="false">https://datort.de/?p=1219</guid>

					<description><![CDATA[1994 erblickte nicht nur der Netscape Navigator oder die erste PlayStation das Licht der Welt, auf dem noch&#8230;]]></description>
										<content:encoded><![CDATA[
<p>1994 erblickte nicht nur der Netscape Navigator oder die erste PlayStation das Licht der Welt, auf dem noch recht jungen TV-Sender &#8222;Der Kabelkanal&#8220;, heute besser bekannt als Kabel 1, turnt auch ein kleiner Troll über den Bildschirm: Hugo.</p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/retro-computing/1219/hugo-der-troll-den-ich-nicht-spielen-durfte/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2F7n7WMO9uasc%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Das Konzept der Sendung war damals recht einzigartig: Die Zuschauer konnten den kleinen Troll in kurzen Spielchen mit den DTMF-Tastentönen ihrer Telefon von Zuhause steuern. Auf dem Bildschirm sahen sie dann das Ergebnis ihrer Tastendrücke. Heute durch die stark unterschiedlichen Laufwege und -zeiten moderner TV-Verbreitungswege undenkbar &#8211; und auch damals schon nicht immer ganz problemlos. </p>



<p>Egal, vier Jahre lief das Ganze. Und ich wollte gerne mitspielen, hatte aber nie das Glück durchzukommen. Das plagt mich bis heute, wie ich auch in meiner Podcast-Episode zu Hugo kundtat. In der Episode gehe ich noch ein bisschen genauer auf das Spiel, die Sendung und die Produktion ein. </p>


<div id="2662142015" class="castos-player dark-mode " tabindex="0" data-episode="1174" data-player_id="2662142015">
	<div class="player">
		<div class="player__main">
			<div class="player__artwork player__artwork-1174">
				<img decoding="async" src="https://datort.de/wp-content/uploads/2025/09/005_hugo-200x200.jpg"
					 alt="Pad One, Please! Der nächste Retro-Podcast"
					 title="Pad One, Please! Der nächste Retro-Podcast">
			</div>
			<div class="player__body">
				<div class="currently-playing">
					<div class="show player__podcast-title">
						Pad One, Please! Der nächste Retro-Podcast					</div>
					<div class="episode-title player__episode-title">#005: Hugo trollt TV und Games</div>
				</div>
				<div class="play-progress">
					<div class="play-pause-controls">
						<button title="Play" aria-label="Play Episode" aria-pressed="false" class="play-btn">
							<span class="screen-reader-text">Play Episode</span>
						</button>
						<button title="Pause" aria-label="Pause Episode" aria-pressed="false" class="pause-btn hide">
							<span class="screen-reader-text">Pause Episode</span>
						</button>
						<img decoding="async" src="https://datort.de/wp-content/plugins/seriously-simple-podcasting/assets/css/images/player/images/icon-loader.svg" alt="Loading" class="ssp-loader hide"/>
					</div>
					<div>
						<audio preload="none" class="clip clip-1174">
							<source src="https://datort.de/podcast-player/1174/005-hugo-trollt-tv-und-games.mp3">
						</audio>
						<div class="ssp-progress" role="progressbar" title="Seek" aria-valuenow="0" aria-valuemin="0" aria-valuemax="843">
							<span class="progress__filled"></span>
						</div>
						<div class="ssp-playback playback">
							<div class="playback__controls">
								<button class="player-btn player-btn__volume" title="Mute/Unmute">
									<span class="screen-reader-text">Mute/Unmute Episode</span>
								</button>
								<button data-skip="-10" class="player-btn player-btn__rwd" title="Rewind 10 seconds">
									<span class="screen-reader-text">Rewind 10 Seconds</span>
								</button>
								<button data-speed="1" class="player-btn player-btn__speed" title="Playback Speed" aria-label="Playback Speed">1x</button>
								<button data-skip="30" class="player-btn player-btn__fwd" title="Fast Forward 30 seconds">
									<span class="screen-reader-text">Fast Forward 30 seconds</span>
								</button>
							</div>
							<div class="playback__timers">
								<time class="ssp-timer">00:00</time>
								<span>/</span>
								<!-- We need actual duration here from the server -->
								<time class="ssp-duration" datetime="PT0H14M3S">14:03</time>
							</div>
						</div>
					</div>
				</div>
									<nav class="player-panels-nav">
													<button class="subscribe-btn" id="subscribe-btn-1174" title="Abonnieren">Abonnieren</button>
																			<button class="share-btn" id="share-btn-1174" title="Teilen">Teilen</button>
											</nav>
							</div>
		</div>
	</div>
			<div class="player-panels player-panels-1174">
							<div class="subscribe player-panel subscribe-1174">
					<div class="close-btn close-btn-1174">
						<span></span>
						<span></span>
					</div>
					<div class="panel__inner">
						<div class="subscribe-icons">
																								<a href="https://music.amazon.de/podcasts/0c0b2b58-55b0-42ac-884b-57604310d6f9/pad-one-please-der-n%C3%A4chste-retro-podcast" target="_blank" rel="noopener noreferrer"
									   class="amazon"
									   title="Subscribe on  Amazon">
										<span></span>
										Amazon									</a>
																																<a href="https://podcasts.apple.com/us/podcast/pad-one-please-noch-so-n-retro-podcast/id1830571033" target="_blank" rel="noopener noreferrer"
									   class="apple_podcasts"
									   title="Subscribe on  Apple Podcasts">
										<span></span>
										Apple Podcasts									</a>
																																<a href="https://deezer.com/show/1002093401" target="_blank" rel="noopener noreferrer"
									   class="deezer"
									   title="Subscribe on  Deezer">
										<span></span>
										Deezer									</a>
																																															<a href="https://datort.de/feed/podcast/pad-one-please" target="_blank" rel="noopener noreferrer"
									   class="rss"
									   title="Subscribe on  RSS">
										<span></span>
										RSS									</a>
																																<a href="https://open.spotify.com/show/4cTvGULCA1LGs9mPdwxKTH" target="_blank" rel="noopener noreferrer"
									   class="spotify"
									   title="Subscribe on  Spotify">
										<span></span>
										Spotify									</a>
																																				</div>
						<div class="player-panel-row" aria-label="RSS Feed URL">
							<div class="title">RSS Feed</div>
							<div>
								<input value="https://datort.de/feed/podcast/pad-one-please" class="input-rss input-rss-1174" title="RSS Feed URL" readonly />
							</div>
							<button class="copy-rss copy-rss-1174" title="Copy RSS Feed URL" aria-label="Copy RSS Feed URL"></button>
						</div>
					</div>
				</div>
										<div class="share share-1174 player-panel">
					<div class="close-btn close-btn-1174">
						<span></span>
						<span></span>
					</div>
					<div class="player-panel-row">
						<div class="title">
							Teilen						</div>
						<div class="icons-holder">
							<a href="https://www.facebook.com/sharer/sharer.php?u=https://datort.de/podcast/005-hugo-trollt-tv-und-games/&#038;t=#005: Hugo trollt TV und Games"
							   target="_blank" rel="noopener noreferrer" class="share-icon facebook" title="Auf Facebook teilen">
								<span></span>
							</a>
							<a href="https://twitter.com/intent/tweet?text=https://datort.de/podcast/005-hugo-trollt-tv-und-games/&#038;url=#005: Hugo trollt TV und Games"
							   target="_blank" rel="noopener noreferrer" class="share-icon twitter" title="Auf Twitter teilen">
								<span></span>
							</a>
							<a href="https://datort.de/podcast-player/1174/005-hugo-trollt-tv-und-games.mp3"
							   target="_blank" rel="noopener noreferrer" class="share-icon download" title="Download" download>
								<span></span>
							</a>
						</div>
					</div>
					<div class="player-panel-row">
						<div class="title">
							Link						</div>
						<div>
							<input value="https://datort.de/podcast/005-hugo-trollt-tv-und-games/" class="input-link input-link-1174" title="Episode URL" readonly />
						</div>
						<button class="copy-link copy-link-1174" title="Copy Episode URL" aria-label="Copy Episode URL" readonly=""></button>
					</div>
					<div class="player-panel-row">
						<div class="title">
							Embed						</div>
						<div style="height: 10px;">
							<input type="text" value='&lt;blockquote class=&quot;wp-embedded-content&quot; data-secret=&quot;Ds8WNvtRtR&quot;&gt;&lt;a href=&quot;https://datort.de/podcast/005-hugo-trollt-tv-und-games/&quot;&gt;#005: Hugo trollt TV und Games&lt;/a&gt;&lt;/blockquote&gt;&lt;iframe sandbox=&quot;allow-scripts&quot; security=&quot;restricted&quot; src=&quot;https://datort.de/podcast/005-hugo-trollt-tv-und-games/embed/#?secret=Ds8WNvtRtR&quot; width=&quot;500&quot; height=&quot;350&quot; title=&quot;&#8222;#005: Hugo trollt TV und Games&#8220; &#8211; datort.de&quot; data-secret=&quot;Ds8WNvtRtR&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; class=&quot;wp-embedded-content&quot;&gt;&lt;/iframe&gt;&lt;script&gt;
/*! This file is auto-generated */
!function(d,l){&quot;use strict&quot;;l.querySelector&amp;&amp;d.addEventListener&amp;&amp;&quot;undefined&quot;!=typeof URL&amp;&amp;(d.wp=d.wp||{},d.wp.receiveEmbedMessage||(d.wp.receiveEmbedMessage=function(e){var t=e.data;if((t||t.secret||t.message||t.value)&amp;&amp;!/[^a-zA-Z0-9]/.test(t.secret)){for(var s,r,n,a=l.querySelectorAll(&#039;iframe[data-secret=&quot;&#039;+t.secret+&#039;&quot;]&#039;),o=l.querySelectorAll(&#039;blockquote[data-secret=&quot;&#039;+t.secret+&#039;&quot;]&#039;),c=new RegExp(&quot;^https?:$&quot;,&quot;i&quot;),i=0;i&lt;o.length;i++)o[i].style.display=&quot;none&quot;;for(i=0;i&lt;a.length;i++)s=a[i],e.source===s.contentWindow&amp;&amp;(s.removeAttribute(&quot;style&quot;),&quot;height&quot;===t.message?(1e3&lt;(r=parseInt(t.value,10))?r=1e3:~~r&lt;200&amp;&amp;(r=200),s.height=r):&quot;link&quot;===t.message&amp;&amp;(r=new URL(s.getAttribute(&quot;src&quot;)),n=new URL(t.value),c.test(n.protocol))&amp;&amp;n.host===r.host&amp;&amp;l.activeElement===s&amp;&amp;(d.top.location.href=t.value))}},d.addEventListener(&quot;message&quot;,d.wp.receiveEmbedMessage,!1),l.addEventListener(&quot;DOMContentLoaded&quot;,function(){for(var e,t,s=l.querySelectorAll(&quot;iframe.wp-embedded-content&quot;),r=0;r&lt;s.length;r++)(t=(e=s[r]).getAttribute(&quot;data-secret&quot;))||(t=Math.random().toString(36).substring(2,12),e.src+=&quot;#?secret=&quot;+t,e.setAttribute(&quot;data-secret&quot;,t)),e.contentWindow.postMessage({message:&quot;ready&quot;,secret:t},&quot;*&quot;)},!1)))}(window,document);
//# sourceURL=https://datort.de/wp-includes/js/wp-embed.min.js
&lt;/script&gt;
'
								   title="Embed Code"
								   class="input-embed input-embed-1174" readonly/>
						</div>
						<button class="copy-embed copy-embed-1174" title="Copy Embed Code" aria-label="Copy Embed Code"></button>
					</div>
				</div>
					</div>
	
	

	</div>
<div class="podcast_meta"><aside><p><a href="https://datort.de/podcast-download/1174/005-hugo-trollt-tv-und-games.mp3?ref=download" title="Hugo: Der Troll, den ich nicht spielen durfte " class="podcast-meta-download">Datei herunterladen</a> | <a href="https://datort.de/podcast-download/1174/005-hugo-trollt-tv-und-games.mp3?ref=new_window" target="_blank" title="Hugo: Der Troll, den ich nicht spielen durfte " class="podcast-meta-new-window">In neuem Fenster abspielen</a> | <span class="podcast-meta-duration">Audiolänge: 14:03</span> | <span class="podcast-meta-date">Aufgenommen am  23. September 2025</span></p><p>Abonnieren: <a href="https://music.amazon.de/podcasts/0c0b2b58-55b0-42ac-884b-57604310d6f9/pad-one-please-der-n%C3%A4chste-retro-podcast" target="_blank" title="Amazon" class="podcast-meta-itunes">Amazon</a> | <a href="https://podcasts.apple.com/us/podcast/pad-one-please-noch-so-n-retro-podcast/id1830571033" target="_blank" title="Apple Podcasts" class="podcast-meta-itunes">Apple Podcasts</a> | <a href="https://deezer.com/show/1002093401" target="_blank" title="Deezer" class="podcast-meta-itunes">Deezer</a> | <a href="https://datort.de/feed/podcast/pad-one-please" target="_blank" title="RSS" class="podcast-meta-itunes">RSS</a> | <a href="https://open.spotify.com/show/4cTvGULCA1LGs9mPdwxKTH" target="_blank" title="Spotify" class="podcast-meta-itunes">Spotify</a></p></aside></div>


<p>Nun gibt es aber ja seit einer ganzen Weile Arduino- und ESP-Boards, mit denen man famose Dinge erschaffen kann wenn man dem Thema etwas Zeit widmet. Und da ich hier noch ein altes Telefon der Deutschen Bundespost rumfliegen habe, was den Retro-Charackter der Aktion nur noch weiter verstärkt, habe ich mich dran gemacht aus dem Telefon ein viel zu großes Numpad zu bauen, mit dem auch gleich noch Hugo Spielen kann. </p>



<h2 id="teileliste" class="cnvs-block-section-heading cnvs-block-section-heading-1761953656988 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Teileliste</span>
	</span>
</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="577" src="https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-1024x577.jpg" alt="" class="wp-image-1229" srcset="https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-1024x577.jpg 1024w, https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-300x169.jpg 300w, https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-768x432.jpg 768w, https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-380x214.jpg 380w, https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1-800x450.jpg 800w, https://datort.de/wp-content/uploads/2025/11/PhoneATroll_components-1.jpg 1094w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Die Teile: Ein ESP32 S3 Zero, das Flachbandkabel vom FeTAp und optional ein Custom PCB, welches alles zusammenbringt</figcaption></figure>



<p>Viel braucht es für dieses Projekt nicht, nämlich nur den ESP und das Telefon: </p>



<ul class="wp-block-list">
<li>Retro-Telefon &#8222;FeTAp&#8220;, hier ein FeTAp 0111 aus 1987</li>



<li>ESP 32 S3 Zero</li>



<li>optional: DIY Platine um Kabelwirrwarr zu vermeiden (siehe &#8222;Schaltplan&#8220;)</li>
</ul>



<p>Naja gut, und natürlich Schraubendreher, einen Lötkolben und was man zu dessen Verwendung halt so benötigt.</p>



<h2 id="schaltplan" class="cnvs-block-section-heading cnvs-block-section-heading-1761953751401 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Schaltplan</span>
	</span>
</h2>



<p>Damit das Ganze funktionieren kann, muss das Tastenfeld mit dem ESP32 verbunden werden. An dem Tastenfeld des Telefons ist ein kurzes Flachband. Also, genau genommen ist es auf der Platine des Telefons und muss von der befreit werden. Danach müssen folgende Pins entsprechend mit dem ESP32 verbunden werden. </p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="428" src="https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-1024x428.png" alt="" class="wp-image-1223" srcset="https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-1024x428.png 1024w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-300x125.png 300w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-768x321.png 768w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-1536x642.png 1536w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-380x159.png 380w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-800x334.png 800w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1-1160x485.png 1160w, https://datort.de/wp-content/uploads/2025/11/Schaltplan_FeTAp-1.png 1904w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Um es für mich etwas angenehmer zu gestalten, habe ich mir eine kleine Platine dafür gebaut. Ich bin immer noch begeistert für welche schmale Mark man heutzutage selbstgestaltete PCBs produzieren lassen kann. Ich pack hier mal meine Lösung in Form einer Gerber-File hin, mit der eine Nachbestellung möglich ist &#8211; Verwendung auf eigene Gefahr: </p>



<div class="wp-block-file"><a id="wp-block-file--media-ca997e77-f3d5-48a6-9034-730e5b601c9d" href="https://datort.de/wp-content/uploads/2025/11/Gerber_FeTapNumPad_PCB_FeTapNumPad_2_2025-11-01.zip">Gerber_FeTapNumPad_PCB_FeTapNumPad_2_2025-11-01</a><a href="https://datort.de/wp-content/uploads/2025/11/Gerber_FeTapNumPad_PCB_FeTapNumPad_2_2025-11-01.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-ca997e77-f3d5-48a6-9034-730e5b601c9d">Herunterladen</a></div>



<h2 id="funktionsweise" class="cnvs-block-section-heading cnvs-block-section-heading-1761954460438 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Funktionsweise</span>
	</span>
</h2>



<p>Das kleine ESP-Board ist in der Lage, als HID (Human Interface Device) über USB zu agieren. Damit gibt es sich in diesem Fall sozusagen als Keyboard aus. Drücke ich eine der Tasten auf dem Telefon, so wird ein Tastendruck (Keyboard.press()) ausgelöst, für 80 Milisekunden gehalten und danach wird die Taste wieder &#8222;losgelassen&#8220; (Keyboard.release()). </p>



<p>Um den richtigen Tastendruck zu ermitteln, wird das Tastenfall in schnellen Intervallen auf Tastendrücke abgefragt &#8211; so wie es das Telefon selbst zuvor auch gemacht hat. Das Tastenfeld ist dabei als eine Art Matrix aufgebaut. Man kann Spannung dabei Zeilen und Reihenweise anlegen. Gebe ich also beispielsweise eine Spannung auf Spalte 2 und Zeile 3, so muss bei Druck der Taste 8 eine Spannung anliegen sofern diese gerade gedrückt wird. So funktioniert im Groben die Erkennung welche Taste gerade gedrückt wird. Simpel aber doch irgendwie faszinierend, wenn ich mir vorstelle in welchem flotten Intervall der ESP da über alle möglichen Konstellationen immer und immer wieder drüber ballert. </p>



<h2 id="software" class="cnvs-block-section-heading cnvs-block-section-heading-1761954867809 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Software</span>
	</span>
</h2>



<p>Die Software besteht im Wesentlichen aus einer einzigen Datei. Ich entwickle in PlattformIO, entsprechend handelt es sich bei dem Projekt um ein solches. Ihr könnt den Code aber auch in die Arduino IDE kopieren, dann müsste ihr nur dafür sorgen dass ihr die entsprechend für den ESP32 S3 Zero konfiguriert. Außerdem müsst ihr vermutlich das #include &lt;Arduino.h&gt; rausnehmen und dem Sketch eine .ino-Dateiendung geben. Mehr dazu auch in der Readme. Das Projekt könnt ihr auf meinem GIthub-Profil auschecken oder runterladen.</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://github.com/datort/phone-a-troll" target="_blank" rel="noreferrer noopener">PhoneATroll @Github</a></div>
</div>



<h2 id="fazit" class="cnvs-block-section-heading cnvs-block-section-heading-1761993025771 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Fazit</span>
	</span>
</h2>



<p>Das Projekt hier hat mir wahnsinnig Spaß gemacht. Ich hab keine Ahnung, ob es da draussen wirklich noch andere Verrückte gibt, die sich an sowas erfreuen. Aber falls ja: Hey, schön das du da bist und viel Spaß mit dem Projekt. Wer keine Lust auf basteln hat: Ich habe kürzlich erfahren, dass im <a href="https://hi-score.org/" target="_blank" rel="noreferrer noopener nofollow">Hi-Score</a> in Hannover auch etwas ähnliches für jeden zum ausprobieren und Spielen stehen soll. Diese Werbung hier ist absolut freiwillig und unbezahlt, ich finde in der Retro-Community muss man zusammenhalten und gute Ideen teilen.</p>



<p>Und wenn ihr das Projekt mal umgesetzt haben solltet: Ich würde mich super über Rückmeldung freuen. Viel Spaß beim Zocken!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/retro-computing/1219/hugo-der-troll-den-ich-nicht-spielen-durfte/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino/ESP + SIMCom A7670E LTE-Modul</title>
		<link>https://datort.de/raspberry-arduino/1113/arduino-esp-simcom-a7670e-lte-modul/</link>
					<comments>https://datort.de/raspberry-arduino/1113/arduino-esp-simcom-a7670e-lte-modul/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Wed, 10 Sep 2025 18:57:35 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Mobilfunk]]></category>
		<guid isPermaLink="false">https://datort.de/?p=1113</guid>

					<description><![CDATA[Auch in Deutschland ist vermutlich Mitte 2028 Schluß mit dem 2G GSM-Netz: Sowohl Telekom als auch Vodafone haben&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Auch in Deutschland ist vermutlich Mitte 2028 Schluß mit dem 2G GSM-Netz: Sowohl Telekom als auch Vodafone haben das Datum zur Abschaltung ihrer ersten digitalen Mobilfunknetze vor einiger Zeit verkündet. Module wie das SIM800L, die nur das 2G-Netz mit GPRS und EDGE unterstützen, werden dann nicht mehr funktionieren. Zeit sich nach Alternativen umzusehen. Das A7670E von SIMCom könnte eine solche Altnative sein. Es ist mit knapp über 10,- Euro von Aliexpress und co. relativ günstig zu haben und via UART-Schnittstelle auch leicht mit 2 Kabeln anzubinden. Allerdings ist nicht alles Gold was glänzt. Hier meine schnelle Pros-/Cons-Liste, bevor wir uns das Board und Software-Beispiele genauer ansehen.</p>



<p><strong>+</strong> relativ günstig<br><strong>+</strong> kompakt<br><strong>+</strong> überschaubarer Stromverbrauch<br><strong>+</strong> optional mit GPS und Bluetooth<br><strong>+</strong> USB-Anschluss für schnellere Datenübertragung<br><br><strong>&#8211;</strong> min. 5 V Versorgungsspannung (SIM800L lief auch mit 3.7 V)<br><strong>&#8211;</strong> Status LED ungenau (moniert nicht verbunden zu sein, obwohl Daten gesendet und empfangen werden)</p>



<h2 id="videoanleitung" class="cnvs-block-section-heading cnvs-block-section-heading-1757866690807 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Videoanleitung</span>
	</span>
</h2>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/1113/arduino-esp-simcom-a7670e-lte-modul/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FxPMGg86Webg%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<h2 id="hardware" class="cnvs-block-section-heading cnvs-block-section-heading-1757071876446 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Hardware</span>
	</span>
</h2>



<p>Für mein Test-Setup verwende ich ein ESP32-WROOM-32D-Board. Andere Boards sind möglich. Ich verwende dieses Board aufgrund der Hardware-Serial, über die die Kommunikation zwischen ESP und A7670E-LTE-Modem läuft. Die Beschriftung auf dem Modem ist ein bisschen unübersichtlich. Auf meinem Board von oben nach unten: <br><strong>G: GND, R: RXD, T: TXT, K: PWRKEY, V: VCC, G: GND, S-SLEEP</strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="1024" src="https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-1024x1024.jpeg" alt="" class="wp-image-1152" srcset="https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-1024x1024.jpeg 1024w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-300x300.jpeg 300w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-200x200.jpeg 200w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-768x768.jpeg 768w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-80x80.jpeg 80w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-110x110.jpeg 110w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-380x380.jpeg 380w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-800x800.jpeg 800w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins-1160x1160.jpeg 1160w, https://datort.de/wp-content/uploads/2025/09/A7670E_Pins.jpeg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Für mein Setup genügt es, vom ESP TX/RX über Kreuz zu verbinden: Also: TX vom ESP auf RX vom Modem und umgekehrt. Außerdem teilen sich ESP und A7670E einen Ground. Das wars dann aber auch. Ich hatte zwischenzeitlich einen 2200μF-Kondensator verbaut, bis ich gesehen habe das genau für diesen Zweck bereits ein 4700μF-Kondensator auf dem Modem verbaut ist. Trotzdem kackte das Modem beim Einbuchen ins LTE-Netz ab und an ab &#8211; die Stromversorgung scheint da aber wohl dann nicht der Grund gewesen zu sein?! </p>



<h2 id="software" class="cnvs-block-section-heading cnvs-block-section-heading-1757071899911 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Software</span>
	</span>
</h2>



<p>Getestet wurde das hier mit dem A7670E-Modul. Allerdings sollten die meisten Sketches auch mit anderen Boards von SIMCom funktionieren, sofern sie den gleichen Befehlssatz unterstützen. </p>



<h5 id="basis-sketch" class="wp-block-heading">Basis Sketch</h5>



<p>Um es auch für Einsteiger verständlich zu halten, teile ich die einzelnen Funktion in kleine Snippets auf. So könnt ihr euch das raussuchen, was für euer Szenario am besten passt. Diese basieren auf folgender Basis, die zunächst nichts weiter macht als die Kommunikation mit dem A7670E sicherzustellen und die Antworten des Moduls im Serial Monitor euer (Arduino-)IDE anzuzeigen. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;

#define RX_PIN 17 // RX-Pin des ESP-Boards
#define TX_PIN 16 // TX-Pin des ESP-Boards
HardwareSerial modem(2);

void setup() {
  Serial.begin(115200);

  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);

  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;); // AT = Attention, Modem muss mit &quot;OK&quot; antworten
}

void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp); // Jede Antwort des Modems in der Serial gekennzeichnet ausgeben
    }
  }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Serial connection ready
Modem: AT
Modem: OK
</pre></div>


<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-1024x768.jpeg" alt="" class="wp-image-1155" srcset="https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-1024x768.jpeg 1024w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-300x225.jpeg 300w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-768x576.jpeg 768w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-200x150.jpeg 200w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-260x195.jpeg 260w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-380x285.jpeg 380w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-800x600.jpeg 800w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot-1160x870.jpeg 1160w, https://datort.de/wp-content/uploads/2025/09/A7670E-ESP32-Topshot.jpeg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h5 id="mobilfunkstatus-sketch" class="wp-block-heading">Mobilfunkstatus Sketch</h5>



<p>Um zu prüfen, ob das A7670E-Modul mit dem Mobilfunknetz verbunden ist, können wir es einfach selbst fragen. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;

#define RX_PIN 17
#define TX_PIN 16
HardwareSerial modem(2);

void setup() {
  Serial.begin(115200);

  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);

  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;);
}

void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp);
    }
  }

  static unsigned long lastRun = millis() - 18000;
  if (millis() - lastRun &gt; 20000) { // Nach 2 Sekunden alle 20 Sekunden aktualisieren
    lastRun = millis();

    modem.println(&quot;AT+CSQ&quot;);      // Signalstärke
    modem.println(&quot;AT+CEREG?&quot;);   // LTE Netzregistrierung
    modem.println(&quot;AT+CGATT?&quot;);   // Datenregistrierung
    modem.println(&quot;AT+CGACT?&quot;);   // PDP Kontext aktiv? (Datenverbindung)
    modem.println(&quot;AT+CGPADDR&quot;);  // IP-Adresse
    modem.println(&quot;AT+NETOPEN?&quot;); // Socket-Service Status
  }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Modem: AT+CSQ
Modem: +CSQ: 26,99
Modem: OK
Modem: AT+CEREG?
Modem: +CEREG: 0,1
Modem: OK
Modem: AT+CGATT?
Modem: +CGATT: 1
Modem: OK
Modem: AT+CGACT?
Modem: +CGACT: 1,1
Modem: +CGACT: 8,1
Modem: OK
Modem: AT+CGPADDR
Modem: +CGPADDR: 1,10.76.56.42
Modem: +CGPADDR: 8,0.0.0.0,254.128.0.0.0.0.0.0.194.209.178.131.245.194.29.154
Modem: OK
Modem: AT+NETOPEN?
Modem: +NETOPEN: 0
Modem: OK
</pre></div>


<p class="has-small-font-size"><strong>+CSQ: 26,99</strong>: 26 ist die Signalqualität, Skala 0-31, 26 = ziemlich guter Empfang<br><strong>+CEREG: 0,1</strong>: Erfolgreich im LTE-Netz eingebucht<br><strong>+CGATT: 1</strong>: Datenverbindung aktiv<br><strong>+CGACT: 1,1</strong> &amp; <strong>+CGACT: 8,1</strong>: Zwei Datenkontexte offen<br><strong>+CGPADDR: 1,10.76.56.42</strong><br><strong>+CGPADDR: 8,0.0.0.0,254.128.0.0.0.0.0.0.194.209.178.131.245.194.29.154</strong>: IP-Adressen, die das Board erhalten hat</p>



<h5 id="ping-sketch" class="wp-block-heading">Ping Sketch</h5>



<p>Ein grundlegender Test von Netzwerk-Kommunikation ist ein &#8222;ping&#8220;: Ein kleines Datenpaket wird an einen Server gesendet. Kommt das Paket an antwortet der Server und der Nutzer sieht, wie lange das Datenpaket auf Reise war. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;

#define RX_PIN 17
#define TX_PIN 16
HardwareSerial modem(2);

void setup() {
  Serial.begin(115200);

  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);

  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;);
}

void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp);
    }
  }

  static unsigned long lastRun = millis() - 18000;
  if (millis() - lastRun &gt; 20000) {
    lastRun = millis();

    modem.println(&quot;AT+CPING=\&quot;8.8.8.8\&quot;,1,4&quot;); // 4 Pings an Google DNS senden
  }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Modem: AT+CPING=&quot;8.8.8.8&quot;,1,4
Modem: OK
Modem: +CPING: 1,8.8.8.8,92,130,114
Modem: +CPING: 1,8.8.8.8,92,40,114
Modem: +CPING: 1,8.8.8.8,92,15,114
Modem: +CPING: 1,8.8.8.8,92,30,114
Modem: +CPING: 3,4,4,0,15,130,40
</pre></div>


<p class="has-small-font-size"><strong>AT+CPING=&#8220;8.8.8.8&#8243;,1,4</strong>: 8.8.8.8 ist die Ziel-IP-Adresse, 1 steht für IPv4 (2 wäre IPv6), 4 ist die Anzahl der Wiederholungen<br><strong>+CPING: 1,8.8.8.8,92,130,114</strong>: 1: Ping erfolgreich, der vorletzte Wert (hier 130) ist die Laufzeit in ms, die anderen Werte bitte dem Manual entnehmen<br><strong>+CPING: 3,4,4,0,15,130,40</strong>: Zusammenfassung über die 4 Pings</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-1024x768.jpeg" alt="" class="wp-image-1156" srcset="https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-1024x768.jpeg 1024w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-300x225.jpeg 300w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-768x576.jpeg 768w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-200x150.jpeg 200w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-260x195.jpeg 260w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-380x285.jpeg 380w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-800x600.jpeg 800w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme-1160x870.jpeg 1160w, https://datort.de/wp-content/uploads/2025/09/A7670E-Stromaufnahme.jpeg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">In der Regel ist die Stromaufnahme sehr gering. Beim Senden und Empfangen kann der Verbrauch kurzzeitig ansteigen. HTTPS-Traffic verbraucht (wenig überraschend) noch etwas mehr Strom</figcaption></figure>



<h5 id="daten-via-http-abrufen-http-get-request" class="wp-block-heading">Daten via HTTP abrufen (HTTP GET-Request)</h5>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;

#define RX_PIN 17
#define TX_PIN 16
HardwareSerial modem(2);

void setup() {
  Serial.begin(115200);

  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);

  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;);
}

void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp);
    }
  }

  static unsigned long lastRun = millis() - 18000;
  if (millis() - lastRun &gt; 20000) {
    lastRun = millis();

    modem.println(&quot;AT+HTTPINIT&quot;); // HTTP-Service des Modems starten

    
    modem.println(&quot;AT+HTTPPARA=\&quot;URL\&quot;,http://httpbin.org/get&quot;); // Abzurufende Adresse
    modem.println(&quot;AT+HTTPACTION=0&quot;); // 0 = GET, 1 = POST, 2 = HEAD, 3 = DELETE, 4 = PUT

    delay(2500); // Wir gehen davon aus, in 2.5s die Antwort zu erhalten. Vermutlich besser: AT+HTTPACTION auswerten, liefert die Content-Length

    modem.println(&quot;AT+HTTPHEAD&quot;); // Ausgabe des Response Headers

    delay(200);

    modem.println(&quot;AT+HTTPREAD=99999&quot;); // &quot;Unsaubere Implementierung&quot;: Eigentlich AT+HTTPREAD? nutzen um Länge der Antwort zu ermitteln
    modem.println(&quot;AT+HTTPTERM&quot;); // HTTP-Service nach Verwendung stoppen
  }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Modem: AT+HTTPINIT
Modem: ERROR
Modem: AT+HTTPPARA=&quot;URL&quot;,http://httpbin.org/get
Modem: OK
Modem: AT+HTTPACTION=0
Modem: OK
Modem: +HTTPACTION: 0,200,255
Modem: AT+HTTPHEAD
Modem: +HTTPHEAD: 226
Modem: HTTP/1.1 200 OK
Modem: Date: Fri, 05 Sep 2025 15:28:01 GMT
Modem: Content-Type: application/json
Modem: Content-Length: 255
Modem: Connection: keep-alive
Modem: Server: gunicorn/19.9.0
Modem: Access-Control-Allow-Origin: *
Modem: Access-Control-Allow-Credentials: true
Modem: OK
Modem: AT+HTTPREAD?
Modem: +HTTPREAD: LEN,255
Modem: OK
Modem: AT+HTTPREAD=99999
Modem: OK
Modem: AT+HTTPTERM
Modem: OK
Modem: +HTTPREAD: 255
Modem: {
Modem: &quot;args&quot;: {},
Modem: &quot;headers&quot;: {
Modem: &quot;Accept&quot;: &quot;*/*&quot;,
Modem: &quot;C &quot;origin&quot;: &quot;80.187.118.156&quot;,
Modem: &quot;url&quot;: &quot;http://httpbin.org/get&quot;
Modem: }
Modem: +HTTPREAD: 0
</pre></div>


<p class="has-small-font-size"><strong>+HTTPACTION: 0,200,255</strong>: 0 = Type der Anfrage (GET), 200 = Statuscode des Servers, 255 = Länge der Antwort in Bytes<br><strong>+HTTPHEAD: 226</strong>: Start Ausgabe des Headers, 226 Bytes<br><strong>+HTTPREAD: LEN,255</strong>: Eine Response liegt vor, 255 Bytes<br><strong>+HTTPREAD: 255</strong>: Beginn der Ausgabe des Response bis <strong>HTTPREAD: 0</strong></p>



<h5 id="daten-via-http-senden-http-post-put-patch" class="wp-block-heading">Daten via HTTP senden (HTTP POST, PUT, PATCH)</h5>



<p>Im vorangegangenen Beispiel beim Abruf der Daten via HTTP haben wir etwas &#8222;gefuttelt&#8220; was die Antworten anging. So haben wir mit delay gearbeitet und gehofft, dass bis dahin eine Antwort da ist. Damit kommen wir jetzt nicht mehr durch. Um den Code weiter lesbar zu halten, habe ich die Logik in einzelne Funktionen aufgeteilt.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;

#define RX_PIN 17
#define TX_PIN 16
HardwareSerial modem(2);

String waitForURC(const char* token, unsigned long timeoutMs = 10000) { // URC: Unsolicited Result Code, Ereignisbasierte Melungen des Modems abfragen. In unserem Fall für die Antwort nach dem POST genutzt
  unsigned long start = millis();
  String buffer;

  while (millis() - start &lt; timeoutMs) {
    while (modem.available()) {
      String line = modem.readStringUntil(&#039;\n&#039;);
      line.trim();

      if (line.length() &gt; 0) {
        Serial.println(&quot;URC: &quot; + line);
      }

      if (line.startsWith(token)) {
        return line;
      }
    }
  }
  Serial.println(&quot;Timeout beim Warten auf URC: &quot; + String(token));
  return &quot;&quot;;
}

void readHttpResponse() {
  modem.println(&quot;AT+HTTPREAD=99999&quot;); // Wir lesen pauschal alles; Hier könnte man auch mit der genauen Zahl an Bytes arbeiten (was sauberer wäre), aber das LTE-Modul liefert nur solange Daten zurück, wie sie vorliegen.
  
  String response;
  unsigned long startTime = millis();

  while (millis() - startTime &lt; 15000) {
    while (modem.available()) {
      String line = modem.readStringUntil(&#039;\n&#039;);
      line.trim();

      if (line.startsWith(&quot;+HTTPREAD:&quot;)) continue;
      if (line == &quot;OK&quot;) {
        Serial.println(&quot;HTTP-Body:&quot;);
        Serial.println(response);
        return;
      }

      response += line + &quot;\n&quot;;
    }
  }
  Serial.println(&quot;Timeout beim Lesen der Response!&quot;);
}

void httpPost(const char* url, const char* json) { // Methode speziell für den HTTP POST-Prozess
  modem.println(&quot;AT+HTTPINIT&quot;);
  modem.printf(&quot;AT+HTTPPARA=\&quot;URL\&quot;,\&quot;%s\&quot;\r\n&quot;, url);
  modem.println(&quot;AT+HTTPPARA=\&quot;CONTENT\&quot;,\&quot;application/json\&quot;&quot;); // Festsetzen des Inhalts auf JSON
  modem.printf(&quot;AT+HTTPDATA=%d,5000\r\n&quot;, strlen(json)); // Dem Modem mitteilen, dass gleich Daten kommen, die es für die Übermittlung aufzeichnen soll

  String dl = waitForURC(&quot;DOWNLOAD&quot;, 5000); // Warten bis das Modem mit &quot;DOWNLOAD&quot; antwortet, dann senden unseres JSON
  if (dl.length() &gt; 0) {
    modem.print(json);
    if (waitForURC(&quot;OK&quot;, 5000).length() == 0) { // Im Anschluss auf die Bestätigung der Übertragung durch das Modem warten
      Serial.println(&quot;Modem or connection stuck, too many data sent or check wiring&quot;);
      return;
    }
  }

  modem.println(&quot;AT+HTTPACTION=1&quot;); // 1 = POST
  String action = waitForURC(&quot;+HTTPACTION:&quot;, 15000); // Hier optimierter Ablauf: Sobald die Anfrage vom Modem versendet wurde, geht&#039;s weiter...

  if (action.length() &gt; 0) {
    int method, status, len;
    if (sscanf(action.c_str(), &quot;+HTTPACTION: %d,%d,%d&quot;, &amp;method, &amp;status, &amp;len) == 3) {
      Serial.printf(&quot;HTTP Status: %d, Length: %d\n&quot;, status, len);

      if (status == 200 || status == 201) { // Status code 200/201 stehen für eine erfolgreiche Anfragen bei POST
        readHttpResponse(); // Auslesen der Antwort in einer eigenen Funktion dafür
      } else {
        Serial.println(&quot;Unexpected response&quot;);
      }
    }
  }

  modem.println(&quot;AT+HTTPTERM&quot;);
}

void setup() {
  Serial.begin(115200);

  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);

  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;);
}

void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp);
    }
  }

  static unsigned long lastRun = millis() - 18000;
  if (millis() - lastRun &gt; 20000) {
    lastRun = millis();
    const char* json = &quot;{\&quot;temperature\&quot;:25.3,\&quot;battery_level\&quot;:\&quot;83\&quot;}&quot;; // Unsere Daten verpackt in JSON

    httpPost(&quot;http://httpbin.org/post&quot;, json); // Start des HTTP Post
  }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Serial connection ready
Modem: AT
Modem: OK
URC: AT+HTTPINIT
URC: OK
URC: AT+HTTPPARA=&quot;URL&quot;,&quot;http://httpbin.org/post&quot;
URC: OK
URC: AT+HTTPPARA=&quot;CONTENT&quot;,&quot;application/json&quot;
URC: OK
URC: AT+HTTPDATA=41,5000
URC: DOWNLOAD
URC: OK
URC: AT+HTTPACTION=1
URC: OK
URC: +HTTPACTION: 1,200,488
HTTP Status: 200, Length: 488
HTTP-Body:
AT+HTTPREAD=99999

Modem: +HTTPREAD: 488
Modem: {
Modem: &quot;args&quot;: {},
Modem: &quot;data&quot;: &quot;{\&quot;temperature\&quot;:25.3,\&quot;battery_level\&quot;:\&quot;83\&quot;}&quot;,
Modem: &quot;files&quot;: {},
Modem: &quot;form&quot;: {},
Modem: &quot;headers&quot;: {
Modem: &quot;Accept&quot;: &quot;*/*&quot;,
Modem: &quot;Cache-Control&quot;: &quot;no-cache&quot;,
Modem: &quot;Content-Length&quot;: &quot;41&quot;,
Modem: &quot;Content-Type&quot;: &quot;application/json&quot;,
Modem: &quot;Host&quot;: &quot;httpbin.org&quot;,
Modem: &quot;X-Amzn-Trace-Id&quot;: &quot;Root=1-68bd430d&quot;,
Modem: &quot;url&quot;: &quot;http://httpbin.org/post&quot;
Modem: }
Modem: AT+HTTPTERM
Modem: OK
Modem: +HTTPREAD: 0
</pre></div>


<p class="has-small-font-size">Dadurch das mit waitForURC auf ein Ereignis warten, verschieben sich hier die Ausgaben ein wenig. <br><strong>AT+HTTPDATA=41,5000</strong>: Unsere zu sendenden Daten sind 41 Bytes lang, Timeout: 5 Sekunden<br><strong>+HTTPACTION: 1,200,488</strong>: Die Übertragung war erfolgreich, 488 Bytes lang ist die Antwort<br><strong>AT+HTTPREAD=99999</strong>: Wir lesen pauschal 99999 Bytes, das Modem liefert aber nur so viel Daten zurück wie vorhanden; Wir hätten hier auch die 488 aus der HTTPACTION-Antwort verwenden können. Das wäre sauberer gewesen, aber in manchen Fällen (bspw. &#8222;chunked&#8220;-Responses) liegt wieder Wert nicht vor. Wir haben es uns also einfacher gemacht<br><strong>+HTTPREAD: 488</strong>: Beginn der Ausgabe der Antwort des Servers, enthält als Bestätigung unter &#8222;data&#8220; das, was wir geposted haben</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="624" src="https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-1024x624.png" alt="" class="wp-image-1158" srcset="https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-1024x624.png 1024w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-300x183.png 300w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-768x468.png 768w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-380x232.png 380w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-800x488.png 800w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole-1160x707.png 1160w, https://datort.de/wp-content/uploads/2025/09/A7670E-Debugging-in-Konsole.png 1238w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">In der Konsole (hier Plattform IO, &#8222;Serieller Monitor&#8220; in Arduino IDE) sieht man die Ausgaben des Modems und kann so nachvollziehen, was passiert</figcaption></figure>



<h5 id="besonderheiten-bei-https" class="wp-block-heading">Besonderheiten bei HTTPS</h5>



<p>Das 7670E-Modul ist dazu in der Lage Daten unverschlüsselt über HTTP, als auch verschlüsselt via HTTPS zu übertragen. Im besten Fall ist dazu nicht viel mehr nötig, als in den hier genannten Beispielen auf &#8222;http://&#8220; ein &#8222;https://&#8220; zu machen. Allerdings steckt der Teufel da gerne im Detail, denn HTTPS ≠ HTTPS. </p>



<p>Hier ein Mini-Exkurs: Werden im Netz Daten verschlüsselt übertragen, kommen dazu unterschiedliche Mechanismen zu tragen. So wird zum einen ein Verschlüsselungsalgorithmus zwischen Client und Server ausgehandelt., heutzutage oft TLS 1.2 oder größer. Neben diesem wird ein passendes Zertifikat benötigt. Gerade wenn es günstig sein soll, wird heute oft Lets Encrypt verwendet &#8211; mach ich auch so. Damit die Kommunikation aber wirklich sicher ist, müssen Betriebssysteme, Browser oder eben LTE-Module mit HTTPS-Support aber die Stammzertifikate der Anbieter kennen. Ein weiteres Thema ist Server Name Indication (SNI) in Verbindung mit virtuellen Hosts. Kurz um: Viele Dinge, die entweder eine vermeintlich sichere Verbindung unsicher machen können oder sie erst gar nicht zustand kommen lassen. </p>



<h6 id="wenn-die-uebertragung-nicht-gelingt" class="wp-block-heading">Wenn die Übertragung nicht gelingt&#8230;</h6>



<p>&#8230;geht&#8217;s an Debugging. Folgende Sachen könnt ihr prüfen:</p>



<p><strong>SNI aktivieren</strong><br>Das Modul hat zur Laufzeit 8 SSL-Konfiguration im Speicher. Per Default ist da wenig konfiguriert, außer die Art der TLS-Verschlüsselung mit der Gegenseite automatisch ausgehandelt werden soll. Was dabei nicht konfiguriert wird ist Server Name Indication. Das kann aber essentiell sein, nämlich dann, wenn euer Server mit Virtual Hosts arbeitet. Aktiviert SNI vor dem <strong>AT+HTTPINIT</strong> mit:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
modem.println(&quot;AT+CSSLCFG=\&quot;enableSNI\&quot;,0,1&quot;)
</pre></div>


<p class="has-small-font-size">SNI wird für den SSL-Kontext &#8222;0&#8220; mit &#8222;1&#8220; aktiviert. SSL-Kontext 0 ist der erste der genannten 8 möglichen und wird per default verwendet. Um die SSL-Kontext-ID anzupassen, kann man den Befehl <strong>AT+HTTPPARA=&#8220;SSLCFG&#8220;,2</strong> nutzen, wobei hier die 2 symbolisch für die ID des Index steht, also 0-7.</p>



<p><strong>HTTPACTION auswerten</strong><br>Einen GET-Request starten wir ja mit <strong>AT+HTTPACTION=0</strong>. Das Modul gibt neben einem &#8222;OK&#8220; auch weitere Informationen aus, im besten Fall sowas: <strong>+HTTPACTION: 0,200,81</strong><br>Die 0 steht für die Art der Anfrage (GET), die 200 für den vom Server gesendeten Statuscode und 81 ist die Länge der Antwort. Ist die Antwort nicht erfolgreich, ist interessant was dort statt 200 steht. Eine 706 würden auf Probleme beim Lesen der Antwort hindeuten, aber gleichzeitig bekräftigen, dass der TLS-Handshake zuvor erfolgreich war, während eine 715 eben genau auf Probleme bei ebendiesem hinweisen würden. In dem Fall müsste man prüfen, ob der verwendete TLS-Standard auf deinem Server von dem LTE-Modul überhaupt unterstützt wird.</p>



<p><strong>HTTP-Header auslesen</strong><br>Mit <strong>AT+HTTPHEAD</strong> lässt sich nach dem Absenden der Anfrage der Antwort-Header auslesen. Hier können auch Hinweise auf das Problem aufgeführt sein, wenn man Glück hat. Das oben angesprochene SNI-Problem könnte beispielsweise hier benannt werden.</p>



<h5 id="https-get-beispiel-sketch" class="wp-block-heading">HTTPS GET Beispiel Sketch</h5>



<p>Die oben genannte Punkte sind in diesem Beispiel berücksichtig, welcher bei mir erfolgreich funktionierte. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;Arduino.h&gt;
 
#define RX_PIN 17
#define TX_PIN 16
HardwareSerial modem(2);


String waitForURC(const char* token, unsigned long timeoutMs = 10000) {
  unsigned long start = millis();
  String buffer;
 
  while (millis() - start &lt; timeoutMs) {
    while (modem.available()) {
      String line = modem.readStringUntil(&#039;\n&#039;);
      line.trim();
 
      if (line.length() &gt; 0) {
        Serial.println(&quot;URC: &quot; + line);
      }
 
      if (line.startsWith(token)) {
        return line;
      }
    }
  }
  Serial.println(&quot;Timeout beim Warten auf URC: &quot; + String(token));
  return &quot;&quot;;
}


void setup() {
  Serial.begin(115200);
 
  delay(1000);
  Serial.println(&quot;Serial connection ready&quot;);
 
  modem.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
  modem.println(&quot;AT&quot;);

  
}
 
void loop() {
  while (modem.available()) {
    String resp = modem.readStringUntil(&#039;\n&#039;);
    resp.trim();
    if (resp.length() &gt; 0) {
      Serial.println(&quot;Modem: &quot; + resp);
    }
  }
 
  static unsigned long lastRun = millis() - 18000;
  if (millis() - lastRun &gt; 20000) {
    lastRun = millis();
 
    modem.println(&quot;AT+CSSLCFG=\&quot;enableSNI\&quot;,0,1&quot;); // SNI für SSL config ID 0 aktivieren
    
    modem.println(&quot;AT+HTTPINIT&quot;);
    
    modem.println(&quot;AT+HTTPPARA=\&quot;URL\&quot;,https://phil.cossnet.de/lte_modul_test.html&quot;); // Kleine selbstgehostete Test-HTML-Datei
    modem.println(&quot;AT+HTTPACTION=0&quot;);
 

    String response = waitForURC(&quot;+HTTPACTION&quot;, 5000); // Auf Antwort warten, offenbar dauert es bei HTTPS länger als bei HTTP
    if (response.length() &gt; 0) {
      modem.println(&quot;AT+HTTPHEAD&quot;);
      modem.println(&quot;AT+HTTPREAD=99999&quot;);
    }
 
    delay(200);
    modem.println(&quot;AT+HTTPTERM&quot;);
  }
}
</pre></div>]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/1113/arduino-esp-simcom-a7670e-lte-modul/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWTRIX STREAM: Die Kleine für den Schreibtisch</title>
		<link>https://datort.de/raspberry-arduino/929/awtrix-mini-die-kleine-fuer-den-schreibtisch/</link>
					<comments>https://datort.de/raspberry-arduino/929/awtrix-mini-die-kleine-fuer-den-schreibtisch/#comments</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Sat, 05 Apr 2025 16:11:45 +0000</pubDate>
				<category><![CDATA[LED]]></category>
		<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Selbstgebaut]]></category>
		<category><![CDATA[Awtrix]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[ESP8266]]></category>
		<guid isPermaLink="false">https://datort.de/?p=929</guid>

					<description><![CDATA[Wenn ihr diesen Artikel gefunden habt, so kennt ihr höchstwahrscheinlich das AWTRIX-Projekt. Eine Firmware für ESP-Entwicklerboards, mit der&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Wenn ihr diesen Artikel gefunden habt, so kennt ihr höchstwahrscheinlich das <a href="https://blueforcer.github.io/awtrix3/#/" target="_blank" rel="noreferrer noopener">AWTRIX</a>-Projekt. Eine Firmware für ESP-Entwicklerboards, mit der sich Selbstbau-LED-Matrixen betreiben oder auch fertige Modelle wie die TC-001 von Ulanzi umpatchen lassen. Mit &#8222;AWTRIX STREAM&#8220; habe ich nun ein kleines Projekt gestartet, welches das Ganze etwas kompakter machen und auf ein LC-Display bringen soll.</p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/929/awtrix-mini-die-kleine-fuer-den-schreibtisch/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FLMmw3sYUiGc%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Sehr kleine 32x8er-LED-Module zu fairen Preisen und für den passenden Standart zum Betrieb der Awtrix-Firmware zu finden, ist gar nicht so einfach. So entstand die Idee, stattdessen einfach ein 320&#215;172 Pixel großes Display zu verwenden. Mein Projekt ist am Ende <strong>keine</strong> eigenständige AWTRIX. Stattdessen spiegelt (oder &#8222;streamt&#8220;) sie sozusagen nur eine bereits in eurem Netzwerk vorhandene LED-Matrix mit laufender AWTRIX-Firmware drauf. Das läuft dann über Wifi und funktioniert erstaunlich gut und schnell.</p>



<h2 id="dokumentation" class="cnvs-block-section-heading cnvs-block-section-heading-1745162369158 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Dokumentation</span>
	</span>
</h2>



<p>Die Dokumentation befindet sich noch im Aufbau, aber gerade wenn ihr die MQTT-Befehle nutzen wollt, die mit Version 1.1.0 mitkamen, habe ich euch die da schon Mal aufgeschrieben.</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://datort.de/awtrix-stream-dokumentation/" target="_blank" rel="noreferrer noopener">AWTRIX STREAM Dokumentation</a></div>
</div>



<h2 id="die-teile" class="cnvs-block-section-heading cnvs-block-section-heading-1741547444743 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Die Teile</span>
	</span>
</h2>



<p>Um das Projekt nachzubauen benötigt ihr gar nicht viel. Löten ist optional: Nur wenn ihr die recht langen Kabel des Displays kürzen wollt, solltet ihr löten. Es geht aber auch ohne das, dann kann alles einfach zusammengesteckt werden.</p>



<ul class="wp-block-list">
<li>D1 Mini-Board (mit ESP8266-Chip)</li>



<li>Waveshare 1.47&#8243; LC-Display oder Noname (z.B. <a href="https://de.aliexpress.com/item/1005008541993365.html?spm=a2g0o.order_list.order_list_main.5.538f5c5fOcFET1&amp;gatewayAdapt=glo2deu" target="_blank" rel="noreferrer noopener nofollow">dieses</a>)*</li>



<li>6x 2mm-Schrauben (z.B. 2&#215;5 oder 2&#215;8)</li>



<li>einen 3D-Drucker**</li>
</ul>



<p>*) Ich will betonen das ich keine Werbung für das Waveshare-Display machen will. Ich habe mich aus 3 Gründen für dieses (im Vergleich etwas teurere) Display entschieden: Zum einen ist die Platine des Boards nur minimal größer als das Display was 3D-Gehäuse kompakter werden lies. Außerdem bringt das Display auf der Rückseite direkt Muttern zum verschrauben mit und da es sich um ein &#8222;Markenprodukt&#8220; handelt, solltet ihr beim Bestellen im besten Fall auf den Millimeter dasselbe Produkt erhalten. In der Theorie sollte auch jedes andere Display, welches einen ST7789-Chip mitbringt problemlos funktionieren wie das verlinkte Noname-Display.</p>



<p>**) Der 3D-Drucker ist optional. Ihr könnt das Projekt natürlich auch mit einem ganz eigenen Gehäuse oder in anderer Form nachbauen. Dann benötigt ihr nur die Hardwarekomponenten und könnt loslegen. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="562" src="https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch.jpg" alt="" class="wp-image-947" srcset="https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch.jpg 1000w, https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch-300x169.jpg 300w, https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch-768x432.jpg 768w, https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch-380x214.jpg 380w, https://datort.de/wp-content/uploads/2025/04/awtrix_mini_twitch-800x450.jpg 800w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h2 id="3d-druck" class="cnvs-block-section-heading cnvs-block-section-heading-1741548970815 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>3D Druck</span>
	</span>
</h2>



<p>Wenn ihr das Projekt wie im Video gezeigt nachbauen möchtet, könnt ihr euch mein AWTRIX STREAM-Gehäuse drucken. Es besteht aus 3 Teilen: Einem Träger, auf dem das Display aufgeschraubt und das D1 Mini-Board aufgelegt wird. Sowie dem Hauptgehäuse und einer aufsteckbaren Front.</p>



<div class="wp-block-file"><a id="wp-block-file--media-6c509b7b-273d-4ee7-ad9b-7adba44d832e" href="https://datort.de/wp-content/uploads/2025/03/AwtrixMINI.zip">3D-Druck Dateien AWTRIX STREAM (A-Variante, für WS-LCD, STL)</a><a href="https://datort.de/wp-content/uploads/2025/03/AwtrixMINI.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-6c509b7b-273d-4ee7-ad9b-7adba44d832e">Herunterladen</a></div>



<div class="wp-block-file"><a id="wp-block-file--media-126e15bb-b3ab-46a1-8b04-6a5dc1e14839" href="https://datort.de/wp-content/uploads/2025/04/Awtrix_Mini_B.zip">3D-Druck Dateien AWTRIX STREAM (B-Variante, für Noname-LCD, STL)</a><a href="https://datort.de/wp-content/uploads/2025/04/Awtrix_Mini_B.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-126e15bb-b3ab-46a1-8b04-6a5dc1e14839">Herunterladen</a></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="666" src="https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-1024x666.png" alt="" class="wp-image-932" srcset="https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-1024x666.png 1024w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-300x195.png 300w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-768x499.png 768w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-1536x999.png 1536w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-2048x1332.png 2048w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-380x247.png 380w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-800x520.png 800w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case-1160x754.png 1160w, https://datort.de/wp-content/uploads/2025/03/AwtrixMINI_3d_case.png 3248w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 id="zusammenbau" class="cnvs-block-section-heading cnvs-block-section-heading-1741548272973 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Zusammenbau</span>
	</span>
</h2>



<p>Im ersten Schritt solltet ihr das Display mit dem D1 Mini-Board verbinden. Die folgende Tabelle zeigt, welche Pin des Displays mit welchem Pin des Boards verbunden werden muss. </p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>D1 Mini Board</strong></td><td><strong>Waveshare 1.47&#8243; Display</strong></td><td><strong>Noname 1.47&#8243; Display</strong></td></tr><tr><td>D5 (GPIO 14)</td><td>CLK</td><td>SCL</td></tr><tr><td>D7 (GPIO 13)</td><td>DIN</td><td>SDA</td></tr><tr><td>D1 (GPIO 5)</td><td>CS</td><td>CS</td></tr><tr><td>D4 (GPIO 2)</td><td>DC</td><td>DC</td></tr><tr><td>D6 (GPIO 12)</td><td>BL</td><td>BL</td></tr><tr><td>D3 (GPIO 0)</td><td>RST</td><td>RST</td></tr><tr><td>3V3</td><td>VCC</td><td>VDD</td></tr><tr><td>G</td><td>GND</td><td>GND</td></tr></tbody></table></figure>



<p>Wenn ihr nicht löten möchtet und das 3D-gedruckte Gehäuse verwenden möchtet, dann müsst ihr an der Stelle nur noch das Display mit 4 Schrauben an dem Träger anbringen und das Kabel vorsichtig verwickeln. Danach den Träger einschieben und von außen festschrauben. Front vorsichtig aufklippen und das wars. Weiter geht&#8217;s mit dem Flashen der Software. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="858" src="https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-1024x858.png" alt="" class="wp-image-942" srcset="https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-1024x858.png 1024w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-300x251.png 300w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-768x643.png 768w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-380x318.png 380w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-800x670.png 800w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06-1160x972.png 1160w, https://datort.de/wp-content/uploads/2025/03/Bildschirmfoto-2025-03-31-um-20.56.06.png 1375w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Der Schaltplan zum Anschluss ESP8266 und LC-Display (hier: Variante mit Waveshare-Display)</figcaption></figure>



<h2 id="software" class="cnvs-block-section-heading cnvs-block-section-heading-1741549667252 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Software</span>
	</span>
</h2>



<p>Um die Software auf das Board zu bekommen, müsst ihr es zunächst via USB mit eurem Rechner verbinden. Als nächstes benötigt ihr einen Chrome-basierten Browser, als Chrome selbst, Chromium, Brave oder MS Edge. Opera funktioniert u. U. auch. Dann geht ihr auf folgende Seite, auf der ich immer die aktuelle Software-Version bereitstelle:</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://esp.datort.de" target="_blank" rel="noreferrer noopener">https://esp.datort.de</a></div>
</div>



<p>Wählt dort das Projekt <strong>#002: AWTRIX STREAM vx.x.x (ehemals &#8222;Awtrix Mini&#8220;)</strong> aus und folgt den Anweisungen. Solltet ihr das lieber in Bewegtbild sehen wollen: Im Video zeige ich auch diesen Schritt.</p>



<p>Nach der Installation stellt das ESP-Board einen WLAN-Access Point zur Verfügung: </p>



<p><strong>SSID:</strong> <code>AWTRIX STREAM-Setup</code><br><strong>Passwort:</strong> <code>12345678</code></p>



<p>Sobald ihr verbunden seit, sollte sich ein Konfigurationsmenü öffnen. Wenn die Seite nicht automatisch erscheint, verbindet euch auf die IP-Adresse <code>http://192.168.4.1</code>. Hier könnt ihr nun euer Wlan konfigurieren. Außerdem könnt ihr dem Board noch einen Hostname vergeben und &#8211; <strong><em>ganz wichtig</em></strong> &#8211; die IP-Adresse der AWTRIX, die kopiert werden soll und von der unsere neue AWTRIX STREAM ihre Daten erhält.</p>



<p>Sind alle Einstellungen vorgenommen sollte sich die AWTRIX STREAM direkt mit ihrer großen Schwester verbinden. Habt ihr euch &#8222;verkonfiguriert&#8220;, so startet bitte mit der Installation der Software von vorne und wählt unbedingt &#8222;Erase Device&#8220; aus. Dann könnt ihr frisch durchstarten.</p>



<h2 id="changelog" class="cnvs-block-section-heading cnvs-block-section-heading-1745159684136 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Changelog</span>
	</span>
</h2>



<p>Um euch auf dem laufenden zu halten, was sich bei der Software so getan hat, kopiere ich euch hier die Änderungen der letzten Versionen rein. </p>



<pre class="wp-block-code"><code>## v1.1.0 - 20.04.2025

&#91;FEATURE] MQTT broker support
&#91;FEATURE] Change settings via MQTT
&#91;FEATURE] HTTP Basic Auth configuration to access secured AWTRIX hosts
&#91;FEATURE] Toggle display via MQTT
&#91;FEATURE] Reboot AWTRIX STREAM via MQTT
&#91;FEATURE] Erase all settings via MQTT to start over
&#91;FIX] Several layout/screen optimisations and new dialogs
&#91;FIX] Reduce Overhead on HTTP calls for better performance
&#91;FIX] Removed FPS counter on Serial connection for better performance
&#91;CHORE] Name change to a more fancy "AWTRIX STREAM". Yeah!

## v1.0.0 - 06.04.2025

Initial release 

</code></pre>



<h2 id="faq" class="cnvs-block-section-heading cnvs-block-section-heading-1743929300324 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>FAQ</span>
	</span>
</h2>



<p><strong>Benötige ich wirklich eine &#8222;richtige&#8220; AWTRIX oder Ulanzi TC001 mit AWTRIX-Firmware oder läuft die AWTRIX STREAM auch Standalone?</strong><br>Die AWTRIX STREAM wiederholt technisch gesehen nur das, was auf einer anderen LED-Matrix angezeigt wird. Sie kann nicht standalone betrieben werden.</p>



<p><strong>Gibt es einen anderen Weg die AWTRIX STREAM zu nutzen ohne erst eine LED-Matrix kaufen zu müssen? </strong><br>Ja. Wenn ihr noch ein ESP32-WROOM-32D-Board rumfliegen habt, könnt ihr da die AWTRIX-Firmware draufflashen. Die läuft dann auch ohne angeschlossene LED-Panele und kann so als Host fungieren.</p>



<p><strong>Ist der Sourcecode verfügbar? </strong><br>Ja, ihr findet das Projekt in meinem <a href="https://github.com/datort/awtrix-stream" target="_blank" rel="noreferrer noopener">Github Repository</a> unter der Attribution-NonCommercial-ShareAlike 4.0 International-Lizenz.</p>



<p><strong>Kann ich mehrere AWTRIX STREAN auf eine Host AWTRIX loslassen?</strong> <br>Theoretisch ja. Jede AWTRIX STREAM verbindet sich über das WLAN via HTTP mit der Host AWTRIX. Das generiert Last auf der Host AWTRIX und kann irgendwann dazu führen, dass sich die AWTRIX STREAM nur noch seltener aktualisieren und alles etwas holpriger wirkt. Wo da genau die Grenze ist, kann ich nicht sagen. 2-3 gleichzeitig habe ich erfolgreich getestet. Eine größere Herausforderung stellt das WLAN da: Das sollte eine gute Signalstärke sowohl für Host also auch für AWTRIX STREAM bieten.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/929/awtrix-mini-die-kleine-fuer-den-schreibtisch/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
			</item>
		<item>
		<title>DIY LED Matrix im Eigenbau</title>
		<link>https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/</link>
					<comments>https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/#comments</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Sat, 09 Mar 2024 18:57:51 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[LED]]></category>
		<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Selbstgebaut]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Awtrix]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[esp32]]></category>
		<guid isPermaLink="false">https://datort.de/?p=625</guid>

					<description><![CDATA[Vor zwei oder drei Jahren wurde mir das erste Mal beim Weihnachtsshopping eine LED-Matrix als Geschenkidee vorgeschlagen. Mit&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Vor zwei oder drei Jahren wurde mir das erste Mal beim Weihnachtsshopping eine LED-Matrix als Geschenkidee vorgeschlagen. Mit 160,- Euro fand ich den Spaß arg teuer. Auch die knapp 50,- Euro für die günstigere Variante von Ulanzi, der TC001 wollte ich irgendwie nicht springen lassen. Für (im besten Fall) noch ein bisschen weniger Geld und mit dem Spaß eines Bastelprojekts habe ich mich nun dran gewagt mir sowas selbst zu basteln. </p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2F7jet_Ib3opY%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Im Kern kommen vier 8x8er RGB LED Matrixen und ein ESP32-WROOM-32D zum Einsatz. Ähnliche Komponenten wie wohl auch in der TC001 verbaut. Als Software verwende ich die <a href="https://github.com/Blueforcer/awtrix3">&#8222;Awtrix 3&#8220;-Bibliothek</a> (vormals &#8222;Awtrix light&#8220;, im Kern aber die gleiche Software). Das ist eine aktive OpenSource-Weiterentwicklung der Awtrix-Bibliothek, einer Software für eine inzwischen wieder eingestellte LED Matrix. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://datort.de/wp-content/uploads/2024/03/4-1024x576.jpg" alt="" class="wp-image-627" srcset="https://datort.de/wp-content/uploads/2024/03/4-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2024/03/4-300x169.jpg 300w, https://datort.de/wp-content/uploads/2024/03/4-768x432.jpg 768w, https://datort.de/wp-content/uploads/2024/03/4-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2024/03/4-380x214.jpg 380w, https://datort.de/wp-content/uploads/2024/03/4-800x450.jpg 800w, https://datort.de/wp-content/uploads/2024/03/4-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2024/03/4.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Unten: Die LED-Panele befinden sich eingeklemmt hinter dem Gitter, welches für den groben Pixel-Look sorgt</figcaption></figure>



<p>Um Geld zu sparen, kommt das Gehäuse aus dem 3D-Drucker. Es wurde selbst designed und ist extrem minimalistisch gehalten. Zentraler Punkt sind die Gitter, hinter welche die kleinen LED-Panels geklemmt werden können. Die Gitter selbst können dann mit kleinen Haken an der Ober- bzw. Unterseite ineinander gehangen werden. Das Ganze fügt sich dann wieder rum in das Gehäuse ein, welches dann durch eine dünne Front verkleidet wird. (Fast) Fertig ist LED-Matrix. </p>



<p>Auf der Rückseite habe ich den ESP32 festgeklebt und verlötet. Strom kommt über USB und geschaltet werden kann die Anzeige über einen kleinen Schalter an der Unterseite. Apropos Strom: Die Displays sind recht energiehungrig und emittieren je nach Helligkeit einiges an Wärme. Das sollte man im Blick haben: Zum einen damit das Gehäuse sich nicht verformt. Zum Anderen sollte ein entsprechend starkes Netzteil angeschloßen und im Querschnitt nicht zu dünne Kabel verwendet werden. <br>Da ich bei meiner günstigen Variante keine Schalter und Sensoren verbaue, fehlt der Software beim ersten Start somit auch die Information über die Raumhelligkeit. Entsprechend hell werden die Panels also beim ersten Start angesteuert. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://datort.de/wp-content/uploads/2024/03/5-1024x576.jpg" alt="" class="wp-image-628" srcset="https://datort.de/wp-content/uploads/2024/03/5-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2024/03/5-300x169.jpg 300w, https://datort.de/wp-content/uploads/2024/03/5-768x432.jpg 768w, https://datort.de/wp-content/uploads/2024/03/5-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2024/03/5-380x214.jpg 380w, https://datort.de/wp-content/uploads/2024/03/5-800x450.jpg 800w, https://datort.de/wp-content/uploads/2024/03/5-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2024/03/5.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Erster Start: Die Matrix zeigt nur wirre Zeichen. Das lässt sich über eine Konfiguration korrigieren</figcaption></figure>



<p>Am Ende komme ich bei knapp unter 22,- Euro raus. Neben den reinen Elektrokomponenten einberechnet ist auch der Strom für den 3D-Drucker, der so ca. 17 Stunden lang gedruckt hat. Außerdem anteilig etwas für das PLA, die Kabel und den verwendeten Kleber um die beiden Hälften zu vereinen. </p>



<p>Am Ende bin ich echt zufrieden mit dem Ergebnis. Die Anzeige sieht schlicht aus, die Dot-Matrix-Ansicht sieht ordentlich aus. Wenn ich es mir wünschen könnte, hätte ich es gerne einen ticken schärfer an den Kanten gehabt. Aber das ist kein Problem, solange man nicht direkt mit der Nase vor der Anzeige steht. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1920" height="1080" src="https://datort.de/wp-content/uploads/2024/03/6-1024x576.jpg" alt="" class="wp-image-629" srcset="https://datort.de/wp-content/uploads/2024/03/6-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2024/03/6-300x169.jpg 300w, https://datort.de/wp-content/uploads/2024/03/6-768x432.jpg 768w, https://datort.de/wp-content/uploads/2024/03/6-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2024/03/6-380x214.jpg 380w, https://datort.de/wp-content/uploads/2024/03/6-800x450.jpg 800w, https://datort.de/wp-content/uploads/2024/03/6-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2024/03/6.jpg 1920w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></figure>



<h2 id="3d-druck-dateien" class="cnvs-block-section-heading cnvs-block-section-heading-1713877970814 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>3D-Druck &amp; Dateien</span>
	</span>
</h2>



<p>In meinem Video seht ihr alles Wichtige zum Aufbau und der Konfiguration. Auch wie ihr die Displays ans Laufen bekommen könnt, wenn diese nach dem ersten Start nur Unfug anzeigen. Wenn ihr das Gehäuse selbst in euren 3D-Drucker packen wollt, findet ihr hier den Download. Bitte beachtet: Das ist natürlich jetzt absolut Custom-Made. Will sagen. Wenn eure LED-Panel bspw. leicht andere Dimensionen haben kann es sein, dass es schon nicht mehr passt und ihr den Druck selbst modifizieren müsst.  </p>



<p>Zum Download stelle ich zwei Dateien. Der erste Download enthält eine STL-Dateien mit dem gesamten Modell. Im zweiten ZIP-Archiv befinden sich alle Elemente einzeln. Nutzt, womit ihr besser klar kommt. </p>



<div class="wp-block-file"><a id="wp-block-file--media-6d46fedd-0e60-4067-a033-b0c9ee12e9d0" href="https://datort.de/wp-content/uploads/2024/03/RGB_LED_Matrix.zip">3D Daten (Fusion360 Archiv, STL mit allen Elementen)</a><a href="https://datort.de/wp-content/uploads/2024/03/RGB_LED_Matrix.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-6d46fedd-0e60-4067-a033-b0c9ee12e9d0">Herunterladen</a></div>



<div class="wp-block-file"><a id="wp-block-file--media-bfe67f10-729e-4b74-9b83-b3dd30cf1702" href="https://datort.de/wp-content/uploads/2024/03/RGB_LED_STL_einzeln-1.zip">3D Daten: Einzelne STL-Dateien für jedes Bauteil</a><a href="https://datort.de/wp-content/uploads/2024/03/RGB_LED_STL_einzeln-1.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-bfe67f10-729e-4b74-9b83-b3dd30cf1702">Herunterladen</a></div>



<h2 id="ansteuern-der-awtrix-3" class="cnvs-block-section-heading cnvs-block-section-heading-1713877949459 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Ansteuern der Awtrix 3</span>
	</span>
</h2>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2Fcb7K3qUKJrM%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>

<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FAkCocqeyH_U%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Nachdem das erste Video mit dem Zusammenbau der Matrix viele Leute interessiert hat, erkläre ich in einem zweiten Video betont anfängerfreundlich, wie die Matrix angesprochen wird. Mit dabei Infos, wie man eigene Apps gestaltet oder die eingebauten Effekte nutzt. Teil des Videos sind auch die folgenden Scripte, welche den Funktionsumfang eurer Matrix mit nützlichen Infos erweitern und vielleicht der Einstieg in eigene Erweiterungen sein könnten.</p>



<h2 id="python-script-youtube-abos" class="cnvs-block-section-heading cnvs-block-section-heading-1713877922530 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Python-Script: YouTube Abos</span>
	</span>
</h2>



<p>In diesem Zustand fungiert die Matrix rein als Display. Mit anderen Worten: Sie kann nix, abgesehen von der Uhrzeit und Datumsanzeige. Inhalte können aber ja einfach über die HTTP-API oder mittels MQTT überspielt werden. Für meinen Fall &#8211; ich möchte die Abozahlen meines YouTube-Kanals anzeigen &#8211; hilft mir dafür folgendes Python-Script:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
import requests
import time

# YouTube API Informationen
youtube_api_key = &quot;xxx&quot;
channel_id = &quot;xxx&quot;

# Awtrix Light Matrix Informationen
awtrix_ip = &quot;192.168.xxx.xxx&quot;


def get_subscribers_count(api_key, channel_id):
    url = f&quot;https://www.googleapis.com/youtube/v3/channels?part=statistics&amp;id={channel_id}&amp;key={api_key}&quot;
    response = requests.get(url)
    data = response.json()
    subscribers = int(data&#x5B;&quot;items&quot;]&#x5B;0]&#x5B;&quot;statistics&quot;]&#x5B;&quot;subscriberCount&quot;])
    return subscribers

def send_app_to_awtrix(app_name, text, icon, duration):
    headers = {&quot;Content-Type&quot;: &quot;application/json&quot;}
    data = {
        &quot;text&quot;: text,
        &quot;icon&quot;: icon,
        &quot;duration&quot;: duration
        &quot;lifetime&quot;: 600
    }

    awtrix_url = &quot;http://&quot;+ awtrix_ip + &quot;/api/custom?name=&quot; + app_name
    response = requests.post(awtrix_url, json=data, headers=headers)
    
    if (response.text != &quot;OK&quot;):
        print(response.text)

    time.sleep(duration * 4)

def host_available():
    try:
        result = subprocess.run(&#x5B;&#039;ping&#039;, &#039;-c&#039;, &#039;1&#039;, awtrix_ip], capture_output=True, text=True, timeout=5)
        return result.returncode == 0

    except subprocess.TimeoutExpired:
        print(f&quot;Timeout: {awtrix_ip} is not reachable&quot;)


def main():
    while True:
        try:
            if host_available:
                subscribers = get_subscribers_count(youtube_api_key, channel_id)
                send_app_to_awtrix(&quot;youtube&quot;, f&quot;{subscribers}&quot;, 7320, 15)
            
            time.sleep(300)
        except Exception as e:
            print(f&quot;Fehler: {e}&quot;)
            time.sleep(60)

if __name__ == &quot;__main__&quot;:
    main()

</pre></div>


<p>In dem Code wird ein Icon mit der ID 7320 verwendet. Dazu sei gesagt: Über das Webinterface der Awtrix Light-Bibliothek lassen sich unter dem Punkt &#8222;Icons&#8220; vorgefertigte Grafiken importieren. Diese stammen von <a href="https://developer.lametric.com/icons" target="_blank" rel="noreferrer noopener">developer.lametric.com</a>, können dort ausgewählt und nutzerfreundlich eingespielt werden. Ach ja, und um die YouTube-API nutzen zu können, müsst ihr euch zunächst für die Nutzung bei <a href="https://developers.google.com/youtube/v3/getting-started" target="_blank" rel="noreferrer noopener">Google freischalten</a>. Kostet aber nix. </p>



<h2 id="python-script-wetter-via-openweathermap" class="cnvs-block-section-heading cnvs-block-section-heading-1713877892154 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Python-Script: Wetter via OpenWeatherMap</span>
	</span>
</h2>



<p>Nicht jeder unterhält einen YouTube-Kanal, aber bei überall gibt&#8217;s Wetter! Und so möchte man vielleicht Informationen wie die aktuelle Temperatur oder ob sich Regen nähert auf der Matrix anzeigen. Als Datenquelle kann dafür super die OpenWeatherMap dienen. Wer es nicht kennt: OWM ist inzwischen ein alter Hase wenn es darum geht, über eine (für die kleine Nutzung) kostenfreie API Wetterdaten für beliebige Standorte zu liefern. Einfach kurz mit E-Mail-Adresse anmelden, API-Key kopieren und los geht&#8217;s. Folgendes Python-Script holt sich Wetterinformationen von einem bestimmten Standort mittels Geo-Koordinaten und sendet das aktuelle Wetter mit Icon und Temperatur an die Awtrix: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
import requests
import time

# OpenWeatherMap API Informationen
api_key = &quot;...&quot;
lat = &quot;50.93&quot;
lon = &quot;6.95&quot;

# OpenWeatherMap Icon -&gt; Awtrix Icon
condition_mapping = {
    &quot;01d&quot;: 1630,
    &quot;01n&quot;: 962,
    &quot;02d&quot;: 2286,
    &quot;02n&quot;: 54631,
    &quot;03d&quot;: 12246,
    &quot;03n&quot;: 12246,
    &quot;04d&quot;: 12294,
    &quot;04n&quot;: 12294,
    &quot;09d&quot;: 2284,
    &quot;09n&quot;: 2284,
    &quot;10d&quot;: 2416,
    &quot;10n&quot;: 2416,
    &quot;11d&quot;: 2981,
    &quot;11n&quot;: 2981,
    &quot;13d&quot;: 1673,
    &quot;13n&quot;: 1673,
    &quot;50d&quot;: 17056,
    &quot;50n&quot;: 17056
}

# Awtrix Light Matrix Informationen
awtrix_ip = &quot;192.168.xxx.xxx&quot;


def get_weather(api_key, lat, lon):
    url = f&quot;http://api.openweathermap.org/data/2.5/weather?lat={lat}&amp;lon={lon}&amp;appid={api_key}&amp;units=metric&quot;
    response = requests.get(url)
    data = response.json()

    if response.status_code == 200:
        icon = data&#x5B;&quot;weather&quot;]&#x5B;0]&#x5B;&quot;icon&quot;]
        temperature = data&#x5B;&quot;main&quot;]&#x5B;&quot;temp&quot;]
        return temperature, icon
    else:
        return None, None

def send_app_to_awtrix(app_name, text, icon, duration):
    headers = {&quot;Content-Type&quot;: &quot;application/json&quot;}
    data = {
        &quot;text&quot;: text,
        &quot;icon&quot;: icon,
        &quot;duration&quot;: duration
    }

    awtrix_url = &quot;http://&quot;+ awtrix_ip + &quot;/api/custom?name=&quot; + app_name
    response = requests.post(awtrix_url, json=data, headers=headers)
    
    if (response.text != &quot;OK&quot;):
        print(response.text)

    time.sleep(duration * 4)

def host_available():
    try:
        result = subprocess.run(&#x5B;&#039;ping&#039;, &#039;-c&#039;, &#039;1&#039;, awtrix_ip], capture_output=True, text=True, timeout=5)
        return result.returncode == 0

    except subprocess.TimeoutExpired:
        print(f&quot;Timeout: {awtrix_ip} is not reachable&quot;)


def main():
    while True:
        try:
            if host_available:
                temperature, icon = get_weather(api_key, lat, lon)

                if temperature is not None and icon is not None:
                    send_app_to_awtrix(&quot;owm&quot;, &quot;{:.1f}°C&quot;.format(temperature), condition_mapping.get(icon), 15)
                else:
                    print(&quot;Failed to retrieve weather information.&quot;)

            time.sleep(300)

        except Exception as e:
            print(f&quot;Fehler: {e}&quot;)
            time.sleep(60)

if __name__ == &quot;__main__&quot;:
    main()

</pre></div>


<h2 id="teileliste" class="cnvs-block-section-heading cnvs-block-section-heading-1713877855219 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Teileliste</span>
	</span>
</h2>



<p>Die Anzahl der verwendeten Komponenten ist bei diesem Projekt recht überschaubar:</p>



<ul class="wp-block-list">
<li>1x ESP32-Wroom-32D Entwicklerboard*</li>



<li>4x 8&#215;8-RGB-LED-Panel, 5V, WS2812B, ca. 71 x 71 mm** (wie z.B. bei <a href="https://de.aliexpress.com/item/1005006127587095.html" target="_blank" rel="noreferrer noopener">AliExpress</a>)</li>



<li>1x Wippschalter I/O, 11&#215;15 mm</li>



<li>1x Micro-USB-Board (wie z.B. bei <a href="https://www.amazon.de/gp/product/B07TVHR9LF/" target="_blank" rel="noreferrer noopener">Amazon</a>)</li>



<li>1x USB-Netzteil, USB-Anschlusskabel und etwas Litze zur Verkabelung der Matrixen, des Boards, Schalters und des Micro-USB-Boards***</li>



<li>&#8222;ecoPLA Weiß&#8220; von 3DJake für das Gehäuse, Noname schwarzes PLA für das Pixel-Gitter im inneren</li>



<li>Noname 2-Komponent-Kleber um die Gehäuse-Hälften miteinander zu verbinden </li>
</ul>



<p>*) Mit großer Wahrscheinlichkeit funktionieren auch ESP-Boards ohne den Zusatz &#8222;D&#8220;. Ich habe die D-Variante im Video erwähnt, da diese zum einen meines Wissens in der TC001 verbaut ist und somit wohl die größte Kompatibilität gewährleistet ist. Außerdem benötigt euer ESP-Board GPIO-Pins bis 35, zumindest wenn ihr auch Licht- und Temperatursensoren verbauen wollt. Sonst immerhin bis GPIO-Pin 32, denn dort wird die Matrix angeschlossen. Wenn ihr ein Board ohne &#8222;D&#8220;-Zusatz habt welches aber die benötigten GPIO-Pins mitbringt, könnt ihr im Zweifel einfach &#8222;blind&#8220; die Awtrix-Bibliothek flashen. Gelingt die Installation und könnt ihr danach auf das Webinterface zugreifen, so ist die Wahrscheinlichkeit relativ hoch, dass auch der Rest funktionieren sollte. </p>



<p>**) Ich habe genau dieses Modell bestellt, allerdings befürchte ich, dass die Module nicht immer die exakt 100% gleiche Größe haben werden und daher besser oder schlechter in die von mir designte Fassung passen. Es kann sein, dass hier Nacharbeiten eurerseits nötig werden. So fiel mir z.B. bereits auf, das die versprochenen 71 x 71 mm bei meinen Modulen nicht eingehalten werden. Am Ende zählt hier aber jeder Millimeter, da ich keine Abstände zwischen den einzelnen Matrixen haben und das Gehäuse so kompakt wie möglich halten wollte.</p>



<p>***) Ich habe hier ein altes 5W-USB-Netzteil verwendet, was in meinem Fall völlig ausreichend ist. Am Ende sind Stärke der verwendeten Litze sowie des Netzteils von der Frage abhängig, mit welcher Helligkeit ihr die Matrix betreiben möchtet. Je heller, desto mehr Strom muss das Netzteil liefern und die Kabel aushalten können. Ich betreibe das Display mit einer Helligkeit von 20 (Bereich: 0-255), was in meinem Fall völlig ausreicht. Dabei bleibe ich unter den genannten 5 Watt. Wird die Grenze überschritten fangen die LEDs an zuflackern und wahrscheinlich hängt sich das ESP-Board irgendwann auf. </p>



<h2 id="wichtige-hinweise" class="cnvs-block-section-heading cnvs-block-section-heading-1713877817867 is-style-cnvs-block-section-heading-11 halignleft" >
	<span class="cnvs-section-title">
		<span>Wichtige Hinweise</span>
	</span>
</h2>



<p>Bitte bedenke: Es handelt sich um ein privates Bastelprojekt eines Hobbyschraubers. Will sagen: So wie gezeigt funktioniert das Ganze gut, aber es bestehen auch Gefahren: Bspw. kann von zu dünnen Kabeln bei hoher Stromaufnahme der LEDs eine Brandgefahr ausgehen oder durch Abwärme das PLA verformen oder mehr. Bei Fehlanschluss des ESP-Boards kann selbiges Schaden nehmen. Heißt: Baut meine Sachen gerne nach, aber ihr handelt eigenverantwortlich. Ich will jeden ermutigen sich auch Themen anzunehmen, in denen er oder sie bisher keine Expertise besitzt, aber geht clever vor: Informiert euch abseits meines Blogs, lasst eure Errungenschaften nicht unbeaufsichtigt laufen usw. Man lernt nie aus.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/625/diy-led-matrix-im-eigenbau/feed/</wfw:commentRss>
			<slash:comments>27</slash:comments>
		
		
			</item>
		<item>
		<title>Homebridge-Erweiterung: (Licht-)Schalter im Eigenbau</title>
		<link>https://datort.de/raspberry-arduino/544/homebridge-erweiterung-licht-schalter-im-eigenbau/</link>
					<comments>https://datort.de/raspberry-arduino/544/homebridge-erweiterung-licht-schalter-im-eigenbau/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Wed, 03 Jan 2024 15:50:04 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Homebridge]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Smarthome]]></category>
		<guid isPermaLink="false">https://datort.de/?p=544</guid>

					<description><![CDATA[Es ist ein bisschen verrückt: Ich kann in meinem Zuhause alle relevanten Leuchten über Wifi-Steckdosen mittels meines iPhones&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Es ist ein bisschen verrückt: Ich kann in meinem Zuhause alle relevanten Leuchten über Wifi-Steckdosen mittels meines iPhones über die Home-App steuern. Vorbei die Zeiten des manuellen Tastendrückens. Doch genau das fehlte mir kürzlich sehr, als ich mein Telefon unten habe liegen lassen. Und daraus wuchs die Idee: Hey, ich brauche wieder einen Schalter! </p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/544/homebridge-erweiterung-licht-schalter-im-eigenbau/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2Fp1ukkSZFIrY%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Herausgekommen ist dabei ein &#8222;Command Control Center&#8220;. Der Name ist völlig übertrieben, ich weiss. Das Gehäuse ist eigens von mir skizziert und mittels 3D-Drucker selbst gedruckt. Wichtig war mir, dass es gut an meinen Schreibtisch (ein weit verbreitetes Modell eines schwedischen Möbelherstellers) passt und drei Taster beherbergen kann. Zusätzlich, um der Mächtigkeit des Begriffs &#8222;Command Control Center&#8220; näher zu kommen, befindet sich im Gehäuse Platz für einen Schlüsselschalter, der die Spannungszufuhr für das verbaute D1 Mini ESP-Board steuert. Man hätte das mit Sicherheit auch anders lösen können, aber: Et soll ja auch Spaß machen!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="591" src="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-1024x591.png" alt="" class="wp-image-549" srcset="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-1024x591.png 1024w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-300x173.png 300w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-768x443.png 768w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-1536x886.png 1536w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-380x219.png 380w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-800x462.png 800w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18-1160x669.png 1160w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.18.png 1776w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Die Taster bieten neben ihrer eigentlichen Aufgabe des als Taster fungieren noch die Möglichkeit, einen LED-Ring leuchten zu lassen. Der symbolisiert ob die entsprechende Lampe ein- oder ausgeschaltet ist. In meinem Beispiel sind zwei Taster mit weißer und einer mit blauer LED verbaut. Die Taster sind mir im Nachgang etwas zu klein zum Drücken, dennoch mag ich sie und mit rund 4,- Euro waren sie recht günstig. Außerdem sind sie mit einer Eingangsspannung von 3 bis 9 Volt für die LED recht flexibel einsetzbar. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="566" src="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-1024x566.png" alt="" class="wp-image-550" srcset="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-1024x566.png 1024w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-300x166.png 300w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-768x424.png 768w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-1536x849.png 1536w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-380x210.png 380w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-800x442.png 800w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30-1160x641.png 1160w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.30.png 1868w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Im Inneren arbeitet ein D1 Mini Clone-Board, also ein ESP8266 der direkt Wifi onboard hat. Das ist wichtig, da die Homebridge, die bei mir als zusätzliche Ebene zu Apples Homekit im Einsatz ist, über API-Aufrufe über das lokale Netzwerk gesteuert wird. Von dem D1 Mini-Board brauch es 6 Pins: 3 für die Statusanzeige, also die jeweilige LED. Und eben 3 weitere für die Erkennung der Tastendrücke. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="886" height="776" src="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43.png" alt="" class="wp-image-551" srcset="https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43.png 886w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43-300x263.png 300w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43-768x673.png 768w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43-380x333.png 380w, https://datort.de/wp-content/uploads/2023/12/Bildschirmfoto-2023-12-28-um-18.48.43-800x701.png 800w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>



<p>Das ist es im Wesentlichen dann auch schon. Natürlich muss die Software noch angepasst werden. So müssen sogenannte &#8222;uniqueId&#8220; hinterlegt werden. Dabei handelt es sich um eine eindeutige Identifikation eines jeden Geräts, welches über Homebridge geschaltet werden kann. Tastendrücke lösen dann entsprechende API-Anfragen aus, welche diese &#8222;uniqueId&#8220; übermitteln, bzw. sie verwenden um in regelmäßigen Abständen nach dem Status (Licht an oder aus) bei der Homebridge nachfrage. Denn es könnte ja auch sein, dass eine Lampe oder Steckdose auf anderem Weg geschaltet wird. </p>



<p>Meinen Code stelle ich euch natürlich frei und als Open Source auf Github zur Verfügung. Die Datei für den 3D-Druck des Gehäuse findet ihr hier:</p>



<div class="wp-block-file"><a id="wp-block-file--media-501b5372-72c9-4523-bc3f-6bebb631311d" href="https://datort.de/wp-content/uploads/2023/12/Command-Control-v12.stl_.zip">Command-Control-v12.stl_</a><a href="https://datort.de/wp-content/uploads/2023/12/Command-Control-v12.stl_.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-501b5372-72c9-4523-bc3f-6bebb631311d">Herunterladen</a></div>



<p>Den Code habe ich auf mein <a href="https://github.com/datort/homebridge-remote-switchboard" target="_blank" rel="noreferrer noopener">Github-Profil</a> gepackt. Von dort könnt ihr alles einfach herunterladen oder via Git auschecken.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/544/homebridge-erweiterung-licht-schalter-im-eigenbau/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DHT22 v BME280 v DS18B20 &#8211; Der Vergleich</title>
		<link>https://datort.de/vergleiche-tests/512/dht22-v-bme280-v-ds18b20-der-vergleich/</link>
					<comments>https://datort.de/vergleiche-tests/512/dht22-v-bme280-v-ds18b20-der-vergleich/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Fri, 03 Nov 2023 10:18:25 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Sensorkunde]]></category>
		<category><![CDATA[Vergleiche & Tests]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[BME280]]></category>
		<category><![CDATA[DHT22]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[DS18B29]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<guid isPermaLink="false">https://datort.de/?p=512</guid>

					<description><![CDATA[Es ist noch nicht lange her, da habe ich mir hier DHT22-Temperatursensoren genauer angeschaut und 5 Sensoren gleichen&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Es ist noch nicht lange her, da habe ich mir hier <a href="https://datort.de/raspberry-arduino/395/dht-22-temperatursensoren-im-test/" data-type="post" data-id="395">DHT22-Temperatursensoren genauer angeschaut</a> und 5 Sensoren gleichen Bautyps und ähnlichen Alters miteinander verglichen. Die Ergebnisse waren so mittel, aber lest den Artikel gerne selbst wenn euch das interessiert. </p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/vergleiche-tests/512/dht22-v-bme280-v-ds18b20-der-vergleich/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FiZZr21FaaMw%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Damals hatte ich sowohl auf <a href="https://mastodon.social/@datort" data-type="link" data-id="https://mastodon.social/@datort" target="_blank" rel="noreferrer noopener">Mastodon</a> als auch unter dem Video den Tipp erhalten, mir mal den BME280 oder den DS18B20 anzuschauen. Diese Sensoren seien deutlich besser als der DHT22. Gesagt getan: Den BME280 gab es für ca. 6 Euro im 5er Pack aus Fernost, den DS18B20 habe ich für so ziemlich denselben Preis bei einem deutschen Händler bestellt. </p>



<p>Alle drei Sensoren sind im Detail ein bisschen anders. So ist der DHT22 der Klassiker, er ist nicht ganz schmal, sehr gut mit Bibliotheken für Android oder ESP-Boards unterstützt und liefert neben der Temperatur auch die relative Luftfeuchte. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://datort.de/wp-content/uploads/2023/10/IMG_5117-1024x682.jpg" alt="" class="wp-image-516" srcset="https://datort.de/wp-content/uploads/2023/10/IMG_5117-1024x682.jpg 1024w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-300x200.jpg 300w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-768x511.jpg 768w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-1536x1022.jpg 1536w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-380x253.jpg 380w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-800x533.jpg 800w, https://datort.de/wp-content/uploads/2023/10/IMG_5117-1160x772.jpg 1160w, https://datort.de/wp-content/uploads/2023/10/IMG_5117.jpg 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Der BME280 ist, nimmt man nur den Sensor für sich, sehr klein. Er wurde von Bosch entwickelt vor dem Hintergrund dort verbaut zu werden, wo wenig Energie und wenig Platz zur Verfügung steht. Neben Temperatur und relativer Feuchte kann er auch den Luftdruck ermitteln. Es gibt auch ein Modell, welches auf den Namen BMP280 hört. Dieser ist hingegen nicht in der Lage, die Luftfeuchte zu ermitteln. Auch für diese Sensoren gibt es einige gute Bibliotheken, welche die Verwendung relativ einfach machen. Allerdings muss man wissen, auf welcher Adresse der Sensor mittels I²C zu erreichen ist: In diesem Fall ist es 0x76, bei anderen 0x77. </p>



<p>Der DS18B20 ist gefühlt der Vielseitigste was seine unterschiedlichen Bauformen angeht. Neben der von mir verwendeten Variante gibt es u.a. auch in einer Wasserdichten Version. Allerdings kann er, anders als der DHT22 oder der BME280 rein die Temperatur ermitteln, nicht die Luftfeuchte. Übermittelt werden die Daten mit dem <a href="https://de.wikipedia.org/wiki/1-Wire" target="_blank" rel="noreferrer noopener">1-Wire-Protokoll</a>. Dabei handelt es sich um eine serielle Datenübertragung welche von der Firma Dallas Semiconductor entwickelt wurde. Der Name ist Programm: Es wird eben neben der Spannungsversorgung nur ein weiteres Kabel benötigt. Wobei, das stimmt nicht ganz: Für die Schaltung wird zudem ein Pull-Up-Widerstand benötigt. Sonst funktioniert das Ganze nicht. Keine große Herausforderung, wenn man es noch nie gemacht hat, sollte man sich dem Thema einmal annehmen. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://datort.de/wp-content/uploads/2023/10/IMG_5114-1024x682.jpg" alt="" class="wp-image-513" srcset="https://datort.de/wp-content/uploads/2023/10/IMG_5114-1024x682.jpg 1024w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-300x200.jpg 300w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-768x511.jpg 768w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-1536x1022.jpg 1536w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-380x253.jpg 380w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-800x533.jpg 800w, https://datort.de/wp-content/uploads/2023/10/IMG_5114-1160x772.jpg 1160w, https://datort.de/wp-content/uploads/2023/10/IMG_5114.jpg 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Für meinen Vergleich habe ich mir auf meinem Steckfeld 3 Teststrecken gebaut. Beide sind vom Aufbau identisch: Von jedem Sensor existiert pro Teststrang ein Exemplar. Angeschlossen sind sie an einen D1 Mini Clone, welcher die Daten an meine InfluxDb und damit an an ein Grafana-Dashboard sendet über das die Auswertung stattfindet. Den Code stelle ich euch gerne bereit. Auch wenn man vermutlich dieses Setup so nicht benötigt, kann man sich vielleicht für eigene Projekte etwas abschauen wenn man neu in der Materie ist: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: arduino; title: ; notranslate">
#include &lt;Wire.h&gt;
#include &lt;SPI.h&gt;
#include &lt;Adafruit_BME280.h&gt;
#include &lt;OneWire.h&gt;
#include &lt;DallasTemperature.h&gt;
#include &lt;ESP8266WiFi.h&gt;
#include &lt;InfluxDbClient.h&gt;
#include &quot;DHT.h&quot;
#include &quot;secrets.h&quot; // Einfache Konstanten-Sammlung für Credentials


#define ONE_WIRE_BUS 2 // GPIO PIN 2

InfluxDBClient influx(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
Point bmeSensor(&quot;bme_1&quot;);
Point dsSensor(&quot;ds_1&quot;);
Point dhtSensor(&quot;dht_1&quot;);


Adafruit_BME280 bme;
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds18b20(&amp;oneWire);

DHT dht(14, DHT22); // GPIO PIN 14

void setup() {
  Serial.begin(9600);

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&quot;.&quot;);
  }

  Serial.println(&quot;&quot;);
  Serial.print(&quot;Connected to &quot;);
  Serial.println(WiFi.SSID());
  Serial.print(&quot;IP address:\t&quot;);
  Serial.println(WiFi.localIP());


  
  Serial.println(F(&quot;BME280 Sensor event test&quot;));

  // Erzwinge Adresse 0x76 statt 0x77, nutzt die SCL/SDA Pins des D1 mini
  if (!bme.begin(0x76)) { 
    Serial.println(F(&quot;Could not find a valid BME280 sensor, check wiring!&quot;));
    while (1) delay(10);
  }
  
  bme_temp-&gt;printSensorDetails();
  bme_humidity-&gt;printSensorDetails();

  ds18b20.begin();

  dht.begin();

  influx.setInsecure();
}

void loop() {
  sensors_event_t temp_event, pressure_event, humidity_event;
  bme_temp-&gt;getEvent(&amp;temp_event);
  bme_humidity-&gt;getEvent(&amp;humidity_event);
  
  Serial.print(F(&quot;BME280 Temperature: &quot;));
  Serial.print(temp_event.temperature);
  Serial.println(&quot; °C&quot;);

  Serial.print(F(&quot;BME280 Humidity: &quot;));
  Serial.print(humidity_event.relative_humidity);
  Serial.println(&quot; %&quot;);

  bmeSensor.addField(&quot;temperature&quot;, temp_event.temperature);
  bmeSensor.addField(&quot;humidity&quot;, humidity_event.relative_humidity);
  if (!influx.writePoint(bmeSensor)) {
    Serial.print(&quot;InfluxDB write failed: &quot;);
    Serial.println(influx.getLastErrorMessage());
  }

  ds18b20.requestTemperatures();
  Serial.println(&quot;DS18B20 Temperature: &quot; + String(ds18b20.getTempCByIndex(0)) + &quot;°C&quot;);

  dsSensor.addField(&quot;temperature&quot;, ds18b20.getTempCByIndex(0));
  if (!influx.writePoint(dsSensor)) {
    Serial.print(&quot;InfluxDB write failed: &quot;);
    Serial.println(influx.getLastErrorMessage());
  }

  Serial.println(&quot;DHT22 Temperature: &quot; + String(dht.readTemperature()));
  Serial.println(&quot;DHT22 Humidity: &quot; + String(dht.readHumidity()));
  dhtSensor.addField(&quot;temperature&quot;, dht.readTemperature());
  dhtSensor.addField(&quot;humidity&quot;, dht.readHumidity());
  if (!influx.writePoint(dhtSensor)) {
      Serial.print(&quot;InfluxDB write failed: &quot;);
      Serial.println(influx.getLastErrorMessage());
    }

  delay(1000);
}
</pre></div>


<p>Für meinen Test habe ich das ganze Setup kurz in die &#8222;Kälte&#8220; gestellt. Das sollte dazu dienen um zu sehen wie schnell die Sensoren der Raumtemperatur annähern. Als Referenz diente ein Thermometer, was mehrere Stunden im Raum stand. Zugegeben: ist wieder nicht hochgradig wissenschaftlich, aber für die Stichprobe in meinen Augen ausreichend. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://datort.de/wp-content/uploads/2023/10/IMG_5128-1024x682.jpg" alt="" class="wp-image-515" srcset="https://datort.de/wp-content/uploads/2023/10/IMG_5128-1024x682.jpg 1024w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-300x200.jpg 300w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-768x511.jpg 768w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-1536x1022.jpg 1536w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-380x253.jpg 380w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-800x533.jpg 800w, https://datort.de/wp-content/uploads/2023/10/IMG_5128-1160x772.jpg 1160w, https://datort.de/wp-content/uploads/2023/10/IMG_5128.jpg 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Am Ende bestätigten sich eure Aussagen: Sowohl der DS18B20 als auch der BME280 sind weniger träge als der DHT22. Der DS18B20 ist bei der Disziplin das Rennpferd. Nach etwa 2-3 Minuten hatte er sich bereits bereits wieder angeglichen. Der BME280 war mit 5 Minuten unwesentlich langsamer, während der DHT22 ca. 10 Minuten brauchte. Hinzu kommt die Frage nach der Güte der Daten. Zwischen den drei DHT22 Sensoren lagen am Ende mehr als 1 Grad Unterschied. Auch hier waren beide andere Sensortypen deutlich besser mit ca. 0.2 Grad beim DS18B20 bzw. nur ca 0.1 Grad beim BME280. Der BME280 war auch der Sensor, der am nächsten am Standthermometer lag. Und das sowohl in Bezug auf die Temperatur als auch auf die relative Luftfeuchte. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="631" src="https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-1024x631.png" alt="" class="wp-image-519" srcset="https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-1024x631.png 1024w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-300x185.png 300w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-768x473.png 768w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-380x234.png 380w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-800x493.png 800w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten-1160x715.png 1160w, https://datort.de/wp-content/uploads/2023/10/Vergleichsdaten.png 1487w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Somit ist das auch mein persönlicher Testsieger, wenngleich der DS18B20 unmittelbar danach kommt. Der DHT22 ist mit Sicherheit kein schlechter Sensor, aber mit dem Wissen ist seine Zeit bei mir zu Hause wohl vorbei. Ich werde ihn zeitnah gegen die BME280er tauschen.  </p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/vergleiche-tests/512/dht22-v-bme280-v-ds18b20-der-vergleich/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Luftqualität mit CCS811 Sensor bestimmen</title>
		<link>https://datort.de/raspberry-arduino/415/luftqualitaet-mit-ccs811-sensor-bestimmen/</link>
					<comments>https://datort.de/raspberry-arduino/415/luftqualitaet-mit-ccs811-sensor-bestimmen/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Fri, 22 Sep 2023 09:32:00 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Sensorkunde]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[Raspberry Pi Pico]]></category>
		<guid isPermaLink="false">https://datort.de/?p=415</guid>

					<description><![CDATA[Mit dem Blick auf den anstehenden Herbst und Winter könnte ein kommendes Bastelprojekt daraus bestehen, die Luftqualität in&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Mit dem Blick auf den anstehenden Herbst und Winter könnte ein kommendes Bastelprojekt daraus bestehen, die Luftqualität in einem Raum zu ermitteln. Sollte man nicht eigenständig regelmäßig selbst auf die Idee kommen zu lüften, könnte man sich hier eine elektronische Unterstützen bauen. </p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/415/luftqualitaet-mit-ccs811-sensor-bestimmen/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2F36p6KTKB1qc%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Mit dem CCS811 ist bereits seit einigen Jahren ein Sensor auf dem Markt, mit dem sich dies per se realisieren lassen sollte. Mein Exemplar lag bisher (einmalige Verwendung ausgenommen) ungenutzt in der Ecke. Zeit also, mal genauer zu schauen was der Sensor so kann &#8211; und eben vielleicht auch nicht!</p>



<p>Im &#8222;Bastelbedarf&#8220; kommt der Sensor oft fertig aufgebaut auf einem kleinen Board, welches die Handhabe mit ihm erleichtert. Wie genau, das mag von Board zu Board etwas unterschiedlich sein. Ich beziehe mich hier auf ein fertiges Platinchen von Adafruit, welches die Verwendung in 2 Punkten erleichtert: </p>



<ul class="wp-block-list">
<li><strong>Pull-Up-Widerstände:</strong> Für die Kommunikation mittels I²C sind diese nötig und bereits auf dem Board verlötet. Dies vereinfacht die Verkabelung in unserem Setup, zumindest wenn sonst nichts auf der I²C-Leitung kommuniziert</li>



<li><strong>Level-Shifting:</strong> Egal ob wir ein Development Board mit 3.3V oder 5V Spannung an den I/O-Ports verwenden, dieses Sensor-Modul kommt mit beidem klar</li>
</ul>



<p>Bleiben am Ende also noch 4 Kabel nötig, um das Board zu betreiben: 3.3V oder eben 5V, Ground, sowie SDA und SCL für die Kommunikation.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-1024x635.jpg" alt="" class="wp-image-417" srcset="https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-1024x635.jpg 1024w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-300x186.jpg 300w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-768x476.jpg 768w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-1536x952.jpg 1536w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-380x236.jpg 380w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-800x496.jpg 800w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811-1160x719.jpg 1160w, https://datort.de/wp-content/uploads/2023/09/PicoVCCS811.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Viel Code ist ebenfalls nicht nötig, da es unterschiedliche Bibliotheken gibt die einem die Arbeit erleichtern. Ich nutze in meinem Beispiel die passende Bibliothek zum Board: &#8222;<em>Adafruit_CCS811</em>&#8222;. Die ist vorab über die Arduino IDE zu installieren. Hier der Code aus meinem Video: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &quot;Adafruit_CCS811.h&quot;

Adafruit_CCS811 ccs;

void setup() {
  Serial.begin(115200);

  if (!ccs.begin()) {
    Serial.println(&quot;Keine Kommunikation mit Sensor, Verkabelung prüfen&quot;);
    while(1);
  }

  while(!ccs.available());
}

void loop() {  
  if (ccs.available() &amp;&amp; !ccs.readData()) {

    Serial.print(&quot;CO2: &quot;);
    Serial.print(ccs.geteCO2());
    Serial.print(&quot;ppm, TVOC: &quot;);
    Serial.println(ccs.getTVOC());

  } else {
    Serial.println(&quot;Keine Daten empfangen&quot;);
    delay(5000);
  }

  delay(1000);
}
</pre></div>


<p>Wie man hier sieht ist es möglich mit der Methode <strong>getTVOC()</strong> die Gesamtzahl der sogenannten <em>Volatile Organic Compounds</em> (VOC) abzurufen. Übersetzt sind das flüchtige organische Verbindungen wie Kohlenwasserstoffe oder Alkohole die sich durch die Luft bewegen. Treffen solche Partikel auf den Sensor, so &#8222;zählt&#8220; dieser sie. Mit der Methode <strong>geteCO2()</strong> lässt sich zudem das sog. <em>equivalent carbon dioxide</em>, also ein CO2-Äquivalent abfragen. Hierbei sollte man jedoch wissen, dass der Sensor nicht in der Lage ist CO2 zu messen. Der ausgegebene Wert ist eine Berechnung, die auf den TVOCs basiert. Entsprechend kann man sich die Frage nach der Güte der ausgegebenen Werte stellen. </p>



<p>Für einen groben Indikator in wie weit sich die Qualität der Luft in einem Raum über die Zeit verändert ist der Sensor aber allemal gut und in Form eines solchen fertig aufgebauten Boards auch für Einsteiger einfach nutzbar. Um die für diesen Sensor bestmöglichen Ergebnisse zu erhalten, sollte man zudem 2 Dinge beachten: </p>



<ul class="wp-block-list">
<li>Vor der ersten Verwendung, sollte der Sensor eine 48 Stunden lange &#8222;Burn-In&#8220;-Phase durchlaufen. Ergo: Er soll einfach &#8222;arbeiten&#8220;. Nach 48 Stunden ist er dann &#8222;eingebrannt&#8220; und soll vernünftige Ergebnisse liefern</li>



<li>Vor jeder Verwendung benötigt der Sensor etwa 20 Minuten, bis er &#8222;betriebswarm&#8220; ist. Zuvor sind die Ergebnisse ungenau</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/415/luftqualitaet-mit-ccs811-sensor-bestimmen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DHT 22 Temperatursensoren im Test</title>
		<link>https://datort.de/raspberry-arduino/395/dht-22-temperatursensoren-im-test/</link>
					<comments>https://datort.de/raspberry-arduino/395/dht-22-temperatursensoren-im-test/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Fri, 08 Sep 2023 09:35:00 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DHT22]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Tinkering]]></category>
		<guid isPermaLink="false">https://datort.de/?p=395</guid>

					<description><![CDATA[Wer irgendwann mit der Entwicklung für die Arduino-Plattform, ein ESP8266-Entwicklerboard oder den Raspberry Pi anfängt, wird vermutlich früher&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Wer irgendwann mit der Entwicklung für die Arduino-Plattform, ein ESP8266-Entwicklerboard oder den Raspberry Pi anfängt, wird vermutlich früher oder später nach dem LED-Blink-Tutorial die Raumtemperatur messen wollen. Mit den DHT 11 bzw. 22 Sensoren gibt da einen halbwegs kostengünstigen, weitverbreiteten und vor allem sehr einfach zu nutzenden Sensor.</p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/395/dht-22-temperatursensoren-im-test/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2Ftt_g8dlXAro%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Während der DHT 11 mit einer Auflösung von einem Grad etwas gröber unterwegs ist, kann der DHT 22 die Temperatur in 0.1 Grad Schritten messen. Oft bekommt man sie vormontiert für 5-10 Euro auf einer kleinen Platine, welche es ermöglicht den Sensor mit einer Spannung von 3.3 bis 5.5 Volt zu betreiben. Auch praktisch ist, dass es er nur einen Pin belegt. Sensoren anderer Bauart, die SPI/I2C verwenden, benötigen schnell mal 2 Pins. </p>



<p>Zudem gibt es für so ziemlich alle Plattformen fertige Bibliotheken, welche die Verwendung mit wenigen Zeilen Code ermöglichen, wie in diesem Mini-Arduino-Sketch: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &quot;DHT.h&quot;

DHT dht(1, DHT22); // 1 = GPIO Pin

void setup() {
  Serial.begin(9600);

  dht.begin();
}

void loop() {
  Serial.println(dht.readTemperature());

  delay(10000);
}
</pre></div>


<p>Bei mir sind auch zwei DHT 22 im Dauereinsatz. Sie sind an ein D1 Mini Clone Board angeschlossen, welche die Werte via Wifi an eine InfluxDB senden. Die Daten werden in einem Grafana-Dashboard ausgewertet. Und genau dort fiel mir kürzlich auf, dass einer der Sensoren mit knapp 90% eine sehr hohe Luftfeuchte ausgab, die einfach nicht stimmen konnte.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://datort.de/wp-content/uploads/2023/09/Bildschirmfoto-2023-09-05-um-21.32.26.png" alt="" class="wp-image-396" style="width:680px;height:265px" width="680" height="265" srcset="https://datort.de/wp-content/uploads/2023/09/Bildschirmfoto-2023-09-05-um-21.32.26.png 744w, https://datort.de/wp-content/uploads/2023/09/Bildschirmfoto-2023-09-05-um-21.32.26-300x117.png 300w, https://datort.de/wp-content/uploads/2023/09/Bildschirmfoto-2023-09-05-um-21.32.26-380x148.png 380w" sizes="auto, (max-width: 680px) 100vw, 680px" /></figure>



<p>Also wechselte ich den Sensor. Und siehe da: ein neuer DHT 22 meldete schlagartig nur noch um die 60% Feuchte. Grund genug mich zu Fragen: Wie zuverlässig sind diese Sensoren eigentlich? Um das zu prüfen, habe ich 5 DHT 22 Sensoren unterschiedlichen Alters auf ein Steckbrett gepackt und die Werte verglichen. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://datort.de/wp-content/uploads/2023/09/IMG_4949-1024x682.jpg" alt="" class="wp-image-397" srcset="https://datort.de/wp-content/uploads/2023/09/IMG_4949-1024x682.jpg 1024w, https://datort.de/wp-content/uploads/2023/09/IMG_4949-300x200.jpg 300w, https://datort.de/wp-content/uploads/2023/09/IMG_4949-768x512.jpg 768w, https://datort.de/wp-content/uploads/2023/09/IMG_4949-380x253.jpg 380w, https://datort.de/wp-content/uploads/2023/09/IMG_4949-800x533.jpg 800w, https://datort.de/wp-content/uploads/2023/09/IMG_4949-1160x773.jpg 1160w, https://datort.de/wp-content/uploads/2023/09/IMG_4949.jpg 1501w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Laut Datenblatt hat der DHT 22 eine Genauigkeit von +/- 0.5 Grad Celsius im in der Wohnung üblichen Temperaturbereich. Bei der Messung der relativen Luftfeuchte sollen es lediglich 2% sein. In meinem Test konnte ich das leider nicht bestätigen: Bei der gemessenen Temperatur wichen die Sensoren bis zu 2 Grad Celsius voneinander ab. Bei der Luftfeuchte war es noch extremer: Während zwei Sensoren um 90% anzeigten, lagen die anderen bei 55-60%. </p>



<p>Ein wie ich finde etwas überraschendes Ergebnis. Wenn ihr den Test in Gänze sehen möchtet, empfehle ich euch meinen kleinen Videobericht dazu. </p>



<p>-&gt; <a href="https://youtu.be/tt_g8dlXAro">DHT 22 Temperatur-Sensor-Vergleich auf YouTube</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/395/dht-22-temperatursensoren-im-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi &#038; Pico W: ADS-B Radar</title>
		<link>https://datort.de/raspberry-arduino/380/raspberry-pi-pico-w-ads-b-radar/</link>
					<comments>https://datort.de/raspberry-arduino/380/raspberry-pi-pico-w-ads-b-radar/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Wed, 22 Feb 2023 20:19:08 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Elektrotechnik]]></category>
		<category><![CDATA[Pico W]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://datort.de/?p=380</guid>

					<description><![CDATA[Das DVB-T-Sticks häufig deutlich mehr können als nur TV oder Radio empfangen, ist inzwischen weit bekannt. Das Stichwort&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Das DVB-T-Sticks häufig deutlich mehr können als nur TV oder Radio empfangen, ist inzwischen weit bekannt. Das Stichwort lautet: Software Defined Radio, SDR. Und damit lässt sich auch Verkehrsfliegern &#8222;zuhören&#8220;. </p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/380/raspberry-pi-pico-w-ads-b-radar/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2Fj8Dq2oP9A_Y%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>dump190 ist dabei das Programm der Wahl. Hiermit lassen sich die über den DVB-T Stick auf 1090 MHz empfangenen Signale in nutzbare Daten umwandeln. Die Software ist dabei ziemlich mächtig und kann die Daten theoretisch direkt für uns visualisieren oder zumindest lesbar und übersichtlich in der Linux-Konsole darstellen. Zusätzlich können die Daten via Netzwerk bereitgestellt werden. Genau das machen wir uns zu nutze. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://datort.de/wp-content/uploads/2023/02/Main-Feature4-1024x576.jpg" alt="" class="wp-image-383" srcset="https://datort.de/wp-content/uploads/2023/02/Main-Feature4-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-300x169.jpg 300w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-768x432.jpg 768w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-380x214.jpg 380w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-800x450.jpg 800w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2023/02/Main-Feature4.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Neben dump1090 auf dem Raspberry Pi nutzen wir einen Pico auf dem ein Micropython Script läuft. Dieses zieht die Daten über das Netzwerk und stellt sie auf einem kleinen runden TFT-Display ganz im Stile eines guten alten Radars aus Action Filmen dar. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-11 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="385" src="https://datort.de/wp-content/uploads/2023/02/Main-Feature2-1024x576.jpg" alt="" class="wp-image-385" srcset="https://datort.de/wp-content/uploads/2023/02/Main-Feature2-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-300x169.jpg 300w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-768x432.jpg 768w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-380x214.jpg 380w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-800x450.jpg 800w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2023/02/Main-Feature2.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" data-id="384" src="https://datort.de/wp-content/uploads/2023/02/Main-Feature3-1024x576.jpg" alt="" class="wp-image-384" srcset="https://datort.de/wp-content/uploads/2023/02/Main-Feature3-1024x576.jpg 1024w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-300x169.jpg 300w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-768x432.jpg 768w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-1536x864.jpg 1536w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-380x214.jpg 380w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-800x450.jpg 800w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3-1160x653.jpg 1160w, https://datort.de/wp-content/uploads/2023/02/Main-Feature3.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>Den Code zu diesem kleinen Experiment findet ihr in meinem Github Repository. Alles weitere im Video.</p>



<p><strong>Alle Links die ihr benötigt</strong><br>* <a rel="noreferrer noopener" href="https://github.com/datort/micropython-radar/blob/main/radar.py" target="_blank">Mein Code auf Github</a><br>* <a href="https://github.com/antirez/dump1090" data-type="URL" data-id="https://github.com/antirez/dump1090" target="_blank" rel="noreferrer noopener">dump1090</a><br>* <a href="https://github.com/russhughes/gc9a01_mpy" data-type="URL" data-id="https://github.com/russhughes/gc9a01_mpy" target="_blank" rel="noreferrer noopener">Micropython TFT Bibliothek</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/380/raspberry-pi-pico-w-ads-b-radar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Health Wearable: Arduino Tool gegen krumme Rücken</title>
		<link>https://datort.de/raspberry-arduino/93/health-wearable-arduino-tool-gegen-krumme-ruecken/</link>
					<comments>https://datort.de/raspberry-arduino/93/health-wearable-arduino-tool-gegen-krumme-ruecken/#respond</comments>
		
		<dc:creator><![CDATA[datort]]></dc:creator>
		<pubDate>Sat, 16 Jan 2021 16:41:00 +0000</pubDate>
				<category><![CDATA[Raspberry & Arduino]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<guid isPermaLink="false">https://datort.de/?p=93</guid>

					<description><![CDATA[Als jemand der jeden Tag viel am Rechner hängt habe ich ein Problem: Ich sitze oft wie eine&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Als jemand der jeden Tag viel am Rechner hängt habe ich ein Problem: Ich sitze oft wie eine Banane vor dem Bildschirm. Über den Tag gibt die nicht vorhandene Rückenmuskelatur auf und ich beuge mich immer weiter nach vorne. Das sieht nicht nur schäbbig aus, es ist auch wahnsinnig ungesund.</p>


<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://datort.de/raspberry-arduino/93/health-wearable-arduino-tool-gegen-krumme-ruecken/"><img decoding="async" src="https://datort.de/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2F42dJp85BvgQ%2Fmaxresdefault.jpg" alt="YouTube Video"></a><br /><br /><figcaption></figcaption></figure>


<p>Mit einem kleinen Health Wearable möchte ich dem entgegenwirken. Ein kleiner Beschleunigungssensor soll dabei unauffällig die Neigung des Oberkörpers überwachen und die Ergebnisse in einer Grafik anzeigen.</p>



<p>Zugegeben: Das Ganze ist eher ein Versuch oder Proof of Concept und gleichermaßen ein Lehrprojekt bei dem ich einfach mal was ausprobieren wollte. Zum Einsatz kommen wieder ein NodeMCU Board und ein GY-61 3-Achsen ADXL335 Beschleunigungs-/Neigungssensor.</p>



<p>Die Software gibt&#8217;s natürlich wie immer auf meinem <a href="https://github.com/datort/arduino-esp8266-gyro-http-server">Github-Account</a>. Alle weiteren Details finden sich im Video. Viel Spaß beim Nachbauen!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datort.de/raspberry-arduino/93/health-wearable-arduino-tool-gegen-krumme-ruecken/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
