<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.defcon-cc.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webmaster</id>
	<title>DefCon Projects - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.defcon-cc.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webmaster"/>
	<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/Special:Contributions/Webmaster"/>
	<updated>2026-05-24T21:34:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Ramdisk_unter_Linux&amp;diff=757</id>
		<title>Ramdisk unter Linux</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Ramdisk_unter_Linux&amp;diff=757"/>
		<updated>2025-10-19T06:46:10Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: Remove file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Ramdisk ist ein Teil des Arbeitsspeichers der für das PC-System wie eine Festplatten Partition aussieht. Das erstellen einer Ramdisk kann unter bestimmten umständen Hilfreich sein, wenn man z.B. möchte das bestimmte Daten, Logdateien, etc. nach einem Neustart des Rechners nicht mehr existent sind (siehe Quellen). Mittels einer Ramdisk lässt sich aber auch ein Geschwindigkeitvorteil erreichen, wenn Webserver wie Apache komplett in der Ramdisk gestartet werden. &lt;br /&gt;
&lt;br /&gt;
== Skript ==&lt;br /&gt;
&lt;br /&gt;
Das Skript prüft zunächst ob ein entsprechendes Ramdisk-Device exisiert. Ist das der Fall wird ein&lt;br /&gt;
Ordner erstellt auf dem dann die Ramdisk, nach entsprechenden erstellen eines Dateisystems (in diesem Fall ext2), gemountet wird.&lt;br /&gt;
&lt;br /&gt;
Das Skript erstellt je nach Einstellung des System ein Ramdisk mit unterschiedlicher Größe. Bei RHEL6 ist die Ramdisk in der&lt;br /&gt;
Standardkonfiguration 15Mb groß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen ob ramdisk-Gerät schon erstellt wurde&lt;br /&gt;
if [ -e /dev/ram0 ]&lt;br /&gt;
then&lt;br /&gt;
    echo [+] Ramdisk Gerät /dev/ram0 existiert schon&lt;br /&gt;
else&lt;br /&gt;
    echo [-] Ramdisk Gerät /dev/ram0 existiert nicht&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Prüfen ob der Ordner schon existiert&lt;br /&gt;
if [ -e &amp;quot;/mnt/ramdisk&amp;quot; ] &amp;amp;&amp;amp; [ -d &amp;quot;/mnt/ramdisk&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo [+] Ordner /mnt/ramdisk existiert schon&lt;br /&gt;
else&lt;br /&gt;
    mkdir /mnt/ramdisk&lt;br /&gt;
    echo [-] Ordner /mnt/ramdisk erstellen&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo [+] Ramdisk mit ext2 Dateisystem formatieren&lt;br /&gt;
/sbin/mke2fs -q -m 0 /dev/ram0&lt;br /&gt;
&lt;br /&gt;
echo [+] Ramdisk mounten&lt;br /&gt;
/bin/mount /dev/ram0 /mnt/ramdisk&lt;br /&gt;
&lt;br /&gt;
echo [+] Berechtigungen setzen&lt;br /&gt;
/bin/chmod 0750 /mnt/ramdisk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
[http://www.netzwelt.de/news/73686-razorback2-razzia-abgeschaltet.html Razorback2 abgeschaltet]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=756</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=756"/>
		<updated>2025-02-03T06:21:29Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Artikelübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[RWE-Wallbox]] - [[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]] - [[Sonoff POW]] - [[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]] - [[Mail bei YUM Updates]] - [[Mail bei dmesg Output]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Mail_bei_dmesg_Output&amp;diff=755</id>
		<title>Mail bei dmesg Output</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Mail_bei_dmesg_Output&amp;diff=755"/>
		<updated>2025-02-03T06:20:47Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: Created page with &amp;quot;Manchmal ist es praktisch wenn man bei neuen Kernel-Meldungen informiert wird. Dieses Skript informiert euch per Mail wenn es zu einem neuen Eintrag im dmesg Protokoll gekommen ist.  == Skript == &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; #!/bin/bash  # Email configuration TO_ADDRESS=&amp;quot;admin@example.com&amp;quot; SUBJECT=&amp;quot;New dmesg Entry Detected for $(hostname)&amp;quot; MAIL_CMD=&amp;quot;/usr/bin/mail&amp;quot; # Make sure the mail command is installed  # Temporary file to store the last state of dmesg DMESG_LAST=&amp;quot;/tmp/...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Manchmal ist es praktisch wenn man bei neuen Kernel-Meldungen informiert wird. Dieses Skript informiert euch per Mail wenn es zu einem neuen Eintrag im&lt;br /&gt;
dmesg Protokoll gekommen ist.&lt;br /&gt;
&lt;br /&gt;
== Skript ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Email configuration&lt;br /&gt;
TO_ADDRESS=&amp;quot;admin@example.com&amp;quot;&lt;br /&gt;
SUBJECT=&amp;quot;New dmesg Entry Detected for $(hostname)&amp;quot;&lt;br /&gt;
MAIL_CMD=&amp;quot;/usr/bin/mail&amp;quot; # Make sure the mail command is installed&lt;br /&gt;
&lt;br /&gt;
# Temporary file to store the last state of dmesg&lt;br /&gt;
DMESG_LAST=&amp;quot;/tmp/dmesg_last&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Initialize the dmesg_last file if it doesn&#039;t exist&lt;br /&gt;
if [ ! -f &amp;quot;$DMESG_LAST&amp;quot; ]; then&lt;br /&gt;
    dmesg &amp;gt; &amp;quot;$DMESG_LAST&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Capture the current state of dmesg&lt;br /&gt;
DMESG_CURRENT=$(dmesg)&lt;br /&gt;
&lt;br /&gt;
# Compare with the last state&lt;br /&gt;
if ! diff &amp;quot;$DMESG_LAST&amp;quot; &amp;lt;(echo &amp;quot;$DMESG_CURRENT&amp;quot;) &amp;gt; /dev/null; then&lt;br /&gt;
    # Get the new entries&lt;br /&gt;
    NEW_ENTRIES=$(diff &amp;quot;$DMESG_LAST&amp;quot; &amp;lt;(echo &amp;quot;$DMESG_CURRENT&amp;quot;) | grep &#039;&amp;gt;&#039; | sed &#039;s/^&amp;gt; //&#039;)&lt;br /&gt;
&lt;br /&gt;
    # Send an email with the new entries&lt;br /&gt;
    echo &amp;quot;$NEW_ENTRIES&amp;quot; | $MAIL_CMD -s &amp;quot;$SUBJECT&amp;quot; &amp;quot;$TO_ADDRESS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Update the last state&lt;br /&gt;
    echo &amp;quot;$DMESG_CURRENT&amp;quot; &amp;gt; &amp;quot;$DMESG_LAST&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=754</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=754"/>
		<updated>2025-02-02T10:33:51Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Artikelübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[RWE-Wallbox]] - [[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]] - [[Sonoff POW]] - [[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]] - [[Mail bei YUM Updates]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Mail_bei_YUM_Updates&amp;diff=753</id>
		<title>Mail bei YUM Updates</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Mail_bei_YUM_Updates&amp;diff=753"/>
		<updated>2025-02-02T10:33:18Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: Created page with &amp;quot;Ich habe mehrere Server im Betrieb für die ich ein BASH-Skript benötigt habe das mich informiert wenn neue YUM Updates  zu verfügung stehen. Ich möchte hier mit euch das BASH-Skript teilen:  == Skript == &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; #!/bin/bash EMAIL=&amp;quot;admin@example.com&amp;quot; STATE_FILE=&amp;quot;/tmp/update_count.state&amp;quot;  # Execute yum check-update and capture the output  UPDATES=$(yum check-update --quiet 2&amp;gt;/dev/null)  # Filter out empty lines and count the number of updates  UPDATE...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich habe mehrere Server im Betrieb für die ich ein BASH-Skript benötigt habe das mich informiert wenn neue YUM Updates &lt;br /&gt;
zu verfügung stehen. Ich möchte hier mit euch das BASH-Skript teilen:&lt;br /&gt;
&lt;br /&gt;
== Skript ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
EMAIL=&amp;quot;admin@example.com&amp;quot;&lt;br /&gt;
STATE_FILE=&amp;quot;/tmp/update_count.state&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Execute yum check-update and capture the output &lt;br /&gt;
UPDATES=$(yum check-update --quiet 2&amp;gt;/dev/null)&lt;br /&gt;
&lt;br /&gt;
# Filter out empty lines and count the number of updates &lt;br /&gt;
UPDATES=$(echo &amp;quot;$UPDATES&amp;quot; | grep -v &amp;quot;^$&amp;quot;) &lt;br /&gt;
UPDATES_COUNT=$(echo -n &amp;quot;$UPDATES&amp;quot; | wc -l)&lt;br /&gt;
&lt;br /&gt;
# Read the previous update count, if any&lt;br /&gt;
if [[ -f &amp;quot;$STATE_FILE&amp;quot; ]]; then&lt;br /&gt;
    PREVIOUS_COUNT=$(cat &amp;quot;$STATE_FILE&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    PREVIOUS_COUNT=0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Compare update counts&lt;br /&gt;
if [[ $UPDATES_COUNT -ne $PREVIOUS_COUNT ]]; then&lt;br /&gt;
    echo &amp;quot;$UPDATES&amp;quot; | mail -s &amp;quot;Updates for $(hostname): ${UPDATES_COUNT}&amp;quot; &amp;quot;$EMAIL&amp;quot;&lt;br /&gt;
    # Update the state file with the new count&lt;br /&gt;
    echo &amp;quot;$UPDATES_COUNT&amp;quot; &amp;gt; &amp;quot;$STATE_FILE&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=SDR_mit_DVB-T_Stick&amp;diff=752</id>
		<title>SDR mit DVB-T Stick</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=SDR_mit_DVB-T_Stick&amp;diff=752"/>
		<updated>2022-01-27T07:58:38Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Projekt geht es darum einen Terratec Cinergy T USB-Stick mit einem RealTek RTL2832U-Chip als SDR (Software Defined Radio) zu nutzen. Als SDR versteht man ein Funktelekommunikationssystem das möglichst einen großen Teil der De- / Modulation in Software durchführt. Nur ein kleiner Teil ist in Hardware realisiert (Antenne, Verstärker + Frontend). Ein bekanntes SDR sind das im universitären Einsatz weit verbreitete USRP&amp;lt;ref&amp;gt;[http://home.ettus.com/ Ettus Research Homepage]&amp;lt;/ref&amp;gt; von Ettus Research das allerdings für einen Hobbybastler recht teuer ist. &lt;br /&gt;
Die meißten DVB-T Sticks bieten allerdings für den Hobbybereich einen akzeptablen abdeckbaren Frequenzbereich, mehrer Informationen dazu gibt es auf der Seite von osmocomSDR&amp;lt;ref&amp;gt;[https://osmocom.org/projects/rtl-sdr/wiki/Rtl-sdr osmocomSDR]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
[[File:SDR DVB T Cinergy.jpg|300px|right|HV Warning]]&lt;br /&gt;
&lt;br /&gt;
Zum Einsatz kommt ein Terratec Cinergy T Stick RC mit einem Elonics E4000 Tuner für ca. 16€.&lt;br /&gt;
&lt;br /&gt;
== Software == &lt;br /&gt;
&lt;br /&gt;
Als Software setze ich zurzeit SDR#&amp;lt;ref&amp;gt;[http://sdrsharp.com/ SDR# Homepage]&amp;lt;/ref&amp;gt;  ein.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:SDR DVB T Cinergy Elonics.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=PC-Maus_als_Drehzahlmesser&amp;diff=751</id>
		<title>PC-Maus als Drehzahlmesser</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=PC-Maus_als_Drehzahlmesser&amp;diff=751"/>
		<updated>2022-01-24T19:10:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wer brauchte nicht schon immer einen einfachen Drehzahlmesser, hatte aber keinen zur Hand. Hier beschreibe ich eine Möglichkeit mittels einer einfachen PC-Maus mit Scrollrad. Ich wollte die Drehzahl von zwei Gleichstrommotoren erfassen die ich im Rahmen eines Balancierenden Roboter (Prinzip des inversen Pendels) einsetzen wollte.&lt;br /&gt;
Die Gleichstrommotoren hatte ich mit einen PWM-Signal und einer kleinen Treiberschaltung angesteuert. Hinter jedem Motor befand sich ein dahintergschaltetes Getriebe.&lt;br /&gt;
Ich habe beide Motoren mit dem selben PWM-Signal angeseteuert aber es kam mir so vor, dass diese sich unterschiedlich schnell drehten. Nur ohne Drehzahlmesser ist das schwer nachzuweisen. Dann kam mir die Idee die Drehzahl mit dem Scrollrad einer Maus zu erfassen. Dafür habe ich ein kleines Programm geschreiben das ihr im Download-Bereich der Artikels findet. Quelltext ist auch verfügbar und kann nach belieben erweitert werden. Über die Genauigkeit kann ich nichts sagen, da ich keinen Drehzahlmesser für Vergleichsmessungen besitze.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
[[File:MouseScrollCounter.jpg|400px|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
Einfach das Programm starten und am Scrollrad drehen. Um das Program zu beenden die Linke und Rechte Maustaste gedrückt halten.&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&lt;br /&gt;
Zu dem Quelltext gibt es nicht allzuviel zu erzählen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/***********************************************&lt;br /&gt;
***&lt;br /&gt;
***  eeeeee eeeee eeeee eeeee eeeeee eeeeee&lt;br /&gt;
***  8    8 8     8     8     8   88 8    8&lt;br /&gt;
***  8e   8 8     8     8     8    8 8    8&lt;br /&gt;
***  88   8 8eee  8eee  8e    8    8 8e   8&lt;br /&gt;
***  88   8 8e    8e    88    8    8 88   8&lt;br /&gt;
***  88   e 88    88    88    8    e 88   8&lt;br /&gt;
***  88eee8 88eee 88    88eee 88eee8 88   8&lt;br /&gt;
*** ----------------------------------------&lt;br /&gt;
***         defcon-cc.dyndns.org&lt;br /&gt;
***        &lt;br /&gt;
************************************************&lt;br /&gt;
************************************************&lt;br /&gt;
***   Programm: MouseScrollCounter           ***&lt;br /&gt;
***   Autor: Patrick Langosch                ***&lt;br /&gt;
***   erstellt: 12.08.14                     ***&lt;br /&gt;
***   Version: 0.1                           ***&lt;br /&gt;
***********************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DIAMETER_WHEEL 0.023 // in meters&lt;br /&gt;
#define COUNTS_PER_REVOLUTION 24 // no dimension&lt;br /&gt;
#define DISTANCE_PER_REVOLUTION (M_PI * DIAMETER_WHEEL) // in meters&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int counts = 0;&lt;br /&gt;
&lt;br /&gt;
HHOOK g_Hook;&lt;br /&gt;
HANDLE g_evExit;&lt;br /&gt;
&lt;br /&gt;
/******************************** LowLevelMouseProc ********************************/&lt;br /&gt;
LRESULT CALLBACK LowLevelMouseProc(int code, WPARAM wParam, LPARAM lParam)&lt;br /&gt;
{&lt;br /&gt;
    if(code == HC_ACTION)&lt;br /&gt;
    {&lt;br /&gt;
        const char *msg;&lt;br /&gt;
        char msg_buff[128];&lt;br /&gt;
        &lt;br /&gt;
        switch(wParam)&lt;br /&gt;
        {&lt;br /&gt;
            case WM_LBUTTONDOWN: &lt;br /&gt;
                msg = &amp;quot;WM_LBUTTONDOWN&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_LBUTTONUP: &lt;br /&gt;
                msg = &amp;quot;WM_LBUTTONUP&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
			&lt;br /&gt;
            case WM_MOUSEMOVE: &lt;br /&gt;
                msg = &amp;quot;WM_MOUSEMOVE&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_MOUSEWHEEL: &lt;br /&gt;
                msg = &amp;quot;WM_MOUSEWHEEL&amp;quot;; &lt;br /&gt;
                counts++;&lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONDOWN: &lt;br /&gt;
	        msg = &amp;quot;WM_RBUTTONDOWN&amp;quot;; &lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONUP: &lt;br /&gt;
	        msg = &amp;quot;WM_RBUTTONUP&amp;quot;; &lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            default: &lt;br /&gt;
                sprintf(msg_buff, &amp;quot;Unknown msg: %u&amp;quot;, wParam); &lt;br /&gt;
                msg = msg_buff;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const MSLLHOOKSTRUCT *p = reinterpret_cast&amp;lt;const MSLLHOOKSTRUCT*&amp;gt;(lParam);&lt;br /&gt;
&lt;br /&gt;
        static bool left_down = false;&lt;br /&gt;
        static bool right_down = false;&lt;br /&gt;
        &lt;br /&gt;
        switch(wParam)&lt;br /&gt;
        {&lt;br /&gt;
            case WM_LBUTTONDOWN: &lt;br /&gt;
				left_down = true; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_LBUTTONUP:   &lt;br /&gt;
				left_down = false; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONDOWN: &lt;br /&gt;
				right_down = true; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONUP:   &lt;br /&gt;
				right_down = false; &lt;br /&gt;
				break;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(left_down &amp;amp;&amp;amp; right_down)&lt;br /&gt;
        {&lt;br /&gt;
        	SetEvent(g_evExit);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return CallNextHookEx(g_Hook, code, wParam, lParam); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************** MAIN ********************************/&lt;br /&gt;
int main(int argc, char *argv[]) &lt;br /&gt;
{&lt;br /&gt;
    int n = 0;&lt;br /&gt;
    int rpm = 0;&lt;br /&gt;
    int rps = 0;&lt;br /&gt;
    float speed = 0.0;&lt;br /&gt;
    char buffer[64];&lt;br /&gt;
    DWORD startTime = 0;&lt;br /&gt;
    DWORD diffTime = 0;&lt;br /&gt;
	&lt;br /&gt;
    // remove scrollbar&lt;br /&gt;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); // get handle of console window&lt;br /&gt;
    CONSOLE_SCREEN_BUFFER_INFO info;&lt;br /&gt;
    &lt;br /&gt;
    GetConsoleScreenBufferInfo(handle, &amp;amp;info);&lt;br /&gt;
    &lt;br /&gt;
    COORD new_size =&lt;br /&gt;
    {&lt;br /&gt;
        info.srWindow.Right - info.srWindow.Left + 1,&lt;br /&gt;
        info.srWindow.Bottom - info.srWindow.Top + 1&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    SetConsoleScreenBufferSize(handle, new_size); // set new size&lt;br /&gt;
    SetConsoleTitle(&amp;quot;DefCon - MouseScrollCounter&amp;quot;); // set title&lt;br /&gt;
	&lt;br /&gt;
    g_evExit = CreateEvent(0, TRUE, FALSE, 0);&lt;br /&gt;
 &lt;br /&gt;
    if(!g_evExit)&lt;br /&gt;
    {&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;CreateEvent failed, le = &amp;quot; &amp;lt;&amp;lt; GetLastError() &amp;lt;&amp;lt; endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    g_Hook = SetWindowsHookEx(WH_MOUSE_LL, &amp;amp;LowLevelMouseProc, GetModuleHandle(0), 0);&lt;br /&gt;
    &lt;br /&gt;
    if(!g_Hook)&lt;br /&gt;
    {&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;SetWindowsHookEx() failed, le = &amp;quot; &amp;lt;&amp;lt; GetLastError() &amp;lt;&amp;lt; endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Press both left and right mouse buttons to exit...&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
    MSG msg;&lt;br /&gt;
    DWORD status;&lt;br /&gt;
    &lt;br /&gt;
    /******************************** LOOP ********************************/&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        while(PeekMessage(&amp;amp;msg, 0, 0, 0, PM_REMOVE))&lt;br /&gt;
        {&lt;br /&gt;
        	DispatchMessage(&amp;amp;msg);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        status = MsgWaitForMultipleObjects(1, &amp;amp;g_evExit, FALSE, INFINITE, QS_ALLINPUT);&lt;br /&gt;
    &lt;br /&gt;
        if(status == (WAIT_OBJECT_0 + 1))&lt;br /&gt;
        {&lt;br /&gt;
            // check if the wheel is reached a revolution&lt;br /&gt;
            if(counts &amp;gt;= COUNTS_PER_REVOLUTION)&lt;br /&gt;
            {&lt;br /&gt;
                if(startTime != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    diffTime = GetTickCount() - startTime; // get time between two calls&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                startTime = GetTickCount();&lt;br /&gt;
        		&lt;br /&gt;
                if(diffTime != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    // get radiation per second and minute&lt;br /&gt;
        	    rps = 1000 / (int)(diffTime); &lt;br /&gt;
        	    rpm = 60000 / (int)(diffTime);&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                speed = DISTANCE_PER_REVOLUTION * rps; // in m/s&lt;br /&gt;
        		&lt;br /&gt;
                system(&amp;quot;cls&amp;quot;);&lt;br /&gt;
                n = snprintf(buffer, 64, &amp;quot;%c DIFF:%ims --&amp;gt; %i rpm --&amp;gt; %.2f m/s %c&amp;quot;, 186, diffTime, rpm, speed, 186);&lt;br /&gt;
        		&lt;br /&gt;
                // ********** draw border **********&lt;br /&gt;
                printf(&amp;quot;%c&amp;quot;, 201);&lt;br /&gt;
        		&lt;br /&gt;
                for(int i = 0; i &amp;lt; n-2; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    printf(&amp;quot;%c&amp;quot;, 205);&lt;br /&gt;
                }&lt;br /&gt;
        	&lt;br /&gt;
                printf(&amp;quot;%c\n&amp;quot;, 187);        		&lt;br /&gt;
                printf(&amp;quot;%s\n&amp;quot;, buffer);&lt;br /&gt;
                printf(&amp;quot;%c&amp;quot;, 200);&lt;br /&gt;
        		&lt;br /&gt;
                for(int i = 0; i &amp;lt; n-2; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    printf(&amp;quot;%c&amp;quot;, 205);&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                printf(&amp;quot;%c\n&amp;quot;, 188);&lt;br /&gt;
        		&lt;br /&gt;
	        counts = 0; // reset counter&lt;br /&gt;
            }&lt;br /&gt;
        	&lt;br /&gt;
            continue; // there are messages to process, eat em up&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            break; // assume g_evExit is signaled&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Exiting...&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
    UnhookWindowsHookEx(g_Hook);&lt;br /&gt;
    CloseHandle(g_evExit);&lt;br /&gt;
	&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
[[File:MouseScrollCounter.zip]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:MouseScrollCounter.zip&amp;diff=750</id>
		<title>File:MouseScrollCounter.zip</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:MouseScrollCounter.zip&amp;diff=750"/>
		<updated>2022-01-24T19:09:42Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Pollin_AVR-NetIO_PHP_Wrapper&amp;diff=749</id>
		<title>Pollin AVR-NetIO PHP Wrapper</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Pollin_AVR-NetIO_PHP_Wrapper&amp;diff=749"/>
		<updated>2022-01-24T19:07:00Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei mir bestand irgendwann einmal das Bedürfnis mein Pollin AVR-NetIO Board über einen&lt;br /&gt;
Webserver mit Befehlen zu füttern. Daraus entstanden einige PHP-Funktionen die eine&lt;br /&gt;
Kommunikation mit dem NetIO-Board bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Die Benutzung gestaltet sich relativ einfach. Dazu einfach die &lt;br /&gt;
PHP-Datei &amp;quot;wrapper.php&amp;quot;, mittels PHP-Befehl &amp;lt;code&amp;gt;include(&amp;quot;wrapper.php&amp;quot;);&amp;lt;/code&amp;gt; einbinden. Nachdem dann über die Funktion &amp;lt;code&amp;gt;function wrapper_open($server, $port)&amp;lt;/code&amp;gt; unter Angabe der IP-Adresse und des Ports mit dem NetIO-Board eine Verbindung aufgebaut werden. Als Rückgabewert der Funktion erhält man einen Zeiger auf die aufgebaute Verbindung. Diesen muss man bei Funktionaufrufen immer mit angeben. Die Verbindung kann dann nach getaner Arbeit mittels &amp;lt;code&amp;gt;function wrapper_close($fp)&amp;lt;/code&amp;gt; beendet werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Beispiel, zum auslesen der Ausgänge. Dafür muss sich die Datei &amp;quot;wrapper.php&amp;quot; im selben &lt;br /&gt;
Ordner wie die Beispiel PHP-Datei befinden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
include(&amp;quot;wrapper.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$fp = wrapper_open(&amp;quot;192.168.0.90&amp;quot;, 50290); // NetIO Standard IP &amp;amp; Port&lt;br /&gt;
$data =  get_dig_output_status($fp);&lt;br /&gt;
&lt;br /&gt;
echo $data;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
/***********************************************&lt;br /&gt;
***&lt;br /&gt;
***  eeeeee eeeee eeeee eeeee eeeeee eeeeee&lt;br /&gt;
***  8    8 8     8     8     8   88 8    8&lt;br /&gt;
***  8e   8 8     8     8     8    8 8    8&lt;br /&gt;
***  88   8 8eee  8eee  8e    8    8 8e   8&lt;br /&gt;
***  88   8 8e    8e    88    8    8 88   8&lt;br /&gt;
***  88   e 88    88    88    8    e 88   8&lt;br /&gt;
***  88eee8 88eee 88    88eee 88eee8 88   8&lt;br /&gt;
***&lt;br /&gt;
***        Coded by Crashdemon....&lt;br /&gt;
***         HAVE A LOT OF PHUN!&lt;br /&gt;
***&lt;br /&gt;
***	      AVR-NetIO Wrapper&lt;br /&gt;
***		   ver 0.1&lt;br /&gt;
***        &lt;br /&gt;
***********************************************/&lt;br /&gt;
&lt;br /&gt;
$BUFFER_SIZE = 16384; &lt;br /&gt;
&lt;br /&gt;
// Establishes a connection to the Pollin AVR-NetIO&lt;br /&gt;
// Parameters: $server -&amp;gt; IP of AVR-NetIO&lt;br /&gt;
//             $port -&amp;gt; Port running the AVR-NetIO&lt;br /&gt;
// Return: The file description pointer of the established connection&lt;br /&gt;
function wrapper_open($server, $port)&lt;br /&gt;
{&lt;br /&gt;
	$errno = $errstr = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	$fp = fsockopen($server, $port, $errno, $errstr, 30);&lt;br /&gt;
	&lt;br /&gt;
	if(!$fp)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error: %s (%s)&amp;quot;, $errstr, $errno);&lt;br /&gt;
	    $data = 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return($fp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Shows the current Info about NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the Info as a String &lt;br /&gt;
function get_version($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;VERSION\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Status of given digital Pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
// Return: status auf the pin HIGH = 1 ; LOW = 0, false if fails&lt;br /&gt;
function get_dig_input($fp, $number)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=4)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;GETPORT &amp;quot;.$number.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
		&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Value of the ADC Input Pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
// Return: decimal value from the AD-Conversion, false if fails&lt;br /&gt;
function get_adc_input($fp, $number)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=4)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;GETADC &amp;quot;.$number.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
		//printf(&amp;quot;%s&amp;quot;, $data);&lt;br /&gt;
		&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set output pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
//			   $set -&amp;gt; HIGH or LOW level set on output pin&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_dig_output($fp, $number, $set)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=8 and ($set == 0 || $set == 1))&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETPORT &amp;quot;.$number.&amp;quot;.&amp;quot;.$set.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return(true);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the current status of the digital output&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: status auf the output pins HIGH = 1 ; LOW = 0&lt;br /&gt;
function get_dig_output_status($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETSTATUS\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the IP of AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the IP as a string&lt;br /&gt;
function get_ip($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETIP\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sets a new IP on AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_ip -&amp;gt; The new IP as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_ip($fp, $new_ip)&lt;br /&gt;
{&lt;br /&gt;
	$ip = explode(&#039;.&#039;, $new_ip); &lt;br /&gt;
	&lt;br /&gt;
	if($ip[0] &amp;lt;= 255 and $ip[1] &amp;lt;= 255 and $ip[2] &amp;lt;= 255 and $ip[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_ip)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETIP &amp;quot;.$new_ip.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Gets the current Subnetmask of AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: subnetmask as a string&lt;br /&gt;
function get_mask($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETMASK\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sets new subnetmask on AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_mask -&amp;gt; the new mask as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_mask($fp, $new_mask)&lt;br /&gt;
{&lt;br /&gt;
	$mask = explode(&#039;.&#039;, $new_mask); &lt;br /&gt;
	&lt;br /&gt;
	if($mask[0] &amp;lt;= 255 and $mask[1] &amp;lt;= 255 and $mask[2] &amp;lt;= 255 and $mask[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_mask)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETMASK &amp;quot;.$new_mask.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}			&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the Gateway of AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the gateway as a string&lt;br /&gt;
function get_gateway($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETGW\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);		&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the Gateway on AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_gw -&amp;gt; The new Gateway adress as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_gateway($fp, $new_gw)&lt;br /&gt;
{&lt;br /&gt;
	$gw = explode(&#039;.&#039;, $new_mask); &lt;br /&gt;
	&lt;br /&gt;
	if($gw[0] &amp;lt;= 255 and $gw[1] &amp;lt;= 255 and $gw[2] &amp;lt;= 255 and $gw[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_gw)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETGW &amp;quot;.$new_gw.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}			&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initializes the LCD, do this first before write to it&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function init_lcd($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;INITLCD\r\n&amp;quot;);	&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}			&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Print text on LCD&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $row -&amp;gt; number of the row&lt;br /&gt;
//             $text -&amp;gt; the text which we would show&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function write_lcd($fp, $row, $text)&lt;br /&gt;
{&lt;br /&gt;
	if($row &amp;gt; 0 and $row &amp;lt;=2)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;WRITELCD &amp;quot;.$row.&amp;quot;.&amp;quot;.$text.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}					&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Clear the given row on the LCD&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $row -&amp;gt; number of the row        &lt;br /&gt;
// Return: non&lt;br /&gt;
function clear_lcd($fp, $row)&lt;br /&gt;
{&lt;br /&gt;
	if($row &amp;gt; 0 and $row &amp;lt;=2)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;CLEARLCD &amp;quot;.$row.&amp;quot;\r\n&amp;quot;);					&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Closes the network connection to AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection &lt;br /&gt;
// Return: non&lt;br /&gt;
function wrapper_close($fp)&lt;br /&gt;
{&lt;br /&gt;
	fclose($fp);	&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
[[File:Netio_wrapper.zip]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Netio_wrapper.zip&amp;diff=748</id>
		<title>File:Netio wrapper.zip</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Netio_wrapper.zip&amp;diff=748"/>
		<updated>2022-01-24T19:05:43Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Ramdisk_unter_Linux&amp;diff=747</id>
		<title>Ramdisk unter Linux</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Ramdisk_unter_Linux&amp;diff=747"/>
		<updated>2022-01-24T18:59:42Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Anhang */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Ramdisk ist ein Teil des Arbeitsspeichers der für das PC-System wie eine Festplatten Partition aussieht. Das erstellen einer Ramdisk kann unter bestimmten umständen Hilfreich sein, wenn man z.B. möchte das bestimmte Daten, Logdateien, etc. nach einem Neustart des Rechners nicht mehr existent sind (siehe Quellen). Mittels einer Ramdisk lässt sich aber auch ein Geschwindigkeitvorteil erreichen, wenn Webserver wie Apache komplett in der Ramdisk gestartet werden. &lt;br /&gt;
&lt;br /&gt;
== Skript ==&lt;br /&gt;
&lt;br /&gt;
Das Skript prüft zunächst ob ein entsprechendes Ramdisk-Device exisiert. Ist das der Fall wird ein&lt;br /&gt;
Ordner erstellt auf dem dann die Ramdisk, nach entsprechenden erstellen eines Dateisystems (in diesem Fall ext2), gemountet wird.&lt;br /&gt;
&lt;br /&gt;
Das Skript erstellt je nach Einstellung des System ein Ramdisk mit unterschiedlicher Größe. Bei RHEL6 ist die Ramdisk in der&lt;br /&gt;
Standardkonfiguration 15Mb groß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen ob ramdisk-Gerät schon erstellt wurde&lt;br /&gt;
if [ -e /dev/ram0 ]&lt;br /&gt;
then&lt;br /&gt;
    echo [+] Ramdisk Gerät /dev/ram0 existiert schon&lt;br /&gt;
else&lt;br /&gt;
    echo [-] Ramdisk Gerät /dev/ram0 existiert nicht&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Prüfen ob der Ordner schon existiert&lt;br /&gt;
if [ -e &amp;quot;/mnt/ramdisk&amp;quot; ] &amp;amp;&amp;amp; [ -d &amp;quot;/mnt/ramdisk&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo [+] Ordner /mnt/ramdisk existiert schon&lt;br /&gt;
else&lt;br /&gt;
    mkdir /mnt/ramdisk&lt;br /&gt;
    echo [-] Ordner /mnt/ramdisk erstellen&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo [+] Ramdisk mit ext2 Dateisystem formatieren&lt;br /&gt;
/sbin/mke2fs -q -m 0 /dev/ram0&lt;br /&gt;
&lt;br /&gt;
echo [+] Ramdisk mounten&lt;br /&gt;
/bin/mount /dev/ram0 /mnt/ramdisk&lt;br /&gt;
&lt;br /&gt;
echo [+] Berechtigungen setzen&lt;br /&gt;
/bin/chmod 0750 /mnt/ramdisk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&lt;br /&gt;
[http://www.netzwelt.de/news/73686-razorback2-razzia-abgeschaltet.html Razorback2 abgeschaltet]&lt;br /&gt;
&lt;br /&gt;
== Anhang ==&lt;br /&gt;
&lt;br /&gt;
[https://www.defcon-cc.org/files/ramdisk http://defcon-cc.dyndns.org/files/ramdisk]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Pollin_AVR-NetIO_PHP_Wrapper&amp;diff=746</id>
		<title>Pollin AVR-NetIO PHP Wrapper</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Pollin_AVR-NetIO_PHP_Wrapper&amp;diff=746"/>
		<updated>2022-01-24T18:58:40Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei mir bestand irgendwann einmal das Bedürfnis mein Pollin AVR-NetIO Board über einen&lt;br /&gt;
Webserver mit Befehlen zu füttern. Daraus entstanden einige PHP-Funktionen die eine&lt;br /&gt;
Kommunikation mit dem NetIO-Board bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Die Benutzung gestaltet sich relativ einfach. Dazu einfach die &lt;br /&gt;
PHP-Datei &amp;quot;wrapper.php&amp;quot;, mittels PHP-Befehl &amp;lt;code&amp;gt;include(&amp;quot;wrapper.php&amp;quot;);&amp;lt;/code&amp;gt; einbinden. Nachdem dann über die Funktion &amp;lt;code&amp;gt;function wrapper_open($server, $port)&amp;lt;/code&amp;gt; unter Angabe der IP-Adresse und des Ports mit dem NetIO-Board eine Verbindung aufgebaut werden. Als Rückgabewert der Funktion erhält man einen Zeiger auf die aufgebaute Verbindung. Diesen muss man bei Funktionaufrufen immer mit angeben. Die Verbindung kann dann nach getaner Arbeit mittels &amp;lt;code&amp;gt;function wrapper_close($fp)&amp;lt;/code&amp;gt; beendet werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Beispiel, zum auslesen der Ausgänge. Dafür muss sich die Datei &amp;quot;wrapper.php&amp;quot; im selben &lt;br /&gt;
Ordner wie die Beispiel PHP-Datei befinden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
include(&amp;quot;wrapper.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$fp = wrapper_open(&amp;quot;192.168.0.90&amp;quot;, 50290); // NetIO Standard IP &amp;amp; Port&lt;br /&gt;
$data =  get_dig_output_status($fp);&lt;br /&gt;
&lt;br /&gt;
echo $data;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
/***********************************************&lt;br /&gt;
***&lt;br /&gt;
***  eeeeee eeeee eeeee eeeee eeeeee eeeeee&lt;br /&gt;
***  8    8 8     8     8     8   88 8    8&lt;br /&gt;
***  8e   8 8     8     8     8    8 8    8&lt;br /&gt;
***  88   8 8eee  8eee  8e    8    8 8e   8&lt;br /&gt;
***  88   8 8e    8e    88    8    8 88   8&lt;br /&gt;
***  88   e 88    88    88    8    e 88   8&lt;br /&gt;
***  88eee8 88eee 88    88eee 88eee8 88   8&lt;br /&gt;
***&lt;br /&gt;
***        Coded by Crashdemon....&lt;br /&gt;
***         HAVE A LOT OF PHUN!&lt;br /&gt;
***&lt;br /&gt;
***	      AVR-NetIO Wrapper&lt;br /&gt;
***		   ver 0.1&lt;br /&gt;
***        &lt;br /&gt;
***********************************************/&lt;br /&gt;
&lt;br /&gt;
$BUFFER_SIZE = 16384; &lt;br /&gt;
&lt;br /&gt;
// Establishes a connection to the Pollin AVR-NetIO&lt;br /&gt;
// Parameters: $server -&amp;gt; IP of AVR-NetIO&lt;br /&gt;
//             $port -&amp;gt; Port running the AVR-NetIO&lt;br /&gt;
// Return: The file description pointer of the established connection&lt;br /&gt;
function wrapper_open($server, $port)&lt;br /&gt;
{&lt;br /&gt;
	$errno = $errstr = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	$fp = fsockopen($server, $port, $errno, $errstr, 30);&lt;br /&gt;
	&lt;br /&gt;
	if(!$fp)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error: %s (%s)&amp;quot;, $errstr, $errno);&lt;br /&gt;
	    $data = 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return($fp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Shows the current Info about NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the Info as a String &lt;br /&gt;
function get_version($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;VERSION\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Status of given digital Pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
// Return: status auf the pin HIGH = 1 ; LOW = 0, false if fails&lt;br /&gt;
function get_dig_input($fp, $number)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=4)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;GETPORT &amp;quot;.$number.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
		&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Value of the ADC Input Pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
// Return: decimal value from the AD-Conversion, false if fails&lt;br /&gt;
function get_adc_input($fp, $number)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=4)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;GETADC &amp;quot;.$number.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
		//printf(&amp;quot;%s&amp;quot;, $data);&lt;br /&gt;
		&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set output pin&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $number -&amp;gt; number of the pin &lt;br /&gt;
//			   $set -&amp;gt; HIGH or LOW level set on output pin&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_dig_output($fp, $number, $set)&lt;br /&gt;
{&lt;br /&gt;
	if($number &amp;gt; 0 and $number &amp;lt;=8 and ($set == 0 || $set == 1))&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETPORT &amp;quot;.$number.&amp;quot;.&amp;quot;.$set.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return(true);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the current status of the digital output&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: status auf the output pins HIGH = 1 ; LOW = 0&lt;br /&gt;
function get_dig_output_status($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETSTATUS\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the IP of AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the IP as a string&lt;br /&gt;
function get_ip($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETIP\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sets a new IP on AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_ip -&amp;gt; The new IP as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_ip($fp, $new_ip)&lt;br /&gt;
{&lt;br /&gt;
	$ip = explode(&#039;.&#039;, $new_ip); &lt;br /&gt;
	&lt;br /&gt;
	if($ip[0] &amp;lt;= 255 and $ip[1] &amp;lt;= 255 and $ip[2] &amp;lt;= 255 and $ip[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_ip)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETIP &amp;quot;.$new_ip.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Gets the current Subnetmask of AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: subnetmask as a string&lt;br /&gt;
function get_mask($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETMASK\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sets new subnetmask on AVR NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_mask -&amp;gt; the new mask as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_mask($fp, $new_mask)&lt;br /&gt;
{&lt;br /&gt;
	$mask = explode(&#039;.&#039;, $new_mask); &lt;br /&gt;
	&lt;br /&gt;
	if($mask[0] &amp;lt;= 255 and $mask[1] &amp;lt;= 255 and $mask[2] &amp;lt;= 255 and $mask[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_mask)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETMASK &amp;quot;.$new_mask.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}			&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Get the Gateway of AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: the gateway as a string&lt;br /&gt;
function get_gateway($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;GETGW\r\n&amp;quot;);&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	return($data);		&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the Gateway on AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $new_gw -&amp;gt; The new Gateway adress as a string&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function set_gateway($fp, $new_gw)&lt;br /&gt;
{&lt;br /&gt;
	$gw = explode(&#039;.&#039;, $new_mask); &lt;br /&gt;
	&lt;br /&gt;
	if($gw[0] &amp;lt;= 255 and $gw[1] &amp;lt;= 255 and $gw[2] &amp;lt;= 255 and $gw[3] &amp;lt;= 255 and &lt;br /&gt;
	preg_match(&amp;quot;!^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$!&amp;quot;, $new_gw)) &lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;SETGW &amp;quot;.$new_gw.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}			&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initializes the LCD, do this first before write to it&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function init_lcd($fp)&lt;br /&gt;
{&lt;br /&gt;
	fputs($fp, &amp;quot;INITLCD\r\n&amp;quot;);	&lt;br /&gt;
	$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
	if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		return($data);&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return(false);&lt;br /&gt;
	}			&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Print text on LCD&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $row -&amp;gt; number of the row&lt;br /&gt;
//             $text -&amp;gt; the text which we would show&lt;br /&gt;
// Return: true if everthing went well, false if fails&lt;br /&gt;
function write_lcd($fp, $row, $text)&lt;br /&gt;
{&lt;br /&gt;
	if($row &amp;gt; 0 and $row &amp;lt;=2)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;WRITELCD &amp;quot;.$row.&amp;quot;.&amp;quot;.$text.&amp;quot;\r\n&amp;quot;);	&lt;br /&gt;
		$data = fread($fp, $BUFFER_SIZE);&lt;br /&gt;
	&lt;br /&gt;
		if(strcmp($data, &amp;quot;ACK&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			return($data);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			return(false);&lt;br /&gt;
		}					&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Clear the given row on the LCD&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection&lt;br /&gt;
//             $row -&amp;gt; number of the row        &lt;br /&gt;
// Return: non&lt;br /&gt;
function clear_lcd($fp, $row)&lt;br /&gt;
{&lt;br /&gt;
	if($row &amp;gt; 0 and $row &amp;lt;=2)&lt;br /&gt;
	{&lt;br /&gt;
		fputs($fp, &amp;quot;CLEARLCD &amp;quot;.$row.&amp;quot;\r\n&amp;quot;);					&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Closes the network connection to AVR-NetIO&lt;br /&gt;
// Parameters: $fp -&amp;gt; file description pointer of the established connection &lt;br /&gt;
// Return: non&lt;br /&gt;
function wrapper_close($fp)&lt;br /&gt;
{&lt;br /&gt;
	fclose($fp);	&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
[https://www.defcon-cc.org/files/netio_wrapper.zip netio_wrapper.zip]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=PC-Maus_als_Drehzahlmesser&amp;diff=745</id>
		<title>PC-Maus als Drehzahlmesser</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=PC-Maus_als_Drehzahlmesser&amp;diff=745"/>
		<updated>2022-01-24T18:58:04Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wer brauchte nicht schon immer einen einfachen Drehzahlmesser, hatte aber keinen zur Hand. Hier beschreibe ich eine Möglichkeit mittels einer einfachen PC-Maus mit Scrollrad. Ich wollte die Drehzahl von zwei Gleichstrommotoren erfassen die ich im Rahmen eines Balancierenden Roboter (Prinzip des inversen Pendels) einsetzen wollte.&lt;br /&gt;
Die Gleichstrommotoren hatte ich mit einen PWM-Signal und einer kleinen Treiberschaltung angesteuert. Hinter jedem Motor befand sich ein dahintergschaltetes Getriebe.&lt;br /&gt;
Ich habe beide Motoren mit dem selben PWM-Signal angeseteuert aber es kam mir so vor, dass diese sich unterschiedlich schnell drehten. Nur ohne Drehzahlmesser ist das schwer nachzuweisen. Dann kam mir die Idee die Drehzahl mit dem Scrollrad einer Maus zu erfassen. Dafür habe ich ein kleines Programm geschreiben das ihr im Download-Bereich der Artikels findet. Quelltext ist auch verfügbar und kann nach belieben erweitert werden. Über die Genauigkeit kann ich nichts sagen, da ich keinen Drehzahlmesser für Vergleichsmessungen besitze.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
[[File:MouseScrollCounter.jpg|400px|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
Einfach das Programm starten und am Scrollrad drehen. Um das Program zu beenden die Linke und Rechte Maustaste gedrückt halten.&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&lt;br /&gt;
Zu dem Quelltext gibt es nicht allzuviel zu erzählen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/***********************************************&lt;br /&gt;
***&lt;br /&gt;
***  eeeeee eeeee eeeee eeeee eeeeee eeeeee&lt;br /&gt;
***  8    8 8     8     8     8   88 8    8&lt;br /&gt;
***  8e   8 8     8     8     8    8 8    8&lt;br /&gt;
***  88   8 8eee  8eee  8e    8    8 8e   8&lt;br /&gt;
***  88   8 8e    8e    88    8    8 88   8&lt;br /&gt;
***  88   e 88    88    88    8    e 88   8&lt;br /&gt;
***  88eee8 88eee 88    88eee 88eee8 88   8&lt;br /&gt;
*** ----------------------------------------&lt;br /&gt;
***         defcon-cc.dyndns.org&lt;br /&gt;
***        &lt;br /&gt;
************************************************&lt;br /&gt;
************************************************&lt;br /&gt;
***   Programm: MouseScrollCounter           ***&lt;br /&gt;
***   Autor: Patrick Langosch                ***&lt;br /&gt;
***   erstellt: 12.08.14                     ***&lt;br /&gt;
***   Version: 0.1                           ***&lt;br /&gt;
***********************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DIAMETER_WHEEL 0.023 // in meters&lt;br /&gt;
#define COUNTS_PER_REVOLUTION 24 // no dimension&lt;br /&gt;
#define DISTANCE_PER_REVOLUTION (M_PI * DIAMETER_WHEEL) // in meters&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int counts = 0;&lt;br /&gt;
&lt;br /&gt;
HHOOK g_Hook;&lt;br /&gt;
HANDLE g_evExit;&lt;br /&gt;
&lt;br /&gt;
/******************************** LowLevelMouseProc ********************************/&lt;br /&gt;
LRESULT CALLBACK LowLevelMouseProc(int code, WPARAM wParam, LPARAM lParam)&lt;br /&gt;
{&lt;br /&gt;
    if(code == HC_ACTION)&lt;br /&gt;
    {&lt;br /&gt;
        const char *msg;&lt;br /&gt;
        char msg_buff[128];&lt;br /&gt;
        &lt;br /&gt;
        switch(wParam)&lt;br /&gt;
        {&lt;br /&gt;
            case WM_LBUTTONDOWN: &lt;br /&gt;
                msg = &amp;quot;WM_LBUTTONDOWN&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_LBUTTONUP: &lt;br /&gt;
                msg = &amp;quot;WM_LBUTTONUP&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
			&lt;br /&gt;
            case WM_MOUSEMOVE: &lt;br /&gt;
                msg = &amp;quot;WM_MOUSEMOVE&amp;quot;; &lt;br /&gt;
	    break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_MOUSEWHEEL: &lt;br /&gt;
                msg = &amp;quot;WM_MOUSEWHEEL&amp;quot;; &lt;br /&gt;
                counts++;&lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONDOWN: &lt;br /&gt;
	        msg = &amp;quot;WM_RBUTTONDOWN&amp;quot;; &lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONUP: &lt;br /&gt;
	        msg = &amp;quot;WM_RBUTTONUP&amp;quot;; &lt;br /&gt;
            break;&lt;br /&gt;
				&lt;br /&gt;
            default: &lt;br /&gt;
                sprintf(msg_buff, &amp;quot;Unknown msg: %u&amp;quot;, wParam); &lt;br /&gt;
                msg = msg_buff;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const MSLLHOOKSTRUCT *p = reinterpret_cast&amp;lt;const MSLLHOOKSTRUCT*&amp;gt;(lParam);&lt;br /&gt;
&lt;br /&gt;
        static bool left_down = false;&lt;br /&gt;
        static bool right_down = false;&lt;br /&gt;
        &lt;br /&gt;
        switch(wParam)&lt;br /&gt;
        {&lt;br /&gt;
            case WM_LBUTTONDOWN: &lt;br /&gt;
				left_down = true; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_LBUTTONUP:   &lt;br /&gt;
				left_down = false; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONDOWN: &lt;br /&gt;
				right_down = true; &lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
            case WM_RBUTTONUP:   &lt;br /&gt;
				right_down = false; &lt;br /&gt;
				break;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(left_down &amp;amp;&amp;amp; right_down)&lt;br /&gt;
        {&lt;br /&gt;
        	SetEvent(g_evExit);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return CallNextHookEx(g_Hook, code, wParam, lParam); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************** MAIN ********************************/&lt;br /&gt;
int main(int argc, char *argv[]) &lt;br /&gt;
{&lt;br /&gt;
    int n = 0;&lt;br /&gt;
    int rpm = 0;&lt;br /&gt;
    int rps = 0;&lt;br /&gt;
    float speed = 0.0;&lt;br /&gt;
    char buffer[64];&lt;br /&gt;
    DWORD startTime = 0;&lt;br /&gt;
    DWORD diffTime = 0;&lt;br /&gt;
	&lt;br /&gt;
    // remove scrollbar&lt;br /&gt;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); // get handle of console window&lt;br /&gt;
    CONSOLE_SCREEN_BUFFER_INFO info;&lt;br /&gt;
    &lt;br /&gt;
    GetConsoleScreenBufferInfo(handle, &amp;amp;info);&lt;br /&gt;
    &lt;br /&gt;
    COORD new_size =&lt;br /&gt;
    {&lt;br /&gt;
        info.srWindow.Right - info.srWindow.Left + 1,&lt;br /&gt;
        info.srWindow.Bottom - info.srWindow.Top + 1&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    SetConsoleScreenBufferSize(handle, new_size); // set new size&lt;br /&gt;
    SetConsoleTitle(&amp;quot;DefCon - MouseScrollCounter&amp;quot;); // set title&lt;br /&gt;
	&lt;br /&gt;
    g_evExit = CreateEvent(0, TRUE, FALSE, 0);&lt;br /&gt;
 &lt;br /&gt;
    if(!g_evExit)&lt;br /&gt;
    {&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;CreateEvent failed, le = &amp;quot; &amp;lt;&amp;lt; GetLastError() &amp;lt;&amp;lt; endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    g_Hook = SetWindowsHookEx(WH_MOUSE_LL, &amp;amp;LowLevelMouseProc, GetModuleHandle(0), 0);&lt;br /&gt;
    &lt;br /&gt;
    if(!g_Hook)&lt;br /&gt;
    {&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;SetWindowsHookEx() failed, le = &amp;quot; &amp;lt;&amp;lt; GetLastError() &amp;lt;&amp;lt; endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Press both left and right mouse buttons to exit...&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
    MSG msg;&lt;br /&gt;
    DWORD status;&lt;br /&gt;
    &lt;br /&gt;
    /******************************** LOOP ********************************/&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        while(PeekMessage(&amp;amp;msg, 0, 0, 0, PM_REMOVE))&lt;br /&gt;
        {&lt;br /&gt;
        	DispatchMessage(&amp;amp;msg);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        status = MsgWaitForMultipleObjects(1, &amp;amp;g_evExit, FALSE, INFINITE, QS_ALLINPUT);&lt;br /&gt;
    &lt;br /&gt;
        if(status == (WAIT_OBJECT_0 + 1))&lt;br /&gt;
        {&lt;br /&gt;
            // check if the wheel is reached a revolution&lt;br /&gt;
            if(counts &amp;gt;= COUNTS_PER_REVOLUTION)&lt;br /&gt;
            {&lt;br /&gt;
                if(startTime != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    diffTime = GetTickCount() - startTime; // get time between two calls&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                startTime = GetTickCount();&lt;br /&gt;
        		&lt;br /&gt;
                if(diffTime != 0)&lt;br /&gt;
                {&lt;br /&gt;
                    // get radiation per second and minute&lt;br /&gt;
        	    rps = 1000 / (int)(diffTime); &lt;br /&gt;
        	    rpm = 60000 / (int)(diffTime);&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                speed = DISTANCE_PER_REVOLUTION * rps; // in m/s&lt;br /&gt;
        		&lt;br /&gt;
                system(&amp;quot;cls&amp;quot;);&lt;br /&gt;
                n = snprintf(buffer, 64, &amp;quot;%c DIFF:%ims --&amp;gt; %i rpm --&amp;gt; %.2f m/s %c&amp;quot;, 186, diffTime, rpm, speed, 186);&lt;br /&gt;
        		&lt;br /&gt;
                // ********** draw border **********&lt;br /&gt;
                printf(&amp;quot;%c&amp;quot;, 201);&lt;br /&gt;
        		&lt;br /&gt;
                for(int i = 0; i &amp;lt; n-2; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    printf(&amp;quot;%c&amp;quot;, 205);&lt;br /&gt;
                }&lt;br /&gt;
        	&lt;br /&gt;
                printf(&amp;quot;%c\n&amp;quot;, 187);        		&lt;br /&gt;
                printf(&amp;quot;%s\n&amp;quot;, buffer);&lt;br /&gt;
                printf(&amp;quot;%c&amp;quot;, 200);&lt;br /&gt;
        		&lt;br /&gt;
                for(int i = 0; i &amp;lt; n-2; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    printf(&amp;quot;%c&amp;quot;, 205);&lt;br /&gt;
                }&lt;br /&gt;
        		&lt;br /&gt;
                printf(&amp;quot;%c\n&amp;quot;, 188);&lt;br /&gt;
        		&lt;br /&gt;
	        counts = 0; // reset counter&lt;br /&gt;
            }&lt;br /&gt;
        	&lt;br /&gt;
            continue; // there are messages to process, eat em up&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            break; // assume g_evExit is signaled&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Exiting...&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
    UnhookWindowsHookEx(g_Hook);&lt;br /&gt;
    CloseHandle(g_evExit);&lt;br /&gt;
	&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
[https://www.defcon-cc.org/files/MouseScrollCounter.zip MouseScrollCounter.zip]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=744</id>
		<title>RWE-Wallbox</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=744"/>
		<updated>2021-02-12T19:53:28Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich bin durch Zufall in den Besitz einer RWE-Wallbox gekommen und möchte euch deren Innenleben nicht vorenthalten. &lt;br /&gt;
Vorgefunden habe ich:&lt;br /&gt;
&lt;br /&gt;
* FI-Schalter, &lt;br /&gt;
* Leitungsschutzschalter&lt;br /&gt;
* Schütz&lt;br /&gt;
* Netzteil (12V) &lt;br /&gt;
* Montageplatte zum nachrüsten eines eHz Zählers (ABB BKE-I).&lt;br /&gt;
&lt;br /&gt;
Weiterhin befindet sich auch ein wenig Digitalelektronik dadrin, nämlich &lt;br /&gt;
zwei Hutschienengeräte der Firma INSYS:&lt;br /&gt;
&lt;br /&gt;
* INSYS RWE e-Mobility LSG&lt;br /&gt;
* INSYS e-Mobility PLC&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=743</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=743"/>
		<updated>2021-02-08T10:40:10Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Artikelübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[RWE-Wallbox]] - [[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]] - [[Sonoff POW]] - [[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=742</id>
		<title>RWE-Wallbox</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=742"/>
		<updated>2021-02-08T10:39:41Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich bin durch zufall in den Besitz einer RWE-Wallbox gekommen und möchte euch deren Innenleben nicht vorenthalten. &lt;br /&gt;
Vorgefunden habe ich:&lt;br /&gt;
&lt;br /&gt;
* FI-Schalter, &lt;br /&gt;
* Leitungsschutzschalter&lt;br /&gt;
* Schütz&lt;br /&gt;
* Netzteil (12V) &lt;br /&gt;
* Montageplatte zum nachrüsten eines eHz Zählers (ABB BKE-I).&lt;br /&gt;
&lt;br /&gt;
Weiterhin befindet sich auch ein wenig Digitalelektronik dadrin, nämlich &lt;br /&gt;
zwei Hutschienengeräte der Firma INSYS:&lt;br /&gt;
&lt;br /&gt;
* INSYS RWE e-Mobility LSG&lt;br /&gt;
* INSYS e-Mobility PLC&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=741</id>
		<title>RWE-Wallbox</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=RWE-Wallbox&amp;diff=741"/>
		<updated>2021-02-08T10:19:43Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: Created page with &amp;quot;tbd&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;tbd&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=740</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=740"/>
		<updated>2020-10-12T06:53:46Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]] - [[Sonoff POW]] - [[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Laptimer&amp;diff=739</id>
		<title>Laptimer</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Laptimer&amp;diff=739"/>
		<updated>2019-04-30T04:39:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Einzelnachweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesen Artikel stelle ich vor, wie ein einfacher Laptimer realisiert werden kann.&lt;br /&gt;
Ich habe ihn Primär dafür eingesetzt die Rundenzeit meines Rennkarts zu erfassen. Er kann aber auch individuell für diverse Einsatzzwecke adaptiert werden. &lt;br /&gt;
Für den Einsatzbereich im Kart gibt es schon einige fertige Lösungen (MyChron, Alfano, etc..), diese sind aber recht teuer weswegen ich zu einem Selbstbau übergegangen bin. Außerdem ist bei einem Selbstbau der Lerneffekt um einiges größer. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage bildet der 8-Bit Mikrocontroller ATmega8 der Firma ATMEL der mit einer Taktfrequenz von 4 MHz betrieben wird. Dieser übernimmt alle Aufgaben der Steuerung und Berechnung. Das sind im großen und ganzen die Erfassung von:&lt;br /&gt;
&lt;br /&gt;
* Drehzahl&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Rundenzeit&lt;br /&gt;
&lt;br /&gt;
sowie die Steuerung der&lt;br /&gt;
 &lt;br /&gt;
* LCD-Anzeige&lt;br /&gt;
* Hintergrundbeleuchtung&lt;br /&gt;
* Bestzeit-LED&lt;br /&gt;
&lt;br /&gt;
Zur Anzeige wird ein alphanummerisches 4x20 Zeilen LCD verwendet (HD44780 kompatibel). Die Stromversorgung wird noch über einen 9V-Block realisiert der über einen Schaltregler die 5V erzeugt. Im Schaltplan ist noch die Möglichkeit vorgesehen über eine Z-Diode die für den Mikroconroller notwendigen 5V zu erzeugen. Davon sollte aber in der Praxis abgesehen werden. In Zukunft gedenke ich den 9V Block durch einen alten Handy-Akku zu ersetzen.&lt;br /&gt;
Mittels eines NPN-Transistors besteht die Möglichkeit die Hintergrundbeleuchtung des LCD&#039;s über den Mikrocontroller einzuschalten. Das sollte beim Batteriebetrieb aber nur für kurze Zeit, z.B. beim beenden einer Runde geschehen. Weiterhin wird über eine LED angezeigt ob eine neue Bestzeit gefahren wurde.&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten ===&lt;br /&gt;
&lt;br /&gt;
Nachfolgend einige Eckdaten des Laptimers:&lt;br /&gt;
&lt;br /&gt;
* Rundenzeitmessung von 15 sec. bis 12 min. Auflösung 10ms.&lt;br /&gt;
* Drehzahlmessung von 0 bis 240000 U/min. Auflösung 100 U/min.&lt;br /&gt;
* Geschwindigkeitsmessung von 0 bis 240 km/h. Auflösung 1 km/h.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung ===&lt;br /&gt;
&lt;br /&gt;
 Pin    Description     Connected with&lt;br /&gt;
 -----------------------------------------&lt;br /&gt;
 1      PC6(RESET)      RC-Network&lt;br /&gt;
 2      PD0(RXD)        Connector (Bootloader)&lt;br /&gt;
 3      PD1(TXD)        Connector (Bootloader)&lt;br /&gt;
 4      PD2(INT0)       Drehzahl&lt;br /&gt;
 5      PD3(INT1)       Geschwindigkeit&lt;br /&gt;
 6      PD4(XCK/T0)     -&lt;br /&gt;
 7      VCC             +5V&lt;br /&gt;
 8      GND             GND&lt;br /&gt;
 9      PB6(XTAL1)      4Mhz Quarz&lt;br /&gt;
 10     PB7(XTAL2)      4Mhz Quarz&lt;br /&gt;
 11     PD5(T1)         -&lt;br /&gt;
 12     PD6(AIN0)       -&lt;br /&gt;
 13     PD7(AIN1)       Bestzeit-LED&lt;br /&gt;
 14     PB0(ICP)        Rundenzeit (Reed-Kontakt)&lt;br /&gt;
 15     PB1(OC1A)       Transistor(LCD_BACKGRND)				&lt;br /&gt;
 16     PB2(SS)         Taster &amp;quot;Hoch&amp;quot;&lt;br /&gt;
 17     PB3(MOSI)       Taster &amp;quot;Runter&amp;quot;&lt;br /&gt;
 18     PB4(MISO)       Taster &amp;quot;OK/EXIT&amp;quot;&lt;br /&gt;
 19     PB5(SCK)        -&lt;br /&gt;
 20     AVCC            +5V&lt;br /&gt;
 21     AREF            -&lt;br /&gt;
 22     AGND            GND	&lt;br /&gt;
 23     PC0(ADC0)       LCD(DB7)&lt;br /&gt;
 24     PC1(ADC1)       LCD(DB6)&lt;br /&gt;
 25     PC2(ADC2)       LCD(DB5)&lt;br /&gt;
 26     PC3(ADC3)       LCD(DB4)&lt;br /&gt;
 27     PC4(ADC4)       LCD(Enable)&lt;br /&gt;
 28     PC5(ADC5)       LCD(RS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es noch eine vierpolige Stiftleiste. Diese dient zum Flashen der Firmware auf den&lt;br /&gt;
Mikrocontroller, zum Debuggen oder zum Senden von Messwerten die dann bequem Protokolliert werden können.&lt;br /&gt;
Die Schnittstelle hat die folgende Belegung (5V Pegel, nur über Pegelwandler an serielle Schnittstelle anschließen):&lt;br /&gt;
&lt;br /&gt;
 Pin    Connected with&lt;br /&gt;
 -----------------------------------------&lt;br /&gt;
 1      +5V&lt;br /&gt;
 2      GND&lt;br /&gt;
 3      RXD&lt;br /&gt;
 4      TXD&lt;br /&gt;
&lt;br /&gt;
=== Stromverbrauch ===&lt;br /&gt;
&lt;br /&gt;
Aktuell betreibe ich den Laptimer mit einem Wald-und-Wiesen 9V-Block, der Kapazität von ungefähr&lt;br /&gt;
600 mAh haben müsste. Dabei ergeben sich für verschiedene Zustände in denen sich der Laptimer befindet&lt;br /&gt;
auch verschiedene Laufzeiten die ich nachfolgend in einer Tabelle aufgeführt habe (für einen 9V-Block a 600mAh):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:left; margin-right:1em&amp;quot;&lt;br /&gt;
! Zustand || Stromaufnahme (mA) || Laufzeit (std)&lt;br /&gt;
|-&lt;br /&gt;
| Standardanzeige (*) + LCD-Hintergrundbeleuchtung an || 44 mA  || 13 std (**) &lt;br /&gt;
|-&lt;br /&gt;
| Standardanzeige (*) + LCD-Hintergrundbeleuchtung aus || 16 mA  || 37 std (**) &lt;br /&gt;
|-&lt;br /&gt;
| Rundenzeitmessung läuft || 44 mA  || 13 std (**)&lt;br /&gt;
|-&lt;br /&gt;
| Standby || 16 mA  || 37 std (**)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*) Anzeige der Messwerte nach dem Einschalten des Laptimers (keine Messung läuft)&lt;br /&gt;
&lt;br /&gt;
(**) Die Berechnung gehen von einer vollständigen Entladung aus. Mitunter schafft es der Schaltregler aber&lt;br /&gt;
nicht mehr die 5V-Versorgungsspannung aufrecht zu halten. Die Zeiten sind als Best-Case anzunehmen. &lt;br /&gt;
&lt;br /&gt;
Den größten Anteil am Stromverbrauch hat sicherlich die LCD-Hintergrundbeleuchtung&amp;lt;ref&amp;gt;[http://www.abacom-online.de/div/LCD20x4.pdf Datenblatt LCD 20x4 (PCM2004A)]&amp;lt;/ref&amp;gt; mit aktuelle 80 mA. Dieser kann natürlich &lt;br /&gt;
noch über den Vorwiderstand R17 gesenkt werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_f = \frac{U_{VCC} - U_f}{R_{17}} = \frac{5~V - 4,2~V}{10~\Omega} = 80~mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bedenken sollte man allerdings das dann mitunter die Erkennbarkeit des Displays, bei starker Sonneneinstrahlung, darunter leidet.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
&lt;br /&gt;
Über Software defines können eine fülle von Einstellungen an dem Laptimer vorgenommen werden ohne Teile im Code ändern zu müssen.&lt;br /&gt;
Zurzeit habe ich die folgenden Parameter implementiert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
N_STROKE_ENGINE 2 // 2-Takt oder 4-Takt Motor? Zwei oder Vier eintragen!&lt;br /&gt;
SEC_LOCK_ICP 1 // Zeit die der ICP nach auslösen gesperrt bleibt, in Sekunden.&lt;br /&gt;
STANDBY_AFTER_MIN 6 // Zurücksetzen der Rundenzeitmessung und Standby (Runde nach x Minuten noch nicht beendet)&lt;br /&gt;
MAX_INTERIM_TICKS 12000 // Schwelle für Differenz zu Best-Zwischenzeiten (ganze Minuten!!)&lt;br /&gt;
AVG_N_ORDER 8 // Ordnung der gleitenden Mittelwertberechnung&lt;br /&gt;
AMOUNT_MAGNETIC_LOOPS 3 // Anzahl der Magnetschleifen auf der Rennstrecke&lt;br /&gt;
KPH_TO_MPS 3.6 // Umrechnung km/h &amp;lt;-&amp;gt; m/s&lt;br /&gt;
PERIMETER_TYRE 0.86 // Reifenumfang in Meter&lt;br /&gt;
FRONT_SPROCKET 11 // Zähnezahl Ritzel&lt;br /&gt;
REAR_SPROCKET 86 // Zähnezahl Kettenrad&lt;br /&gt;
SEC_SHOW_LAPTIME 5 // Zeit in Sekunden, bei der die alte Rundenzeit angezeigt wird &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zeiten ===&lt;br /&gt;
&lt;br /&gt;
Der Atmega8 besitzt drei Timer die alle genutzt werden. Nachfolgend ist aufgelistet welchen Zweck die der jeweilige Timer genutzt wird und&lt;br /&gt;
welches Zeitnormal er erzeugt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:left; margin-right:1em&amp;quot;&lt;br /&gt;
! TimerX || Wird benutzt für || Zeitnormal&lt;br /&gt;
|-&lt;br /&gt;
| Timer0 || Geschwindigkeits- und Drehzahlmessung  || 100µs&lt;br /&gt;
|-&lt;br /&gt;
| Timer1 ||  Rundenzeit || 10ms&lt;br /&gt;
|-&lt;br /&gt;
| Timer2 || PWM für LCD Hintergrundbeleuchtung  || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Berechnung der Zeiten gestaltet sich im ganzen Programm nach dem selben Schema. Ausgehend von den &amp;quot;overflow_ticks_10ms&amp;quot; die über den&lt;br /&gt;
internen Timer des Atmegas alle 10ms erhöht wird, werden die daraus folgenden Zeiten abgeleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void splitTicks(uint16_t ticks, volatile struct myTime* result)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t centiSec = 0;&lt;br /&gt;
    uint16_t seconds = 0;&lt;br /&gt;
&lt;br /&gt;
    centiSec = ticks; // Zenti-Sekunden (10ms)&lt;br /&gt;
    seconds = centiSec / 100; // Sekunden berechnen&lt;br /&gt;
&lt;br /&gt;
    result-&amp;gt;ticks = ticks;&lt;br /&gt;
    result-&amp;gt;csec = centiSec  % 100; // Rest bei der Berechnung der Sekunden --&amp;gt; Zenti-Sekunden&lt;br /&gt;
    result-&amp;gt;min = seconds  / 60; // Minuten berechnen&lt;br /&gt;
    result-&amp;gt;sec = seconds  % 60; // Rest bei der Berechnung der Minuten -- &amp;gt; Sekunden&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei wird eine eigens angelegte Struktur &amp;quot;myTime&amp;quot; genutzt, die wie folgt definiert ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Struktur für die diversen Zeiten&lt;br /&gt;
struct myTime &lt;br /&gt;
{&lt;br /&gt;
    uint8_t min;&lt;br /&gt;
    uint8_t sec;&lt;br /&gt;
    uint8_t csec;&lt;br /&gt;
    uint16_t ticks;&lt;br /&gt;
    uint16_t interim[AMOUNT_MAGNETIC_LOOPS];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interrupt Service Routinen ===&lt;br /&gt;
&lt;br /&gt;
==== Timer0 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/******** ISR des Overflow von Timer0 ********/&lt;br /&gt;
ISR(TIMER0_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
    TCNT0 = -50; // Timer Register wird mit einem Wert vorbelegt, 2^8 - 206 = 50 als Rest&lt;br /&gt;
		 // somit ist mit jedem Aufruf der ISR 0.1ms vergangen&lt;br /&gt;
&lt;br /&gt;
    overflow_ticks_100us++; // Mit jedem Aufruf der ISR sind 100µs vergangen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Timer1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/******** ISR des Input Capture (Rundenzeit)(Timer1 / 16Bit) ********/&lt;br /&gt;
ISR(TIMER1_CAPT_vect) // Aufruf bei steigender Flanke an ICP&lt;br /&gt;
{&lt;br /&gt;
    TIMSK &amp;amp;= ~(1 &amp;lt;&amp;lt; TICIE1); // Input Capture Interrupt deaktivieren&lt;br /&gt;
    TIFR &amp;amp;= (1 &amp;lt;&amp;lt; ICF1); // Zur Sicherheit das IC-Flag löschen, durch schreiben einer eins&lt;br /&gt;
&lt;br /&gt;
    if(initial_start == FALSE) // Kein Erststart wenn = 0&lt;br /&gt;
    {&lt;br /&gt;
        loop_crossed = TRUE; // Flag signalisiert das soeben eine Magnetschleife überfahren wurde	&lt;br /&gt;
        act.interim[run_over_magnetic_loops] = overflow_ticks_10ms; // Zwischenzeit speichern&lt;br /&gt;
&lt;br /&gt;
        run_over_magnetic_loops++; // Anzahl der überfahrenen Magnetschleifen hochzählen&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else // Wenn Magnetschleife das erste mal überfahren wird = 1&lt;br /&gt;
    {&lt;br /&gt;
        ICR1 = TCNT1 - ICR1; // Wert für Input Capture Register berechnen, die Takte die zwischen aufruf der ISR und dem setzen von ICR1 vergangen sind&lt;br /&gt;
        TCNT1 = -5000 + (ICR1 + 6); // Takte die zwischen vorherigen Befehl ablaufen werden dazuaddiert 	&lt;br /&gt;
&lt;br /&gt;
        initial_start = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Wenn alle Magnetschleifen auf der Rennstrecke überfahren wurden &lt;br /&gt;
    // d.h. eine Runde abgeschlossen wurde&lt;br /&gt;
    if(run_over_magnetic_loops == AMOUNT_MAGNETIC_LOOPS)&lt;br /&gt;
    {&lt;br /&gt;
        run_over_magnetic_loops = 0; // Überfahrene Magnetschleifen zurücksetzen&lt;br /&gt;
		&lt;br /&gt;
        ICR1 = TCNT1 - ICR1; // Wert für Input Capture Register berechnen, die Takte die zwischen aufruf der ISR und dem setzen von ICR1 vergangen sind&lt;br /&gt;
        TCNT1 = -5000 + (ICR1 + 2); // Takte die zwischen vorherigen Befehl ablaufen werden dazuaddiert 	&lt;br /&gt;
        lap_complete = TRUE; // Flag setzen wenn Runde beendet&lt;br /&gt;
&lt;br /&gt;
        lap = act; // Werte übertragen&lt;br /&gt;
        overflow_ticks_10ms = 0; // Overflow Zähler auf Null setzen&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Sorgt dafür das Pegeländerungen welche durch Prellen des Reed-Kontaktes &lt;br /&gt;
    // hervorgerufen werden nicht an den ICP1 Pin gelangen können&lt;br /&gt;
    temp = act.sec;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******** ISR des Overflow von Timer1 ********/&lt;br /&gt;
ISR(TIMER1_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
    TCNT1 = -5000; // Timer Register wird mit einem Wert vorbelegt, 2^16 - 60536 = 5000 als Rest&lt;br /&gt;
		   // somit ist mit jedem Aufruf der ISR 10^-2 Sekunden (0.01) vergangen&lt;br /&gt;
&lt;br /&gt;
    if(initial_start == FALSE) // Erstüberfahrt einer Magnetschleife&lt;br /&gt;
    {&lt;br /&gt;
        // d.h jedes mal wenn overflow_ticks_10ms um eins inkrementiert wird,&lt;br /&gt;
        // sind 10ms vergangen&lt;br /&gt;
        overflow_ticks_10ms++; // max. 65536 da 16Bit Variable&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Timeout Zähler der Drehzahl und Geschwindigkeit&lt;br /&gt;
    if(timeout_ticks_rpm &amp;lt; (TIMEOUT_RPM / 100))&lt;br /&gt;
    {&lt;br /&gt;
        timeout_ticks_rpm++;&lt;br /&gt;
        timeout_rpm = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else timeout_rpm = TRUE;&lt;br /&gt;
&lt;br /&gt;
    if(timeout_ticks_kph &amp;lt; (TIMEOUT_KPH / 100))&lt;br /&gt;
    {&lt;br /&gt;
        timeout_ticks_kph++;&lt;br /&gt;
        timeout_kph = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else timeout_kph = TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Timer2 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/******** ISR des Compare Match von Timer2 ********/&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PB1); // LCD-Hintergrundbeleuchtung (PWM) &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******** ISR des Overflow von Timer2 ********/&lt;br /&gt;
ISR(TIMER2_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PB1); // LCD-Hintergrundbeleuchtung (PWM)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fuses ===&lt;br /&gt;
&lt;br /&gt;
[[File:Laptimer_Fuses.jpg|right|thumb|400px|Fuses Einstellungen des Atmega8]]&lt;br /&gt;
&lt;br /&gt;
Die Fuses sind dazu da dem Mikrocontroller bestimmte Einstellungen mitzugeben. Das sind dinge wie &amp;quot;Welche Takquelle wird benutzt?&amp;quot;. &lt;br /&gt;
Diese Informationen benötigt der Mikrocontroller um richtig zu laufen. Nähere Informationen dazu hier&amp;lt;ref&amp;gt;[http://www.mikrocontroller.net/articles/AVR_Fuses  AVR Fuses einstellen]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ich habe meinen Atmega8 mit folgenden Fuses programmiert:&lt;br /&gt;
&lt;br /&gt;
* High Fuses: 0xD4&lt;br /&gt;
* Low Fuses: 0x1C&lt;br /&gt;
&lt;br /&gt;
Kurz zusammengefasst:&lt;br /&gt;
&lt;br /&gt;
* BOOTRST und BOOTSZ0 müssen gesetzt sein wenn der Bootloader benutzt wird&lt;br /&gt;
* BODLEVEL und BODEN aktivieren den Brownout&amp;lt;ref&amp;gt;[http://www.mikrocontroller.net/articles/Brownout Brownout]&amp;lt;/ref&amp;gt; und setzen die Grenzspannung auf 4V&lt;br /&gt;
* EESAVE sorgt dafür das die Einstellungen im EEPROM auch nach dem übertragen einer neuen Firmware erhalten bleiben&lt;br /&gt;
&lt;br /&gt;
=== Flashen ===&lt;br /&gt;
&lt;br /&gt;
[[File:Laptimer_Bootloader_Flash_FW.jpg|right|thumb|400px|Flashen mittels FastBoot Bootloader]]&lt;br /&gt;
&lt;br /&gt;
Um das Programm auf den Mikrocontroller zu bekommen gibt es mehrere möglichkeiten, aber für alle wird zunächst&lt;br /&gt;
einmal ein ISP-Programmer benötigt. Da es diese recht günstig (~10€) in der Bucht gibt gehe ich im weiteren nicht mehr darauf ein.&lt;br /&gt;
&lt;br /&gt;
Zum Flashen muss der entsprechende ISP-Programmer mit den Pins Reset, MISO, MOSI sowie SCK verbunden werden. Diese&lt;br /&gt;
Möglichkeit habe ich in meinem Layout allerdings nicht vorgesehen, deswegen bietet es sich an den Mikrocontroller&lt;br /&gt;
extern zu Programmieren. Im Layout gibt es die Möglichkeit den Mikrocontroller über einen Bootloader zu Flashen (nur Flash kein EEPROM) allerdings muss dafür auch zunächst der Bootloader über einen ISP-Programmer in den Chip geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Im Grunde kann dafür jeder Bootloader benutzt werden, ich benutze zurzeit den Bootloader FastBoot von Peter Dannegger.&amp;lt;ref&amp;gt;[http://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger AVR Bootloader FastBoot von Peter Dannegger]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Flashen geschieht mittels eines Bootloader über die serielle Schnittstelle (UART) des Atmega8 (Pins PD0 und PD1). Nutzt man diese Möglichkeit sollte man darauf achten, dass der Mikrocontroller auch keinen Fall direkt mit der seriellen Schnittstelle des PCs verbunden werden darf. Beachtet man das nicht zerschießt man sich die entsprechenden Eingangspins des Atmega.&lt;br /&gt;
Es muss also zwingend eine Pegelwandlung (± 12V PC &amp;lt;&amp;gt; 0-5V µC) z.B. mit einem MAX232 (es gibt in der Bucht auch schon fertige Schaltungen direkt mit USB/Seriell-Wandler für ~2€) durchgeführt werden. Die Belegung der Stiftleiste kann unter [[Laptimer#Pinbelegung|Pinbelegung]] nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Protokollierung ===&lt;br /&gt;
&lt;br /&gt;
Über die serielle Schnittstelle erfolgt nicht nur das Flashen des Mikrocontrollers. Die Schnittstelle kann unter anderem auch zum Debuggen bei der Fehlersuche &lt;br /&gt;
genutzt werden. Ein weiteres nettes Feature ist das Protokollieren von Messwerten wie z.B. Drehzahl, Geschwindigkeit, Rundenzeit um nur einige Beispiele zu nennen.&lt;br /&gt;
Zum Protokollieren benutze ich zur Zeit den Datenlogger &amp;quot;Openlog&amp;quot; von Sparkfun&amp;lt;ref&amp;gt;[https://www.sparkfun.com/products/9530  Sparkfun - Openlog]&amp;lt;/ref&amp;gt;. Der Datenlogger protokolliert die Messwerte auf eine microSD-Karte und kommt erstaunlicherweise direkt mit den 5V-Pegel der seriellen Schnittstelle zurecht (Datennlogger wird intern mit 3,3V betrieben). Um den Datenlogger nutzen zu können muss man lediglich die CONFIG.TXT auf die richtige Baudrate einstellen (Ich benutze per Default 19200 baud/sek).&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Beispiel wie die Ausgabe über die serielle Schnittstelle mit dem Mikrocontroller durchgeführt werden kann. Das Senden erfolgt zurzeit in der main-Routine&lt;br /&gt;
mit jedem Schleifen durchlauf ist also in keinem Fall zeit-deterministisch. Möchte man die Ausgabe immer in gleich Zeitabständen durchführen muss das mit Hilfe eines Timers erfolgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
USART_send(utoa(pre_rpm, buffer, 10)); // Drehzahl ausgeben&lt;br /&gt;
USART_send(&amp;quot;,&amp;quot;);&lt;br /&gt;
USART_send(utoa(kph, buffer, 10)); // Geschwindigkeit ausgeben&lt;br /&gt;
USART_send(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe über die serielle Schnittstelle erfolgt in diesem Beispiel als CSV (comma seperated value) mit anschließenden Newline.&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
&lt;br /&gt;
Das EEPROM dient dazu diverse Werte im Mikrocontroller zu speichern die auch nach einem Spannungsverlust erhalten bleiben sollen.&lt;br /&gt;
Aktuell werden die folgenden Daten im EEPROM des Mikrocontrollers gespeichert:&lt;br /&gt;
&lt;br /&gt;
* Einstellungen (Anzahl der Magnetschleifen, Reifenumfang, Ritzel- und Kettenradzahl)&lt;br /&gt;
* Bestzeit + dazugehörige Zwischenzeiten&lt;br /&gt;
&lt;br /&gt;
Möchte man die Daten die im EEPROM gespeichert sind zurücksetzen (um z.B. den Laptimer auf einer anderen Rennstrecke&lt;br /&gt;
einzusetzen) muss man den Ok/Exit-Taster bei einschalten des Laptimers gedrückt halten. Die nun erfolgte&lt;br /&gt;
Inititialisierung wird durch den Text &amp;quot;Init. EEPROM!&amp;quot; auf dem Display und dem Blinken des Bestzeit-LED signalisiert.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend sind die Standardwerte angegeben die nach der erfolgten Initialiserungen für die Einstellungen im EEPROM stehen:&lt;br /&gt;
&lt;br /&gt;
* Magnetschleifen = 3&lt;br /&gt;
* Reifenumfang = 0.86&lt;br /&gt;
* Ritzel = 10&lt;br /&gt;
* Kattenrad = 86&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bugs ===&lt;br /&gt;
&lt;br /&gt;
In der Version 1.0:&lt;br /&gt;
&lt;br /&gt;
* Funktion &amp;quot;EEPROM_readBesttime()&amp;quot; ließt falsche ticks ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// EEPROM leer --&amp;gt; Defaultwert übernehmen&lt;br /&gt;
if(temp_word == EEPROM_WORD_DEF) besttime-&amp;gt;ticks = EEPROM_WORD_DEF;&lt;br /&gt;
else besttime-&amp;gt;ticks = temp_byte;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ersetzen durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// EEPROM leer --&amp;gt; Defaultwert übernehmen&lt;br /&gt;
if(temp_word == EEPROM_WORD_DEF) besttime-&amp;gt;ticks = EEPROM_WORD_DEF;&lt;br /&gt;
else besttime-&amp;gt;ticks = temp_word;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Da alle alle Zeiten aus dem externen Quarz abgeleitet werden, hängt die Genauigkeit (Rundenzeiten, ...) maßgeblich von der Genauigkeit des verwendeten Quarz ab. Dieser ist natürlichen Schwankungen aufgrund von Temperatureinflüssen und Alterung unterlegen. Der von mir eingesetzte 4 MHz Quarz im HC-49/US Gehäuse weist einen Temperaturkoeffizient von ± 30 ppm und eine Frequenztoleranz von ebendfalls ± 30 ppm auf. Bei der Verschaltung des Quarz ist außerdem auf die richtige Lastkapazität zu achten entspricht diese nicht genau der vom Hersteller angebenen Kapazität kommt eine weitere Fehlerquelle hinzu. Dabei gilt: Bei kleinere Last schwingt der Quarz schneller und bei größerer Last langsamer. &lt;br /&gt;
Ausgehend von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F_r=\left(\frac{f_{ist}}{f_{soll}} - 1 \right) \cdot 10^6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
umgestellt nach &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f_{ist}=\left(\frac{F_r}{10^6} + 1\right)\cdot f_{soll} = \left(\frac{30~ppm}{10^6} + 1\right)\cdot 4~MHz = 4~MHz \pm 120~Hz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ergibt sich für einen 4 Mhz Quarz eine Gangabweichung von 120 Hz bei einer Frequenztoleranz von ± 30 ppm.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:left; margin-right:1em&amp;quot;&lt;br /&gt;
! Quarz-Typ || Frequenzfehler (25°C) || Abweichung (min/jahr) || Abweichung (s/tag) || Abweichung (s/h) || Abweichung (ms/min) || Frequenabw. bei 4 MHz &lt;br /&gt;
|-&lt;br /&gt;
| Standardquarz (Grundtton) || 30 ppm  || 16 min/jahr || 2,6 s/tag || 108 ms/h || 1,8 ms/s || 120 Hz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet konkret das man bei einer Rundenzeit von ca. 10 min mit einen Fehler von 18 ms rechnen muss. Lässt man auch noch Temperatureinflüsse mit in die&lt;br /&gt;
Rechnung einfließen kann sich das ganze im Worst-Case noch verdoppeln. Alterungseffekte wurden dabei außer acht gelassen.&lt;br /&gt;
&lt;br /&gt;
=== Abstimmen des Quarz ===&lt;br /&gt;
&lt;br /&gt;
Möchte man diese einflüsse so gut es geht kompensieren bietet es sich an zunächst einmal zu schauen mit welcher Frequenz der Quarz den&lt;br /&gt;
tatsächlich schwingt. Das gestaltet sich allerdings nicht so einfach wie es auf den ersten Blick aussieht. Da der Quarz schon durch geringe Kapazitäten von einigen pF messbar verstimmt wird, würde ein direktes Messen den Quarz messbar verstimmen. Um das Problem zu umgehen kann man den Takt über den Vorteiler eines Timers auf einen&lt;br /&gt;
IO-Pin ausgeben und dann dort messen.&amp;lt;ref&amp;gt;[http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC#Echtzeituhr_mit_Uhrenquarz AVR - Die genaue Sekunde – Echtzeituhr mit Uhrenquarz]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abstimmen erstzt man einen Lastkondensator durch einen Trimmkondensator (0-47pF). Dieser wird dann so lange verdreht bis die gewünschte Frequenz auf dem Display des Frequenzzählers angezeigt wird.&amp;lt;ref&amp;gt;[http://sprut.de/electronic/mess/frequenz.htm Das Quarzproblem]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
&lt;br /&gt;
In den nachfolgenden Kapiteln wird ausführlich auf einzelnen Komponenten des Laptimers eingegangen. &lt;br /&gt;
&lt;br /&gt;
=== Magnetstreifen ===&lt;br /&gt;
In die Kartbahn sind in der Regel an bestimmten stellen Magnetstreifen eingelassen. Dazu werden einfache Permanent-Magneten genutzt (siehe Quelle Patenschrift). Ein Magnetstreifen sollte sich auf jedenfall auf der Start-/Ziellinie befinden. Je nach Kartbahn gibt es aber auch mehrere Magnetstreifen auf der Strecke die es ermöglichen Zwischenzeiten zu erfassen. Die Magnetstreifen sind i.d.R. ca. 1,8cm breit und umfassen die ganze Länge der Kartbahn. Ein Reed-Kontakt schaltet in ca. 2cm Abstand, von den Permanent-Magneten wobei dieser Wert stark von der Empfindlichkeit des Reed-Kontaktes abhängt.&lt;br /&gt;
&lt;br /&gt;
=== Rundenzeit erfassen ===&lt;br /&gt;
&lt;br /&gt;
Um die Rundenzeit zu erfassen, muss zunächst einmal das Magnetfeld des Magnetstreifens beim überfahren erfasst werden. Dazu kann man einen Hallsensor oder Hallschalter einsetzen. Es sollte aber auch eine Reed-Kontakt reichen. Beim überfahren des Magnetstreifens wird der Reed-Kontakt für kurze Zeit geschlossen. Der dadurch entstehende Pegelwechsel wird über den Mikrocontroller über den ICP-Pin (Input Capture) erfasst.&lt;br /&gt;
&lt;br /&gt;
=== Drehzahl erfassen ===&lt;br /&gt;
&lt;br /&gt;
Die Drehzahl wird Potentialfrei gemessen was kapazitiv über einen Draht geschieht der um das Zündkabel (Verbindung Zündkerze &amp;lt;&amp;gt; Zündspule) gewickelt wird.&lt;br /&gt;
&lt;br /&gt;
=== Geschwindigkeit erfassen ===&lt;br /&gt;
&lt;br /&gt;
Bei der Erfassung der Geschwindigkeit gibt es zwei möglichkeiten. Die Drehzahl der hinteren Achse kann direkt erfasst werden, was z.B. ebendfalls mittels eines &lt;br /&gt;
Reed-Kontaktes und Magnet (wie beim Fahrrad) geschehen kann. Es besteht aber auch die Option die Geschwindigkeit aus der Drehzahl und dem Übersetzungsverhältnis (Ritzel &amp;lt;&amp;gt; Kettenrad) zu berechnen.&lt;br /&gt;
&lt;br /&gt;
== Berechnungen ==&lt;br /&gt;
&lt;br /&gt;
=== Rundenzeit ===&lt;br /&gt;
Zunächst berechne ich wielange der Reed-Kontakt Zeit hat um im &amp;quot;Worst-Case&amp;quot; zu schließen. Dazu nehme ich eine Geschwindigkeit von&lt;br /&gt;
&amp;lt;math&amp;gt;v = 100~km/h = 27,78~m/s &amp;lt;/math&amp;gt;&lt;br /&gt;
beim überfahren der Magnetschleife, an. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; s = v \cdot t \rightarrow t = \left( \frac{s}{v} \right) = \left( \frac{1,8 \cdot 10^-2~m}{27,78~m/s} \right) = 0,65~ms &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Reed-Kontakt hat also ca. 0,65 ms Zeit um zu schließen. Bei 50 km/h dementsprechend doppelt so viel (1,3 ms).&lt;br /&gt;
&lt;br /&gt;
=== Drehzahl / Geschwindigkeit ===&lt;br /&gt;
&lt;br /&gt;
Das ermitteln der Drehzahl bzw. der Geschwindigkeit gestaltet sich ähnlich. Es wird bei beiden zu messenden Größen die Zeitdifferenz die zwischen zwei&lt;br /&gt;
Impulsen gemessen und daraus dann die entsprechende Geschwindkeit bzw. Drehzahl berechnet. Da sich Drehzahl und Geschwindigkeit grob nur in dem Übersetzungsverhältnis&lt;br /&gt;
zwischen Ritzel und Kettenrad unterscheiden, kann mitunter von einer expliziten zusätzlichen Erfassung der Geschwindigkeit oder Drehzahl abgesehen werden.&lt;br /&gt;
&lt;br /&gt;
Eine Umrechnung der Geschwindigkeit aus der Drehzahl erfolgt nach der folgenden Gleichung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v = n \cdot \frac{x_{Ritzel}}{x_{Kettenrad}} \cdot U \cdot 0,06 \frac{km}{min}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;v~\textrm{in}~\frac{km}{h}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;n~\textrm{in}~min^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Berechnungen die ich dazu angestellt habe befinden sich im nachfolgenden Bild oder in dem dazugehörigen PDF im Anhang.&lt;br /&gt;
&lt;br /&gt;
[[File:Berechnungen_Drehzahl_Geschwindigkeit.gif]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung: Nach jedem &amp;quot;Tick&amp;quot; sind 100µs vergangen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Steuerung ==&lt;br /&gt;
&lt;br /&gt;
Die (Menü-)Steuerung des Laptimers geschieht über drei auf der Vorderseite angebrachte Taster (Ok/Exit, Hoch, Runter).&lt;br /&gt;
Die Taster dienen zum einem dazu das Navigieren durch das Menü zu ermöglichen zum anderen aber auch zum zurücksetzen von &lt;br /&gt;
gespeicherten Rundenzeiten oder zum zurücksetzen des Laptimers. &lt;br /&gt;
&lt;br /&gt;
=== Einstellungen ===&lt;br /&gt;
&lt;br /&gt;
Durch drücken des Ok/Exit-Tasters kommt man ins Einstellungen-Menü. In dem Menü können die folgenden&lt;br /&gt;
Einstellungen vorgenommen werden:&lt;br /&gt;
&lt;br /&gt;
* Anzahl der Magnetschleifen (1...6)&lt;br /&gt;
* Reifenumfang in Meter (0.01...2.50)&lt;br /&gt;
* Anzahl der Zähne des Ritzels (0...25)&lt;br /&gt;
* Anzahl der Zähne des Kettenrades (0...100)&lt;br /&gt;
&lt;br /&gt;
Durch drücken des Hoch- oder Runter-Tasters kann der jeweilige Menüpunkt ausgewählt werden, was durch ein&lt;br /&gt;
Symbol (&amp;gt;) vor dem Menüpunkteintrag kenntlich gemacht wird. Durch drücken der Ok/Exit-Taste kann der Wert ausgewählt &lt;br /&gt;
und über den Hoch- oder Runter-Taster editiert werden. Durch drücken der Ok/Exit-Taste wird der Wert übernommen.&lt;br /&gt;
&lt;br /&gt;
Bei der Ermittlung der Geschwindigkeit gibt es die Möglichkeit diese aus der Drehzahl des Motors zu berechnen oder&lt;br /&gt;
diese über den Sensor an der Hinterachse zu bestimmen. Durch die Wahl der Ritzel-/Kettenradzahl kann man aus einen&lt;br /&gt;
der beiden Optionen wählen. &lt;br /&gt;
&lt;br /&gt;
Sind für Ritzel und Kettenrad Werte ungleich Null eingestellt, wird die Geschwindigkeit aus der Drehzahl des Motors&lt;br /&gt;
berechnet (Belastet den Mikrocontroller mit zusätzlichen Berechnungen). Wurde für die Ritzel- und Kettenradzahl hingegen&lt;br /&gt;
Null eingestellt wird die Geschwindigkeit mittels des Geschwindigkeitssensors direkt an der Hinterachse ermittelt. &lt;br /&gt;
Die zweite Option ist deutlich weniger Rechenintensiv und sollte deswegen wenn möglich bevorzugt werden.&lt;br /&gt;
&lt;br /&gt;
Durch längeres Drücken (&amp;gt;3sek) des Ok/Exit-Tasters werden die geänderten Werte ins EEPROM des Mikrocontrollers geschrieben. &lt;br /&gt;
Das schreiben wird durch eine Nachricht &amp;quot;Save to EEPROM&amp;quot; auf dem Display und durch Blinken der Bestzeit-LED signalisiert.&lt;br /&gt;
Die Änderungen sind dann dauerhaft in dem Mikrocontroller gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Laptimer_Rev_E_1.jpg&lt;br /&gt;
File:Laptimer_Rev_E_2.jpg&lt;br /&gt;
File:Laptimer_RevE_1_New.jpg&lt;br /&gt;
File:Laptimer_RevE_2_New.jpg&lt;br /&gt;
File:Laptimer_RevE_3_New.jpg&lt;br /&gt;
File:Laptimer_Laptime_Reed_Switch_1.jpg&lt;br /&gt;
File:Laptimer_Laptime_Reed_Switch_2.jpg&lt;br /&gt;
File:Laptimer_Laptime_Reed_Switch_3.jpg&lt;br /&gt;
File:Laptimer_Laptime_Reed_Switch_4.jpg&lt;br /&gt;
File:Laptimer_Velocity_Sensor.jpg&lt;br /&gt;
File:Laptimer_Laptime_Sensor.jpg&lt;br /&gt;
File:Laptimer_RevF_1.jpg&lt;br /&gt;
File:Laptimer_RevF_OpenLog.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
[[File:Laptimer_RevE_sch.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
Aktuelle Version: 1.1&lt;br /&gt;
&lt;br /&gt;
Quelltext ver1.1: [[File:Laptimer Code_ver1.1.pdf]] &amp;lt;br&amp;gt;&lt;br /&gt;
Laptimer Project Files ver1.1 (AVR-Studio 4): [[File:Laptimer_ver1.1.zip]]&lt;br /&gt;
&lt;br /&gt;
Quelltext ver1.0: [[File:Laptimer Code_ver1.0.pdf]] &amp;lt;br&amp;gt;&lt;br /&gt;
Laptimer Project Files ver1.0 (AVR-Studio 4): [[File:Laptimer_ver1.0.zip]]&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
* THT-Layout verbessern (kleiner, integrierte Spannungsversorgung)&lt;br /&gt;
* SMD-Layout erstellen&lt;br /&gt;
* Menü-Auswahl Drehzahl 2-Takt / 4-Takt &lt;br /&gt;
* Kommunikation über RS232 mit anderer Peripherie (GPS, Accelerometer, Lenkwinkel, ...)&lt;br /&gt;
* Praktischer Test: Drehzahl schwankt sehr stark? (Einstreuungen)&lt;br /&gt;
* Praktischer Test: Geschwindigkeit erreicht irgendwann einen Endwert.&lt;br /&gt;
* Kontrast des Display schlecht bei Sonneneinstrahlung&lt;br /&gt;
* Ablesen durch Vibrationen teilweise schwierig&lt;br /&gt;
* Grafik-Display Unterstützung&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/27580/spark_l.JPG Schaltplan Drehzahlteil] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.google.com/patents/EP0632350B1?cl=de Patentschrift Alfano E.P.0632350]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Laptimer_Drehzahl_Geschwindigkeit.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=738</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=738"/>
		<updated>2019-04-30T04:39:11Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Einzelnachweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Wifi-Chip: ESP8266&lt;br /&gt;
* Chip für die Erfassung der Messwerte: CHIPSEA CSE7766 &amp;lt;ref&amp;gt;[https://dl.itead.cc/S31/CSE7766.pdf CHIPSEA CSE7766]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
# Um die WLAN-Zugangsdaten einzutragen muss jetzt eine serielle Verbindung (z.B. mittels PuTTY&amp;lt;ref&amp;gt;[https://www.putty.org/ PuTTY]&amp;lt;/ref&amp;gt;) zu dem POW aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Wifi_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
[https://www.itead.cc/wiki/Sonoff_Pow#Hardware Sonoff POW Hardware] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=737</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=737"/>
		<updated>2019-04-29T17:46:21Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Wifi-Chip: ESP8266&lt;br /&gt;
* Chip für die Erfassung der Messwerte: CHIPSEA CSE7766 &amp;lt;ref&amp;gt;[https://dl.itead.cc/S31/CSE7766.pdf CHIPSEA CSE7766]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
# Um die WLAN-Zugangsdaten einzutragen muss jetzt eine serielle Verbindung (z.B. mittels PuTTY&amp;lt;ref&amp;gt;[https://www.putty.org/ PuTTY]&amp;lt;/ref&amp;gt;) zu dem POW aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Wifi_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
[https://www.itead.cc/wiki/Sonoff_Pow#Hardware Sonoff POW Hardware] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=736</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=736"/>
		<updated>2019-04-29T16:15:35Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
# Um die WLAN-Zugangsdaten einzutragen muss jetzt eine serielle Verbindung (z.B. mittels PuTTY&amp;lt;ref&amp;gt;[https://www.putty.org/ PuTTY]&amp;lt;/ref&amp;gt;) zu dem POW aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Wifi_Settings.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Wifi_Settings.png&amp;diff=735</id>
		<title>File:Tasmota Wifi Settings.png</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Wifi_Settings.png&amp;diff=735"/>
		<updated>2019-04-29T16:14:52Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=734</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=734"/>
		<updated>2019-04-29T15:55:51Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
# Um die WLAN-Zugangsdaten einzutragen muss jetzt eine serielle Verbindung (z.B. mittels PuTTY&amp;lt;ref&amp;gt;[https://www.putty.org/ PuTTY]&amp;lt;/ref&amp;gt;) zu dem POW aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=733</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=733"/>
		<updated>2019-04-29T15:53:32Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
# Um die WLAN-Zugangsdaten einzutragen muss jetzt eine serielle Verbindung zu dem POW aufgebaut werden&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=732</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=732"/>
		<updated>2019-04-29T15:52:03Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases]&amp;lt;/ref&amp;gt; von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=731</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=731"/>
		<updated>2019-04-29T15:49:15Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases] von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=730</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=730"/>
		<updated>2019-04-29T15:48:57Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases] von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=729</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=729"/>
		<updated>2019-04-29T15:48:28Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases] von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
# Warten bis der Flashvorgang erfolgreich beendet wurde&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota Flashing Complete.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Flashing_Complete.png&amp;diff=728</id>
		<title>File:Tasmota Flashing Complete.png</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Flashing_Complete.png&amp;diff=728"/>
		<updated>2019-04-29T15:47:26Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=727</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=727"/>
		<updated>2019-04-29T15:44:56Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases] von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png|right|thumb|400px|Flashen mittels ESPEasy Flasher]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=726</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=726"/>
		<updated>2019-04-29T15:43:45Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESPEasyFlasher-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/BattloXX/ESPEasyFlasher ESPEasyFlasher]&amp;lt;/ref&amp;gt; und entpacken&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung (RX und TX kreuzen, VDD an 3,3V) mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Entsprechend neustes Release &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/releases Tasmota Releases] von Tasmota herunterladen und in den Ordner vom ESPEasyFlasher-Tool verschieben (sonoff.bin)&lt;br /&gt;
# ESPEasyFlasher-Tool starten und COM-Port des USB&amp;lt;&amp;gt;Seriell-Wandler auswählen&lt;br /&gt;
# Taster am Sonoff POW gedrück halten (versetzt den POW in den Flashmode)&lt;br /&gt;
# POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
# Mittels drücken auf &amp;quot;Flash&amp;quot; im ESPEasyFlasher-Tool den Flashvorgang einleiten&lt;br /&gt;
&lt;br /&gt;
[[File:Tasmota_Flashing.png]]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Flashing.png&amp;diff=725</id>
		<title>File:Tasmota Flashing.png</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Tasmota_Flashing.png&amp;diff=725"/>
		<updated>2019-04-29T15:42:40Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=724</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=724"/>
		<updated>2019-04-29T15:24:15Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESP-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/igrr/esptool-ck/releases ESP-Tool]&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Sonoff POW entsprechend Pinbelegung mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden. &lt;br /&gt;
# Taster am Sonoff POW gedrück halten&lt;br /&gt;
# Sonoff POW mit 3,3V versorgen (im Idealfall direkt über den USB&amp;lt;&amp;gt;Seriell-Wandler)&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=723</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=723"/>
		<updated>2019-04-29T15:10:17Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Alternative Firmware flashen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota &amp;lt;ref&amp;gt;[https://github.com/arendst/Sonoff-Tasmota/ Tasmota]&amp;lt;/ref&amp;gt; ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESP-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/igrr/esptool-ck/releases ESP-Tool]&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Sonoff POW entsprechend mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=722</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=722"/>
		<updated>2019-04-29T15:09:12Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
# ESP-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/igrr/esptool-ck/releases ESP-Tool]&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Sonoff POW entsprechend mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=721</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=721"/>
		<updated>2019-04-29T15:08:34Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
1. ESP-Tool herunterladen &amp;lt;ref&amp;gt;[https://github.com/igrr/esptool-ck/releases ESP-Tool]&amp;lt;/ref&amp;gt;&lt;br /&gt;
2. Sonoff POW entsprechend mit einem USB&amp;lt;&amp;gt;Seriell-Wandler verbinden.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=720</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=720"/>
		<updated>2019-04-29T15:06:23Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware flashen ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
* EspTool herunterladen &amp;lt;ref&amp;gt;[https://github.com/igrr/esptool-ck/releases]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=719</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=719"/>
		<updated>2019-04-29T15:04:07Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative Firmware ===&lt;br /&gt;
&lt;br /&gt;
Als alternative Firmware setze ich Tasmota ein was die funktionen der Hersteller-Firmware erheblich erweitert und auch &lt;br /&gt;
wenn notwedig nach dem eigenen belieben verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Tasmota flashen ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=718</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=718"/>
		<updated>2019-04-29T04:58:05Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich wollte von diversen Geräten in meiner Wohnung den Energieverbrauch erfassen und bin dabei auf die vergleichsweise günstigen&lt;br /&gt;
IoT WLAN-Schalter von Itead gestoßen. Mit dem Sonoff POW R2 habe ich das gefunden was ich brauchte um diverse Messwerte&lt;br /&gt;
von meiner Geschirrspülmaschine, Waschmaschine, ... zu erfassen. Ich beschreibe hier ein bisschen wie die Hardware des Sonoff POW &lt;br /&gt;
aufgebaut ist und welche alternative Firmware es gibt (eigentlich gibt es noch mehr) um den Funktionsumfang zu erweitern. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=717</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=717"/>
		<updated>2019-04-25T04:57:12Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Bilder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sonoff_POW_PCB_Top.jpg&lt;br /&gt;
File:Sonoff_POW_PCB_Bottom.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Sonoff_POW_PCB_Top.jpg&amp;diff=716</id>
		<title>File:Sonoff POW PCB Top.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Sonoff_POW_PCB_Top.jpg&amp;diff=716"/>
		<updated>2019-04-25T04:51:36Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:Sonoff_POW_PCB_Bottom.jpg&amp;diff=715</id>
		<title>File:Sonoff POW PCB Bottom.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:Sonoff_POW_PCB_Bottom.jpg&amp;diff=715"/>
		<updated>2019-04-25T04:50:12Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=714</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=714"/>
		<updated>2019-04-23T04:48:04Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Neue Artikel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]]&lt;br /&gt;
&lt;br /&gt;
== Neue Artikel ==&lt;br /&gt;
[[Sonoff POW]] - [[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=713</id>
		<title>Sonoff POW</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Sonoff_POW&amp;diff=713"/>
		<updated>2019-04-23T04:47:20Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: Created page with &amp;quot; == Hardware ==  == Software ==  == Bilder ==  == Quellen ==   == Einzelnachweise ==  &amp;lt;references&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=LED-Tisch&amp;diff=712</id>
		<title>LED-Tisch</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=LED-Tisch&amp;diff=712"/>
		<updated>2019-04-23T04:43:39Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Bilder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann hatte ich mal die Idee einen LED-Tisch Tisch zu bauen, da ich im Internet&amp;lt;ref&amp;gt;[http://hackedgadgets.com/2009/06/05/64-rgb-led-color-table/ Hacked Gadgets - 64 RGB-LED Color Table]&amp;lt;/ref&amp;gt; viele schöne Umsetzungen&lt;br /&gt;
gesehen habe. Ich habe mich dazu entschieden einen LED-Tisch mit 64-RGB-Leds aufzubauen. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Zur Ansteuerung der RGB-Leds wird der äußerst weit verbreitete LED-Treiber TLC5940 Chip genutzt. Dieser Chip hat den Vorteil,&lt;br /&gt;
dass er in Reihe geschaltet werden und somit fast unbegrenzt viele LEDs angesteuert werden können. Begrenzender Faktor ist&lt;br /&gt;
fast ausschließlich die Taktfrequenz der seriellen Übertragung. Ein weiterer Vorteile des LED-Treibers ist die mögliche Korrektor von Fertigungstoleranzen (Helligkeitsunterschied) zwischen den Leds mittels DOT Correction.&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten ===&lt;br /&gt;
&lt;br /&gt;
* Maße: ca. 50x50x20cm&lt;br /&gt;
* LED-Treiber: TLC5940&lt;br /&gt;
* µC: Atmel Atmega16&lt;br /&gt;
* LED: 64x RGB-Led 5mm&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:LED_Tisch_Frame.jpg&lt;br /&gt;
File:LED_Tisch_Matrix.jpg&lt;br /&gt;
File:LED_Tisch_LEDs.jpg&lt;br /&gt;
File:LED_Tisch_Wiring.jpg&lt;br /&gt;
File:LED_Tisch_PCB.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[File:Laptimer_RevE_sch.pdf]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/27580/spark_l.JPG Schaltplan Drehzahlteil] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.google.com/patents/EP0632350B1?cl=de Patentschrift Alfano E.P.0632350]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Laptimer_Drehzahl_Geschwindigkeit.pdf]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:LED_Tisch_PCB.jpg&amp;diff=711</id>
		<title>File:LED Tisch PCB.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:LED_Tisch_PCB.jpg&amp;diff=711"/>
		<updated>2019-04-23T04:42:49Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=File:LED_Tisch_Wiring.jpg&amp;diff=710</id>
		<title>File:LED Tisch Wiring.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=File:LED_Tisch_Wiring.jpg&amp;diff=710"/>
		<updated>2019-04-23T04:41:49Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=709</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=Main_Page&amp;diff=709"/>
		<updated>2017-12-28T08:51:11Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Neue Artikel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Daniel Duesentrieb.jpg]]&lt;br /&gt;
&lt;br /&gt;
Willkommen in meinem Wiki!&lt;br /&gt;
Hier dreht sich alles um (Elektronik)projekte die ich mal durchgeführt habe.&lt;br /&gt;
Ich werde hier in unregelmäßigen Abstände mal das ein oder andere&lt;br /&gt;
Projekt beschreiben. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Meißtbesuchte Seiten ==&lt;br /&gt;
&amp;lt;TopTenPages/&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Artikelübersicht ==&lt;br /&gt;
[[Pollin AVR-NetIO PHP Wrapper]] - [[Ätzmaschine]] - [[Ramdisk unter Linux]] - [[RS232/RS485-Wandler]] - [[Nulldurchgangserkennung]] - [[Lötrauchabsaugung]] - [[PC-Maus als Drehzahlmesser]] - [[GPS Laptimer]] - [[Platinenfräsmaschine]] - [[WLAN Richtfunkantenne]] - [[Laptimer]] - [[OsmocomBB]] - [[SDR mit DVB-T Stick]] - [[ESP8266]]&lt;br /&gt;
&lt;br /&gt;
== Neue Artikel ==&lt;br /&gt;
[[Samsung Galaxy Ace disassembled]] - [[Cafissimo Picco Hack]] - [[LED-Tisch]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.defcon-cc.org/wiki/index.php?title=LED-Tisch&amp;diff=708</id>
		<title>LED-Tisch</title>
		<link rel="alternate" type="text/html" href="https://www.defcon-cc.org/wiki/index.php?title=LED-Tisch&amp;diff=708"/>
		<updated>2017-12-28T08:50:09Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: /* Bilder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann hatte ich mal die Idee einen LED-Tisch Tisch zu bauen, da ich im Internet&amp;lt;ref&amp;gt;[http://hackedgadgets.com/2009/06/05/64-rgb-led-color-table/ Hacked Gadgets - 64 RGB-LED Color Table]&amp;lt;/ref&amp;gt; viele schöne Umsetzungen&lt;br /&gt;
gesehen habe. Ich habe mich dazu entschieden einen LED-Tisch mit 64-RGB-Leds aufzubauen. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Zur Ansteuerung der RGB-Leds wird der äußerst weit verbreitete LED-Treiber TLC5940 Chip genutzt. Dieser Chip hat den Vorteil,&lt;br /&gt;
dass er in Reihe geschaltet werden und somit fast unbegrenzt viele LEDs angesteuert werden können. Begrenzender Faktor ist&lt;br /&gt;
fast ausschließlich die Taktfrequenz der seriellen Übertragung. Ein weiterer Vorteile des LED-Treibers ist die mögliche Korrektor von Fertigungstoleranzen (Helligkeitsunterschied) zwischen den Leds mittels DOT Correction.&lt;br /&gt;
&lt;br /&gt;
=== Eckdaten ===&lt;br /&gt;
&lt;br /&gt;
* Maße: ca. 50x50x20cm&lt;br /&gt;
* LED-Treiber: TLC5940&lt;br /&gt;
* µC: Atmel Atmega16&lt;br /&gt;
* LED: 64x RGB-Led 5mm&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:LED_Tisch_Frame.jpg&lt;br /&gt;
File:LED_Tisch_Matrix.jpg&lt;br /&gt;
File:LED_Tisch_LEDs.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[File:Laptimer_RevE_sch.pdf]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quelltext ==&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/27580/spark_l.JPG Schaltplan Drehzahlteil] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.google.com/patents/EP0632350B1?cl=de Patentschrift Alfano E.P.0632350]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Laptimer_Drehzahl_Geschwindigkeit.pdf]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
</feed>