<?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>Schritt für Schritt Anweisung Archives - Nerd Corner</title>
	<atom:link href="https://nerd-corner.com/de/tag/schritt-fuer-schritt-anweisung/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerd-corner.com/de/tag/schritt-fuer-schritt-anweisung/</link>
	<description>Craft your dreams!</description>
	<lastBuildDate>Tue, 19 Aug 2025 16:21:22 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://nerd-corner.com/wp-content/uploads/2019/10/cropped-LogoNerdCorner-2-32x32.png</url>
	<title>Schritt für Schritt Anweisung Archives - Nerd Corner</title>
	<link>https://nerd-corner.com/de/tag/schritt-fuer-schritt-anweisung/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DIY Solarpanelhalterung für 2W Panels</title>
		<link>https://nerd-corner.com/de/diy-solarpanelhalterung-fuer-2w-panels/</link>
					<comments>https://nerd-corner.com/de/diy-solarpanelhalterung-fuer-2w-panels/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 17:41:40 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[3D Druck]]></category>
		<category><![CDATA[CAD]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Druck]]></category>
		<category><![CDATA[Filament]]></category>
		<category><![CDATA[Gehäuse]]></category>
		<category><![CDATA[Halter]]></category>
		<category><![CDATA[Halterung]]></category>
		<category><![CDATA[löten]]></category>
		<category><![CDATA[Präzision]]></category>
		<category><![CDATA[PV]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Solar]]></category>
		<category><![CDATA[Solar panel]]></category>
		<category><![CDATA[Solid Works]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[Verkabelung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1702</guid>

					<description><![CDATA[<p>Oft braucht es keine großen Stromquellen, um einen 18650-Akku zuverlässig zu laden. Leider sind passende, kleine Solarpanels schwer zu finden – viele sind polykristallin, besitzen &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/diy-solarpanelhalterung-fuer-2w-panels/">DIY Solarpanelhalterung für 2W Panels</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p data-start="155" data-end="778">Oft braucht es keine großen Stromquellen, um einen 18650-Akku zuverlässig zu laden. Leider sind passende, kleine Solarpanels schwer zu finden – viele sind polykristallin, besitzen kein Gehäuse oder sind lediglich laminiert und mit einfachen Ösen zur Befestigung versehen. Für eine stabile und wetterfeste Montage im Außenbereich ist das allerdings selten ideal. Wer Wert auf eine saubere, dauerhafte Installation legt, braucht ein robustes Gehäuse mit verstellbarem Halter. Für meine Outdoor-Anwendungen reicht in der Regel eine Leistung von etwa 1,5 Watt – da ist ein monokristallines 2-Watt-Panel mit entsprechender Solarpanelhalterung genau die richtige Wahl.</p>
<p data-start="155" data-end="778"><img fetchpriority="high" decoding="async" class="zoooom aligncenter wp-image-1714" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand.jpg" alt="" width="716" height="800" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand.jpg 1393w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand-268x300.jpg 268w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand-916x1024.jpg 916w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand-768x858.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanel-stand-1374x1536.jpg 1374w" sizes="(max-width: 716px) 100vw, 716px" /></p>
<p data-start="155" data-end="778"><em><strong>Das könnte dich auch interessieren: </strong><a href="https://nerd-corner.com/de/diy-powerbank-mit-spannungsregler-und-voltmeter/">DIY Powerbank mit Spannungsregler und Voltmeter</a></em></p>
<h2 data-start="179" data-end="214">Montageplanung und Materialwahl</h2>
<p data-start="216" data-end="416">Bevor ich mit dem Bau beginne, überlege ich mir zunächst, wo die Solarpanels montiert werden sollen: Eins am Gartenschuppen, zwei am Balkongeländer,  und eines am Mast der Wetterstation.</p>
<p data-start="418" data-end="721">Am Gartenschuppen steht eine gerade Holzwand zur Verfügung, was einen flachen Halter erforderlich macht. Das Balkongeländer sowie der Mast hingegen haben jeweils einen Durchmesser von 30 mm – hier ist ein Halter mit Rundung notwendig. Aktuell benötige ich also zwei unterschiedliche Befestigungstypen.</p>
<p data-start="723" data-end="972">Als Solarpanel verwende ich ein monokristallines 2-Watt-Modul mit etwa 6 V Ausgangsspannung (siehe <em data-start="822" data-end="834">Bild 1.0.1</em>). Für den elektrischen Anschluss am Panel habe ich mich für eine Standard-Hohlbuchse mit 5,5×2,1 mm entschieden (siehe <em data-start="956" data-end="968">Bild 1.0.2</em>). Kabel und Schrauben sind in der Darstellung nicht enthalten, da sie je nach Anwendung variieren können. Die Panels sind im Fünfer- oder Zehnerpack bei diversen Onlinehändlern erhältlich. Ihre Abmessungen betragen 120 × 110 mm (Länge × Breite), wobei die Höhe zwischen 1,3 mm und 1,8 mm schwanken kann.</p>
<p><img decoding="async" class="aligncenter wp-image-1713 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1.jpg" alt="" width="2276" height="1330" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1.jpg 2279w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1-1536x898.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter1-2048x1197.jpg 2048w" sizes="(max-width: 2276px) 100vw, 2276px" /></p>
<h2 data-start="175" data-end="204">Konstruktion des Gehäuses</h2>
<p data-start="206" data-end="477">Das zentrale Bauteil für die Solarpanelhalterung ist der Rahmen. Er übernimmt sowohl die Stabilität als auch die Dichtfunktion des Gehäuses. Der Rahmen muss verwindungssteif sein, alle notwendigen Gewinde aufnehmen können und dabei dennoch kompakt bleiben. Das Solarpanel wird von hinten mit Leisten in seinen Sitz gepresst, sodass es an der Vorderseite dicht abschließt.<br data-start="618" data-end="621" />Um einen gleichmäßigen Anpressdruck zu erzeugen, sind mehrere Schrauben notwendig (<em data-start="708" data-end="726">siehe Bild 2.0.1</em>).</p>
<p data-start="732" data-end="968">Auf der Rückseite befindet sich ein Deckel (<em data-start="780" data-end="792">Bild 2.0.2</em>), der zur Stabilität in X-Form verstärkt ist. Dieser Deckel nimmt außerdem die Hohlbuchse (5,5 × 2,1 mm) auf, die später mit einer kleinen Brücke befestigt wird. Eine der insgesamt vier Anpressleisten, die das Panel in den Rahmen drücken, ist in <em data-start="1058" data-end="1070">Bild 2.0.3</em> zu sehen. Zur Befestigung an Geländern oder Wänden kommt der Gelenkhalter (<em data-start="1153" data-end="1165">Bild 2.0.4</em>) zum Einsatz. Dieser dient als Aufnahme für den Haltehebel, der das Gehäuse sicher fixiert und eine flexible Ausrichtung ermöglicht.</p>
<p><img decoding="async" class="aligncenter wp-image-1712 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2.jpg" alt="" width="2265" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2.jpg 2277w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-2048x1194.jpg 2048w" sizes="(max-width: 2265px) 100vw, 2265px" /></p>
<p>Auf Bild 2.1.1 ist der Halte Arm zur Geländer Befestigung angezeigt mit einem 30mm Durchmesser am Ende. Das Gegenstück für den Halter sieht man auf Bild 2.1.2. Die Brücke (Bild 2.1.3) zum Befestigen der Hohlbuchse am Deckel.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1711" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1.jpg" alt="Solarpanelhalterung CAD Teile" width="2276" height="1330" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1.jpg 2279w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1-1536x898.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter2-1-2048x1197.jpg 2048w" sizes="auto, (max-width: 2276px) 100vw, 2276px" /></p>
<h2 data-start="61" data-end="86">3D-Druck der Bauteile</h2>
<p data-start="88" data-end="354">Für den 3D-Druck habe ich folgende Druckausrichtungen für den Prusa MK4 gewählt (<em data-start="181" data-end="209">siehe Bild 3.0.1 und 3.0.2</em>).<br data-start="211" data-end="214" />Besonders wichtig: Die Leiste muss natürlich viermal gedruckt werden, da sie an allen vier Seiten des Solarpanels zum Einsatz kommt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1710 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3.jpg" alt="" width="2265" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3.jpg 2277w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-2048x1194.jpg 2048w" sizes="auto, (max-width: 2265px) 100vw, 2265px" /></p>
<h3 data-start="162" data-end="406">Gewindeschneiden</h3>
<p data-start="162" data-end="406">Kommen wir nun zu meiner Lieblingsbeschäftigung: dem Gewindeschneiden. Zugegeben – gerade im Rahmen gibt es einiges zu tun (<em data-start="292" data-end="310">siehe Bild 3.1.1</em>): Die grünen Markierungen zeigen 12× M3-Gewinde, die gelben 4× M3-Gewinde an.</p>
<p data-start="408" data-end="795">Für alle, die nicht zu den größten Fans des Gewindeschneidens zählen, gibt es eine alternative Variante des Rahmens. Dieser ist mit Schlitzen zur Aufnahme von normalen M3-Muttern ausgestattet. Die passende Datei trägt den Namen: Deckel110x120_V1-2.stl (<em data-start="675" data-end="693">siehe Bild 3.1.3</em>).<br data-start="695" data-end="698" />Die Vertiefungen für die Muttern sind zusätzlich in <em data-start="754" data-end="766">Bild 3.1.4</em> und <em data-start="771" data-end="778">3.1.5</em> gut zu erkennen.</p>
<p data-start="797" data-end="1074">Beim Rückendeckel (<em data-start="820" data-end="832">Bild 3.1.2</em>) lässt sich das Schneiden von Gewinden allerdings kaum vermeiden: Hier sind 3× M3-Gewinde und 2× M2-Gewinde notwendig.<br data-start="961" data-end="964" data-is-only-node="" />Alternativ können jedoch auch selbstschneidende Schrauben verwendet werden – das spart Werkzeuge und Zeit.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1709 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1.jpg" alt="" width="2276" height="1330" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1.jpg 2279w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1-1536x898.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter3-1-2048x1197.jpg 2048w" sizes="auto, (max-width: 2276px) 100vw, 2276px" /></p>
<h2 data-start="165" data-end="289">Verlöten und Montage</h2>
<p data-start="165" data-end="289">Wenn alle 3D-Druckteile gereinigt und mit Gewinden versehen sind, kann das Solarpanel angeschlossen und verlötet werden.</p>
<h3 data-start="165" data-end="289">Elektrische Anschlüsse</h3>
<p data-start="291" data-end="519">Die erste Hürde besteht darin, herauszufinden, wo sich der Pluspol am Panel befindet.<br data-start="384" data-end="387" />Auf der Rückseite des Solarpanels befinden sich lediglich zwei Lötlaschen, aber keine Kennzeichnung – also: Plus oder Minus? Um das schnell und eindeutig festzustellen, benötigen wir ein Multimeter. Stellen wir es auf Gleichspannungsmessung (DC) ein, hilft es uns, die Polarität zu erkennen.</p>
<p data-start="699" data-end="1045">Im Bild 4.0.1: Die rote Leitung (Plus) des Multimeters liegt auf einer der Lötlaschen, die schwarze Leitung (Minus) auf der anderen. Erscheint nun im Display ein Minuszeichen vor dem Messwert, bedeutet das, dass die rote Leitung am Minuspol liegt – also ist die gegenüberliegende Lasche der Pluspol des Solarpanels.</p>
<p data-start="1047" data-end="1363">Im Bild 4.0.2 sehen wir die umgekehrte Konfiguration: Die rote Leitung liegt auf dem Pluspol des Panels, die schwarze Leitung auf dem Minuspol. In diesem Fall erscheint kein Minuszeichen im Display – die Polarität stimmt,<br data-start="1294" data-end="1297" />und wir wissen nun sicher, wo der Pluspol des Solarpanels ist.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1708 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4.jpg" alt="" width="2265" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4.jpg 2277w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2048x1194.jpg 2048w" sizes="auto, (max-width: 2265px) 100vw, 2265px" /></p>
<p data-start="79" data-end="137">Jetzt wird die Hohlbuchse mit dem Solarpanel verlötet. Welche Anschlüsse dabei verbunden werden müssen, zeigt Bild 4.1.1 deutlich.<br data-start="222" data-end="225" />Im Bild 4.1.2 sieht man die fertige Verlötung im eingebauten Zustand.</p>
<p data-start="304" data-end="614">Zusätzlich habe ich am Pluspol der Hohlbuchse eine Diode angelötet (siehe Bild 4.1.3).<br data-start="398" data-end="401" />Diese schützt vor Rückstrom: Sollte am angeschlossenen Verbraucher keine eigene Schutzdiode vorhanden sein, würde das Solarpanel im Dunkeln Energie aus dem Akku ziehen – und ungewollt als Heizung arbeiten.</p>
<p data-start="616" data-end="772">Ein typisches Beispiel:<br data-start="639" data-end="642" />Wenn ein Laderegler keine integrierte Diode besitzt, kann der Akku das Panel bei fehlendem Sonnenlicht rückwärts entladen.</p>
<p data-start="774" data-end="1004">Die Einbaurichtung der Diode ist entscheidend, damit der Strom nur in eine Richtung fließen kann.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1707 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1.jpg" alt="" width="2276" height="1330" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1.jpg 2279w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1-1536x898.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-1-2048x1197.jpg 2048w" sizes="auto, (max-width: 2276px) 100vw, 2276px" /></p>
<h3 data-start="62" data-end="284">Montage der Hohlbuchse und Einsetzen des Panels</h3>
<p data-start="62" data-end="284">Die Montage der verlöteten Hohlbuchse an der Haltebrücke ist in Bild 4.2.1 dargestellt.<br data-start="157" data-end="160" />Dazu wird die Hohlbuchse in die große Öffnung der Haltebrücke geschoben, bis das Gewinde auf der anderen Seite herausragt. Anschließend wird die Mutter auf das Gewinde gesetzt und festgezogen – das Ergebnis zeigt Bild 4.2.2. Nun wird das Solarpanel in den Haltesitz des Rahmens eingesetzt (siehe Bild 4.2.3, roter Rahmen).<br data-start="496" data-end="499" />Wer die Dichtigkeit erhöhen möchte, kann vor dem Einsetzen des Panels etwas elastischen Kleber gleichmäßig in den Sitz auftragen. Sitzt das Solarpanel korrekt, wird die erste Leiste aufgesetzt und mit einer Schraube in der Mitte leicht angezogen (siehe Bild 4.2.4, magenta Kreis). Zur Veranschaulichung nochmal eine Seitenansicht in Bild 4.2.5.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1706 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2.jpg" alt="" width="2264" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2.jpg 2278w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-2-2048x1194.jpg 2048w" sizes="auto, (max-width: 2264px) 100vw, 2264px" /></p>
<h3 data-start="62" data-end="294">Befestigung der Leisten und Verschraubung</h3>
<p data-start="62" data-end="294">Nach und nach werden die restlichen Leisten jeweils mit der Schraube in der Mitte angebracht (siehe Bild 4.3.1). Anschließend werden die restlichen Schrauben eingesetzt, aber noch nicht fest angezogen (siehe Bild 4.3.2). Wenn das Solarpanel gleichmäßig sitzt, werden zuerst die mittleren Schrauben jeder Leiste fest angezogen.<br data-start="401" data-end="404" />Danach werden alle übrigen Schrauben festgezogen und nach einer kurzen Zeit nochmals nachgezogen. Falls das Solarpanel noch Spiel hat, kann man zwischen Solarpanel und Leiste etwas unterlegen, bis es fest sitzt. In Bild 4.3.3 sieht man, wie die Hohlbuchse samt Haltebrücke an der Innenseite des Rückendeckels befestigt wird.<br data-start="738" data-end="741" />Zum Abschluss wird der Rückendeckel mit vier Schrauben auf den Rahmen geschraubt (siehe Bild 4.3.4).</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1705 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3.jpg" alt="" width="2276" height="1330" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3.jpg 2279w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3-1536x898.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-3-2048x1197.jpg 2048w" sizes="auto, (max-width: 2276px) 100vw, 2276px" /></p>
<p>Bis zur Fertigstellung des Halters sind nur noch wenige Schritte nötig:<br data-start="139" data-end="142" />Zuerst wird die M6-Mutter in den Gelenkhalter eingepresst (siehe Bild 4.4.1).<br data-start="223" data-end="226" />Anschließend wird der Halter für das Geländer mit einer M6-Schraube am Gelenkhalter befestigt (siehe Bild 4.4.2).<br data-start="343" data-end="346" />Der Gelenkhalter wird nun mit drei M3-Schrauben am Rückendeckel verschraubt.<br data-start="422" data-end="425" />Nicht zu vergessen: Die M3-Muttern müssen in den Gegenhalter eingepresst werden, der später für die Montage am Geländer verwendet wird (siehe Bild 4.4.4).</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1704 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4.jpg" alt="" width="2264" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4.jpg 2278w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-4-2048x1194.jpg 2048w" sizes="auto, (max-width: 2264px) 100vw, 2264px" /></p>
<h2>Explosionszeichnung</h2>
<p>Zur besseren Übersicht gibt es eine Explosionszeichnung des Solarpanelhalters in Bild 4.5.1.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1703 zoooom" src="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5.jpg" alt="" width="2264" height="1320" srcset="https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5.jpg 2278w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5-1024x597.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5-768x448.jpg 768w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5-1536x895.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2025/06/solarpanelhalter4-5-2048x1194.jpg 2048w" sizes="auto, (max-width: 2264px) 100vw, 2264px" /></p>
<h3>Anmerkung</h3>
<p data-start="64" data-end="682">Natürlich gibt es auch alternative Befestigungsmöglichkeiten. So könnte man das Solarpanel beispielsweise im Garten am Blumenbeet anbringen – dort besteht jedoch die Gefahr, dass wachsende Pflanzen es nach und nach verdecken. In diesem Fall bietet sich ein Halter mit Aluminiumrohr und Erdspieß an (siehe Bild 5.0.1).<br data-start="381" data-end="384" />Auch auf dem Balkon lässt sich das Panel befestigen, etwa an Blumenkästen, die das Geländer verdecken. Hierfür gibt es ebenfalls eine passende Halterung mit Aluminiumrohr (siehe Bild 5.0.2).<br data-start="574" data-end="577" />Darüber hinaus ist auch eine Montage an einer Wand oder an einem Pfosten vorgesehen (siehe Bild 5.0.3).</p>
<p><img decoding="async" src="https://elepla.de/images/Powerbank/2W_Solarpanel_Halterrahmen/5-0.jpg" alt="5 0" /></p>
<p data-start="66" data-end="163">Des Weiteren plane ich die Konstruktion eines Solarpanelhalters mit integriertem USB-C-Ausgang.</p>
<p data-start="165" data-end="442">Das Solarpanel ist eine ideale Ergänzung für meine Kleingeräte und Sensoren im Außenbereich – und das sogar im Winter! Die benötigten Kabel lassen sich je nach Anforderung entweder selbst konfektionieren oder einfach kaufen. Grundsätzlich gilt dabei: je kürzer, desto besser.</p>
<p data-start="444" data-end="558">Viel Freude beim Nachbauen – oder vielleicht hat dich dieses Projekt sogar inspiriert, selbst kreativ zu werden.</p>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a href="https://www.thingiverse.com/thing:6835041">Solarpanelhalterung Gehäuse</a></li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/diy-solarpanelhalterung-fuer-2w-panels/">DIY Solarpanelhalterung für 2W Panels</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/diy-solarpanelhalterung-fuer-2w-panels/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deployment einer WebApp mit Kubernetes und Caddy</title>
		<link>https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/</link>
					<comments>https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 17:20:29 +0000</pubDate>
				<category><![CDATA[Angular-DE]]></category>
		<category><![CDATA[App Entwicklung]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[Caddy]]></category>
		<category><![CDATA[Caddy Server]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[ClusterIP]]></category>
		<category><![CDATA[ConfigMap]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Domain Registrierung]]></category>
		<category><![CDATA[Hetzner]]></category>
		<category><![CDATA[Images]]></category>
		<category><![CDATA[Ingress]]></category>
		<category><![CDATA[Ingress Controller]]></category>
		<category><![CDATA[IP Adresse]]></category>
		<category><![CDATA[K3s]]></category>
		<category><![CDATA[Kubectl]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[LoadBalancer]]></category>
		<category><![CDATA[mySql]]></category>
		<category><![CDATA[Nest.js]]></category>
		<category><![CDATA[Node Port]]></category>
		<category><![CDATA[Pods]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[Reverse Proxy]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[Traefik]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1687</guid>

					<description><![CDATA[<p>Nachdem im letzten Beitrag beschrieben wurde, wie man produktionsreife Docker-Images erstellt und auf Docker Hub hochlädt, geht es nun darum, diese Images auf einem Server &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/">Deployment einer WebApp mit Kubernetes und Caddy</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Nachdem im letzten Beitrag beschrieben wurde, wie man produktionsreife Docker-Images erstellt und auf Docker Hub hochlädt, geht es nun darum, diese Images auf einem Server bereitzustellen. Ziel ist es, die Webanwendung über eine eigene Domain für alle zugänglich zu machen. Dafür nutzen wir einen Virtual Private Server (VPS) von Hetzner und setzen Kubernetes (<span style="font-size: 1.125rem;">k3s) </span><span style="font-size: 1.125rem;">mit Caddy als Reverse Proxy ein.</span></p>
<p><em><strong>Das könnte dich ebenfalls interessieren: </strong><a href="https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/">Docker Images erstellen und auf Dockerhub hochladen</a></em></p>
<h2>Einen VPS bei Hetzner einrichten</h2>
<p>Hetzner bietet oft Empfehlungslinks mit Guthaben-Vorteilen für Neukunden. Selbstverständlich kann man auch andere Anbieter nutzen, aber Hetzner ist preislich attraktiv und bietet solide Leistungen.</p>
<h3>Was ist ein VPS?</h3>
<p>Ein Virtual Private Server (VPS) ist ein virtueller Server, der auf einer physischen Maschine betrieben wird und als eigenständiger Server agiert. Er bietet mehr Kontrolle als klassisches Shared Hosting und ist eine kostengünstige Alternative zu dedizierten Servern. Der Zugriff erfolgt in der Regel per SSH (Secure Shell), wodurch wir den Server über die Kommandozeile steuern können.</p>
<h3>SSH-Zugriff auf den VPS</h3>
<p data-start="1137" data-end="1384">Nach dem Erstellen eines VPS erfolgt die Verwaltung meist über eine <strong data-start="1205" data-end="1227">Secure Shell (SSH)</strong>. SSH ist ein Protokoll, das verschlüsselte Verbindungen zu entfernten Servern ermöglicht. Um sich mit dem Server zu verbinden, nutzt man folgenden Befehl:</p>
<p data-start="1137" data-end="1384"><span style="background-color: #e9ebec; color: #222222; font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 15px;">ssh root@&lt;IP-Adresse-des-Servers&gt;</span></p>
<p data-start="1430" data-end="1582">Falls ein SSH-Schlüssel hinterlegt wurde, kann die Authentifizierung per <strong data-start="1503" data-end="1535">Public-Key-Authentifizierung</strong> erfolgen, was sicherer als ein Passwort ist.</p>
<h3>Server bei Hetzner erstellen</h3>
<ol>
<li>Nach der Anmeldung in der Hetzner Cloud navigieren wir zu „Projekte“ und erstellen ein neues Projekt.</li>
<li>Danach wählen wir „Server hinzufügen“ und können eine Instanz konfigurieren.</li>
<li>Für den Anfang reicht oft das günstigste Modell aus. Ich empfehle jedoch, die Option für eine IPv4-Adresse zu aktivieren, da rein IPv6-basierte Setups oft Kompatibilitätsprobleme verursachen.</li>
</ol>
<h2>Domain einrichten</h2>
<p>Um die Anwendung später unter einer eigenen Domain zu erreichen, muss man eine Domain registrieren und mit dem Server verknüpfen.</p>
<h3>Domain bei Hetzner beantragen</h3>
<ol>
<li>In der Hetzner ConsoleH eine neue Domain registrieren oder eine bestehende Domain hinzufügen.</li>
<li>Um DNS-Einträge zu verwalten, müssen wir den DNS-Zugriff aktivieren.</li>
</ol>
<h3>Nameserver setzen</h3>
<p>Folgende Nameserver sollten genutzt werden:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">helium.ns.hetzner.de. 
hydrogen.ns.hetzner.com. 
oxygen.ns.hetzner.com.</pre>
<p>Diese neuen Nameserver bieten bessere Performance und Flexibilität im Vergleich zu den alten Hetzner-Nameservern:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ns1.first-ns.de.
robotns2.second-ns.de.
robotns3.second-ns.com.</pre>
<p>Beide Nameserver Varianten sind aber möglich! Die DNS Änderungen brauchen etwas Zeit. Mit Tools wie <a href="https://mxtoolbox.com/">MXToolbox</a> können wir aber überprüfen, ob die Änderungen bereits stattgefunden haben.</p>
<h3>Domain mit dem Server verbinden</h3>
<p data-start="3155" data-end="3229">Nun muss die <strong data-start="3168" data-end="3219">IP-Adresse des Servers mit der Domain verknüpft</strong> werden:</p>
<ol data-start="3231" data-end="3512">
<li data-start="3231" data-end="3283">In der Hetzner Cloud zu <strong data-start="3258" data-end="3271">DNS-Zonen</strong> wechseln.</li>
<li data-start="3284" data-end="3323">Die registrierte Domain auswählen.</li>
<li data-start="3324" data-end="3411">Einen neuen <strong data-start="3339" data-end="3351">A-Record</strong> erstellen und die <strong data-start="3370" data-end="3386">IPv4-Adresse</strong> des Servers eintragen.</li>
<li data-start="3412" data-end="3512">Falls vorhanden, den <strong data-start="3436" data-end="3458">IPv6-Record (AAAA)</strong> entfernen, um Kompatibilitätsprobleme zu vermeiden.</li>
</ol>
<p data-start="3514" data-end="3621">Mit <a href="https://mxtoolbox.com/" target="_blank" rel="noopener" data-start="3518" data-end="3553">MXToolbox</a> kann man auch hier prüfen, ob die DNS-Änderungen bereits übernommen wurden.</p>
<h2>Kubernetes einrichten</h2>
<p>Kubernetes ist ein leistungsfähiges Orchestrierungstool für Container. Ich verwende <strong data-start="3756" data-end="3763">k3s</strong>, eine schlanke Kubernetes-Variante, die sich besonders gut für kleinere Umgebungen eignet.</p>
<h3 data-start="3858" data-end="3902">K3s auf dem Server installieren</h3>
<p data-start="3903" data-end="3980">Per SSH auf den Server verbinden und k3s mit folgendem Befehl installieren:</p>
<pre><code class="language-sh">curl -sfL https://get.k3s.io | sh - </code></pre>
<p><span style="font-size: 1.125rem;">Das Skript installiert k3s und startet den Kubernetes-Dienst. </span>Nach der Installation kann k3s mit folgendem Befehl überprüft werden:</p>
<pre><code class="language-sh">kubectl get nodes
</code></pre>
<p>k3s bringt eine eigene <code>kubectl</code>-Version mit, sodass keine separate Installation nötig ist.</p>
<h3>YAML-Files für FE, BE, MySQL und Redis erstellen</h3>
<p>Für das Deployment unserer Anwendung brauchen wir YAML-Dateien für:</p>
<ul>
<li>Frontend (Angular)</li>
<li>Backend (NestJS)</li>
<li>Datenbank (MySQL)</li>
<li>Session-Management (Redis)</li>
</ul>
<p>Eine <strong data-start="4641" data-end="4661">Deployment-Datei</strong> für das Backend könnte so aussehen:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: dockerhub-user/backend:latest
          ports:
            - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: ClusterIP
</pre>
<h2>Was sind Deployments und Services?</h2>
<ul>
<li><strong>Deployments</strong> verwalten die Bereitstellung und Skalierung von Containern.</li>
<li><strong>Services</strong> sorgen für eine stabile Netzwerkverbindung zwischen Containern.</li>
<li>ClusterIP bedeutet, dass der Service nur innerhalb des Kubernetes-Clusters erreichbar ist.</li>
</ul>
<h2>Caddy als Reverse Proxy einrichten</h2>
<p>Damit eingehender Traffic richtig verteilt wird, wird ein Reverse Proxy benötigt. K3s bringt standardmäßig <strong>Traefik</strong> mit, allerdings habe ich mich für eine einfachere Lösung entschieden: <strong>Caddy</strong>. Ich war echt erstaunt wie wenig Anleitungen bzw. Dokumentation es zu Caddy in Kombination mit Kubernetes gibt.</p>
<h3>Warum Kubernetes mit Caddy?</h3>
<ul>
<li>Automatische Let’s Encrypt SSL-Zertifikate</li>
<li>Einfache Konfiguration per <code>Caddyfile</code></li>
<li>Built-in Load Balancer</li>
</ul>
<h3>Traefik entfernen</h3>
<pre><code class="language-sh">kubectl delete helmrelease traefik -n kube-system
</code></pre>
<h3>Caddy Deployment erstellen</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apiVersion: apps/v1
kind: Deployment
metadata:
  name: caddy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: caddy
  template:
    metadata:
      labels:
        app: caddy
    spec:
      containers:
        - name: caddy
          image: caddy
          volumeMounts:
            - name: caddy-config
              mountPath: /etc/caddy/Caddyfile
      volumes:
        - name: caddy-config
          configMap:
            name: caddy-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: caddy-config
data:
  Caddyfile: |

    example.com {
        reverse_proxy backend-service:3000
    }

---
apiVersion: v1
kind: Service
metadata:
  name: caddy-service
spec:
  type: LoadBalancer
  selector:
    app: caddy
  ports:
    - port: 80
      targetPort: 80
    - port: 443
      targetPort: 443</pre>
<p>Wichtig: Da Let’s Encrypt ein Rate-Limit hat, sollten Tests zunächst mit Staging-Zertifikaten erfolgen!</p>
<h2>Fazit</h2>
<p>Nach diesen Schritten läuft die Anwendung nun in einem Kubernetes-Cluster auf einem Hetzner VPS und ist über eine eigene Domain erreichbar. Als nächstes würde es sich anbieten eine automatische CI/CD-Pipeline einzurichten, um neue Versionen ohne manuellen Aufwand zu deployen.</p>
<p>The post <a href="https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/">Deployment einer WebApp mit Kubernetes und Caddy</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker Images erstellen und auf Docker Hub hochladen</title>
		<link>https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/</link>
					<comments>https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Wed, 15 Jan 2025 11:44:13 +0000</pubDate>
				<category><![CDATA[Angular-DE]]></category>
		<category><![CDATA[App Entwicklung]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Backend Server]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker Hub]]></category>
		<category><![CDATA[Docker Images]]></category>
		<category><![CDATA[Docker Repository]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[google cloud mysql]]></category>
		<category><![CDATA[Images]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[mySql]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Nest.js]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[redis session management]]></category>
		<category><![CDATA[redis session management nest.js]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1680</guid>

					<description><![CDATA[<p>In diesem Beitrag zeige ich, wie man production-ready Docker Images für eine Web Anwendung mit Angular, NestJS, MySQL und Redis erstellt und anschließend auf Docker &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/">Docker Images erstellen und auf Docker Hub hochladen</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In diesem Beitrag zeige ich, wie man production-ready Docker Images für eine Web Anwendung mit Angular, NestJS, MySQL und Redis erstellt und anschließend auf Docker Hub veröffentlicht. Voraussetzung ist eine installierte Docker Umgebung.</p>
<p><em><strong>Das könnte dich ebenfalls interessieren:</strong> <a href="https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/">NestJS auf Vercel hosten</a></em></p>
<h2>Erstellung der Docker Compose Yml</h2>
<p>Mit Docker Compose können alle Komponenten einer Anwendung über eine einzige Konfigurationsdatei definiert und gemeinsam gebuildet bzw. gestartet werden.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">version: '3.8'

services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    depends_on:
      - mysql
      - redis
    environment:
      - DATABASE_URL=mysql://user:password@mysql:3306/db
      - SESSION_STORE=redis://redis:6379

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: db
    ports:
      - "3306:3306"

  redis:
    image: redis:latest
    ports:
      - "6379:6379"</pre>
<h2>Erstellung der Env Datei</h2>
<p>Um Umgebungsvariablen zentral zu verwalten, erstellen wir eine <code>.env</code> Datei:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">DATABASE_URL=mysql://user:password@mysql:3306/db 
SESSION_STORE=redis://redis:6379</pre>
<p>Wichtig: Alle ENV-Variablen, die im Code verwendet werden, müssen auch in <code>docker-compose.yml</code> vorkommen!</p>
<h2>Docker-Image für das Frontend</h2>
<p>Das Angular-Frontend muss für die Produktion gebaut werden. Hier ein Beispiel-<code>Dockerfile</code>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">FROM node:20 AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build --prod

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf</pre>
<p>Da wir für den Build auf nginx angewiesen sind brauchen wir auch eine entsprechende Config Datei:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">server {
  listen 80;
  server_name _;

  location / {
    root /usr/share/nginx/html;
    index index.html;
    try_files $uri $uri/ /index.html;
  }
}</pre>
<h2>Docker-Image für das Backend</h2>
<p>Auch das NestJS-Backend muss gebaut werden. Hier ein optimiertes <code>Dockerfile</code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic"># Build stage
FROM node:20 AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine
WORKDIR /app

COPY --from=build /app/dist ./dist
COPY package.json package-lock.json ./
RUN npm install --only=production
CMD ["node", "dist/main.js"]</pre>
<h2>Builden der App mit Docker Compose</h2>
<p>Nachdem alle Dockerfiles konfiguriert wurden können jetzt die Images gebuildet werden. Mit Docker compose ist das ganze wirklich einfach.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose up -d --build</pre>
<p>Anschließend sind die Images fertig, die Container gebaut und die App kann lokal direkt ausgetestet werden! Als letzer Schritt müssen die Images noch auf DockerHub hochgeladen werden, damit sie später leichter für das Deployment auf einem Server genutzt werden können.</p>
<h2>Hochladen auf Docker Hub</h2>
<p>Das Hochladen wird nachfolgend Schritt für Schritt erklärt:</p>
<ol>
<li>Erstelle einen Account bei <a href="https://hub.docker.com/">Docker Hub</a>.</li>
<li>Erstelle ein Repository für das Frontend und Backend (1 privates Repo ist aktuell kostenlos).</li>
<li>Baue die Images und tagge sie:
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker tag &lt;image-id&gt; dockerAccountName/frontend:latest
docker tag &lt;image-id&gt; dockerAccountName/backend:latest</pre>
</li>
<li>Melde dich an und pushe die Images:
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker login
docker push dockerAccountName/frontend:latest
docker push dockerAccountName/backend:latest</pre>
</li>
</ol>
<h2>Ausblick: Deployment mit Kubernetes</h2>
<p>Da die Images nun auf Docker Hub sind, steht dem Deployment nichts mehr im Wege. Ich habe mich für ein Kubernetes-Cluster auf einem Hetzner-VPS entschieden. <a href="https://nerd-corner.com/de/deployment-einer-webapp-mit-kubernetes-und-caddy/">Mehr Infos dazu hier</a>.</p>
<p>The post <a href="https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/">Docker Images erstellen und auf Docker Hub hochladen</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/docker-images-erstellen-und-auf-docker-hub-hochladen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Erfahrungen aus der Praxis: NestJS auf Vercel hosten</title>
		<link>https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/</link>
					<comments>https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Thu, 14 Nov 2024 07:55:27 +0000</pubDate>
				<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[cookie-sessions]]></category>
		<category><![CDATA[CORS Fehler]]></category>
		<category><![CDATA[Cors Fehler nest]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Datenbank hosten]]></category>
		<category><![CDATA[Datenbank konfigurieren]]></category>
		<category><![CDATA[Einstellungen]]></category>
		<category><![CDATA[Erfahrungsbericht]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[express-sessions]]></category>
		<category><![CDATA[express.js]]></category>
		<category><![CDATA[google cloud]]></category>
		<category><![CDATA[google cloud mysql]]></category>
		<category><![CDATA[Hosten]]></category>
		<category><![CDATA[internal Server Fehler Vercel]]></category>
		<category><![CDATA[Internal Server Fehler Vercel nest]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[mySql]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[NestJs]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[redis session management]]></category>
		<category><![CDATA[redis session management nest.js]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Session Mamagement]]></category>
		<category><![CDATA[session management]]></category>
		<category><![CDATA[typescript]]></category>
		<category><![CDATA[Vercel]]></category>
		<category><![CDATA[vercel.json]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1632</guid>

					<description><![CDATA[<p>Nachdem ich Stunden damit verbracht habe, meine NestJS-App auf Vercel zu hosten und es nicht zum Laufen brachte, dachte ich mir, dass es an der &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/">Erfahrungen aus der Praxis: NestJS auf Vercel hosten</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Nachdem ich Stunden damit verbracht habe, meine NestJS-App auf Vercel zu hosten und es nicht zum Laufen brachte, dachte ich mir, dass es an der Zeit ist, zu dokumentieren, was ich gelernt habe &#8211; nicht nur, um mir in Zukunft Zeit zu sparen, sondern hoffentlich auch, um anderen zu helfen, einige der Fallstricke zu vermeiden, in die ich geraten bin. Hier ist eine Aufschlüsselung dessen, was funktioniert hat, was nicht, und wie ich es schließlich geschafft habe, dass alles reibungslos läuft.</p>
<p><em><strong>Das könnte dich ebenfalls interessieren:</strong> <a href="https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/" target="_blank" rel="noopener">Swagger zu Node Server hinzufügen</a></em></p>
<h3>Schritt 1: NestJS auf Vercel hosten</h3>
<p>Das Wichtigste zuerst: Die Grundeinstellungen für die Bereitstellung auf Vercel. Vercel ist großartig für Serverless, aber die Arbeit mit NestJS benötigt ein paar Anpassungen. Die Hauptsache ist, eine vercel.json-Konfigurationsdatei einzurichten, die Vercel genau sagt, wie die App zu behandeln ist.</p>
<p>Hier ist die Endkonfiguration:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="beyond">{
  "version": 2,
  "builds": [
    {
      "src": "src/main.ts",
      "use": "@vercel/node"
    }
  ],
  "routes": [
    {
      "src": "/(.*)",
      "dest": "src/main.ts",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "PATCH",
        "OPTIONS",
        "DELETE",
        "HEAD",
        "CONNECT",
        "TRACE"
      ]
    }
  ]
}
</pre>
<p>Ich habe daraufhin in Vercel folgende Fehlermeldung erhalten:</p>
<pre>This Serverless Function has crashed. Your connection is working correctly. 
Vercel is working correctly. 500: INTERNAL_SERVER_ERROR 
Code: FUNCTION_INVOCATION_FAILED ID: bom1::sgk4v-1711014022883-1e9ed54f4c37</pre>
<p>Bei einem Blick in die Logs stellte ich fest, dass die Datenbankverbindung ein Problem darstellte und außerdem die folgende Logmeldung angezeigt wurde:</p>
<pre>No exports found in module "/var/task/app-name/src/main.js".
Did you forget to export a function or a server?</pre>
<p>Es stellte sich heraus, dass ich den zweiten Teil der Fehlermeldung ignorieren und mich nur auf die Datenbankverbindung konzentrieren musste.</p>
<h3>Schritt 2: Konfigurieren der Datenbank</h3>
<p>Für meine Anwendung habe ich eine mysql-Datenbank mit mehreren Schemata verwendet. Ich habe mehrere kostenlose Angebote ausprobiert, aber sie waren nicht mit dem Ansatz mehrerer Schemata kompatibel. Daher habe ich mich für das Hosting bei Google Cloud entschieden. Ich habe es auf einen Preis von 0,01 $ pro Stunde heruntergeschraubt und das 300 $-Einsteigerangebot genutzt.</p>
<p>Um Vercel eine Verbindung zu ermöglichen, musste in der Konfiguration von Google Cloud die IP-Adresse auf <strong>0.0.0.0/0</strong> gesetzt werden, so dass die Datenbank von jeder IP-Adresse aus zugänglich war.</p>
<h3>Schritt 3: Umgang mit CORS</h3>
<p>Die CORS Fehler haben auch für einige Kopfschmerzen gesorgt. Stelle sicher, dass OPTIONS für CORS Preflight-Anfragen zugelassen wird, da Vercel eine explizite Erlaubnis für Cross-Origin-Anfragen benötigt. Am Ende musste ich eine Menge Header hinzufügen, um sicherzustellen, dass die Anfragen erlaubt waren:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="beyond">app.enableCors({
    origin: 'domain-name',
    credentials: true,
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
    allowedHeaders: [
      'Origin',
      'X-Requested-With',
      'Content-Type',
      'Accept',
      'Authorization',
    ],
  });</pre>
<h3>Schritt 4: Umstellung auf express-session und Redis für die Sitzungsverwaltung</h3>
<p>Einer der kniffligsten Teile war die Sessions zum Laufen zu bringen. Ich begann mit der <em>cookie-session</em> Bibliothek, aber Vercel ignoriert sie komplett. Nach einem Blick in die Dokumentation und einigem Ausprobieren wechselte ich zur <em>express-session</em> Bibliothek, da sie populärer ist und besser mit Vercels serverloser Umgebung funktioniert.</p>
<p>Aus irgendeinem Grund muss die Import-Syntax genau so aussehen:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="beyond">import session = require('express-session');</pre>
<p>Außerdem musste ich die Sitzungsmiddleware mit aktiviertem Vertrauensproxy konfigurieren, da Vercel Anfragen proxifiziert. So sieht die Einstellung aus:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="beyond">const expressApp = app.getHttpAdapter().getInstance();
expressApp.set('trust proxy', true);</pre>
<p>Auch die Einstellung secure: true und sameSite: &#8217;none&#8216; war wichtig, um sicherzustellen, dass Cookies über HTTPS und verschiedene Domainanfragen funktionieren!</p>
<p>Beachten, dass mit Vercel mehrere serverlose Instanzen Anfragen bearbeiten können, was bei parallelen Anfragen leider zu Sitzungskonflikten führt. Um dies zu beheben, habe ich meinen Sitzungsspeicher mit einer Redis-Instanz verbunden. Glücklicherweise war das super einfach.</p>
<p><a href="https://redis.io/">Redis</a> hält die Sitzungsdaten konsistent und vermeidet Konflikte zwischen Anfragen, insbesondere unter Last. Hier der Code:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="beyond">const expressApp = app.getHttpAdapter().getInstance();
expressApp.set('trust proxy', true);

const redisClient = createClient({
    password: process.env.REDIS_PASSWORD,
    socket: {
      host: process.env.REDIS_HOST,
      port: parseInt(process.env.REDIS_PORT, 10),
    },
  });

  redisClient
    .connect()
    .catch((err) =&gt;
      console.log('Could not establish a connection with Redis: ' + err),
    );

  redisClient.on('error', (err) =&gt; console.log('Redis error: ' + err));
  redisClient.on('connect', () =&gt;
    console.log('Connected to Redis successfully'),
  );

  app.use(
    session({
      store: new RedisStore({ client: redisClient }),
      secret: process.env.COOKIE_SECRET,
      cookie: {
        secure: process.env.NODE_ENV !== 'development',
        sameSite: process.env.NODE_ENV === 'development' ? 'lax' : 'none',
        maxAge: 86400000,
      },
    }),
  );</pre>
<h3>Schritt 5: Hinzufügen von withCredentials im Frontend</h3>
<p>Dieser Schritt ist nur eine Randnotiz: Damit Session-Cookies zwischen Frontend und Backend funktionieren, muss withCredentials in den HTTP-Anfragen meines Frontends auf true gesetzt werden. Dies ermöglicht die Einbeziehung von Cookies in herkunftsübergreifende Anfragen, was wichtig ist, wenn das Frontend und das Backend getrennt gehostet werden. Ich musste sicherstellen, dass der HTTP-Client von Angular diese Einstellung aktiviert hat.</p>
<h3>Schritt 6: Schriftart hinzufügen</h3>
<p>Um Schriftdateien in Ihr NestJS-Projekt einzubinden, muss man die CompilerOptions in der nest-cli.json-Datei verwenden, um Assets für die Build-Ausgabe zu definieren, z. B. durch die Angabe von „include“: „**/*.ttf“ und ‚outDir‘: „dist/src“.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-title="nest-cli.json" data-enlighter-theme="beyond">{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [
      {
        "include": "**/*.ttf",
        "outDir": "dist/src"
      }
    ],
    "deleteOutDir": true
  }
}</pre>
<p>Anschließend kann man nach dem Build die Schriftarten im Code mit path.resolve referenzieren, z. B. path.resolve(__dirname, &#8218;../fonts/Roboto-Regular.ttf&#8216;). Auf diese Weise wird sichergestellt, dass die Schriftartendateien mit dem Build gebündelt werden und während der Laufzeit zugänglich sind.</p>
<h3>Schlussgedanken zum Thema NestJS auf Vercel hosten</h3>
<p>Das Deployment meiner NestJS-App auf Vercel war eine wahre Achterbahnfahrt. Manchmal hatte ich das Gefühl, dass ich kurz davor war, alles perfekt zum Laufen zu bringen, nur um dann mit neuen Fehlern konfrontiert zu werden, die mich zurück in den Fehlersuch-Modus schickten. Es gab Momente der Frustration &#8211; vor allem im Zusammenhang mit der Sessionverarbeitung und CORS-Problemen. Aber jede Lösung brachte ein neues Hoch, und jeder behobene Fehler fühlte sich wie ein kleiner Sieg an.</p>
<p>Jetzt, wo endlich alles reibungslos funktioniert, kann ich sagen, dass es ein großartiges Gefühl ist. Wenn ich sehe, dass meine Anwendung so funktioniert, wie ich es mir vorgestellt habe, ist das all die Kopfschmerzen wert. Es ist eine große Erleichterung, aber noch mehr freut es mich, zu wissen, dass ich jede Hürde überwunden habe und auf das, was ich gelernt habe, zurückblicken kann. Ich hoffe, dieser Leitfaden kann anderen einige dieser Schwierigkeiten ersparen und helfen, diesen „Es funktioniert einfach“-Moment etwas schneller zu erreichen!</p>
<p>The post <a href="https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/">Erfahrungen aus der Praxis: NestJS auf Vercel hosten</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/erfahrungen-aus-der-praxis-nestjs-auf-vercel-hosten/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dupont Steckverbindung V1.1</title>
		<link>https://nerd-corner.com/de/dupont-steckverbindung-v1-1/</link>
					<comments>https://nerd-corner.com/de/dupont-steckverbindung-v1-1/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 07:46:11 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[SolidWorks-DE]]></category>
		<category><![CDATA[3D Druck]]></category>
		<category><![CDATA[CAD]]></category>
		<category><![CDATA[Dupont]]></category>
		<category><![CDATA[Gehäuse]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Solid Works]]></category>
		<category><![CDATA[Steckverbinder]]></category>
		<category><![CDATA[Steckverbindung]]></category>
		<category><![CDATA[Verkabelung]]></category>
		<category><![CDATA[Verschraubung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1609</guid>

					<description><![CDATA[<p>Auf die äußerst positive Resonanz zu meinen Schnellverbindern (Dupont Steckverbindung) hin musste ich feststellen, dass ihr ursprünglicher Zweck, sie nur in der Entwicklungsumgebung einzusetzen, sich &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/dupont-steckverbindung-v1-1/">Dupont Steckverbindung V1.1</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Auf die äußerst positive Resonanz zu meinen Schnellverbindern (Dupont Steckverbindung) hin musste ich feststellen, dass ihr ursprünglicher Zweck, sie nur in der Entwicklungsumgebung einzusetzen, sich auf den Dauereinsatz an verschiedenen Geräten ausgeweitet hat. Viele äußerten zudem den Wunsch, die Verbinder fest montieren oder anschrauben zu können. Diesem Wunsch bin ich nun nachgekommen.</p>
<p><em><strong>Das könnte dich auch interessieren: </strong><a href="https://nerd-corner.com/de/3d-gedruckte-dupont-steckverbindung-fuer-jumper-kabel/">3D gedruckte Dupont Steckverbindung für Jumper Kabel</a></em></p>
<h2>Umsetzung der Dupont Steckverbindung</h2>
<p>Wie bei jeder Neuentwicklung oder Änderung eines bestehenden Teils standen auch hier einige Entscheidungen an, jedoch waren in diesem Fall nicht viele notwendig.</p>
<ul>
<li><strong>Anzahl der Befestigungslaschen:</strong> zwei oder vier</li>
<li><strong>Durchmesser der Befestigungslöcher:</strong> 2,2 mm</li>
<li><strong>Deckel nach Befestigung abnehmbar:</strong> ja</li>
</ul>
<p>Bei der Anzahl der Befestigungslaschen ist klar, dass eine einzelne Lasche dazu führt, dass sich das Gehäuse um die Schraube dreht, wenn diese nicht fest genug angezogen ist. Beim Ein- oder Ausstecken der Verbindung versucht das Gehäuse sich um die Schraube zu drehen. Mit zwei oder mehr Laschen lässt sich das Ein- und Ausstecken problemlos bewerkstelligen, selbst wenn die Schrauben nicht vollständig festgezogen sind.</p>
<p>Der Durchmesser der Befestigungsbohrungen wurde auf 2,2 mm für M2-Schrauben festgelegt. Größere Schrauben würden die Laschen größer machen als das Gehäuse des Verbinders selbst, und zwei M2-Schrauben bieten bereits ausreichend Haltekraft.</p>
<p>Die Entscheidung, ob der Deckel nach der Befestigung des Verbinders weiterhin abnehmbar sein soll, ergab sich zwangsläufig. Da die Klemmlaschen des Deckels am Gehäuseboden überstehen, mussten die Befestigungslaschen ohnehin erhöht über dem Boden stehen. Wären die Laschen bündig mit dem Gehäuseboden, könnte sich der Deckel beim Anziehen der Schrauben um etwa 0,3 mm anheben. Warum wurden die Befestigungslaschen nicht direkt am Deckel angebracht? Der Deckel ist nicht stabil genug, um die seitlichen Laschen zu tragen. Der Abstand zwischen der Oberfläche und dem Gehäuseboden beträgt im verschraubten Zustand 1,1 mm, was ausreicht, um den Deckel problemlos zu entfernen.</p>
<p>Zu den Befestigungsbohrungen mit einem Durchmesser von 2,2 mm: Der Bohrungsabstand ist immer ein Vielfaches von 2,54 mm, was sinnvoll ist, da auch die DuPont-Stecker eine Breite und Höhe von 2,54 mm haben. Der Bohrungsabstand vergrößert sich proportional zur Anzahl der Pins am Gehäuse. Ein positiver Nebeneffekt: Diese Abstände passen auch zu den Löchern einer Lochrasterplatte. In Bild 1.0.1 habe ich zwei 4-Pin-Stecker auf einer Lochrasterplatte montiert. Für die Befestigung habe ich die passenden Löcher im Abstand der 4-Pin-Stecker verwendet und mit einem M2-Gewindebohrer Gewinde geschnitten. Wie man sehen kann, halten die Schrauben einwandfrei, ohne dass eine Mutter benötigt wird.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1614 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/10/1_1.jpg" alt="Dupont Steckverbindung" width="2310" height="1355" srcset="https://nerd-corner.com/wp-content/uploads/2024/10/1_1.jpg 2316w, https://nerd-corner.com/wp-content/uploads/2024/10/1_1-300x176.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/10/1_1-1024x601.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/10/1_1-768x451.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/10/1_1-1536x901.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/10/1_1-2048x1202.jpg 2048w" sizes="auto, (max-width: 2310px) 100vw, 2310px" /></p>
<p>Ja, das war’s fast für diesmal – eigentlich wären wir jetzt fertig, aber zwei Dinge sind mir noch wichtig. Erstens möchte ich auf die vielseitige Verwendung der Steckverbinder eingehen. Ich benutze sie seit vier Jahren und entdecke ständig neue Möglichkeiten, diese flexibel einzusetzen. Nachfolgend einige Beispiele mit Variante <em>eins</em>, die bis auf die Anschraubmöglichkeit identisch mit Version 1.1 ist.</p>
<p>In Bild 2.0.1 sieht man einen 10-PIN-Stecker mit einem 200 mm Jumperkabel. Bild 2.0.2 zeigt den Unterschied zwischen einem 10-PIN-Stecker mit einem 100 mm Jumperkabel und einem mit 200 mm.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1613 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/10/2.jpg" alt="Dupont connector" width="2310" height="1355" srcset="https://nerd-corner.com/wp-content/uploads/2024/10/2.jpg 2316w, https://nerd-corner.com/wp-content/uploads/2024/10/2-300x176.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1024x601.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/10/2-768x451.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1536x901.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2048x1202.jpg 2048w" sizes="auto, (max-width: 2310px) 100vw, 2310px" /></p>
<p>Bild 2.1.1 zeigt einen 9-PIN-Stecker auf der einen Seite und drei verschiedene Stecker auf der gegenüberliegenden Seite. In Bild 2.1.2 ist diese Seite vergrößert dargestellt. Hier sieht man die drei Stecker: einen 4-PIN-Stecker, daneben einen 3-PIN-Stecker und ganz links einen 2-PIN-Stecker. Addiert man die Pins der drei Stecker, kommt man wieder auf die neun Pins, wie auf der anderen Seite.</p>
<p>Sicherlich ist euch aufgefallen, dass die DuPont-Stecker der drei Verbindungen unterschiedlich sind. Beim 4-PIN-Stecker sind alle Pins männlich, also Stifte. Im Gegensatz dazu sind beim mittleren 3-PIN-Stecker alle Pins weiblich, also Buchsen. Besonders interessant wird es beim 2-PIN-Stecker, der einen Stift und eine Buchse kombiniert. Was hat es damit auf sich? Hier möchte ich die Flexibilität des werkzeuglosen Stecksystems von Nerd-Corner demonstrieren. Mit diesen Steckern kann man, wie beim 2-PIN-Stecker, einen Verpolungsschutz einbauen: Der Stift ist der Pluspol, die Buchse der Minuspol. Am Gegenstecker ist es umgekehrt, wodurch die Verbindung nicht falsch gesteckt werden kann!</p>
<p>Der 2-PIN-Stecker ist das einfachste Beispiel, aber dieses Prinzip lässt sich auf alle Stecker anwenden, sodass sich auch komplexere Schutzsysteme aufbauen lassen.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1612 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/10/2-1.jpg" alt="dupont steckverbindung" width="2310" height="1355" srcset="https://nerd-corner.com/wp-content/uploads/2024/10/2-1.jpg 2316w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1-300x176.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1-1024x601.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1-768x451.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1-1536x901.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/10/2-1-2048x1202.jpg 2048w" sizes="auto, (max-width: 2310px) 100vw, 2310px" /></p>
<p>Der Aufbau in Bild 2.2.1 zeigt eine weitere Möglichkeit, einen Kabelbaum zu erstellen. Auf der linken Seite befindet sich ein 10-PIN-Stecker, ganz rechts ein 5-PIN-Stecker, verbunden durch ein 200 mm Jumperkabel. Der orangefarbene 3-PIN-Stecker ist über ein 400 mm Jumperkabel mit dem 10-PIN-Stecker verbunden, ebenso wie der 2-PIN-Stecker, allerdings mit einem 500 mm Jumperkabel. Diese Lösung bietet grenzenlose Flexibilität über die gesamte Steckerfamilie hinweg und das komplett werkzeuglos.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1611 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/10/2-2.jpg" alt="dupont connector" width="2310" height="1355" srcset="https://nerd-corner.com/wp-content/uploads/2024/10/2-2.jpg 2316w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2-300x176.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2-1024x601.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2-768x451.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2-1536x901.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/10/2-2-2048x1202.jpg 2048w" sizes="auto, (max-width: 2310px) 100vw, 2310px" /></p>
<h2>Zusammenbau der Dupont Steckverbindung</h2>
<p>Ich erhalte immer wieder Anfragen, Steckergehäuse für 15 oder 22 Pins zu bauen. Leider ist dies mit diesem System zwar nicht unmöglich, aber eine große Herausforderung. Der Aufwand steht in keinem sinnvollen Verhältnis zum Nutzen – zumindest für mich. Eigentlich wollte ich bereits bei der 6-PIN-Variante aufhören, da die Montage schon einiges an Feinmotorik erfordert und die Haltekraft der Laschen nachlässt. Das Problem der Haltekraft konnte ich ab der 7-PIN-Variante durch eine dritte Lasche lösen, aber der Zusammenbau wurde dadurch sehr schwierig.</p>
<p>Es gibt jedoch meist eine Lösung, wie in der Bilderserie 3.0 zu sehen ist.</p>
<p>In Bild 3.0.1 erkennt man, dass eine Buchsenleiste ins Spiel kommt, da wir hier männliche (Stift-)Kabel verwenden. Für weibliche Kabel könnte man stattdessen eine Stiftleiste nutzen.</p>
<p>Der Ablauf für den Zusammenbau mit männlichen Kabeln (Stiften) sieht folgendermaßen aus:</p>
<ol>
<li>Die Kabel in die Buchsenleiste drücken.</li>
<li>Die gesteckten DuPont-Gehäuse leicht in den Gehäuseboden des Steckers drücken und die Kabel in die vorgesehenen Mulden pressen (siehe Bild 3.0.1).</li>
<li>Die DuPont-Gehäuse vollständig in den Gehäuseboden drücken und zur internen Anschlagleiste schieben. Anschließend die Kabel einzeln nach hinten ziehen – die Buchsenleiste sollte nicht entfernt werden (Bild 3.0.2).</li>
<li>Sobald die DuPont-Stecker im Gehäuse fixiert sind, wird der Deckel aufgesetzt und eingerastet (Bild 3.0.3).</li>
<li>Zum Abschluss wird die Buchsenleiste entfernt, und der Zusammenbau ist abgeschlossen (Bild 3.0.4).</li>
</ol>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1610 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/10/3.jpg" alt="Dupont Stecker" width="2310" height="1355" srcset="https://nerd-corner.com/wp-content/uploads/2024/10/3.jpg 2316w, https://nerd-corner.com/wp-content/uploads/2024/10/3-300x176.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/10/3-1024x601.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/10/3-768x451.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/10/3-1536x901.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/10/3-2048x1202.jpg 2048w" sizes="auto, (max-width: 2310px) 100vw, 2310px" /></p>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a href="https://www.thingiverse.com/thing:6515743" target="_blank" rel="noopener">Dupont Steckverbindung 3PIN</a></li>
</ul>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/dupont-steckverbindung-v1-1/">Dupont Steckverbindung V1.1</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/dupont-steckverbindung-v1-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hohlbuchse als Schalter verwenden</title>
		<link>https://nerd-corner.com/de/hohlbuchse-als-schalter-verwenden/</link>
					<comments>https://nerd-corner.com/de/hohlbuchse-als-schalter-verwenden/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Tue, 18 Jun 2024 17:26:22 +0000</pubDate>
				<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[3D Druck]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Gehäuse]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Hohlbuchse]]></category>
		<category><![CDATA[Hohlstecker]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[löten]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Spannungsregeler]]></category>
		<category><![CDATA[Spannungswandler]]></category>
		<category><![CDATA[Step down]]></category>
		<category><![CDATA[Step up]]></category>
		<category><![CDATA[Steuerung]]></category>
		<category><![CDATA[Verkabelung]]></category>
		<category><![CDATA[Voltmeter]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1568</guid>

					<description><![CDATA[<p>In vielen alltäglich genutzten Geräten, wie batteriebetriebenen Radios, Lampen, Taschenlampen und vor allem Laptops, wird eine Hohlbuchse zur Energieversorgung verwendet. In diesen Fällen dient die &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/hohlbuchse-als-schalter-verwenden/">Hohlbuchse als Schalter verwenden</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In vielen alltäglich genutzten Geräten, wie batteriebetriebenen Radios, Lampen, Taschenlampen und vor allem Laptops, wird eine Hohlbuchse zur Energieversorgung verwendet. In diesen Fällen dient die Hohlbuchse oft als Schalter: Sobald ein Stecker eingesteckt wird, wird die Stromversorgung von der Batterie, dem Akku oder einer anderen Quelle unterbrochen und das Gerät wird direkt vom Stecker mit Strom versorgt, wodurch die Batterie geschont wird. Die Trennung des primären Stromkreises erfolgt dabei rein mechanisch.</p>
<p><em><strong>Das könnte dich auch interessieren: </strong><a href="https://nerd-corner.com/de/diy-powerbank-mit-spannungsregler-und-voltmeter/">DIY Powerbank mit Spannungsregler und Voltmeter</a></em></p>
<h2>Liste der Komponenten</h2>
<p>Für die Darstellung der Funktion habe ich mich für einen kleinen Testaufbau entschlossen. Für meinen Testaufbau benötige ich folgendes:</p>
<ul>
<li>Hohlbuchse 5,5 x 2,1 (1.0.1)</li>
<li>Voltmeter (1.0.2)</li>
<li>5V Netzteil (1.0.3)</li>
<li>Hohlbuchsen Halter (1.0.4)</li>
<li>Hohlbuchsen Brücke (1.0.5)</li>
<li>Diverse Kabel (1.0.6)</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1569 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/06/1-0.jpg" alt="Hohlbuchse komponenten" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/1-0.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/1-0-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/1-0-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/1-0-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/1-0-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/1-0-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<h2>Montageanleitung für Halter und Brücke</h2>
<p>Der erste Schritt besteht darin, den Halter (1.0.4) und die Brücke (1.0.5) mit dem 3D-Drucker zu drucken. Nach dem Säubern der Druckteile schneide ich in den Halter zwei M2-Gewinde (siehe 2.0.1). Wer lieber mit selbstschneidenden Schrauben arbeitet, kann diesen Schritt überspringen. Danach wird die Hohlbuchse in das große Loch der Brücke geschoben (2.0.2) und mit der Mutter an der Vorderseite der Brücke fest verschraubt (2.0.3). Die Montage der Brücke am Halter ist ebenfalls sehr einfach: Man schiebt die Brücke mit den Aussparungen rechts und links über die beiden Zylinderflächen am Halter (2.0.4) und befestigt sie mit M2-Schrauben (2.0.5). Halter und Brücke mit montierter Hohlbuchse bilden eine sehr stabile Einheit, die große Kräfte aufnehmen kann. Wenn alles korrekt montiert ist, sollte die Hohlbuchse nicht überstehen, sondern 0,3 bis 0,5 mm versenkt sein.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1574 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/06/2-0.jpg" alt="jack socket hohlstecker" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/2-0.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/2-0-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/2-0-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/2-0-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/2-0-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/2-0-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<h2>Verkabelung und Verlötung der Hohlbuchse</h2>
<p>Kommen wir nun zum Kern dieses Artikels: dem Verkabeln beziehungsweise Verlöten der Hohlbuchse. Hierbei verwende ich vorkonfektionierte Stecker und Buchsen, die bereits verpresste Kabel und eine Zugentlastung enthalten. Die Farbmarkierung der Kabel ist ebenfalls praktisch, da rot für Plus und schwarz für Minus steht (3.0.1).</p>
<p>Die Hohlbuchse mit Schaltfunktion hat in der Regel drei Lötlaschen. Der Minuspol wird immer geschaltet, das heißt, im Bild 3.0.2 entspricht dies der Nummer zwei. Hier wird auch der Minuspol der primären Energieversorgung, wie z.B. Batterie oder Akkumulator, angelötet. Die Lötlasche Nummer eins ist für den gemeinsamen Pluspol vorgesehen; alle Plus-Verbindungen werden hier angelötet. Der Minuspol zu den Verbrauchern im Gerät wird an die Lötlasche Nummer drei gelötet. Im Bild 3.0.3 ist die komplette Verlötung der Hohlbuchse dargestellt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1573" src="https://nerd-corner.com/wp-content/uploads/2024/06/3-0.jpg" alt="jack socket hohlstecker" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/3-0.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/3-0-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/3-0-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/3-0-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/3-0-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/3-0-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<h2>Montage und Anschluss</h2>
<p>Nach der erfolgreichen Verlötung kann nun mit dem restlichen Versuchsaufbau fortgefahren werden. Zuerst wird der Halter mit der verlöteten Hohlbuchse auf eine Holzplatte geschraubt (4.0.1). Anschließend werden die beiden Mini-Voltmeter auf der Holzplatte befestigt (4.0.2). Die Mini-Voltmeter sind eine Kreation von Nerd-Corner. <a href="https://nerd-corner.com/de/verbesserter-lm2587s-spannungswandler-step-up-modul-dc-dc/">Wer Interesse an solchen Gehäusen hat, kann unter folgendem Link den entsprechenden Artikel lesen und die STL-Dateien herunterladen</a>.</p>
<p>Nun schließe ich die an der Hohlbuchse verlöteten Kabel an die Mini-Voltmeter an (siehe Bild 4.0.2, rosa Rahmen). Als nächstes verbinde ich die primäre Stromquelle mit meinem 5V-Netzteil und schalte es ein (siehe Bild 4.0.3, gelber Rahmen). Nach dem Einschalten des Netzteils liegt an beiden Mini-Voltmetern eine Spannung an: 5,35 Volt am Versorger (roter Kreis) und 5,28 Volt beim Verbraucher (grüner Kreis).</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1572 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/06/4-0.jpg" alt="jack socket hohlstecker" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/4-0.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/4-0-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/4-0-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/4-0-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/4-0-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/4-0-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<h3>Einbindung der zweiten Stromquelle</h3>
<p>Da der Strom sauber über die Hohlbuchse zum Verbraucher fließt, kommt jetzt die zweite Stromquelle ins Spiel. Diese betreibe ich mit 12V, um einen deutlichen Unterschied zur primären Stromversorgung zu haben. Im Bild 4.1.1 ist die zweite Stromversorgung mit 12,2 Volt dargestellt (türkiser Rahmen).</p>
<p>Nun stecke ich die zweite Stromversorgung mit 12 Volt in die Hohlbuchse (Bild 4.1.2, blauer Rahmen). Nach einer kurzen Verzögerung ändert sich der Wert am Mini-Voltmeter des Verbrauchers auf 12 Volt (grüner Rahmen). An der primären Stromversorgung hat sich nichts geändert; sie bleibt eingesteckt und eingeschaltet (roter Rahmen). Der Wert liegt weiterhin bei 5,34 Volt, was zwar 0,01 Volt niedriger ist als vor dem Einstecken der zweiten Stromversorgung, aber dies liegt an den Schwankungen des 5V-Netzteils.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1571 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/06/4-1.jpg" alt="jack socket hohlstecker" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/4-1.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/4-1-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/4-1-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/4-1-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/4-1-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/4-1-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<p>Als letzten Schritt entferne ich das 5 Volt Netzteil vom primären Stromkreis um zu überprüfen, ob wirklich keine Spannung am primären Stromkreis anliegt. Am Bild 4.2.1 im gelben Rahmen bleibt es dunkel und somit war der Versuch erfolgreich!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1570 zoooom" src="https://nerd-corner.com/wp-content/uploads/2024/06/4-2.jpg" alt="jack socket hohlstecker" width="2280" height="1332" srcset="https://nerd-corner.com/wp-content/uploads/2024/06/4-2.jpg 2291w, https://nerd-corner.com/wp-content/uploads/2024/06/4-2-300x175.jpg 300w, https://nerd-corner.com/wp-content/uploads/2024/06/4-2-1024x598.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2024/06/4-2-768x449.jpg 768w, https://nerd-corner.com/wp-content/uploads/2024/06/4-2-1536x897.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2024/06/4-2-2048x1196.jpg 2048w" sizes="auto, (max-width: 2280px) 100vw, 2280px" /></p>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a href="https://www.thingiverse.com/thing:6313994">Holstecker Halter und Brücke</a></li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/hohlbuchse-als-schalter-verwenden/">Hohlbuchse als Schalter verwenden</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/hohlbuchse-als-schalter-verwenden/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WeMos D1 R2 &#8211; Ganze Webseite mit html, css &#038; js hosten</title>
		<link>https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/</link>
					<comments>https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sat, 02 Mar 2024 23:11:48 +0000</pubDate>
				<category><![CDATA[Arduino Projekte]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Arduino mit WLAN]]></category>
		<category><![CDATA[C Programmierung]]></category>
		<category><![CDATA[Datenübertragung]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP8266 mit mDNS]]></category>
		<category><![CDATA[ganze Webseite]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Klemmsystem]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[Lokales Netzwerk]]></category>
		<category><![CDATA[Netzwerk]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Webseite hosten]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[WeMos]]></category>
		<category><![CDATA[WeMos D1]]></category>
		<category><![CDATA[WeMos D1 in Arduino IDE]]></category>
		<category><![CDATA[WeMos D1 mini]]></category>
		<category><![CDATA[WeMos D1 R2]]></category>
		<category><![CDATA[WeMOS D1 Webserver]]></category>
		<category><![CDATA[WIFI]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1526</guid>

					<description><![CDATA[<p>Im ersten Teil der WeMos Reihe wurde die Einrichtung und Wlan Integration erklärt. Darauf aufbauend wird in diesem Artikel Schritt für Schritt beschrieben wie man &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/">WeMos D1 R2 &#8211; Ganze Webseite mit html, css &#038; js hosten</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Im <a href="https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/">ersten Teil</a> der WeMos Reihe wurde die Einrichtung und Wlan Integration erklärt. Darauf aufbauend wird in diesem Artikel Schritt für Schritt beschrieben wie man eine komplette Webseite mit HTML Seiten, CSS Styling und JavaScript Funktionen auf einem WeMos hosten kann. Das ganze ist ziemlich einfach und unglaublich hilfreich! Ich kann es selbst kaum fassen wie schwer es ist eine vernünftige Anleitung für diese wichtige Funktion im Internet zu finden.</p>
<p>Ich sehe leider sehr oft Blogartikel in denen der HTML Code in der Arduino Datei eingebettet wird. Sowas kann man für eine Mini Demonstration zwar machen, ist aber im Alltag völliger Schwachsinn. Es ist viel zu unübersichtlich und sobald das Projekt wächst nicht mehr nutzbar.</p>
<p>Die ordentliche Alternative ist einen Ordner namens &#8222;data&#8220; einzurichten und in diesem die Webseiten als html Dateien abzulegen. Zusätzlich wird das Styling als CSS Datei gespeichert und es können sogar Funktionen per JavaScript Datei ausgeführt werden. Also alles 1:1 wie auf einem gewöhnlichem Webserver!</p>
<p><em><strong>Das könnte dich auch interessieren: </strong><a href="https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/">WeMos D1 R2 erste Schritte und Wlan Integration</a></em></p>
<h2>Liste der Komponenten</h2>
<ul>
<li>Arduino IDE (Entwicklungsumgebung)</li>
<li><a href="https://amzn.to/3tQPCjC" target="_blank" rel="noopener">WeMos D1 R2</a></li>
</ul>
<h3>Das Einrichten des Dateisystems (offiziell SPIFFS) geschieht einmalig und ist kinderleicht:</h3>
<p><a href="https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/">(Zunächst sollte man die grundlegende Einrichtung aus dem ersten Teil abgeschlossen haben!)</a></p>
<ol>
<li>Auf <a href="https://github.com/esp8266/arduino-esp8266fs-plugin/releases/tag/0.2.0">GitHub</a> eine Kopie der Datei &#8222;ESP8266FS-0.2.0.zip&#8220; herunterladen und entpacken</li>
<li>Die Datei esp8266fs.jar im Arduino-Tool-Verzeichnis ablegen. Der Pfad sieht etwa so aus: [home_dir]\Arduino\tools\ESP8266FS\tool\esp8266fs.jar (Siehe Bild) Ich musste den Pfadteil tools\ESP8266FS\tool\ im Arduino Ordner selbst erstellen. <img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1531" src="https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-file-path-esp8266fs.jar-.png" alt="Screenshot file path esp8266fs.jar" width="1080" height="335" srcset="https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-file-path-esp8266fs.jar-.png 1190w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-file-path-esp8266fs.jar--300x93.png 300w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-file-path-esp8266fs.jar--1024x318.png 1024w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-file-path-esp8266fs.jar--768x238.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></li>
<li>Die Arduino IDE neustarten.</li>
</ol>
<p>Das wars auch schon! Man kann jetzt in der Arduino DIE unter Tools den neuen Punkt „ESP8266 Sketch Data Upload“ sehen.</p>
<h2>Wie kann man das neue Dateisystem jetzt nutzen?</h2>
<ol>
<li>Erstellen Sie in ihrem aktuellen WeMos Projekt Ordner einen zusätzlichen Ordner mit dem Namen „data“. So wie in dem nachfolgendem Bild</li>
</ol>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1528" src="https://nerd-corner.com/wp-content/uploads/2024/03/Wemos-data-folder.png" alt="Wemos data folder" width="1040" height="324" srcset="https://nerd-corner.com/wp-content/uploads/2024/03/Wemos-data-folder.png 1146w, https://nerd-corner.com/wp-content/uploads/2024/03/Wemos-data-folder-300x93.png 300w, https://nerd-corner.com/wp-content/uploads/2024/03/Wemos-data-folder-1024x319.png 1024w, https://nerd-corner.com/wp-content/uploads/2024/03/Wemos-data-folder-768x239.png 768w" sizes="auto, (max-width: 1040px) 100vw, 1040px" /></p>
<ol start="2">
<li>Legen Sie die Dateien, die Sie hochladen möchten, in das &#8218;data&#8216;-Verzeichnis</li>
<li>Wählen Sie in der Arduino IDE im Menü &#8218;Tools&#8216; den WeMos aus und wählen Sie eine Größe bei &#8218;Flash Size&#8216;</li>
<li>Das Dialogfeld für den seriellen Monitor schließen!</li>
<li>Wählen Sie aus dem Menü &#8218;Tools&#8216; die Option &#8218;ESP8266 Sketch Data Upload&#8216;.</li>
</ol>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1529" src="https://nerd-corner.com/wp-content/uploads/2024/03/data-folder-upload.png" alt="Data folder upload" width="805" height="518" srcset="https://nerd-corner.com/wp-content/uploads/2024/03/data-folder-upload.png 851w, https://nerd-corner.com/wp-content/uploads/2024/03/data-folder-upload-300x193.png 300w, https://nerd-corner.com/wp-content/uploads/2024/03/data-folder-upload-768x495.png 768w" sizes="auto, (max-width: 805px) 100vw, 805px" /></p>
<p>Sobald der Upload abgeschlossen ist zeigt das Nachrichtenfenster der Arduino IDE 100% Upload an.</p>
<h2>WeMos Beispielprogramm zum Ein- und Ausschalten der OnBoard LED</h2>
<p>Ähnlich wie im ersten Teil wird der Webserver die OnBoard LED steuern. Als Basis dient ebenfalls der Code aus dem ersten Teil. Der überarbeitete Code sieht so aus:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic" data-enlighter-title="D1_webserver_filesystem">#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESP8266WebServer.h&gt;
#include &lt;ESP8266mDNS.h&gt;

ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200); //Baudrate
  Serial.println("ESP starts");

  WiFi.begin("NerdCornerWiFi","NerdCornerPassword");


  Serial.print("Connecting...");

  while(WiFi.status()!=WL_CONNECTED){ //Loop which makes a point every 500ms until the connection process has finished

    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected! IP-Address: ");
  Serial.println(WiFi.localIP()); //Displaying the IP Address

  if (MDNS.begin("nerd-corner")) {
    Serial.println("DNS started, available with: ");
    Serial.println("http://nerd-corner.local/");
  }

  server.serveStatic("/", SPIFFS, "/", "max-age=86400");
  SPIFFS.begin();

  server.onNotFound([](){ 
    server.send(404, "text/plain", "Landing page not found! Don't forget to name your landing page 'index.html'!");  
  });
 
  server.on("/led", HTTP_POST, []() {    
     
    const String ledState = server.arg("ledstate");
    if(ledState=="on"){
      switchLedOn();
    }
    else if(ledState=="off"){
      switchLedOff();
    }
    server.send(200, "text/json", "{\"result\":\"ok\"}");
  });

  server.begin();
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  server.handleClient();
  MDNS.update();

}

void switchLedOff(){ 
  digitalWrite(LED_BUILTIN, HIGH);   // turn the D1 LED off 
}

void switchLedOn(){ 
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED on 
}</pre>
<p>Auf ein paar Besonderheiten möchte ich dabei hinweisen. Wir haben beispielsweise folgendes hinzugefügt:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">server.serveStatic("/", SPIFFS, "/", "max-age=86400"); 
SPIFFS.begin();</pre>
<p>Ohne die beiden Zeilen wäre der Zugriff auf die Dateien im &#8222;data&#8220; Ordner nicht möglich. Bitte beachten, dass der Name &#8222;index.html&#8220; als default für die Landing Page eingestellt ist. Wenn man unbedingt möchte kann man das aber auch ändern.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">server.on("/led", HTTP_POST, []() {    
     
    const String ledState = server.arg("ledstate");
    if(ledState=="on"){
      switchLedOn();
    }
    else if(ledState=="off"){
      switchLedOff();
      }
      server.send(200, "text/json", "{\"result\":\"ok\"}");
  });</pre>
<p>Der &#8222;/led&#8220; Endpoint empfängt die Befehle vom Webserver. Lautet der Befehl &#8222;on&#8220; wird die LED eingeschaltet und bei &#8222;off&#8220; wird die LED ausgeschaltet.</p>
<h2>Wemos Webseite zum Ein- und Ausschalten der WeMos OnBoard LED</h2>
<p>Die Beispielwebseite ist ganz einfach aufgebaut. Sie besteht in erster Linie aus 2 Buttons zum Ein- und Ausschalten der LED.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1536" src="https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control.jpeg" alt="Website Wemos control LED" width="875" height="1946" srcset="https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control.jpeg 921w, https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control-135x300.jpeg 135w, https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control-461x1024.jpeg 461w, https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control-768x1708.jpeg 768w, https://nerd-corner.com/wp-content/uploads/2024/03/Webseite-Wemos-Control-691x1536.jpeg 691w" sizes="auto, (max-width: 875px) 100vw, 875px" /></p>
<p>Die Ordnerstruktur der Webseite ist sehr übersichtlich gehalten. Es gibt eine Hauptseite mit dem Namen &#8222;index.html&#8220; Dieser Name ist weltweit üblich für die Hauptseiten und wird auch automatisch vom WeMos entsprechend erkannt. Darüber hinaus einen &#8222;CSS&#8220; Ordner fürs Styling und einen &#8222;JS&#8220; Ordner für Funktionen.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1537" src="https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-data-file-system.png" alt="Screenshot esp8266 data file system" width="1045" height="347" srcset="https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-data-file-system.png 1152w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-data-file-system-300x100.png 300w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-data-file-system-1024x340.png 1024w, https://nerd-corner.com/wp-content/uploads/2024/03/Screenshot-data-file-system-768x255.png 768w" sizes="auto, (max-width: 1045px) 100vw, 1045px" /></p>
<p>Im Header Bereich der Webseite verlinken wir die Styles. Da wäre zum einen ein Standard Bootstrap, der alles automatisch bischen schöner macht und zusätzlich eine custom Styles Datei mit meinen eigenen Anpassungen. Außerdem werden im Header Bereich auch die Funktionen der Webseite verlinkt. Ich benutze den jQuery Standard um von der Webseite Requests an den WeMos zu senden. Meine eigenen custom Funktionen liegen in der &#8222;index.js&#8220;.</p>
<p>Bitte beachten, dass die jQuery Datei VOR der eigenen Datei eingebunden werden muss, sonst können keine jQuery Befehle im eigenen Code benutzt werden! Die eigenen Funktionen werden anschließend von den Buttons verwendet. Der HTML Code der Seite sieht insgesamt folgendermaßen aus:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="atomic">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;&lt;/html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    /&gt;
    &lt;script type="text/javascript" src="js/jquery-3.5.1.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="./js/index.js"&gt;&lt;/script&gt;
    &lt;link rel="stylesheet" href="css/bootstrap.min.css" /&gt;
    &lt;link rel="stylesheet" href="css/custom-style.css" /&gt;
    &lt;title&gt;D1 Webserver&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;D1 Webserver with filesystem&lt;/h1&gt;
    &lt;p&gt;
      This is an example for a WeMos Webserver with a filesystem. You can easily
      create webpages with html, css and js!
    &lt;/p&gt;

    &lt;h3&gt;Example to turn on and off the built in LED&lt;/h3&gt;
    &lt;button class="button-style" onclick="changeLEDState('on')"&gt;Turn on&lt;/button&gt;
    &lt;button class="button-style" onclick="changeLEDState('off')"&gt;
      Turn off
    &lt;/button&gt;

    &lt;h3&gt;Example to demo a JS function&lt;/h3&gt;
    &lt;button class="button-style" onclick="showAlert()"&gt;Show alert&lt;/button&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Besonderes Augenmerk gilt der JavaScript Funktion &#8222;changeLEDState(value)&#8220;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="atomic">function changeLEDState(value) {
  $.post("/led", { ledstate: value });
}</pre>
<p>Dadurch, dass jQuery genutzt wird für die Kommunikation mit dem WeMos, reicht ein einfaches Dollarzeichen mit dem entsprechendem Request Befehl. Bei diesem POST Request wird ebenfalls ein Wert mit geschickt, welcher entweder &#8222;on&#8220; oder &#8222;off&#8220; ist zum ein- und ausschalten der LED.</p>
<p>Die Webseite kann nachfolgend als zip Datei heruntergeladen werden.</p>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/1540/?tmstv=1755908851" rel="nofollow" id="download-link-1540" data-redirect="false" >
	Wemos example webserver to control OnBoard LED</a>
</li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/">WeMos D1 R2 &#8211; Ganze Webseite mit html, css &#038; js hosten</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tensorflow GPU aktivieren unter Windows</title>
		<link>https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/</link>
					<comments>https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Tue, 09 May 2023 21:22:10 +0000</pubDate>
				<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[Visual Studio-DE]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[GPU]]></category>
		<category><![CDATA[Grafikkarte]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[ML]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<category><![CDATA[Tensorflow Anleitung]]></category>
		<category><![CDATA[TensorFlow GPU]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1364</guid>

					<description><![CDATA[<p>Ich arbeite aktuell an einem Hobbyprojekt bei dem ich mittels KI deutsche Sätze ins Bairische übersetzen möchte, wie beispielsweise auf der Webseite Dialektl.com. Ich arbeite &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/">Tensorflow GPU aktivieren unter Windows</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ich arbeite aktuell an einem Hobbyprojekt bei dem ich mittels KI deutsche Sätze ins Bairische übersetzen möchte, wie beispielsweise auf der Webseite <a href="https://dialektl.com/" target="_blank" rel="noopener">Dialektl.com</a>. Ich arbeite hierfür mit Tensorflow, eine Open-Source-Plattform für maschinelles Lernen und Deep Learning. Tensorflow ist eine der am häufigsten verwendeten Bibliotheken für Deep Learning, da sie eine breite Palette von Funktionen und eine sehr aktive Entwicklergemeinschaft bietet. Für fast alle Machine Learning Modelle ist der Trainingsprozess äußert rechenaufwendig. Um die Geschwindigkeit des Trainingsprozesses zu erhöhen empfiehlt es sich die Grafikkarte (GPU) des Computers anstelle des Prozessors (CPU) zu verwenden.</p>
<p>Mein naiver Gedanke war, dass Tensorflow automatisch die GPU benutzen würde. Man muss allerdings erst die nachfolgende Schritt für Schritt Anleitung befolgen, damit Tensorflow die GPU überhaupt erkennt und nutzt.</p>
<p><em><strong>Das könnte dich auch interessieren:</strong> <a href="https://nerd-corner.com/de/tensorflow-js-oder-tensorflow-nutzen/">Tensorflow.js oder Tensorflow (Python) nutzen?</a></em></p>
<p><strong>DISCLAIMER: Ab Version 2.11 unterstütz Tensorflow keine GPUs mehr unter Windows! Entweder wechselt man das Betriebssystem oder downgraded Tensorflow auf Version 2.10. Außerdem wird eine Grafikkarte von NVIDIA benötigt!</strong></p>
<h3>1. Überprüfen der gewünschten CUDA und cuDNN Versionen</h3>
<p>Zunächst sollte man herausfinden welche CUDA und cuDNN Version von TensorFlow benötigt wird. Auf der Webseite werden alle Versionen von Tensorflow und die gewünschte CUDA Versionen bzw. cuDNN Versionen aufgelistet: <a href="https://www.tensorflow.org/install/source_windows#gpu">https://www.tensorflow.org/install/source_windows#gpu</a></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1372 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/tensorflow_requirements.png" alt="tensorflow requirements" width="1120" height="562" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/tensorflow_requirements.png 1128w, https://nerd-corner.com/wp-content/uploads/2023/05/tensorflow_requirements-300x151.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/tensorflow_requirements-1024x514.png 1024w, https://nerd-corner.com/wp-content/uploads/2023/05/tensorflow_requirements-768x385.png 768w" sizes="auto, (max-width: 1120px) 100vw, 1120px" /></p>
<h2>2. Überprüfen der eigenen Grafikkarte</h2>
<p>Wie bereits im Disclaimer erwähnt muss die Grafikkarte von NVIDIA sein. Auf der Webseite <a href="https://developer.nvidia.com/cuda-gpus">https://developer.nvidia.com/cuda-gpus</a> kann man seine eigene GPU suchen und die „Compute Capability“ überprüfen. Mindestvoraussetzung für Tensorflow ist ein Wert von 3.5, der aber von allen aktuellen Grafikkarten erfüllt wird.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1371 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/cuda-architectures.png" alt="cuda architectures" width="1120" height="158" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/cuda-architectures.png 1129w, https://nerd-corner.com/wp-content/uploads/2023/05/cuda-architectures-300x42.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/cuda-architectures-1024x144.png 1024w, https://nerd-corner.com/wp-content/uploads/2023/05/cuda-architectures-768x108.png 768w" sizes="auto, (max-width: 1120px) 100vw, 1120px" /></p>
<h2>3. Installieren der neusten NVIDIA-Treiber</h2>
<p>Um die GPU für TensorFlow zu aktivieren, müssen die neuesten NVIDIA-Treiber installiert sein. Einfach auf die NVIDIA-Website gehen den neuesten Treiber die eigene Grafikkarte herunterladen.</p>
<h2>4. Installieren von Visual Studio (optional)</h2>
<p>In TensorFlow wurden einige Teile der Bibliothek in C++ geschrieben, um die Leistung zu maximieren. Daher kann die Installation von Visual Studio dazu beitragen, die Kompatibilität und Leistung von TensorFlow zu verbessern: <a style="font-size: 1.125rem; color: midnightblue; outline: 0px;" href="https://visualstudio.microsoft.com/de/vs/">https://visualstudio.microsoft.com/de/vs/</a></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1370 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/vs-studio-download.png" alt="Visual studio installer" width="690" height="304" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/vs-studio-download.png 694w, https://nerd-corner.com/wp-content/uploads/2023/05/vs-studio-download-300x132.png 300w" sizes="auto, (max-width: 690px) 100vw, 690px" /></p>
<p>Es reicht hier einzelne Komponenten auszuwählen. Ich habe hier alles mit C++ in „Compiler, Buildtools und Runtimes“ ausgewählt und zusätzlich noch MS Build, was wiederum ein paar weitere Komponenten automatisch installiert. Insgesamt aber trotzdem über 25 GB!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1369 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/VS-studio-components.png" alt="choose components in visual studio" width="880" height="751" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/VS-studio-components.png 885w, https://nerd-corner.com/wp-content/uploads/2023/05/VS-studio-components-300x256.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/VS-studio-components-768x655.png 768w" sizes="auto, (max-width: 880px) 100vw, 880px" /></p>
<h2>5. Installieren von CUDA-Toolkit</h2>
<p>Das CUDA-Toolkit ist ein Toolkit für die Entwicklung von CUDA-Anwendungen, das von NVIDIA bereitgestellt wird. TensorFlow benötigt CUDA, um auf der GPU ausgeführt zu werden. Die in Schritt 1 verlangte Version des CUDA-Toolkits einfach von der NVIDIA-Website herunterladen und installieren: <a href="https://developer.nvidia.com/cuda-downloads">https://developer.nvidia.com/cuda-downloads</a></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1368 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/Cuda-toolkit-download.png" alt="download cuda toolkit" width="1130" height="889" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/Cuda-toolkit-download.png 1135w, https://nerd-corner.com/wp-content/uploads/2023/05/Cuda-toolkit-download-300x236.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/Cuda-toolkit-download-1024x806.png 1024w, https://nerd-corner.com/wp-content/uploads/2023/05/Cuda-toolkit-download-768x604.png 768w" sizes="auto, (max-width: 1130px) 100vw, 1130px" /></p>
<h2>6. Installieren der cuDNN-Bibliotheken</h2>
<p>cuDNN ist eine Bibliothek von Deep-Learning-Primitiven, die von NVIDIA bereitgestellt wird. TensorFlow benötigt zusätzlich cuDNN, um auf der GPU ausgeführt zu werden. cuDNN ist kostenlos, aber man muss einen Account als NVIDIA Developer erstellen: <a href="https://developer.nvidia.com/rdp/cudnn-download">https://developer.nvidia.com/rdp/cudnn-download</a></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1367 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download.png" alt="cuDNN download" width="1710" height="875" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download.png 1717w, https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download-300x154.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download-1024x524.png 1024w, https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download-768x393.png 768w, https://nerd-corner.com/wp-content/uploads/2023/05/cuDNN-download-1536x786.png 1536w" sizes="auto, (max-width: 1710px) 100vw, 1710px" /></p>
<p>Nach dem Download muss der Inhalt entpackt werden. Der Inhalt wirdin dem Programme Ordner in „NVIDIA GPU Computing Toolkit“ hinein verschoben. Nach dem Verschieben den Dateipfad des „bin“ Ordners kopieren.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1366 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/unzip-cuDNN.png" alt="unzip cuDNN" width="670" height="226" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/unzip-cuDNN.png 673w, https://nerd-corner.com/wp-content/uploads/2023/05/unzip-cuDNN-300x101.png 300w" sizes="auto, (max-width: 670px) 100vw, 670px" /></p>
<h2>7. PATH Variable setzen</h2>
<p>Öffne die Umgebungsvariablen in dem du den Begriff einfach in die Windows Suche eingibst. Dann die Systemvariable „path“ bearbeiten und einen neuen Eintrag hinzufügen mit dem Dateipfad des „bin“ Ordners aus dem vorherigem Schritt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1365 zoooom" src="https://nerd-corner.com/wp-content/uploads/2023/05/path-variable.png" alt="Set path variable for tensorflow gpu" width="1220" height="203" srcset="https://nerd-corner.com/wp-content/uploads/2023/05/path-variable.png 1223w, https://nerd-corner.com/wp-content/uploads/2023/05/path-variable-300x50.png 300w, https://nerd-corner.com/wp-content/uploads/2023/05/path-variable-1024x170.png 1024w, https://nerd-corner.com/wp-content/uploads/2023/05/path-variable-768x127.png 768w" sizes="auto, (max-width: 1220px) 100vw, 1220px" /></p>
<h2>8. Erstellen einer virtuellen Umgebung</h2>
<p>Es wird empfohlen, TensorFlow in einer virtuellen Umgebung zu installieren, um Konflikte mit anderen Python-Paketen zu vermeiden. Idealerweise mittels Anaconda. Einfach hier downloaden und installieren: <a href="https://www.anaconda.com/download">https://www.anaconda.com/download</a></p>
<p>Anschließend den Anaconda Navigator starten. Unter Environments &gt; Create  neue Umgebung erstellen. Danach wieder auf Home klicken und eine vorhandene Python IDE von hier aus launchen. Es sollten auch zusätzliche IDEs wie PyCharm nach dem Download automatisch hier angezeigt werden.</p>
<h2>9. Verifizieren der Tensorflow GPU Unterstützung</h2>
<p>Um zu überprüfen, ob die TensorFlow GPU Unterstützung erfolgreich erkannt wurde, sollte zunächst in der Python IDE das Tensorflow Package installiert werden. Aber dabei beachten unter Windows wird die GPU nur bis Version 2.10 erkannt! In den nachfolgenden Versionen nicht mehr! Es muss also Tensorflow 2.10 installiert werden.</p>
<p>Anschließend folgenden Code laufen lassen um eine liste der verfügbaren GPUs anzuzeigen:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import tensorflow as tf

tf.config.list_physical_devices('GPU')</pre>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/">Tensorflow GPU aktivieren unter Windows</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Blendfreie Lampe und Powerbank</title>
		<link>https://nerd-corner.com/de/blendfreie-lampe-und-powerbank/</link>
					<comments>https://nerd-corner.com/de/blendfreie-lampe-und-powerbank/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Mon, 26 Dec 2022 15:02:39 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[3D Druck]]></category>
		<category><![CDATA[Akku]]></category>
		<category><![CDATA[Battery management system]]></category>
		<category><![CDATA[Battery shield V3]]></category>
		<category><![CDATA[blendfrei]]></category>
		<category><![CDATA[blendfreie Taschenlampe]]></category>
		<category><![CDATA[CAD]]></category>
		<category><![CDATA[DIY Powerbank]]></category>
		<category><![CDATA[Gehäuse]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Ladegerät]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[LED Streifen]]></category>
		<category><![CDATA[Powerbank]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Solid Works]]></category>
		<category><![CDATA[Taschenlampe]]></category>
		<category><![CDATA[Verkabelung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1293</guid>

					<description><![CDATA[<p>Ich hatte mir einen neuen 3D Drucker gekauft mit geschlossenem Bauraum. Irgendwann stellte ich fest, dass einer der beiden Extruder verstopft war. Das Problem war, &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/blendfreie-lampe-und-powerbank/">Blendfreie Lampe und Powerbank</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ich hatte mir einen neuen 3D Drucker gekauft mit geschlossenem Bauraum. Irgendwann stellte ich fest, dass einer der beiden Extruder verstopft war. Das Problem war, um den Extruder zu säubern brauchte ich Licht, denn die Bauraumbeleuchtung funktioniert nur wenn der Drucker eingeschaltet ist. Wenn der Drucker an ist, würden auch die Lüfter anfangen zu drehen, welche  schnell kaputt gehen können, wenn man mit dem  Imbusschlüssel abrutscht. Daher habe ich lieber zu einer Taschenlampe gegriffen.</p>
<p>Die Taschenlampe konnte man nicht ordentlich positionieren und sie blendete. Aus diesem Grund kam mir die Idee eine eigene blendfreie Lampe zu entwickeln, die man einfach auf das Heizbett stellen kann und nicht blendet. Am besten kabellos mit einer Powerbank. <a href="https://nerd-corner.com/de/review-battery-shield-v3-die-diy-powerbank-mit-lipo-akku-18650/" target="_blank" rel="noopener">Ich hatte bereits eine eigene Powerbank mit dem Battery Shield V3 gebaut</a>, welche ich dieses Mal als Basis genutzt habe.</p>
<p><em><strong>Das könnte dich auch interessieren:</strong> <a href="https://nerd-corner.com/de/review-battery-shield-v3-die-diy-powerbank-mit-lipo-akku-18650/" target="_blank" rel="noopener">Eigene Powerbank mit dem Battery Shield V3</a></em></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1299 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-scaled.jpg" alt="Glare free blendfreie Lampe" width="2500" height="1141" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-300x137.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-1024x467.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-768x350.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-1536x701.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/glarefree_lamp_titelbild-2048x935.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Liste der Komponenten</h2>
<ul>
<li><a href="https://amzn.to/3VqHdxz" target="_blank" rel="noopener">1 x Hohlbuchse 5,5&#215;2,1</a></li>
<li><a href="https://amzn.to/3I2uBJZ" target="_blank" rel="noopener">1 x Battery Shield V3</a></li>
<li><a href="https://amzn.to/3WqjLlh" target="_blank" rel="noopener">1 x LiPo 18650 3500mAh</a></li>
<li><a href="https://amzn.to/3VhSOPu" target="_blank" rel="noopener">1 x Wippschalter 250V/3A Einbaumaß 15&#215;10,5mm</a></li>
<li><a href="https://amzn.to/3hSBZNe" target="_blank" rel="noopener">4 x Zylinderkopfschrauben mit Innensechkant M2 x6</a></li>
<li><a href="http://6 x Linsensenkkopfschrauben M2 x 20" target="_blank" rel="noopener">6 x Linsensenkkopfschrauben M2 x 20</a></li>
<li><a href="https://amzn.to/3HY8nJ6" target="_blank" rel="noopener">17 x 5V SMD2835 LED Streifen</a></li>
<li><a href="https://amzn.to/3WnXvbX" target="_blank" rel="noopener">5 x Jumperkabel</a></li>
</ul>
<p><img loading="lazy" decoding="async" class="size-full wp-image-1300 aligncenter" src="https://nerd-corner.com/wp-content/uploads/2022/12/PBLamp.gif" alt="glare free lamp belndfreie Lampe GIF" width="469" height="289" /></p>
<h2>Wahl der LED</h2>
<p>Da <a href="https://nerd-corner.com/de/review-battery-shield-v3-die-diy-powerbank-mit-lipo-akku-18650/" target="_blank" rel="noopener">das Grundgehäuse der Powerbank mit dem Battery shield V3 bereits fertig </a>war, musste ich mir hauptsächlich Gedanken über die Beleuchtung machen. Als Leuchtmittel sollten LEDs mit 5V oder 3V genutzt werden, da das Battery shield V3 entweder 5V oder 3V bereitstellt. Für meine Zwecke reicht ein geringerer Lumen Wert. Nach kurzer Recherche fand ich passende LED-Strips.</p>
<p>Die Lichttemperatur meines LED Streifens beträgt 6500K auch kaltweiß genannt. Dieses Licht beinhaltet sehr viel Blauanteil, wodurch sich gut arbeiten lässt und Details schnell sichtbar werden. Da das Battery shield V3 drei zusätzliche 5V und einen USB A <span style="font-size: 1.125rem;">Ausgang besitzt, ist die Versorgung der LEDs kein Problem.</span><span style="font-size: 1.125rem;"> </span></p>
<p><span style="font-size: 1.125rem;">Bei den LEDs für die blendfreie Lampe handelt es sich um SMD2835. Diese sind 2,5 mm breit und 3,5 mm lang und haben eine etwas geringere Leuchtkraft als ein SMD5050. Wieviel die LEDs verbrauchen ist entscheidend für die Leuchtdauer der Lampe, da die Energiezufuhr über den Akku beschränkt ist.  </span></p>
<h2>Konstruktion des Deckels und Zwischendeckels</h2>
<p><span style="font-size: 1.125rem;">Wie bereits im vorherigem Abschnitt erwähnt wird das Grundgehäuse der Powerbank nicht verändert. Die LEDs werden stattdessen auf einen Zwischendeckel aufgeklebt. </span>Der Zwischendeckel dient auch als Träger der Hohlbuchse für den 3V Ausgang. Weiterhin wurde ein Durchbruch kontruiert um die Kabel vom Ein-Aus-Schalter durchzuführen. Die schrägen Öffnungen des Zwischendeckels sollen helfen bei Bedarf nachträglich noch von hinten Kleber an den LED Streifen anzubringen.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1311 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs.jpg" alt="Zwischendeckel der Lampe" width="1600" height="782" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs.jpg 1619w, https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs-300x147.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs-1024x500.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs-768x375.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zwischendeckel-fur-LEDs-1536x750.jpg 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<p>Bei der Oberseite (dem Deckel, wo das Licht durchscheint) wurde es ein wenig komplexer. Einerseits soll genügend Licht durchscheinen, andererseits darf es nicht blenden! Natürlich wäre ein glasklarer Deckel für die Lichtausbeute ideal, doch wie gesagt, dann würde es womöglich blenden. Um einen Ausgleich zu schaffen zwischen effektiver Lichtausbeute und Blendfreiheit sind mehrere Faktoren zu berücksichtigen:</p>
<ul>
<li>Materialauswahl (Filament)</li>
<li>Abstand zum Leuchtmittel</li>
<li>Stärke der Scheibe</li>
<li>Druckstrategie</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1312 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-scaled.jpg" alt="Deckel der Lampe" width="2500" height="1077" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-300x129.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-1024x441.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-768x331.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-1536x662.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/Deckel-der-Lampe-2048x882.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<p>Bei der Materialauswahl für die blendfreie Lampe fiel die Wahl auf „Elfenbein“. Der Abstand zum Leuchtmittel beträgt 10,5 mm und die Scheibendicke (Materialstärke) 1 mm. Die Schichthöhe beträgt 0,25 mm, sprich bei einem Millimeter ergibt das vier Schichten, wobei die erste Schicht 45° nach links und die zweite Schicht 45° nach rechts aufgetragen wird. Durch die verschiedenen Richtungen der Schichten wird das Licht immer wieder gebrochen und blendfrei. Es handelt sich dabei um eine subjektive Wahrnehmung und die Bezeichnung blendfrei gilt daher nicht für alle Menschen.</p>
<h2>Zusammenbau</h2>
<ul>
<li>
<h5>Verlöten der Teile mit den Jumperkabeln:<img loading="lazy" decoding="async" class="aligncenter wp-image-1303 size-large zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp-665x1024.jpg" alt="zusammenbau shield v3 powerbank" width="665" height="1024" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp-665x1024.jpg 665w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp-195x300.jpg 195w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp-768x1182.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp-998x1536.jpg 998w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt1_glarefree_lamp.jpg 1167w" sizes="auto, (max-width: 665px) 100vw, 665px" /></h5>
</li>
<li>
<h5>Schneiden und ankleben der LED Streifen: Der LED Streifen wird in zweimal 6 LEDs und einmal 5 LEDs getrennt und auf den Zwischendeckel geklebt. Der Kabeldurchbruch am Deckel für den Stecker muss frei bleiben:<img loading="lazy" decoding="async" class="aligncenter wp-image-1304 size-large zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-1024x576.jpg" alt="Zusammenbau blendfreie Lampe mit LEDs" width="1024" height="576" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-1024x576.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-300x169.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-768x432.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-1536x865.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-2048x1153.jpg 2048w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt2b_glarefree_lamp-scaled.jpg 2560w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></h5>
</li>
<li>
<h5>Anbringen der Hohlbuchse am Zwischendeckel:<img loading="lazy" decoding="async" class="aligncenter wp-image-1305 size-large zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt3_glarefree_lamp-1024x789.jpg" alt="Zusammenbau holbuchse anbringen" width="1024" height="789" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt3_glarefree_lamp-1024x789.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt3_glarefree_lamp-300x231.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt3_glarefree_lamp-768x592.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt3_glarefree_lamp.jpg 1081w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></h5>
</li>
<li>
<h5>Einschrauben des Battery shield in das Gehäuse nachdem die zehn Gewinde zuvor in das Gehäuse geschnitten worden sind.</h5>
</li>
<li>
<h5>Wippschalter in den Deckel eindrücken:<img loading="lazy" decoding="async" class="aligncenter wp-image-1306 size-large zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt4_glarefree_lamp-1024x471.jpg" alt="zusammbau shield v3 powerbank kippschalter" width="1024" height="471" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt4_glarefree_lamp-1024x471.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt4_glarefree_lamp-300x138.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt4_glarefree_lamp-768x353.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt4_glarefree_lamp.jpg 1473w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></h5>
</li>
<li>
<h5>LiPo 18650 in die Aufnahme drücken</h5>
</li>
<li>
<h5>Kabel verbinden und einschalten:<img loading="lazy" decoding="async" class="aligncenter wp-image-1307 size-large" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-1024x622.jpg" alt="Zusammenbau Schritte glare free" width="1024" height="622" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-1024x622.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-300x182.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-768x467.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-1536x933.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-2048x1244.jpg 2048w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt5_glarefree_lamp-scaled.jpg 2560w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></h5>
</li>
<li>
<h5>Falls alle LED’s leuchten, Zwischendeckel auf Gehäuse stecken und danach den Deckel auf den Zwischendeckel stecken und verschrauben:<img loading="lazy" decoding="async" class="aligncenter wp-image-1308 size-large zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-1024x623.jpg" alt="Zusammenbau Endschritt blendfrei" width="1024" height="623" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-1024x623.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-300x182.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-768x467.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-1536x934.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-2048x1245.jpg 2048w, https://nerd-corner.com/wp-content/uploads/2022/12/Zusammenbau_schritt_ende_glarefree_lamp-scaled.jpg 2560w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></h5>
</li>
</ul>
<h2>Blendfreie Lampe CAD Design</h2>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1294 size-large" src="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp-1024x543.jpg" alt="CAD Glare free lamp" width="1024" height="543" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp-1024x543.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp-300x159.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp-768x407.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp-1536x814.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp.jpg 1620w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>Für die Gewinde sind die Bohrungen auf Kernlochdurchmesser konstruiert, d.h. bei M2 auf den Durchmesser 1,6 mm. Man kann das Gewinde mit dem Gewindebohrer schneiden oder mit einer Schraube formen (eindrücken). Ich persönlich bevorzuge das Gewindeschneiden. Wo an dem Gehäuse die Gewinde geschnitten werden müssen zeigen die beiden Grafiken.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1295 size-large" src="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp2-1024x510.jpg" alt="CAD glare free lamp" width="1024" height="510" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp2-1024x510.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp2-300x149.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp2-768x383.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_glarefree_lamp2.jpg 1124w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>Weitere Anmerkungen</h2>
<p>Mancher wird sich fragen, warum der Wippschalter aus dem Deckel ragt und nicht versenkt wurde. Die Lampe lässt sich dadurch besser ein- und ausschalten.  Meistens hat man nur eine Hand frei und kann nicht richtig in die Versenkung greifen, wenn der Wippschalter aber hervorsteht ist es leichter ihn zu bedienen. Trotzdem habe ich auch <strong>eine Variante mit versenktem Wippschalter</strong> konstruiert, die man im Download-Bereich herunterladen kann!</p>
<p>Die Leistung der Lampe liegt bei ca. 1,4 Watt. Bei 5,05 V beträgt die Stromstärke daher 0,27 A, was kein Problem  für das Battery Shield V3 und den LiPo darstellt. Die Leuchtdauer der Lampe beträgt ca. 5 Stunden im Dauerbetrieb. Für diese Daten habe ich einen Samsung 18650 mit 3500 mAh verwendet. Die Powerbank kann parallel zum Betrieb der Lampe genutzt werden. Die gesamte Stromstärke sollte allerdings nicht über 3A liegen.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1302" src="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_seitlich_in_einzelteile.jpg" alt="CAD blendfreie Lampe glarefree" width="1201" height="1259" srcset="https://nerd-corner.com/wp-content/uploads/2022/12/CAD_seitlich_in_einzelteile.jpg 1271w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_seitlich_in_einzelteile-286x300.jpg 286w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_seitlich_in_einzelteile-977x1024.jpg 977w, https://nerd-corner.com/wp-content/uploads/2022/12/CAD_seitlich_in_einzelteile-768x805.jpg 768w" sizes="auto, (max-width: 1201px) 100vw, 1201px" /></p>
<p>Ich benutze diese Lampe nicht nur für meinen 3D Drucker, sondern auch beim Löten, lesen oder als Nachtlicht. Die Powerbank ist zudem extrem leicht mit 127g.</p>
<h2>Datei zum Herunterladen</h2>
<ul>
<li><a href="https://www.thingiverse.com/thing:5430271" target="_blank" rel="noopener">STL Dateien der blendfreien Lampe</a></li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/blendfreie-lampe-und-powerbank/">Blendfreie Lampe und Powerbank</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/blendfreie-lampe-und-powerbank/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Swagger Api Doku zu Node Server hinzufügen</title>
		<link>https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/</link>
					<comments>https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Wed, 26 Oct 2022 17:07:59 +0000</pubDate>
				<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[Api]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Backend mit Swagger]]></category>
		<category><![CDATA[Backend Server]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[Endpoints]]></category>
		<category><![CDATA[Endpunkte]]></category>
		<category><![CDATA[express.js]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[Node mit Swagger und Typescript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Swagger]]></category>
		<category><![CDATA[Swagger dokumentation]]></category>
		<category><![CDATA[Swagger express]]></category>
		<category><![CDATA[Swagger.json]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1266</guid>

					<description><![CDATA[<p>Ich habe vor kurzem einen Node Server mit express.js in Typescript programmiert. Das ist eine typische Kombination für Backend Entwicklung. Das ist besonders vorteilhaft wenn &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/">Swagger Api Doku zu Node Server hinzufügen</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ich habe vor kurzem einen Node Server mit express.js in Typescript programmiert. Das ist eine typische Kombination für Backend Entwicklung. Das ist besonders vorteilhaft wenn bereits Erfahrung mit Frontend Entwicklung in Typescript vorhanden ist. Generell würde ich sowohl im Frontend als auch im Backend empfehlen lieber Typescript anstelle von Javascript zu nutzen. Typescript nutzt Javascript ist aber typbasiert und daher nicht so fehleranfällig!</p>
<p>Auch sollte der Fokus stehts auf clean Code legen und dieser ordentlich dokumentiert sein, besonders wenn ein Projekt größer wird zahlt sich ordentlich dokumentierte Arbeit aus. Um beispielsweise REST Endpunkte zu dokumentieren empfiehlt es sich Swagger zu benutzen. Die Swagger API Dokumentation bietet eine Übersicht über alle Endpunkte und sogar die Möglichkeit mit diesen zu interagieren.</p>
<p><strong><em>Das könnte Sie auch interessieren: </em></strong><em><a href="https://nerd-corner.com/de/wie-man-eine-reactive-angular-form-svg-mit-klickbaren-elementen-erstellt/" target="_blank" rel="noopener">Angular Form SVG mit clickbaren Elementen</a></em></p>
<h2>Liste der Komponenten</h2>
<ul>
<li>Entwicklungsumgebung (z.B. VS Code)</li>
<li>Node.js</li>
</ul>
<h2>Dokumentation mit Swagger</h2>
<p>Obwohl Swagger recht bekannt ist, konnte ich keine detaillierte Anleitung für die Implementation finden. Ich möchte daher 2 Wege zur Implementierung von Swagger in einen bestehenden Node Server erklären. Die erste Möglichkeit besteht darin direkt zu jedem Endpunkt Swagger Parameter hinzuzufügen. Das ist wohl die schnellere Variante, kann allerdings abhängig von der Anzahl der Endpunkte unübersichtlich werden. In der zweiten Variante wird eine „swagger.json“ Datei erstellt, die die  Parameter der Endpunkte zusammenfasst.</p>
<p>Um Swagger nutzen zu können wird folgende Bibliothek bzw. deren Typerweiterung genutzt:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">npm install --save  swagger-ui-express
npm install --save-dev @types/swagger-ui-express</pre>
<p>Swagger erstellt eine Dokumentation der Endpunkte:</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1271" src="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu.jpg" alt="Example Swagger Docu" width="1647" height="853" srcset="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu.jpg 1847w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu-300x155.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu-1024x531.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu-768x398.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerDocu-1536x796.jpg 1536w" sizes="auto, (max-width: 1647px) 100vw, 1647px" /></p>
<p>Diese können geöffnet werden und man sieht einen beispielhaften Request und einen beispielhaften Response:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1273 zoooom" style="font-size: 1.125rem;" src="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint.jpg" alt="Example Swagger Endpoint 1" width="1657" height="840" srcset="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint.jpg 1757w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint-300x152.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint-1024x519.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint-768x389.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint-1536x779.jpg 1536w" sizes="auto, (max-width: 1657px) 100vw, 1657px" /><img loading="lazy" decoding="async" class="aligncenter wp-image-1272 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2.png" alt="Example Swagger Endpoint 2" width="1657" height="803" srcset="https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2.png 1757w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2-300x145.png 300w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2-1024x496.png 1024w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2-768x372.png 768w, https://nerd-corner.com/wp-content/uploads/2022/10/exampleSwaggerEndpoint2-1536x744.png 1536w" sizes="auto, (max-width: 1657px) 100vw, 1657px" /></p>
<p>Über den Button &#8222;Try it out&#8220; kann direkt mit dem Endpunkt interagiert werden.</p>
<h2>Swagger API Dokumentation mit Parametern</h2>
<p>Diese Variante empfiehlt sich eher für kleinere Projekte. Zunächst müssen diese beiden Swagger Bibliotheken in das Projekt eingebunden werden:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">npm install --save-dev @types/swagger-jsdoc 
npm install --save swagger-jsdoc</pre>
<p>Die Bibliotheken werden in app.ts bzw. für nicht Typescript Nutzer app.js konfiguriert. Aufgrund der hier festgelegten Konfiguration befindet sich die Dokumentation unter „/api-docs“:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-title="app.ts">import express from "express";
import bodyParser from "body-parser";
import exampleRoutes from "./routes/example-route";
import swaggerJSDoc from "swagger-jsdoc";
import swaggerUi from "swagger-ui-express";

const app = express();

const options = {
  definition: {
    openapi: "3.0.1",
    info: {
      title: "REST API for Swagger Documentation",
      version: "1.0.0",
    },
    schemes: ["http", "https"],
    servers: [{ url: "http://localhost:3000/" }],
  },
  apis: [
    `${__dirname}/routes/example-route.ts`,
    "./dist/routes/example-route.js",
  ],
};

const swaggerSpec = swaggerJSDoc(options);

app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec));
app.use(bodyParser.json());
app.use(exampleRoutes);

app.listen(3000);</pre>
<p>Der Endpunkt wird mit den Parametern folgendermaßen beschrieben:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-title="example-route.ts">import { Router } from "express";
import { exampleFunction } from "../controller/example";

const router = Router();

/**
 * @swagger
 * /example:
 *      post:
 *          summary: Send the text to the server
 *          tags:
 *              - ExampleEndpoints
 *          description: Send a message to the server and get a response added to the original text.
 *          requestBody:
 *              required: true
 *              content:
 *                  application/json:
 *                      schema:
 *                          type: object
 *                          properties:
 *                              responseText:
 *                                  type: string
 *                                  example: This is some example string! This is an endpoint
 *          responses:
 *              201:
 *                  description: Success
 *                  content:
 *                      application/json:
 *                          schema:
 *                              type: object
 *                              properties:
 *                                  text:
 *                                      type: string
 *                                      example: This is some example string!
 *              404:
 *                  description: Not found
 *              500:
 *                  description: Internal server error
 */
router.post("/example", exampleFunction);

export default router;
</pre>
<h2>Swagger API Dokumentation mit swagger.json</h2>
<p>Um eine bessere Übersicht zu haben und um die Dokumentation nicht mit dem eigentlichen Code zu vermischen empfiehlt sich die Nutzung einer, oder gar mehrerer json Dateien. Bei der Nutzung von TypeScript muss die Swagger.json Datei in die rootDirectory:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1276 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/10/foulderStructureOfSwaggerJson.jpg" alt="Foulder Structure with Swagger.json" width="170" height="344" srcset="https://nerd-corner.com/wp-content/uploads/2022/10/foulderStructureOfSwaggerJson.jpg 199w, https://nerd-corner.com/wp-content/uploads/2022/10/foulderStructureOfSwaggerJson-148x300.jpg 148w" sizes="auto, (max-width: 170px) 100vw, 170px" /></p>
<p>Auch hier wirdzunächst die Konfiguration in app.ts bzw. für nicht Typescript Nutzer in app.js festgelegt. Hier wird ebenfalls der Domainpfad „/api-docs“ für die Dokumentation gewählt:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-title="app.ts">import express from "express";
import bodyParser from "body-parser";
import exampleRoutes from "./routes/example-route";
import swaggerUi from "swagger-ui-express";

import * as swaggerDocument from "./swagger.json";

const app = express();

app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument));

app.use(bodyParser.json());

app.use(exampleRoutes);

app.listen(3000);</pre>
<p>Wichtiger Hinweis: Um JSON Dateien in ein Typescript Projekt zu importieren muss dies in der tsconfig.json erlaubt werden. Außerdem muss die JSON Datei sich in der root directory befinden:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-title="tsconfig.json">{
  "compilerOptions": {
    "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
    "module": "commonjs" /* Specify what module code is generated. */,
    "rootDir": "./src" /* Specify the root folder within your source files. */,
    "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
    "resolveJsonModule": true /* Enable importing .json files. */,
    "outDir": "./dist" /* Specify an output folder for all emitted files. */,
    "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
    "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
    "strict": true /* Enable all strict type-checking options. */,
    "skipLibCheck": true /* Skip type checking all .d.ts files. */
  }
}</pre>
<p>Die vorherige Swagger Dokumentation mit Parametern würde somit in der swagger.json folgendermaßen aussehen:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
  "openapi": "3.0.1",
  "info": {
    "title": "REST API for Swagger Documentation",
    "version": "1.0.0"
  },
  "schemes": ["http"],
  "servers": [{ "url": "http://localhost:3000/" }],
  "paths": {
    "/example": {
      "post": {
        "tags": ["ExampleEndpoints"],
        "summary": "Send a text to the server",
        "description": "Send a message to the server and get a response added to the original text.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExampleSchemaHeader"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExampleSchemaBody"
                }
              }
            }
          },
          "404": { "description": "Not found" },
          "500": { "description": "Internal server error" }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ExampleSchemaBody": {
        "properties": {
          "responseText": {
            "type": "string",
            "example": "This is some example string! This is an endpoint"
          }
        }
      },
      "ExampleSchemaHeader": {
        "required": ["text"],
        "properties": {
          "text": {
            "type": "string",
            "example": "This is some example string!"
          }
        }
      }
    }
  }
}
</pre>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a href="https://github.com/hanneslim/Node-with-swagger-params" target="_blank" rel="noopener">Github Beispielprojekt für swagger Parameter</a></li>
<li><a href="https://github.com/hanneslim/node-with-swagger-json" target="_blank" rel="noopener">Github Beispielprojekt für swagger.json</a></li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/">Swagger Api Doku zu Node Server hinzufügen</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/swagger-api-doku-zu-node-server-hinzufuegen/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
