<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[forum.technik-hobby.de - Alle Foren]]></title>
		<link>https://forum.technik-hobby.de/</link>
		<description><![CDATA[forum.technik-hobby.de - https://forum.technik-hobby.de]]></description>
		<pubDate>Sat, 18 Apr 2026 13:44:13 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Mit Powerstation Auto starten]]></title>
			<link>https://forum.technik-hobby.de/thread-107.html</link>
			<pubDate>Wed, 02 Nov 2022 22:36:58 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=131">RobertoKalla11</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-107.html</guid>
			<description><![CDATA[Hallo,<br />
ich möchte mir eine Powerstation kaufen mit der ich mein Auto starten kann. Geht sowas und was für eine brauche ich da für eine ? <br />
<br />
Grüße Robert]]></description>
			<content:encoded><![CDATA[Hallo,<br />
ich möchte mir eine Powerstation kaufen mit der ich mein Auto starten kann. Geht sowas und was für eine brauche ich da für eine ? <br />
<br />
Grüße Robert]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Dashcam]]></title>
			<link>https://forum.technik-hobby.de/thread-106.html</link>
			<pubDate>Sat, 27 Aug 2022 15:15:39 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=129">KarinaKlee34</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-106.html</guid>
			<description><![CDATA[Hallo,<br />
Ich habe gehört das sich in Merseburg am Fußgängerüberweg am Döner im Zentrum leider hin und wieder Asylbewerber vor Autos werfen, um bewusst angefahren zu werden. Ich habe absolut nichts gegen Asylbewerber aber die Sachverhalte sind dort polizeilich bekannt. Nun möchte ich mir eine Dashcam in mein Auto hängen. So eine Dashcam kann ja auch in anderen Situationen gut sein wenn ein Unfall ist und der schuldige seine Schuld abstreitet. Ich weis nur nicht so richte ob das Sinn macht, weil man ja nicht einfach öffentliche Bereiche Videoüberwachen darf. Da gibt es ja dieses komische Datenschutzgesetz. Es wäre ja sinnlos wenn ich mir eine Dashcam in das Auto hänge und das Video vom Richter zum Beispiel nicht erkannt wird. Was sagt ihr dazu ?  Was sind eure Erfahrungen ? Werden Dashcam Videos von der Polizei und vom Richter anerkannt ? <br />
<br />
Grüße Karina]]></description>
			<content:encoded><![CDATA[Hallo,<br />
Ich habe gehört das sich in Merseburg am Fußgängerüberweg am Döner im Zentrum leider hin und wieder Asylbewerber vor Autos werfen, um bewusst angefahren zu werden. Ich habe absolut nichts gegen Asylbewerber aber die Sachverhalte sind dort polizeilich bekannt. Nun möchte ich mir eine Dashcam in mein Auto hängen. So eine Dashcam kann ja auch in anderen Situationen gut sein wenn ein Unfall ist und der schuldige seine Schuld abstreitet. Ich weis nur nicht so richte ob das Sinn macht, weil man ja nicht einfach öffentliche Bereiche Videoüberwachen darf. Da gibt es ja dieses komische Datenschutzgesetz. Es wäre ja sinnlos wenn ich mir eine Dashcam in das Auto hänge und das Video vom Richter zum Beispiel nicht erkannt wird. Was sagt ihr dazu ?  Was sind eure Erfahrungen ? Werden Dashcam Videos von der Polizei und vom Richter anerkannt ? <br />
<br />
Grüße Karina]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Barcode-Scanner (Tastatur-Emulation) und Tastatur gleichzeitig benutzen]]></title>
			<link>https://forum.technik-hobby.de/thread-105.html</link>
			<pubDate>Sun, 31 Jul 2022 17:21:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-105.html</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Problem:</span><br />
Wenn man einen Barcode-Scanner besitzt, der eine Tastaureingabe emuliert und man zusätzlich aber auch ein oder mehrere Eingabefelder für andere Daten haben will, so ist es schwierig die Eingabe von Barcode-Scanner nur in dem dafür vorgesehenen Eingabefeld einzutragen. Normalerweise wird der Barcode einfach als Tastatureingabe gesendet und landet somit in dem Eingabefeld, das gerade den Eingabefokus besitzt.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lösung:</span><br />
Es gibt eine Möglichkeit, die Eingabe vom Barcode-Scanner zu erkennen. Dafür muss man das InputDevice registrieren (der DeviceName dient dabei der Unterscheidung).<br />
Mein Script habe ich ausführlich kommentiert, sodass hoffentlich verständlich wird, wie man sein eigenes Script anpassen muss, um diese Lösung verwenden zu können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=170" target="_blank" title="">!BarcodeScanner.au3</a> (Größe: 4,73 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Problem:</span><br />
Wenn man einen Barcode-Scanner besitzt, der eine Tastaureingabe emuliert und man zusätzlich aber auch ein oder mehrere Eingabefelder für andere Daten haben will, so ist es schwierig die Eingabe von Barcode-Scanner nur in dem dafür vorgesehenen Eingabefeld einzutragen. Normalerweise wird der Barcode einfach als Tastatureingabe gesendet und landet somit in dem Eingabefeld, das gerade den Eingabefokus besitzt.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lösung:</span><br />
Es gibt eine Möglichkeit, die Eingabe vom Barcode-Scanner zu erkennen. Dafür muss man das InputDevice registrieren (der DeviceName dient dabei der Unterscheidung).<br />
Mein Script habe ich ausführlich kommentiert, sodass hoffentlich verständlich wird, wie man sein eigenes Script anpassen muss, um diese Lösung verwenden zu können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=170" target="_blank" title="">!BarcodeScanner.au3</a> (Größe: 4,73 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[AutoIt-Spritpreis]]></title>
			<link>https://forum.technik-hobby.de/thread-103.html</link>
			<pubDate>Sun, 26 Dec 2021 19:02:56 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-103.html</guid>
			<description><![CDATA[Bei <span style="font-weight: bold;" class="mycode_b">AutoIt-Spritpreis</span> handelt es sich um ein Programm, dass die aktuellen Spritpreise (E5, E10 und Diesel) einer, vom Benutzer ausgewählten, Tankstelle anzeigt.<br />
Die Preise werden alle 10 Minuten von "www.tankerkoenig.de" abgefragt und im Programmfenster angezeigt.<br />
<br />
<br />
<br />
Die gewünschte Tankstelle kann in einer Umkreissuche ermittelt werden:<br />
<br />
Eingegeben wird der Ort (evtl. plus Straße) und der Suchradius und dann wird mit Hilfe von OpenStreetMap Längen-/Breitengrad ermittelt. Mit diesen Daten wird dann bei "www.tankerkoenig.de" eine Umkreissuche durchgeführt. So kann man die gewünschte Tankstelle auswählen.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tankerkoenig.de verlangt allerdings, das jeder Nutzer einen eigenen API-Key beantragen muss: <a href="https://creativecommons.tankerkoenig.de/" target="_blank" rel="noopener" class="mycode_url">https://creativecommons.tankerkoenig.de/</a></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #ff0000;" class="mycode_color">Dieser API-Key darf nicht veröffentlicht werden!</span></span><br />
<br />
Deshalb fragt mein Programm diesen Key einmalig bei Programmstart ab und speichert ihn in der Windows-Registry des Benutzers.<br />
<br />
<br />
<br />
Das Script und alle benötigten Dateien befinden sich im ZIP-Archiv (Anhang).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Edit 25.12.2021 Version 1.2.1.0:</span><br />
<br />
Eine neue Version!<br />
<br />
- Es wird getestet, ob der Server von Tankerkoenig.de online ist.<br />
<br />
- Die Öffnungszeiten der Tankstelle werden als Tooltip bei dem grünen/roten Balken angezeigt. Danke für den Hinweis, Bitnugger!<br />
<br />
- Kleinere Änderungen am Code.<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Screenshots:</span></span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=166" target="_blank" title="">Spritpreis0.jpg</a> (Größe: 38,43 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment --> <!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=167" target="_blank" title="">Spritpreis1.jpg</a> (Größe: 44,11 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --> <!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=168" target="_blank" title="">Spritpreis2.jpg</a> (Größe: 115,82 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=169" target="_blank" title="">AutoIt-Spritpreis_v1_2.zip</a> (Größe: 1,15 MB / Downloads: 7)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Bei <span style="font-weight: bold;" class="mycode_b">AutoIt-Spritpreis</span> handelt es sich um ein Programm, dass die aktuellen Spritpreise (E5, E10 und Diesel) einer, vom Benutzer ausgewählten, Tankstelle anzeigt.<br />
Die Preise werden alle 10 Minuten von "www.tankerkoenig.de" abgefragt und im Programmfenster angezeigt.<br />
<br />
<br />
<br />
Die gewünschte Tankstelle kann in einer Umkreissuche ermittelt werden:<br />
<br />
Eingegeben wird der Ort (evtl. plus Straße) und der Suchradius und dann wird mit Hilfe von OpenStreetMap Längen-/Breitengrad ermittelt. Mit diesen Daten wird dann bei "www.tankerkoenig.de" eine Umkreissuche durchgeführt. So kann man die gewünschte Tankstelle auswählen.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tankerkoenig.de verlangt allerdings, das jeder Nutzer einen eigenen API-Key beantragen muss: <a href="https://creativecommons.tankerkoenig.de/" target="_blank" rel="noopener" class="mycode_url">https://creativecommons.tankerkoenig.de/</a></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #ff0000;" class="mycode_color">Dieser API-Key darf nicht veröffentlicht werden!</span></span><br />
<br />
Deshalb fragt mein Programm diesen Key einmalig bei Programmstart ab und speichert ihn in der Windows-Registry des Benutzers.<br />
<br />
<br />
<br />
Das Script und alle benötigten Dateien befinden sich im ZIP-Archiv (Anhang).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Edit 25.12.2021 Version 1.2.1.0:</span><br />
<br />
Eine neue Version!<br />
<br />
- Es wird getestet, ob der Server von Tankerkoenig.de online ist.<br />
<br />
- Die Öffnungszeiten der Tankstelle werden als Tooltip bei dem grünen/roten Balken angezeigt. Danke für den Hinweis, Bitnugger!<br />
<br />
- Kleinere Änderungen am Code.<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Screenshots:</span></span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=166" target="_blank" title="">Spritpreis0.jpg</a> (Größe: 38,43 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment --> <!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=167" target="_blank" title="">Spritpreis1.jpg</a> (Größe: 44,11 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --> <!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=168" target="_blank" title="">Spritpreis2.jpg</a> (Größe: 115,82 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=169" target="_blank" title="">AutoIt-Spritpreis_v1_2.zip</a> (Größe: 1,15 MB / Downloads: 7)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[NeoPixelClock]]></title>
			<link>https://forum.technik-hobby.de/thread-101.html</link>
			<pubDate>Sat, 08 Feb 2020 15:01:53 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-101.html</guid>
			<description><![CDATA[So ein NeoPixel-Ring mit 60 LEDs (WS2812) eignet sich ja sehr gut zum basteln einer Uhr. Das wurde ja auch schon diverse Male gemacht. Ich wollte aber nichts nachbauen, sondern sie komplett neu bauen.<br />
Meine NeoPixelClock besteht aus dem NeoPixel-Ring, einer 8fach 7-Segment-Anzeige (mit MAX7219) zur Anzeige des Datums (dd.mm.jjjj), einem Luxmeter (BH1750) zum regeln der Helligkeit, sowie einem Wemos D1 mini als zentralen Microcontroller.<br />
Eingebaut habe ich das Ganze in ein Uhrengehäuse, bei dem ich die Zeiger und das Uhrwerk ausgebaut habe. <br />
Der Durchmesser des Gehäuses von 25cm und das große Ziffernblatt passt ziemlich gut zu dem NeoPixel-Ring und dort, wo vorher das Uhrwerk drin war, kann man gut den Wemos D1 mini unterbringen.<br />
<br />
Hier mal zwei Bilder von der fertigen Uhr:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=162" target="_blank" title="">NeoPixelClock_v.jpg</a> (Größe: 329,49 KB / Downloads: 17)
<!-- end: postbit_attachments_attachment --><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=161" target="_blank" title="">NeoPixelClock_h.jpg</a> (Größe: 268,48 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br />
<br />
In echt sieht die Uhr cooler aus. Das kann man auf dem Foto nicht so gut einfangen. Ich musste ziemlich abblenden, damit die LEDs das nicht überstrahlen und da macht mein Smartphone keine so guten Bilder.<br />
Die Stunden werden mit drei LEDs dargestellt, die vormittags (0-11 Uhr) in Blau und nachmittags (12-23 Uhr) in Lila leuchten. Die Minuten leuchten in Grün und die Sekunden in Rot. Außerdem gibt es noch Stundenmarkierungen, die in Weiß leuchten (dunkler als die anderen LEDs).<br />
In der Mitte befindet sich die 8fach 7-Segment-Anzeige mit dem Datum (in Rot) und darunter kann man den BH1750 erkennen, der die Helligkeit ermittelt und so die Helligkeit der Anzeigen entsprechend regelt.<br />
<br />
Der Wemos kann per WPS-Button ins WLAN befördert werden und holt sich dann per NTP das aktuelle Datum und die aktuelle Uhrzeit, sodass die Uhr immer sekundengenau geht.<br />
Außerdem läuft noch ein kleiner HTTP-Server, der eine Infoseite ausliefert und mit dem man den Sylvester-Countdown als Test starten kann.<br />
Der Sylvester-Countdown zeigt am 31.12. umd 23:59 die letzten 60 Sekunden als rote LEDs an und zählt dann rückwärts. Das sieht ganz cool aus. <img src="https://www.arduinoforum.de/images/smilies/biggrin.gif" loading="lazy"  alt="[Bild: biggrin.gif]" class="mycode_img" /><br />
<br />
Und ich habe auch die OTA-Updatefunktion eingebaut, damit ich die Uhr per WLAN updaten kann.<br />
<br />
Schaltplan:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=163" target="_blank" title="">NeoPixelClock.GIF</a> (Größe: 50,97 KB / Downloads: 13)
<!-- end: postbit_attachments_attachment --><br />
<br />
Den Sketch gibt es im ZIP-Archiv (Anhang).<br />
<br />
Nochwas zum Stromverbrauch. Der liegt zwischen 160mA und 360mA (je nachdem, wie weit die LEDs "aufgedreht" werden). Also nichts für Batteriebetrieb.<br />
Ich benutze hier ein 5V / 1A USB-Steckernetzteil (hatte ich noch rumliegen).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=164" target="_blank" title="">NeoPixelClock_D1mini.zip</a> (Größe: 5,48 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[So ein NeoPixel-Ring mit 60 LEDs (WS2812) eignet sich ja sehr gut zum basteln einer Uhr. Das wurde ja auch schon diverse Male gemacht. Ich wollte aber nichts nachbauen, sondern sie komplett neu bauen.<br />
Meine NeoPixelClock besteht aus dem NeoPixel-Ring, einer 8fach 7-Segment-Anzeige (mit MAX7219) zur Anzeige des Datums (dd.mm.jjjj), einem Luxmeter (BH1750) zum regeln der Helligkeit, sowie einem Wemos D1 mini als zentralen Microcontroller.<br />
Eingebaut habe ich das Ganze in ein Uhrengehäuse, bei dem ich die Zeiger und das Uhrwerk ausgebaut habe. <br />
Der Durchmesser des Gehäuses von 25cm und das große Ziffernblatt passt ziemlich gut zu dem NeoPixel-Ring und dort, wo vorher das Uhrwerk drin war, kann man gut den Wemos D1 mini unterbringen.<br />
<br />
Hier mal zwei Bilder von der fertigen Uhr:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=162" target="_blank" title="">NeoPixelClock_v.jpg</a> (Größe: 329,49 KB / Downloads: 17)
<!-- end: postbit_attachments_attachment --><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=161" target="_blank" title="">NeoPixelClock_h.jpg</a> (Größe: 268,48 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br />
<br />
In echt sieht die Uhr cooler aus. Das kann man auf dem Foto nicht so gut einfangen. Ich musste ziemlich abblenden, damit die LEDs das nicht überstrahlen und da macht mein Smartphone keine so guten Bilder.<br />
Die Stunden werden mit drei LEDs dargestellt, die vormittags (0-11 Uhr) in Blau und nachmittags (12-23 Uhr) in Lila leuchten. Die Minuten leuchten in Grün und die Sekunden in Rot. Außerdem gibt es noch Stundenmarkierungen, die in Weiß leuchten (dunkler als die anderen LEDs).<br />
In der Mitte befindet sich die 8fach 7-Segment-Anzeige mit dem Datum (in Rot) und darunter kann man den BH1750 erkennen, der die Helligkeit ermittelt und so die Helligkeit der Anzeigen entsprechend regelt.<br />
<br />
Der Wemos kann per WPS-Button ins WLAN befördert werden und holt sich dann per NTP das aktuelle Datum und die aktuelle Uhrzeit, sodass die Uhr immer sekundengenau geht.<br />
Außerdem läuft noch ein kleiner HTTP-Server, der eine Infoseite ausliefert und mit dem man den Sylvester-Countdown als Test starten kann.<br />
Der Sylvester-Countdown zeigt am 31.12. umd 23:59 die letzten 60 Sekunden als rote LEDs an und zählt dann rückwärts. Das sieht ganz cool aus. <img src="https://www.arduinoforum.de/images/smilies/biggrin.gif" loading="lazy"  alt="[Bild: biggrin.gif]" class="mycode_img" /><br />
<br />
Und ich habe auch die OTA-Updatefunktion eingebaut, damit ich die Uhr per WLAN updaten kann.<br />
<br />
Schaltplan:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=163" target="_blank" title="">NeoPixelClock.GIF</a> (Größe: 50,97 KB / Downloads: 13)
<!-- end: postbit_attachments_attachment --><br />
<br />
Den Sketch gibt es im ZIP-Archiv (Anhang).<br />
<br />
Nochwas zum Stromverbrauch. Der liegt zwischen 160mA und 360mA (je nachdem, wie weit die LEDs "aufgedreht" werden). Also nichts für Batteriebetrieb.<br />
Ich benutze hier ein 5V / 1A USB-Steckernetzteil (hatte ich noch rumliegen).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=164" target="_blank" title="">NeoPixelClock_D1mini.zip</a> (Größe: 5,48 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_GraphicsDrawStringRotate]]></title>
			<link>https://forum.technik-hobby.de/thread-100.html</link>
			<pubDate>Tue, 04 Feb 2020 18:31:18 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-100.html</guid>
			<description><![CDATA[Ich habe hier eine Funktion geschrieben, mit der man einen String auf eine GDI+ Graphic zeichnen lassen kann.<br />
Das Besondere daran ist, dass man den String um 90, 180 oder 270 Grad gedreht zeichnen lassen kann. Außerdem kann man Fontname, Schriftgröße, Schriftstil und die Ausrichtung (links, zentriert, rechts) angeben.<br />
Auch mehrzeilige Strings sind möglich.<br />
Im Beispiel habe ich außerdem einen Backbuffer mit eingebaut, um zu zeigen, wie man mit GDI+ auf andere Fenster (überlagernd) reagieren muss.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit:</span> Neue Version!</span> Man kann jetzt auch die <span style="color: #ff0000;" class="mycode_color">Schriftfarbe</span> angeben. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
<br />
Screenshot:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">Screenshot.png</a> (Größe: 363,44 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">_GDIPlus_GraphicsDrawRotateString.au3</a> (Größe: 5,78 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ich habe hier eine Funktion geschrieben, mit der man einen String auf eine GDI+ Graphic zeichnen lassen kann.<br />
Das Besondere daran ist, dass man den String um 90, 180 oder 270 Grad gedreht zeichnen lassen kann. Außerdem kann man Fontname, Schriftgröße, Schriftstil und die Ausrichtung (links, zentriert, rechts) angeben.<br />
Auch mehrzeilige Strings sind möglich.<br />
Im Beispiel habe ich außerdem einen Backbuffer mit eingebaut, um zu zeigen, wie man mit GDI+ auf andere Fenster (überlagernd) reagieren muss.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit:</span> Neue Version!</span> Man kann jetzt auch die <span style="color: #ff0000;" class="mycode_color">Schriftfarbe</span> angeben. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
<br />
Screenshot:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">Screenshot.png</a> (Größe: 363,44 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">_GDIPlus_GraphicsDrawRotateString.au3</a> (Größe: 5,78 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[LED-Tester]]></title>
			<link>https://forum.technik-hobby.de/thread-99.html</link>
			<pubDate>Fri, 31 Jan 2020 07:00:31 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-99.html</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">LED-Tester </span><br />
Da mir das Testen von LEDs mit dem Multimeter zu blöd war, vor allem, weil sie dabei nicht leuchten und man die Helligkeit beurteilen kann, habe ich mir einen LED-Tester gebaut.<br />
Aufgebaut auf einer, selbst erstellten, doppelseitigen Platine. Mit zehn LM317 (die im TO92-Gehäuse) als Konstantstromquelle (5 verschiedene Ströme mal jeweils 2 Steckplätze).<br />
Damit stehen folgende Ströme zum testen zur Verfügung: 2mA, 5mA, 10mA, 15mA und 20mA.<br />
Durch die unterschiedlichen Ströme kann man beim entwickeln durchtesten, bei welchem Strom die gewünschte Helligkeit erreicht wird. Und dadurch, dass jeweils zwei Steckplätze vorhanden sind, kann man testen, ob zwei LEDs auch gleich hell leuchten. Das ist ganz hilfreich, wenn die LEDs aus der "Grabbelkiste" sind und man die genauen Daten nicht kennt.<br />
Für den Stromanschluss habe ich eine Mikro-USB-Buchse vorgesehen. Es gibt so fertige <a href="https://www.amazon.de/Keenso-St%C3%BCcke-Breakout-Adapter-Stecker/dp/B07R9SMJKF/ref=pd_day0_hl_147_10?_encoding=UTF8&amp;pd_rd_i=B07R9SMJKF&amp;pd_rd_r=a498d9ac-4293-48e8-afec-19ed8b24ddde&amp;pd_rd_w=Rbe1f&amp;pd_rd_wg=m0A6R&amp;pf_rd_p=c1c0c313-b950-46bd-9af0-83d42e9e421e&amp;pf_rd_r=95ZXBP3YQYNBF3Z8XX0R&amp;psc=1&amp;refRID=95ZXBP3YQYNBF3Z8XX0R" target="_blank" rel="noopener" class="mycode_url">Breakout-Platinen</a>, wo die USB-Buchse auf eine 5polige Stiftleiste geführt wird. Meine Platine habe ich passend dazu angepasst, sodass ich die dort einlöten kann.<br />
Hier mal ein Bild von der Platine:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=148" target="_blank" title="">LED-Tester.gif</a> (Größe: 57,84 KB / Downloads: 1072)
<!-- end: postbit_attachments_attachment --><br />
<br />
Und vom fertigen Aufbau:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=149" target="_blank" title="">LED-Tester.jpg</a> (Größe: 200,84 KB / Downloads: 1034)
<!-- end: postbit_attachments_attachment --><br />
<br />
Wer sich auch so eine Platine anfertigen lassen will, darf gern die Gerberdateien benutzen (ZIP-Archiv, Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=150" target="_blank" title="">LED-Tester.zip</a> (Größe: 10,13 KB / Downloads: 968)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">LED-Tester </span><br />
Da mir das Testen von LEDs mit dem Multimeter zu blöd war, vor allem, weil sie dabei nicht leuchten und man die Helligkeit beurteilen kann, habe ich mir einen LED-Tester gebaut.<br />
Aufgebaut auf einer, selbst erstellten, doppelseitigen Platine. Mit zehn LM317 (die im TO92-Gehäuse) als Konstantstromquelle (5 verschiedene Ströme mal jeweils 2 Steckplätze).<br />
Damit stehen folgende Ströme zum testen zur Verfügung: 2mA, 5mA, 10mA, 15mA und 20mA.<br />
Durch die unterschiedlichen Ströme kann man beim entwickeln durchtesten, bei welchem Strom die gewünschte Helligkeit erreicht wird. Und dadurch, dass jeweils zwei Steckplätze vorhanden sind, kann man testen, ob zwei LEDs auch gleich hell leuchten. Das ist ganz hilfreich, wenn die LEDs aus der "Grabbelkiste" sind und man die genauen Daten nicht kennt.<br />
Für den Stromanschluss habe ich eine Mikro-USB-Buchse vorgesehen. Es gibt so fertige <a href="https://www.amazon.de/Keenso-St%C3%BCcke-Breakout-Adapter-Stecker/dp/B07R9SMJKF/ref=pd_day0_hl_147_10?_encoding=UTF8&amp;pd_rd_i=B07R9SMJKF&amp;pd_rd_r=a498d9ac-4293-48e8-afec-19ed8b24ddde&amp;pd_rd_w=Rbe1f&amp;pd_rd_wg=m0A6R&amp;pf_rd_p=c1c0c313-b950-46bd-9af0-83d42e9e421e&amp;pf_rd_r=95ZXBP3YQYNBF3Z8XX0R&amp;psc=1&amp;refRID=95ZXBP3YQYNBF3Z8XX0R" target="_blank" rel="noopener" class="mycode_url">Breakout-Platinen</a>, wo die USB-Buchse auf eine 5polige Stiftleiste geführt wird. Meine Platine habe ich passend dazu angepasst, sodass ich die dort einlöten kann.<br />
Hier mal ein Bild von der Platine:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=148" target="_blank" title="">LED-Tester.gif</a> (Größe: 57,84 KB / Downloads: 1072)
<!-- end: postbit_attachments_attachment --><br />
<br />
Und vom fertigen Aufbau:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=149" target="_blank" title="">LED-Tester.jpg</a> (Größe: 200,84 KB / Downloads: 1034)
<!-- end: postbit_attachments_attachment --><br />
<br />
Wer sich auch so eine Platine anfertigen lassen will, darf gern die Gerberdateien benutzen (ZIP-Archiv, Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=150" target="_blank" title="">LED-Tester.zip</a> (Größe: 10,13 KB / Downloads: 968)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Countdown-Timer mit I2C-LCD]]></title>
			<link>https://forum.technik-hobby.de/thread-98.html</link>
			<pubDate>Wed, 15 Jan 2020 14:46:04 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-98.html</guid>
			<description><![CDATA[Dieses Programm stellt einen Countdown-Timer dar.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Zuerst mal die benötigte Hardware:</span></span><br />
1. Einen Arduino Nano oder Clone (<a href="https://www.berrybase.de/raspberry-pi-co/arduino/boards/kompatibler-arduino-nano-mit-atmel-mega-328p-prozessor-ch340g-usb-chipsatz?c=300" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/raspberry-pi-co...satz?c=300</a>)<br />
2. Ein Standard 16x2 LCD  (<a href="https://www.berrybase.de/raspberry-pi-co/raspberry-pi/displays/lcd-16x2-gr-252-n/gelb?c=123" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/raspberry-pi-co...gelb?c=123</a>)<br />
3. Ein I2C-Backpack (<a href="https://www.berrybase.de/bauelemente/aktive-bauelemente/displays/alphanumerische-displays/iic/i2c-interface-f-252-r-1602/2004-displays?c=123" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/akt...lays?c=123</a>)<br />
4. Einen Drehencoder (<a href="https://www.berrybase.de/bauelemente/passive-bauelemente/potentiometer/drehimpulsgeber/drehregler/rotary-encoder-mit-breakoutboard?c=164" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/pas...oard?c=164</a>)<br />
5. Einen Taster (<a href="https://www.berrybase.de/bauelemente/schalter-taster/mikroschalter-taster/kurzhubtaster-vertikale-printmontage-6x6mm-h-5-0mm?c=86" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/sch...5-0mm?c=86</a>)<br />
6. Ein Relais-Modul (<a href="https://www.berrybase.de/bauelemente/sensoren-module/relaiskarten/5v-1-kanal-relais-modul" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/sen...lais-modul</a>)<br />
7. Ein 5V Netzteil (<a href="https://www.berrybase.de/strom/netzteile/stecker-tischnetzteile/schaltnetzteil-5v-dc-2a-2000ma-mit-hohlstecker-3-5-x-1-35-mm-schwarz?c=393" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/strom/netzteile...warz?c=393</a>)<br />
<br />
Gesamtkosten: ca. 20 € (plus Versandkosten)<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Schaltplan:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=146" target="_blank" title="">Countdown-Timer.GIF</a> (Größe: 42,24 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment --><br />
<br />
Mein Programm bietet nun die Möglichkeit, die Minuten (0 bis 99) und die Sekunden (0 bis 59) mit Hilfe des Drehencoders einzugeben. Die Klickfunktion des Encoders wird benutzt, um zwischen der Eingabe der Minuten und der Sekunden hin- und herzuschalten.<br />
Mit dem Taster (S1 im Schaltplan) kann man den Countdown starten/stoppen.<br />
Das Relaismodul ist dazu da, dass man damit ein Gerät (z.B. eine Lampe) für diese Zeit einschalten kann und auf dem LCD wird die Restzeit (Minuten/Sekunden) fortlaufend angezeigt.<br />
<br />
Das Programm befindet sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=147" target="_blank" title="">I2C_Countdown.zip</a> (Größe: 2,05 KB / Downloads: 19)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Dieses Programm stellt einen Countdown-Timer dar.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Zuerst mal die benötigte Hardware:</span></span><br />
1. Einen Arduino Nano oder Clone (<a href="https://www.berrybase.de/raspberry-pi-co/arduino/boards/kompatibler-arduino-nano-mit-atmel-mega-328p-prozessor-ch340g-usb-chipsatz?c=300" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/raspberry-pi-co...satz?c=300</a>)<br />
2. Ein Standard 16x2 LCD  (<a href="https://www.berrybase.de/raspberry-pi-co/raspberry-pi/displays/lcd-16x2-gr-252-n/gelb?c=123" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/raspberry-pi-co...gelb?c=123</a>)<br />
3. Ein I2C-Backpack (<a href="https://www.berrybase.de/bauelemente/aktive-bauelemente/displays/alphanumerische-displays/iic/i2c-interface-f-252-r-1602/2004-displays?c=123" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/akt...lays?c=123</a>)<br />
4. Einen Drehencoder (<a href="https://www.berrybase.de/bauelemente/passive-bauelemente/potentiometer/drehimpulsgeber/drehregler/rotary-encoder-mit-breakoutboard?c=164" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/pas...oard?c=164</a>)<br />
5. Einen Taster (<a href="https://www.berrybase.de/bauelemente/schalter-taster/mikroschalter-taster/kurzhubtaster-vertikale-printmontage-6x6mm-h-5-0mm?c=86" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/sch...5-0mm?c=86</a>)<br />
6. Ein Relais-Modul (<a href="https://www.berrybase.de/bauelemente/sensoren-module/relaiskarten/5v-1-kanal-relais-modul" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/bauelemente/sen...lais-modul</a>)<br />
7. Ein 5V Netzteil (<a href="https://www.berrybase.de/strom/netzteile/stecker-tischnetzteile/schaltnetzteil-5v-dc-2a-2000ma-mit-hohlstecker-3-5-x-1-35-mm-schwarz?c=393" target="_blank" rel="noopener" class="mycode_url">https://www.berrybase.de/strom/netzteile...warz?c=393</a>)<br />
<br />
Gesamtkosten: ca. 20 € (plus Versandkosten)<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Schaltplan:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=146" target="_blank" title="">Countdown-Timer.GIF</a> (Größe: 42,24 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment --><br />
<br />
Mein Programm bietet nun die Möglichkeit, die Minuten (0 bis 99) und die Sekunden (0 bis 59) mit Hilfe des Drehencoders einzugeben. Die Klickfunktion des Encoders wird benutzt, um zwischen der Eingabe der Minuten und der Sekunden hin- und herzuschalten.<br />
Mit dem Taster (S1 im Schaltplan) kann man den Countdown starten/stoppen.<br />
Das Relaismodul ist dazu da, dass man damit ein Gerät (z.B. eine Lampe) für diese Zeit einschalten kann und auf dem LCD wird die Restzeit (Minuten/Sekunden) fortlaufend angezeigt.<br />
<br />
Das Programm befindet sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=147" target="_blank" title="">I2C_Countdown.zip</a> (Größe: 2,05 KB / Downloads: 19)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Wemos D1 mini mit WPS-Pushbutton]]></title>
			<link>https://forum.technik-hobby.de/thread-97.html</link>
			<pubDate>Wed, 15 Jan 2020 14:15:54 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-97.html</guid>
			<description><![CDATA[Um einen "Wemos D1 mini" (oder einen anderen ESP8266) mit dem WLAN zu verbinden, muss man nicht unbedingt SSID und PSK im Programm mitgeben.<br />
Das würde den Betrieb ja auch auf das eine WLAN beschränken.<br />
Es gibt auch die Möglichkeit, einen Taster (einfach von D3 bzw. GPIO 0 nach GND) als WPS-Pushbutton zu benutzen:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=144" target="_blank" title="">Wemos D1 mini WPS.GIF</a> (Größe: 11,8 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br />
<br />
Die Funktion "WiFi.beginWPSConfig()" in der "ESP8266WiFi.h"-Library übernimmt dann den Datenaustausch mit dem Router.<br />
<br />
Ich habe ein Programm geschrieben, das folgendes ermöglicht:<br />
1. Man startet die WPS-Pushbutton-Methode auf dem WLAN-Router.<br />
2. Man hält die WPS-Taste am Wemos min. 2 Sekuden gedrückt, bis die WLAN-LED schnell blinkt.<br />
3. Dann lässt man die Taste los und wartet etwas (maximal dauert das 2 Minuten).<br />
4. Der Wemos verbindet sich mit dem WLAN.<br />
Wenn die Verbindung erfolgreich war, dann leuchtet die WLAN-LED nun dauerhaft. Wenn nicht, dann blitzt die LED einmal pro Sekunde kurz auf und man muss die Prozedur wiederholen.<br />
<br />
Bei erfolgreicher WLAN-Verbindung holt sich das Programm dann das aktuelle Datum/Uhrzeit von einem NTP-Server aus dem Internet.<br />
Außerdem habe ich noch die Möglichkeit eines "OverTheAir"-Updates (OTA) eingebaut. So kann man weitere Firmware-Updates über das WLAN durchführen.<br />
<br />
Das Programm befindet sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=145" target="_blank" title="">Wemos_WPS_Pushbutton.zip</a> (Größe: 2,6 KB / Downloads: 16)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Um einen "Wemos D1 mini" (oder einen anderen ESP8266) mit dem WLAN zu verbinden, muss man nicht unbedingt SSID und PSK im Programm mitgeben.<br />
Das würde den Betrieb ja auch auf das eine WLAN beschränken.<br />
Es gibt auch die Möglichkeit, einen Taster (einfach von D3 bzw. GPIO 0 nach GND) als WPS-Pushbutton zu benutzen:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=144" target="_blank" title="">Wemos D1 mini WPS.GIF</a> (Größe: 11,8 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br />
<br />
Die Funktion "WiFi.beginWPSConfig()" in der "ESP8266WiFi.h"-Library übernimmt dann den Datenaustausch mit dem Router.<br />
<br />
Ich habe ein Programm geschrieben, das folgendes ermöglicht:<br />
1. Man startet die WPS-Pushbutton-Methode auf dem WLAN-Router.<br />
2. Man hält die WPS-Taste am Wemos min. 2 Sekuden gedrückt, bis die WLAN-LED schnell blinkt.<br />
3. Dann lässt man die Taste los und wartet etwas (maximal dauert das 2 Minuten).<br />
4. Der Wemos verbindet sich mit dem WLAN.<br />
Wenn die Verbindung erfolgreich war, dann leuchtet die WLAN-LED nun dauerhaft. Wenn nicht, dann blitzt die LED einmal pro Sekunde kurz auf und man muss die Prozedur wiederholen.<br />
<br />
Bei erfolgreicher WLAN-Verbindung holt sich das Programm dann das aktuelle Datum/Uhrzeit von einem NTP-Server aus dem Internet.<br />
Außerdem habe ich noch die Möglichkeit eines "OverTheAir"-Updates (OTA) eingebaut. So kann man weitere Firmware-Updates über das WLAN durchführen.<br />
<br />
Das Programm befindet sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=145" target="_blank" title="">Wemos_WPS_Pushbutton.zip</a> (Größe: 2,6 KB / Downloads: 16)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[LED-Lauflicht]]></title>
			<link>https://forum.technik-hobby.de/thread-66.html</link>
			<pubDate>Thu, 30 May 2019 11:39:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-66.html</guid>
			<description><![CDATA[Hier ist mal eine kleine Lauflicht-Schaltung.<br />
Es werden 8 Low-Current-LEDs (2 mA pro LED) sowie 8 Widerstände mit 1.5 kOhm verwendet.<br />
Als Mikroprozessor kommt ein Arduino Nano (oder Clone) zum Einsatz.<br />
<br />
Hier mal der Fritzing-Schaltplan:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=136" target="_blank" title="">LED-Lauflicht_Steckplatine.png</a> (Größe: 278,43 KB / Downloads: 7)
<!-- end: postbit_attachments_attachment --><br />
<br />
Das Programm für den Nano (siehe Anhang) bietet 10 verschiedene Lauflicht-Programme, die man über eine Eingabe auf der seriellen Schnittstelle ändern kann.<br />
Außerdem kann man die Laufrichtung (Links &lt;-&gt; Rechts) ändern.<br />
Das Ganze läuft blockierungsfrei (ohne Delays) und (wer will) kann die Programme noch anpassen (Standard: bis zu 30 Schritte je Programm).<br />
Man kann natürlich auch noch die maximale Anzahl der Schritte erhöhen. So lange, wie der Speicher des Nano noch ausreicht...<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=137" target="_blank" title="">LED_Lauflicht.zip</a> (Größe: 1,58 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hier ist mal eine kleine Lauflicht-Schaltung.<br />
Es werden 8 Low-Current-LEDs (2 mA pro LED) sowie 8 Widerstände mit 1.5 kOhm verwendet.<br />
Als Mikroprozessor kommt ein Arduino Nano (oder Clone) zum Einsatz.<br />
<br />
Hier mal der Fritzing-Schaltplan:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=136" target="_blank" title="">LED-Lauflicht_Steckplatine.png</a> (Größe: 278,43 KB / Downloads: 7)
<!-- end: postbit_attachments_attachment --><br />
<br />
Das Programm für den Nano (siehe Anhang) bietet 10 verschiedene Lauflicht-Programme, die man über eine Eingabe auf der seriellen Schnittstelle ändern kann.<br />
Außerdem kann man die Laufrichtung (Links &lt;-&gt; Rechts) ändern.<br />
Das Ganze läuft blockierungsfrei (ohne Delays) und (wer will) kann die Programme noch anpassen (Standard: bis zu 30 Schritte je Programm).<br />
Man kann natürlich auch noch die maximale Anzahl der Schritte erhöhen. So lange, wie der Speicher des Nano noch ausreicht...<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=137" target="_blank" title="">LED_Lauflicht.zip</a> (Größe: 1,58 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[DS18B20-Tester]]></title>
			<link>https://forum.technik-hobby.de/thread-57.html</link>
			<pubDate>Thu, 09 May 2019 10:58:00 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-57.html</guid>
			<description><![CDATA[Hier ist ein Programm zum testen von DS18B20-Temperatur-Sensoren.<br />
Die Ausgabe erfolgt über den seriellen Port und über ein I2C-LCD (optional).<br />
Die DS18B20-Class habe ich selbst geschrieben, weil ich möglichst viel Speicher sparen wollte. Diese Klasse kann man ganz gut in eigene Projekte einbauen.<br />
Wie gesagt, sie ist klein und lässt sich einfach abfragen. Die Temperatur wird asynchron eingelesen, wodurch man währenddessen andere Funktionen ausführen kann.<br />
Das eigentliche einlesen geschieht dann innerhalb von 17-18 ms. Die übliche Konvertierungszeit kann man anderweitig nutzen.<br />
Ich habe das Programm ausführlich kommentiert, sodass die Funktionsweise der Klasse hoffentlich verständlich wird.<br />
<br />
Hier mal ein "Fritzing-Schaltplan":<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=135" target="_blank" title="">DS18B20-Tester_Steckplatine.png</a> (Größe: 191,75 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br />
<br />
Das Programm und die Klassen-Dateien (.cpp und .h) befinden sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=134" target="_blank" title="">DS18B20-Tester.zip</a> (Größe: 189,7 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hier ist ein Programm zum testen von DS18B20-Temperatur-Sensoren.<br />
Die Ausgabe erfolgt über den seriellen Port und über ein I2C-LCD (optional).<br />
Die DS18B20-Class habe ich selbst geschrieben, weil ich möglichst viel Speicher sparen wollte. Diese Klasse kann man ganz gut in eigene Projekte einbauen.<br />
Wie gesagt, sie ist klein und lässt sich einfach abfragen. Die Temperatur wird asynchron eingelesen, wodurch man währenddessen andere Funktionen ausführen kann.<br />
Das eigentliche einlesen geschieht dann innerhalb von 17-18 ms. Die übliche Konvertierungszeit kann man anderweitig nutzen.<br />
Ich habe das Programm ausführlich kommentiert, sodass die Funktionsweise der Klasse hoffentlich verständlich wird.<br />
<br />
Hier mal ein "Fritzing-Schaltplan":<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=135" target="_blank" title="">DS18B20-Tester_Steckplatine.png</a> (Größe: 191,75 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br />
<br />
Das Programm und die Klassen-Dateien (.cpp und .h) befinden sich im ZIP-Archiv (Anhang).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=134" target="_blank" title="">DS18B20-Tester.zip</a> (Größe: 189,7 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Backofen-Thermometer]]></title>
			<link>https://forum.technik-hobby.de/thread-56.html</link>
			<pubDate>Sun, 05 May 2019 18:42:02 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-56.html</guid>
			<description><![CDATA[Ich habe gerade mein neuestes Projekt fertiggestellt. Es handelt sich dabei um ein Backofen-Thermometer. Ich möchte es hier mal vorstellen.<br />
Dabei habe ich folgendes eingesetzt:<br />
- einen Arduino Nano (ok, einen China-Clone)<br />
- eine RTC (DS3231)<br />
- ein 16x2 LCD mit I2C-Backpack<br />
- ein MAX6675 mit K-Thermoelement (0...800 Grad C.)<br />
- ein Battery Shield für einen 18650 Li-Ionen-Akku (inkl. Lade-/Entladeschaltung und 5V-Ausgang)<br />
- einen Dreh-Enkoder mit Taster (beim runterdrücken)<br />
- einen aktiven Buzzer (so einen kleinen Piepser)<br />
- und einen Schalter (zum ein-/ausschalten)<br />
<span style="font-weight: bold;" class="mycode_b">Zusammengebaut sieht es so aus:</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=131" target="_blank" title="">Backofen-Thermometer.jpg</a> (Größe: 203,8 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment --><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Schaltplan:</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=132" target="_blank" title="">Backofen-Thermometer.GIF</a> (Größe: 63,63 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment --><br />
<br />
<blockquote class="mycode_quote"><cite>Zitat: schrieb:</cite>Der Sketch verwendet 11058 Bytes (35%) des Programmspeicherplatzes. Globale Variablen verwenden 400 Bytes (19%) des dynamischen Speichers.</blockquote>Speichermäßig ist da also noch Luft. Es fehlt ja noch die Möglichkeit die Uhrzeit der DS3231 zu stellen. Das werde ich noch einbauen.<br />
Den Sketch findet ihr im ZIP-Archiv (Anhang), falls es jemanden interessiert.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=133" target="_blank" title="">Backofen_Thermometer.zip</a> (Größe: 4,71 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ich habe gerade mein neuestes Projekt fertiggestellt. Es handelt sich dabei um ein Backofen-Thermometer. Ich möchte es hier mal vorstellen.<br />
Dabei habe ich folgendes eingesetzt:<br />
- einen Arduino Nano (ok, einen China-Clone)<br />
- eine RTC (DS3231)<br />
- ein 16x2 LCD mit I2C-Backpack<br />
- ein MAX6675 mit K-Thermoelement (0...800 Grad C.)<br />
- ein Battery Shield für einen 18650 Li-Ionen-Akku (inkl. Lade-/Entladeschaltung und 5V-Ausgang)<br />
- einen Dreh-Enkoder mit Taster (beim runterdrücken)<br />
- einen aktiven Buzzer (so einen kleinen Piepser)<br />
- und einen Schalter (zum ein-/ausschalten)<br />
<span style="font-weight: bold;" class="mycode_b">Zusammengebaut sieht es so aus:</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=131" target="_blank" title="">Backofen-Thermometer.jpg</a> (Größe: 203,8 KB / Downloads: 15)
<!-- end: postbit_attachments_attachment --><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Schaltplan:</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title=".gif" border="0" alt=".gif" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=132" target="_blank" title="">Backofen-Thermometer.GIF</a> (Größe: 63,63 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment --><br />
<br />
<blockquote class="mycode_quote"><cite>Zitat: schrieb:</cite>Der Sketch verwendet 11058 Bytes (35%) des Programmspeicherplatzes. Globale Variablen verwenden 400 Bytes (19%) des dynamischen Speichers.</blockquote>Speichermäßig ist da also noch Luft. Es fehlt ja noch die Möglichkeit die Uhrzeit der DS3231 zu stellen. Das werde ich noch einbauen.<br />
Den Sketch findet ihr im ZIP-Archiv (Anhang), falls es jemanden interessiert.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=133" target="_blank" title="">Backofen_Thermometer.zip</a> (Größe: 4,71 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Taster entprellen]]></title>
			<link>https://forum.technik-hobby.de/thread-54.html</link>
			<pubDate>Fri, 26 Apr 2019 18:08:21 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-54.html</guid>
			<description><![CDATA[Da ich in meinen Projekten oftmals einen oder mehrere Taster verwende und ich zum entprellen nicht gleich eine "riesige" Library einbinden will, habe ich mal eine kleine PushButton-Klasse geschrieben. Die verbraucht nur wenig Speicher und hat doch alles, was ich so brauche (inkl. konfigurierbarer Tastenwiederholung).<br />
Diese Klasse verwendet <span style="font-weight: bold;" class="mycode_b">keine</span> Interrupts!<br />
Der Tastenzustand wird jedes Mal bei "Btn.pressed()" ausgelesen, was bedeutet, dass die Methode jedes Mal in der Loop-Funktion aufgerufen werden muss.<br />
Und die Loop-Funktion darf nicht blockierend programmiert sein (was sich sowieso von selbst verstehen sollte). Delays unbedingt vermeiden!<br />
<br />
<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>PushButton.h:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#ifndef PushButton_h<br />
#define PushButton_h 1<br />
#if (ARDUINO &gt;= 100)<br />
  #include "Arduino.h"<br />
#else<br />
  #include "WProgram.h"<br />
#endif<br />
/****************************************************************************************************************<br />
    PushButton-Klasse zum entprellen von Tastern<br />
    Version: 1.0.0.1 (26.04.2019)<br />
    Autor: Thomas Stephan (Gorathan)<br />
    Homepage: https://forum.technik-hobby.de<br />
    PushButton-Parameter: <br />
    Anschluss-Pin (0...255)<br />
    Pinmodus (0 = INPUT, 1 = INPUT_PULLUP, Standard = 1)<br />
    Reaktion (0 = LOW-aktiv, 1 = HIGH-aktiv, Standard = 0)<br />
    Entprellzeit (0...255 in ms, Standard = 30)<br />
    Wiederholzeit (0...65535 in ms, Standard = 0 / keine Tastenwiederholung)<br />
    Verzoegerungszeit (0...65535 in ms, Standard = 500) bis zur ersten Tastenwiederholung<br />
    <br />
    Beispiel: [] = optional<br />
      PushButton Btn(Anschluss-Pin[, Pinmodus][, Reaktion][, Entprellzeit][, Wiederholzeit][, Verzoegerungszeit]);<br />
    Abfrage: <br />
      if (Btn.pressed()) {...}<br />
    Wiederholzeit setzen:<br />
      Btn.setRepeatTime(repeatTime, delayTime);<br />
*****************************************************************************************************************/<br />
class PushButton {<br />
  private:<br />
    const uint8_t _pin, _dbTime;<br />
    const bool _edge;<br />
    uint16_t _RepeatTime, _DelayTime;<br />
    bool _newState, _oldState, _state, _1stClick;<br />
    uint32_t _dbMillis, _repMillis;<br />
  public:<br />
    // Konstruktor<br />
    PushButton(const uint8_t pin, const bool pullup = 1, const bool edge = 0, &#92;<br />
               const uint8_t dbTime = 30, const uint16_t repeatTime = 0, const uint16_t delayTime = 500);<br />
    // Methoden<br />
    bool pressed(void);<br />
    void setRepeatTime(const uint16_t repeatTime, const uint16_t delayTime = 500) {<br />
      _RepeatTime = repeatTime;<br />
      _DelayTime = delayTime;<br />
    };<br />
};<br />
#endif</code></div></div><br />
</div>
	</div>
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>PushButton.cpp:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include "PushButton.h"<br />
<br />
/***** Konstruktor *****/<br />
PushButton::PushButton(const uint8_t pin, const bool pullup, const bool edge, &#92;<br />
                       const uint8_t dbTime, const uint16_t repeatTime, const uint16_t delayTime):<br />
  _pin(pin), _edge(edge), _dbTime(dbTime), _RepeatTime(repeatTime), _DelayTime(delayTime)<br />
{<br />
  pinMode(pin, pullup ? INPUT_PULLUP : INPUT);<br />
}<br />
<br />
/***** Methode *****/<br />
bool PushButton::pressed(void) {<br />
  const uint32_t nowMillis = millis();<br />
  bool pressed = false;<br />
  _newState = digitalRead(_pin) == _edge;<br />
  if (_newState != _oldState) {<br />
    if (nowMillis - _dbMillis &gt; _dbTime) {<br />
      _repMillis = nowMillis;<br />
      _1stClick = true;<br />
      _oldState = _newState;<br />
      if (_newState) pressed = true;<br />
    }<br />
    _dbMillis = nowMillis;<br />
  } else if (_RepeatTime &amp;&amp; _newState &amp;&amp; nowMillis - _repMillis &gt; _RepeatTime + _1stClick * _DelayTime) {<br />
    _repMillis = nowMillis;<br />
    _state ^= 1;<br />
    _1stClick = false;<br />
    pressed = _state;<br />
  }<br />
  return pressed;<br />
}</code></div></div><br />
</div>
	</div>
<br />
Im Anhang befindet sich noch ein Beispiel-Sketch für einen Arduino-Nano.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=130" target="_blank" title="">My_PushButton_Class.zip</a> (Größe: 2,33 KB / Downloads: 3)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Da ich in meinen Projekten oftmals einen oder mehrere Taster verwende und ich zum entprellen nicht gleich eine "riesige" Library einbinden will, habe ich mal eine kleine PushButton-Klasse geschrieben. Die verbraucht nur wenig Speicher und hat doch alles, was ich so brauche (inkl. konfigurierbarer Tastenwiederholung).<br />
Diese Klasse verwendet <span style="font-weight: bold;" class="mycode_b">keine</span> Interrupts!<br />
Der Tastenzustand wird jedes Mal bei "Btn.pressed()" ausgelesen, was bedeutet, dass die Methode jedes Mal in der Loop-Funktion aufgerufen werden muss.<br />
Und die Loop-Funktion darf nicht blockierend programmiert sein (was sich sowieso von selbst verstehen sollte). Delays unbedingt vermeiden!<br />
<br />
<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>PushButton.h:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#ifndef PushButton_h<br />
#define PushButton_h 1<br />
#if (ARDUINO &gt;= 100)<br />
  #include "Arduino.h"<br />
#else<br />
  #include "WProgram.h"<br />
#endif<br />
/****************************************************************************************************************<br />
    PushButton-Klasse zum entprellen von Tastern<br />
    Version: 1.0.0.1 (26.04.2019)<br />
    Autor: Thomas Stephan (Gorathan)<br />
    Homepage: https://forum.technik-hobby.de<br />
    PushButton-Parameter: <br />
    Anschluss-Pin (0...255)<br />
    Pinmodus (0 = INPUT, 1 = INPUT_PULLUP, Standard = 1)<br />
    Reaktion (0 = LOW-aktiv, 1 = HIGH-aktiv, Standard = 0)<br />
    Entprellzeit (0...255 in ms, Standard = 30)<br />
    Wiederholzeit (0...65535 in ms, Standard = 0 / keine Tastenwiederholung)<br />
    Verzoegerungszeit (0...65535 in ms, Standard = 500) bis zur ersten Tastenwiederholung<br />
    <br />
    Beispiel: [] = optional<br />
      PushButton Btn(Anschluss-Pin[, Pinmodus][, Reaktion][, Entprellzeit][, Wiederholzeit][, Verzoegerungszeit]);<br />
    Abfrage: <br />
      if (Btn.pressed()) {...}<br />
    Wiederholzeit setzen:<br />
      Btn.setRepeatTime(repeatTime, delayTime);<br />
*****************************************************************************************************************/<br />
class PushButton {<br />
  private:<br />
    const uint8_t _pin, _dbTime;<br />
    const bool _edge;<br />
    uint16_t _RepeatTime, _DelayTime;<br />
    bool _newState, _oldState, _state, _1stClick;<br />
    uint32_t _dbMillis, _repMillis;<br />
  public:<br />
    // Konstruktor<br />
    PushButton(const uint8_t pin, const bool pullup = 1, const bool edge = 0, &#92;<br />
               const uint8_t dbTime = 30, const uint16_t repeatTime = 0, const uint16_t delayTime = 500);<br />
    // Methoden<br />
    bool pressed(void);<br />
    void setRepeatTime(const uint16_t repeatTime, const uint16_t delayTime = 500) {<br />
      _RepeatTime = repeatTime;<br />
      _DelayTime = delayTime;<br />
    };<br />
};<br />
#endif</code></div></div><br />
</div>
	</div>
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>PushButton.cpp:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include "PushButton.h"<br />
<br />
/***** Konstruktor *****/<br />
PushButton::PushButton(const uint8_t pin, const bool pullup, const bool edge, &#92;<br />
                       const uint8_t dbTime, const uint16_t repeatTime, const uint16_t delayTime):<br />
  _pin(pin), _edge(edge), _dbTime(dbTime), _RepeatTime(repeatTime), _DelayTime(delayTime)<br />
{<br />
  pinMode(pin, pullup ? INPUT_PULLUP : INPUT);<br />
}<br />
<br />
/***** Methode *****/<br />
bool PushButton::pressed(void) {<br />
  const uint32_t nowMillis = millis();<br />
  bool pressed = false;<br />
  _newState = digitalRead(_pin) == _edge;<br />
  if (_newState != _oldState) {<br />
    if (nowMillis - _dbMillis &gt; _dbTime) {<br />
      _repMillis = nowMillis;<br />
      _1stClick = true;<br />
      _oldState = _newState;<br />
      if (_newState) pressed = true;<br />
    }<br />
    _dbMillis = nowMillis;<br />
  } else if (_RepeatTime &amp;&amp; _newState &amp;&amp; nowMillis - _repMillis &gt; _RepeatTime + _1stClick * _DelayTime) {<br />
    _repMillis = nowMillis;<br />
    _state ^= 1;<br />
    _1stClick = false;<br />
    pressed = _state;<br />
  }<br />
  return pressed;<br />
}</code></div></div><br />
</div>
	</div>
<br />
Im Anhang befindet sich noch ein Beispiel-Sketch für einen Arduino-Nano.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=130" target="_blank" title="">My_PushButton_Class.zip</a> (Größe: 2,33 KB / Downloads: 3)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Anfang der Jahreszeiten berechnen]]></title>
			<link>https://forum.technik-hobby.de/thread-53.html</link>
			<pubDate>Mon, 22 Apr 2019 17:39:58 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-53.html</guid>
			<description><![CDATA[Um den Anfang der Jahreszeiten genau berechnen zu können, muss man schon einen 32-Bit-Mikroprozessor nehmen. Also einen ESP8266 zum Beispiel. <br />
Ein 8-Bit ATmega (z.B. Arduino UNO oder Nano) würde ein "falsches" Ergebnis liefern. Die Ungenauigkeit liegt dort bei bis zu 12 Stunden.<br />
<br />
Mit einem ESP8266 funktioniert das Programm aber recht genau (Abweichung liegt bei +-1 Minute).<br />
Ich habe das Programm auf Mitteleuropäische Zeit konfiguriert. Die Sommerzeit wird automatisch addiert. Es wird keine zusätzliche Bibliothek benötigt.<br />
Vielleicht könnt ihr so ein Programm ja gebrauchen...<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=128" target="_blank" title="">CalcSeason.zip</a> (Größe: 2,92 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Um den Anfang der Jahreszeiten genau berechnen zu können, muss man schon einen 32-Bit-Mikroprozessor nehmen. Also einen ESP8266 zum Beispiel. <br />
Ein 8-Bit ATmega (z.B. Arduino UNO oder Nano) würde ein "falsches" Ergebnis liefern. Die Ungenauigkeit liegt dort bei bis zu 12 Stunden.<br />
<br />
Mit einem ESP8266 funktioniert das Programm aber recht genau (Abweichung liegt bei +-1 Minute).<br />
Ich habe das Programm auf Mitteleuropäische Zeit konfiguriert. Die Sommerzeit wird automatisch addiert. Es wird keine zusätzliche Bibliothek benötigt.<br />
Vielleicht könnt ihr so ein Programm ja gebrauchen...<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=128" target="_blank" title="">CalcSeason.zip</a> (Größe: 2,92 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Buzzer-ISR]]></title>
			<link>https://forum.technik-hobby.de/thread-51.html</link>
			<pubDate>Fri, 05 Apr 2019 15:36:18 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-51.html</guid>
			<description><![CDATA[Hier ein kleines Beispiel, wie man einen aktiven Buzzer per Timer-Interrupt ansteuern kann.<br />
Das hat den Vorteil, dass man keine Delays und Schleifen benutzen muss. Man gibt einfach z.B. "Beep(3, 500, 200);" ein und schon werden drei Toene mit 500ms Puls- und 200ms Pausendauer abgespielt.<br />
Weil das interruptgesteuert ist, kann man danach einfach das eigene Programm weiterlaufen lassen.<br />
Man muss nur aufpassen, bei Programmen oder Bibliotheken, die ebenfalls den Timer1-Interrupt benutzen. Dann muss man auf einen anderen Timer-Interrupt ausweichen.<br />
<br />
Hier mal als Fritzing-Platine:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=125" target="_blank" title="">Nano_Buzzer.png</a> (Größe: 194,77 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment --><br />
<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Sourcecode:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include &lt;TimerOne.h&gt;<br />
<br />
const byte BUZZER_PIN = 5;        // den aktiven Buzzer mit Plus an den Pin D5 vom Arduino Nano und Minus an GND <br />
<br />
// Struktur fuer den Buzzer<br />
struct tBuzzer {<br />
  bool state = 0;                 // Status des Buzzers (1 = ein, 0 = aus)<br />
  uint8_t tones = 0;              // Anzahl der abzuspielenden Toene<br />
  uint16_t times[2] = {0, 0};     // Array mit [0] = Pausenzeit, [1] = Pulszeit<br />
  uint32_t ticks = 0;             // zum merken der Millisekunden<br />
};<br />
<br />
volatile struct tBuzzer buzzer;   // Buzzer-Struktur als volatile, weil sie in einer Interrupt-Funktion verwendet wird<br />
<br />
<br />
// Interrupt-Routine zum reagieren auf die Anzahl und die Puls-/Pausenzeit des Buzzers<br />
void BeepISR() {<br />
  // wenn noch Toene abgespielt werden muessen und die Puls- bzw. Pausenzeit abgelaufen ist, dann...<br />
  if (buzzer.tones &amp;&amp; (millis() - buzzer.ticks &gt; buzzer.times[buzzer.state])) {<br />
    buzzer.state ^= 1;                      // den Status mit "XOR 1" invertieren<br />
    if (!buzzer.state) buzzer.tones--;      // wenn Status = 0, dann die Anzahl um eins verringern<br />
    digitalWrite(BUZZER_PIN, buzzer.state); // den Buzzer ein-/ausschalten (je nach Status)<br />
    buzzer.ticks = millis();                // die Millisekunden merken<br />
  }<br />
}<br />
<br />
// Funktion, um die Ausgabe der Toene zu starten<br />
// Parameter: Anzahl der Toene 0...255, Pulsdauer in ms 0...65535 [, Pausendauer in ms 0...65535]<br />
void Beep(const uint8_t tones, const uint16_t pulse, const uint16_t pause = 0) {<br />
  uint8_t oldSREG = SREG;        // Interrupt-Register merken<br />
  cli();                         // Interrupts verhindern<br />
  if (!buzzer.tones) {           // wenn die bisherigen Toene abgespielt wurden<br />
    buzzer.tones = tones;        // die Parameter in die Struktur uebernehmen<br />
    buzzer.times[0] = pause;<br />
    buzzer.times[1] = pulse;<br />
    buzzer.ticks = millis();     // die Millisekunden merken<br />
  }<br />
  SREG = oldSREG;                // Interrupt-Register wieder herstellen<br />
}<br />
<br />
void setup() {<br />
  digitalWrite(BUZZER_PIN, LOW);   // sicherstellen, dass der Pin auf LOW liegt<br />
  pinMode(BUZZER_PIN, OUTPUT);     // den Pin fuer den Buzzer als Ausgang schalten<br />
  Timer1.initialize(1000);         // Timer-Interrupt (alle 1000us = 1ms) initialisieren<br />
  Timer1.attachInterrupt(BeepISR); // zum steuern der Buzzerausgabe<br />
<br />
  // Beispiele:<br />
  Beep(5, 25, 500);                // fuenf Toene ausgeben (Puls: 25ms, Pause: 500ms)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
<br />
  Beep(2, 300, 150);               // zwei Toene ausgeben (Puls: 300ms, Pause: 150ms)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
<br />
  Beep(1, 1000);                   // ein Ton ausgeben (Puls: 1000ms, Pause: 0ms, kann weggelassen werden)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
}<br />
<br />
void loop() {<br />
}</code></div></div><br />
</div>
	</div>
<br />
Im Anhang (ZIP-Archiv) befindet sich der Sourcecode als Arduino-Sketch.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=126" target="_blank" title="">Buzzer-ISR.zip</a> (Größe: 1,38 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hier ein kleines Beispiel, wie man einen aktiven Buzzer per Timer-Interrupt ansteuern kann.<br />
Das hat den Vorteil, dass man keine Delays und Schleifen benutzen muss. Man gibt einfach z.B. "Beep(3, 500, 200);" ein und schon werden drei Toene mit 500ms Puls- und 200ms Pausendauer abgespielt.<br />
Weil das interruptgesteuert ist, kann man danach einfach das eigene Programm weiterlaufen lassen.<br />
Man muss nur aufpassen, bei Programmen oder Bibliotheken, die ebenfalls den Timer1-Interrupt benutzen. Dann muss man auf einen anderen Timer-Interrupt ausweichen.<br />
<br />
Hier mal als Fritzing-Platine:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=125" target="_blank" title="">Nano_Buzzer.png</a> (Größe: 194,77 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment --><br />
<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Sourcecode:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include &lt;TimerOne.h&gt;<br />
<br />
const byte BUZZER_PIN = 5;        // den aktiven Buzzer mit Plus an den Pin D5 vom Arduino Nano und Minus an GND <br />
<br />
// Struktur fuer den Buzzer<br />
struct tBuzzer {<br />
  bool state = 0;                 // Status des Buzzers (1 = ein, 0 = aus)<br />
  uint8_t tones = 0;              // Anzahl der abzuspielenden Toene<br />
  uint16_t times[2] = {0, 0};     // Array mit [0] = Pausenzeit, [1] = Pulszeit<br />
  uint32_t ticks = 0;             // zum merken der Millisekunden<br />
};<br />
<br />
volatile struct tBuzzer buzzer;   // Buzzer-Struktur als volatile, weil sie in einer Interrupt-Funktion verwendet wird<br />
<br />
<br />
// Interrupt-Routine zum reagieren auf die Anzahl und die Puls-/Pausenzeit des Buzzers<br />
void BeepISR() {<br />
  // wenn noch Toene abgespielt werden muessen und die Puls- bzw. Pausenzeit abgelaufen ist, dann...<br />
  if (buzzer.tones &amp;&amp; (millis() - buzzer.ticks &gt; buzzer.times[buzzer.state])) {<br />
    buzzer.state ^= 1;                      // den Status mit "XOR 1" invertieren<br />
    if (!buzzer.state) buzzer.tones--;      // wenn Status = 0, dann die Anzahl um eins verringern<br />
    digitalWrite(BUZZER_PIN, buzzer.state); // den Buzzer ein-/ausschalten (je nach Status)<br />
    buzzer.ticks = millis();                // die Millisekunden merken<br />
  }<br />
}<br />
<br />
// Funktion, um die Ausgabe der Toene zu starten<br />
// Parameter: Anzahl der Toene 0...255, Pulsdauer in ms 0...65535 [, Pausendauer in ms 0...65535]<br />
void Beep(const uint8_t tones, const uint16_t pulse, const uint16_t pause = 0) {<br />
  uint8_t oldSREG = SREG;        // Interrupt-Register merken<br />
  cli();                         // Interrupts verhindern<br />
  if (!buzzer.tones) {           // wenn die bisherigen Toene abgespielt wurden<br />
    buzzer.tones = tones;        // die Parameter in die Struktur uebernehmen<br />
    buzzer.times[0] = pause;<br />
    buzzer.times[1] = pulse;<br />
    buzzer.ticks = millis();     // die Millisekunden merken<br />
  }<br />
  SREG = oldSREG;                // Interrupt-Register wieder herstellen<br />
}<br />
<br />
void setup() {<br />
  digitalWrite(BUZZER_PIN, LOW);   // sicherstellen, dass der Pin auf LOW liegt<br />
  pinMode(BUZZER_PIN, OUTPUT);     // den Pin fuer den Buzzer als Ausgang schalten<br />
  Timer1.initialize(1000);         // Timer-Interrupt (alle 1000us = 1ms) initialisieren<br />
  Timer1.attachInterrupt(BeepISR); // zum steuern der Buzzerausgabe<br />
<br />
  // Beispiele:<br />
  Beep(5, 25, 500);                // fuenf Toene ausgeben (Puls: 25ms, Pause: 500ms)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
<br />
  Beep(2, 300, 150);               // zwei Toene ausgeben (Puls: 300ms, Pause: 150ms)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
<br />
  Beep(1, 1000);                   // ein Ton ausgeben (Puls: 1000ms, Pause: 0ms, kann weggelassen werden)<br />
  delay(4000);                     // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)<br />
}<br />
<br />
void loop() {<br />
}</code></div></div><br />
</div>
	</div>
<br />
Im Anhang (ZIP-Archiv) befindet sich der Sourcecode als Arduino-Sketch.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=126" target="_blank" title="">Buzzer-ISR.zip</a> (Größe: 1,38 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>