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

<channel>
	<title>Datenübertragung Archives - Nerd Corner</title>
	<atom:link href="https://nerd-corner.com/de/tag/datenuebertragung/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerd-corner.com/de/tag/datenuebertragung/</link>
	<description>Craft your dreams!</description>
	<lastBuildDate>Wed, 06 Mar 2024 12:08:14 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://nerd-corner.com/wp-content/uploads/2019/10/cropped-LogoNerdCorner-2-32x32.png</url>
	<title>Datenübertragung Archives - Nerd Corner</title>
	<link>https://nerd-corner.com/de/tag/datenuebertragung/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WeMos D1 R2 &#8211; Ganze Webseite mit html, css &#038; js hosten</title>
		<link>https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/</link>
					<comments>https://nerd-corner.com/de/wemos-d1-r2-ganze-webseite-mit-html-css-js-hosten/#respond</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sat, 02 Mar 2024 23:11:48 +0000</pubDate>
				<category><![CDATA[Arduino Projekte]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Arduino mit WLAN]]></category>
		<category><![CDATA[C Programmierung]]></category>
		<category><![CDATA[Datenübertragung]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP8266 mit mDNS]]></category>
		<category><![CDATA[ganze Webseite]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Klemmsystem]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[Lokales Netzwerk]]></category>
		<category><![CDATA[Netzwerk]]></category>
		<category><![CDATA[Schritt für Schritt Anweisung]]></category>
		<category><![CDATA[Webseite hosten]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[WeMos]]></category>
		<category><![CDATA[WeMos D1]]></category>
		<category><![CDATA[WeMos D1 in Arduino IDE]]></category>
		<category><![CDATA[WeMos D1 mini]]></category>
		<category><![CDATA[WeMos D1 R2]]></category>
		<category><![CDATA[WeMOS D1 Webserver]]></category>
		<category><![CDATA[WIFI]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=1526</guid>

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

					<description><![CDATA[<p>Ich habe mir schon häufig gedacht, dass es überaus praktisch wäre meine Arduino Projekte mit dem WLAN zu verbinden. Irgendwann bin ich zufällig auf den &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/">WeMos D1 R2 erste Schritte und Wlan integration</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ich habe mir schon häufig gedacht, dass es überaus praktisch wäre meine Arduino Projekte mit dem WLAN zu verbinden. Irgendwann bin ich zufällig auf den WeMos D1 R2 gestoßen und bin begeistert! Im Prinzip lässt sich jedes Arduino Projekt auch mit dem D1 realisieren und man hat dabei immer die Möglichkeit Wlan zu nutzen. Wahrscheinlich wird der D1 zukünftig sogar den Arduino vom Markt verdrängen. Anbei erkläre ich die Unterschiede zwischen einem Arduino UNO R3 und einem WeMos D1. Anschließend beschreibe ich die Einrichtung des D1 anhand eines einfachen Beispiels. In dem Beispiel wird mit einem Browser eine LED gesteuert, welche fest auf dem D1 verbaut ist.</p>
<p><em><strong>Das könnte dich auch interessieren:</strong> <a href="https://nerd-corner.com/de/arduino-luefter-steuerung/">Wie man einen Lüfter mit einem Arduino steuert!</a></em></p>
<h2>Liste der Komponenten</h2>
<ul>
<li>Arduino IDE (Entwicklungsumgebung)</li>
<li><a href="https://amzn.to/3tQPCjC" target="_blank" rel="noopener">WeMos D1 R2</a></li>
</ul>
<h2>Unterschiede zwischen dem WeMos D1 R2 und dem Arduino UNO R3</h2>
<p>Ein Arduino UNO R3 ähnelt optisch sehr dem WeMos D1. Der Hauptunterschied ist, dass der D1 ein ESP2866 WIFI Modul auf seiner Platine integriert hat. Dadurch hat man die Möglichkeit den D1 mit dem Internet zu verbinden. Grob gesagt ist der D1 ein wlanfähiger Arduino!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1175 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-scaled.jpg" alt="Wemos D1 and Arduino Uno" width="2000" height="900" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-300x135.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-1024x461.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-768x346.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-1536x691.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-und-Arduino-Uno-2048x922.jpg 2048w" sizes="auto, (max-width: 2000px) 100vw, 2000px" /></p>
<p>Man sollte allerdings beachten, dass die Taktfrequenz der beiden Prozessoren unterschiedlich sind. Der Arduino besitzt einen 8 bit Atmel Prozessor und der D1 einen Wlan fähigen ESP8266 Prozessor mit 32 bit Taktfrequenz. Die Pins des D1 sind zwar ähnlich angeordnet wie bei einem Arduino UNO, aber unterscheiden sich in der Betriebsspannung. Bei einem Arduino UNO liegt die Spannung der Pins bei 5V und bei dem D1 bei 3,3V. Zusätzlich ist aber auch auf dem D1 ein 5V Ausgang vorhanden. Aufgrund der Spannungsunterschiede an den Pins sollte man nicht blindlings ein Arduino Shield auf einen D1 stecken. Es empfiehlt sich zuerst die Kompatibilität zu prüfen!</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-1166" src="https://nerd-corner.com/wp-content/uploads/2022/01/Pinout_D1_R2.png" alt="Pinout WeMos D1 R2 Pinbelegung" width="770" height="888" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Pinout_D1_R2.png 783w, https://nerd-corner.com/wp-content/uploads/2022/01/Pinout_D1_R2-260x300.png 260w, https://nerd-corner.com/wp-content/uploads/2022/01/Pinout_D1_R2-768x886.png 768w" sizes="auto, (max-width: 770px) 100vw, 770px" /></p>
<p>Außerdem sollte man beachten, dass der D1 im Gegensatz zum Arduino nur einen analog Pin besitzt und zusätzlich die Anzahl der digitalen Pins unterschiedlich ist. Der Arduino besitzt 20 digitale Pins und der D1 nur 16 digitale Pins. Allerdings haben die digitalen Pins des D1 mehr nützliche Zusatzfunktionen.</p>
<p>Bitte beachten: Auch die Bezeichnung der digitalen D1 Pins unterscheidet sich von denen des Arduino und müssen daher softwaretechnisch angepasst werden.</p>
<p>Als letztes noch der Hinweis, dass sich der USB Anschluss ebenfalls unterscheidet. Im Gegensatz zum Arduino besitzt der D1 den deutlich verbreiteteren Micro USB Standard.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1176 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-scaled.jpg" alt="Wemos D1 R2 vs Arduino Uno" width="2000" height="1500" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-300x225.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-1024x768.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-768x576.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-1536x1152.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-vs-Arduino-Uno-2048x1536.jpg 2048w" sizes="auto, (max-width: 2000px) 100vw, 2000px" /></p>
<h2>Einrichtung des D1</h2>
<p>Die Arduino IDE öffnen und den D1 mit dem Computer verbinden. Unter Tools &gt; Port den entsprechenden COM Port des D1 auswählen. Sollte der D1 hier nicht erkannt werden liegt das vermutlich an einem fehlenden Treiber.</p>
<p>Wenn nun der passende COM Port ausgewählt wurde und man einen Beispiel sketch auf den D1 lädt wird vorraussichtlich folgende Fehlermeldung auftauchen: „An error occurred while uploading the sketch avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x2e“. Der Grund für diesen Fehler ist, dass das falsche Board ausgewählt wurde. Der Name des ausgewählten Boards taucht rechts unten in der IDE auf:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1167 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/WEMOS-choosen-in-IDE.png" alt="WeMos D1 com Port IDE" width="1300" height="55" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/WEMOS-choosen-in-IDE.png 1308w, https://nerd-corner.com/wp-content/uploads/2022/01/WEMOS-choosen-in-IDE-300x13.png 300w, https://nerd-corner.com/wp-content/uploads/2022/01/WEMOS-choosen-in-IDE-1024x43.png 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/WEMOS-choosen-in-IDE-768x32.png 768w" sizes="auto, (max-width: 1300px) 100vw, 1300px" /></p>
<p>Um den D1 auswählen zu können muss der Boardmanager für den ESP8266 noch hinzugefügt werden. Hier folgenden Link in Preferences &gt; Board Manager einfügen: http://arduino.esp8266.com/stable/package_esp8266com_index.json</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1168 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/preferences-board-manager.png" alt="Preferences boardmananger WeMos D1 R2" width="910" height="703" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/preferences-board-manager.png 921w, https://nerd-corner.com/wp-content/uploads/2022/01/preferences-board-manager-300x232.png 300w, https://nerd-corner.com/wp-content/uploads/2022/01/preferences-board-manager-768x593.png 768w" sizes="auto, (max-width: 910px) 100vw, 910px" /></p>
<p>Anschließend in Tools &gt; Board &gt; Board Manager nach ESP8266 suchen und die neuste Version installieren:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1169 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/Esp8266-in-boardsmanager.png" alt="WeMos D1 R2 ESP8266 boardmananger in Arduino IDE" width="1200" height="692" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Esp8266-in-boardsmanager.png 1213w, https://nerd-corner.com/wp-content/uploads/2022/01/Esp8266-in-boardsmanager-300x173.png 300w, https://nerd-corner.com/wp-content/uploads/2022/01/Esp8266-in-boardsmanager-1024x590.png 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/Esp8266-in-boardsmanager-768x443.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></p>
<p>Jetzt in Tools &gt; Board &gt; ESP8266 Boards &gt; LOLIN (WEMOS D1 R2 &amp;mini) auswählen:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1170 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board.png" alt="choose WeMos D1 board in Arduino IDE" width="1900" height="999" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board.png 1920w, https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board-300x158.png 300w, https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board-1024x539.png 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board-768x404.png 768w, https://nerd-corner.com/wp-content/uploads/2022/01/Choose-ESP8266-board-1536x808.png 1536w" sizes="auto, (max-width: 1900px) 100vw, 1900px" /></p>
<p>Nun kann man wieder ein Beispielprojekt unter File &gt; Examples &gt; 01.Basics &gt; Blink auswählen und mit einem Klick auf Upload funktioniert das Ganze. Das Beispielprojekt lässt jetzt die blaue LED auf dem ESP8266 Modul blinken.</p>
<p>Achtung: Dieses Setup war einmalig für die erstmalige Benutzung und muss nicht erneut wiederholt werden!</p>
<h2>WeMos D1 mit dem Internet verbinden</h2>
<p>Der Programmaufbau entspricht dem eines regulären Microcontrollers wie man es auch vom Arduino kennt. Es gibt eine setup() Funktion, welche nur einmal direkt zum Programmstart aufgerufen wird und eine loop() Funktion, welche nach dem setup() in Dauerschleife läuft.</p>
<p>Als erstes wird die ESP WiFi Bibliothek benötigt. Diese wird mittels #include &lt;ESP8266WiFi.h&gt; eingebunden. Sobald der ESP mit Strom versorgt wird, soll eine WLAN-Verbindung hergestellt werden. Daher wird der Code in die setup() Funktion geschrieben.</p>
<p>Wir brauchen den Seriellen Monitor um uns den aktuellen Stand des Verbindungsaufbaus anzeigen zu lassen. Die Baudrate kann selbst festgelegt werden. Für den D1 nehme ich 115200. Den Seriellen Monitor findet man unter Tools &gt; Serial Monitor. Im Fenster des Seriellen Monitors kann rechts unten die Baudrate eingestellt werden. Bitte hier ebenfalls 115200 auswählen. Wählt man nicht die gleiche Baudrate wie im setup() definiert, werden einem nur unleserliche Sonderzeichen angezeigt.</p>
<p>Um sich mit dem Wlan zu verbinden reicht der einfache Befehl WiFi.beginn(„WlanName“, „WlanPasswort“). Es kann sehr hilfreich sein wenn man sich hier gleich die IP Adresse des D1 anzeigen lässt. Dazu nutzt man den Befehl WiFi.localIP()</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">#include &lt;ESP8266WiFi.h&gt;

void setup() {
  Serial.begin(115200); //Baudrate
  Serial.println("ESP starts");

  WiFi.begin("NerdCornerWiFi","NerdCornerPassword");

  Serial.print("Connecting...");

  while(WiFi.status()!=WL_CONNECTED){ //Loop which makes a point every 500ms until the connection process has finished

    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected! IP-Address: ");
  Serial.println(WiFi.localIP()); //Displaying the IP Address

}

void loop() {
  // put your main code here, to run repeatedly:

}</pre>
<h2>Der D1 als Webserver und DNS-Server</h2>
<p>Nach den bisherigen Schritten ist der D1 zwar mit dem WiFi verbunden, aber selbst noch nicht über einen Browser erreichbar. Damit der D1 bequem über den Browser angesteuert werden kann braucht man die #include &lt;ESP8266WebServer.h&gt; Bibliothek. Anschließend wird mit dem Befehl ESP8266WebServer server(80) ein Webserver Objekt erstellt und der Port 80 festgelegt. Der Server lässt sich nun mit dem Befehl server.begin() starten. Damit der D1 zu jederzeit prüfen kann, ob Anfragen zu bearbeiten sind, wird der server.handleClient() in die loop() Funktion geschrieben.</p>
<p>Gibt man nun die IP Adresse des D1 in einem Browser ein, von einem Gerät, dass sich im selben WiFi befindet, ist der D1 bereits erreichbar. Es wurde nur noch nicht spezifiziert was bei einem Aufruf des D1 passieren soll.</p>
<p>Man kann sich hier auch vorgefertigte Funktionen anzeigen lassen. Für den Anfang beispielsweise einen Satz, wenn der Link nicht definiert wurde, oder einen Text für einen custom Link. Es können auch eigene Funktionen für bestimmte Links ausgeführt werden.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">server.onNotFound([](){ 
  server.send(404, "text/plain", "Link was not found!");  
});
 
server.on("/", []() {
  server.send(200, "text/plain", "Landing page!");
});
 
server.on("/custom", []() {
  server.send(200, "text/plain", "Just a custom route!");
  ownFunction();
});</pre>
<p>Die Webserver Einrichtung ist jetzt abgeschlossen. Da es aber meist sehr nervig ist jedesmal die IP-Adresse des D1 in den Browser einzutippen bzw. die sich auch ändern kann, macht es Sinn dem DNS des D1 einen Namen zuzuweisen. Dafür wird wieder eine Bibliothek verwendet, welche mittels #include &lt;ESP8266mDNS.h&gt; eingebunden wird. Der DNS wird einmalig definiert und daher in die setup() Funktion geschrieben. Um den DNS Namen festzulegen, nutzt man die Methode MDNS.begin(DNS Name), beispielsweise MDNS.begin(nerd-corner). Zusätzlich muss noch MDNS.update() in die loop Funktion geschrieben werden.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESP8266WebServer.h&gt;
#include &lt;ESP8266mDNS.h&gt;

ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200); //Baudrate
  Serial.println("ESP starts");

  WiFi.begin("NerdCornerWiFi","NerdCornerPassword");

  Serial.print("Connecting...");

  while(WiFi.status()!=WL_CONNECTED){ //Loop which makes a point every 500ms until the connection process has finished

    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected! IP-Address: ");
  Serial.println(WiFi.localIP()); //Displaying the IP Address

  if (MDNS.begin("nerd-corner")) {
    Serial.println("DNS started, available with: ");
    Serial.println("http://nerd-corner.local/");
  }

  server.onNotFound([](){ 
    server.send(404, "text/plain", "Link was not found!");  
  });
 
  server.on("/", []() {
    server.send(200, "text/plain", "Landing page!");
  });
 
  server.on("/custom", []() {
    server.send(200, "text/plain", "Just a custom route!");
    ownFunction();
  });

  server.begin();

}

void loop() {
  server.handleClient();
  MDNS.update();

}

void ownFunction(){ //go to "IP-Adress/custom" to call this function
  Serial.println("Own function was called");

}</pre>
<p>Anschließend kann man im Browser http://nerd-corner.local eingeben und man erreicht den D1. Bitte beachten, dass die Endung immer &#8222;.local&#8220; sein muss! Manche Android Geräte unterstützen mDNS nicht, dann muss weiterhin die tatsächliche IP Adresse angegeben werden. Jetzt steht der Verwendung für eigene Projekte eigentlich nichts mehr im Weg! Hier findet Ihr ein paar spannende Anwendungsbeispiele: https://makesmart.net/tag/d1-mini/</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1171 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1.png" alt="WeMos D1 R2 testing custom route functions" width="1240" height="737" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1.png 1249w, https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1-300x178.png 300w, https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1-1024x608.png 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1-768x456.png 768w, https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1-890x530.png 890w, https://nerd-corner.com/wp-content/uploads/2022/01/custom-route-D1-445x265.png 445w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></p>
<h2>Beispielprogramm zum Ein- und Ausschalten der OnBoard LED</h2>
<p>Zum Abschluss des Blogposts noch ein simples Beispielprogramm bei dem wir das bisher gelernte anwenden. Wir schreiben zwei zusätzliche Funktionen. Eine um die fest verbaute BuiltIn Led einzuschalten und eine Funkton zum Ausschalten. Ein kleiner Hinweis, im Gegensatz zum Arduino wird die LED mit digitalWrite(LED_BUILTIN, LOW) eingeschalten statt ausgeschalten, also genau invertiert!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1177 zoooom" src="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-scaled.jpg" alt="Wemos D1 R2 blinking LED" width="2000" height="900" srcset="https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-300x135.jpg 300w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-1024x461.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-768x346.jpg 768w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-1536x691.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2022/01/Wemos-D1-R2-build-in-LED-2048x922.jpg 2048w" sizes="auto, (max-width: 2000px) 100vw, 2000px" /></p>
<p>Die Funktionen können über <a href="http://nerd-corner.local/on">http://nerd-corner.local/on</a> und <a href="http://nerd-corner.local/offn">http://nerd-corner.local/off</a> aufgerufen werden. Anbei der vollständige Programmcode:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="atomic">#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESP8266WebServer.h&gt;
#include &lt;ESP8266mDNS.h&gt;

ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200); //Baudrate
  Serial.println("ESP starts");

  WiFi.begin("NerdCornerWiFi","NerdCornerPassword");

  Serial.print("Connecting...");

  while(WiFi.status()!=WL_CONNECTED){ //Loop which makes a point every 500ms until the connection process has finished

    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected! IP-Address: ");
  Serial.println(WiFi.localIP()); //Displaying the IP Address

  if (MDNS.begin("nerd-corner")) {
    Serial.println("DNS started, available with: ");
    Serial.println("http://nerd-corner.local/");
  }

  server.onNotFound([](){ 
    server.send(404, "text/plain", "Link was not found!");  
  });
 
  server.on("/", []() {
    server.send(200, "text/plain", "Landing page!");
  });
 
  server.on("/on", []() {
    server.send(200, "text/plain", "Switching LED on!");
    switchLedOn();
  });

  server.on("/off", []() {
    server.send(200, "text/plain", "Switching LED off!");
    switchLedOff();
  });

  server.begin();


  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  server.handleClient();
  MDNS.update();

}

void switchLedOff(){ 
  digitalWrite(LED_BUILTIN, HIGH);   // turn the D1 LED off 
}

void switchLedOn(){ 
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED on 
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/">WeMos D1 R2 erste Schritte und Wlan integration</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/wemos-d1-r2-erste-schritte-und-wlan-integration/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</title>
		<link>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/</link>
					<comments>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Thu, 08 Jul 2021 13:53:33 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[Linux-DE]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[C Programmierung]]></category>
		<category><![CDATA[CAD]]></category>
		<category><![CDATA[Datenübertragung]]></category>
		<category><![CDATA[Datenübertragung per Licht]]></category>
		<category><![CDATA[Genauigkeit]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[LiFi]]></category>
		<category><![CDATA[LiFI Router]]></category>
		<category><![CDATA[Light Fidelity]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lüfter]]></category>
		<category><![CDATA[Präzision]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[visible Light communication]]></category>
		<category><![CDATA[visuelle Lichtkommunikation]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[zyklische Redundanzprüfung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=964</guid>

					<description><![CDATA[<p>Nachdem ich bereits einfache Textnachrichten mittels Lichtsignale von einem Raspberry Pi zu einem Arduino Uno übertragen habe ( Link: https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/ ) wollte ich dieses System &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/">Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Nachdem ich bereits einfache Textnachrichten mittels Lichtsignale von einem Raspberry Pi zu einem Arduino Uno übertragen habe ( Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) wollte ich dieses System verbessern, um jegliche Dateiformate in beide Richtungen übertragen zu können. Da ein Raspberry Pi mit Linux betrieben wird, kann dieses System zur Datenübertragung mittels VLC (visueller Lichtkommunikation) auf alle Linux Geräte übertragen werden. Der Software Code und die STL Dateien können am Ende des Blogeintrags heruntergeladen werden.</p>
<p><em><strong>Das könnte dich auch interessieren:</strong> <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/" target="_blank" rel="noopener">Textnachrichten mittels Lichtsignale senden</a></em></p>
<p><em><strong>Eng mit diesem Artikel verbunden:</strong> <a href="https://nerd-corner.com/de/zyklische-redundanzpruefung-in-c/" target="_blank" rel="noopener">Fehlererkennung bei der Datenübertragung</a></em></p>
<p><em><strong>Ebenfalls relevant:</strong> <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/" target="_blank" rel="noopener">Taktgeschwindigkeit für eine Datenübertragung festlegen in C</a></em></p>
<h2>Liste der Bauteile</h2>
<ul>
<li><a href="https://amzn.to/3zlaLSJ" target="_blank" rel="noopener">2x Raspberry Pi 4</a></li>
<li><a href="https://amzn.to/3zhH6to" target="_blank" rel="noopener">2x 5V Solarzelle</a></li>
<li><a href="https://amzn.to/3rkpOZU" target="_blank" rel="noopener">2x 5V Laserdiode</a></li>
<li><a href="https://amzn.to/2Uu9AkT" target="_blank" rel="noopener">Jumper Kabel</a></li>
<li><a href="https://amzn.to/3exAv6g" target="_blank" rel="noopener">3D Drucker</a></li>
<li><a href="https://amzn.to/3hST9I2" target="_blank" rel="noopener">Filament</a></li>
<li><a href="https://amzn.to/3kwoX7c" target="_blank" rel="noopener">2x 5V Lüfter</a></li>
<li><a href="https://amzn.to/2UvY34L" target="_blank" rel="noopener">NPN Transistor</a></li>
<li>2x ADC Board mit einem LM393</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-966 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-scaled.jpg" alt="Datenübertragung mit Licht Einzelteile" width="2500" height="1681" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-300x202.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-1024x689.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-768x516.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-1536x1033.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-2048x1377.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Verkabelung</h2>
<p>Anders als bei der Verkabelung im letzten Artikel, in dem Textnachrichten mittels Lichtsignale von einem Pi zu einem Arduino gesendet wurden ( Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ), gibt es jetzt keinen definierten Empfänger und keinen definierten Sender. Es werden stattdessen zwei baugleiche Stationen aufgebaut, die sowohl Daten senden und empfangen können.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-965 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine.png" alt="Fritzing Pi VLC LiFI" width="2250" height="1459" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine.png 2270w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-300x195.png 300w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-1024x664.png 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-768x498.png 768w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-1536x996.png 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-2048x1328.png 2048w" sizes="auto, (max-width: 2250px) 100vw, 2250px" /></p>
<p>Aus diesem Grund werden die Raspberry Pi’s sowohl mit einem 5V Laser als auch mit einer 5V Solarzelle verbunden. Für den Laser wurde der GPIO18 Pin gewählt, welcher in der „wiringPi“ Library Pin 1 entspricht. Die „wiringPi“ Library wird im Programmcode verwendet. Direkt unter GPIO18 befindet sich ein Ground, welcher mit dem Minus Pol des Lasers verbunden wird.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-967 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/GPIO.png" alt="Datenübertragung mittels Licht Pi" width="1500" height="1125" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/GPIO.png 1600w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-300x225.png 300w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-1024x768.png 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-768x576.png 768w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-1536x1152.png 1536w" sizes="auto, (max-width: 1500px) 100vw, 1500px" /></p>
<p>Die Solarzelle liefert je nach Lichtintensität einen entsprechenden Spannungswert. Da die digitalen Pins des Raspberry Pi aber nur 1 und 0 erkennen können, muss mit Hilfe eines Komparators der analoge Wert der Solarzelle in einen digitalen Wert gewandelt werden. Der Vorgang wird genauer im Abschnitt „ADC Board mit einem LM393 Komparator“ erläutert. Für die Verkabelung wird der Plus und Minus Pol der Solarzelle mit den Plus und Minus Kontakten des ADC Boards verbunden. Anschließend wird der Ground des ADC Boards an einen Raspberry Pi Ground verbunden und für die Spannungsversorgung der Plus Pol des ADC Boards mit 5V des Pi verbunden. Der D0 Pin des ADC Boards liefert den digitalen Wert 0 oder 1, abhängig von der Lichtintensität der Solarzelle. Diesen Pin habe ich mit GPIO17, welcher in der „wiringPi“ Library Pin 0 entspricht, verbunden.</p>
<p>Da mir aufgefallen ist, dass der Pi im Betrieb sehr heiß wird, habe ich noch einen Lüfter angeschlossen. Damit der Lüfter sich nicht dauerhaft im Betrieb befindet, was sich negativ auf die Leistung des Lasers auswirken würde, kann der Lüfter durch einen NPN Transistor geschalten werden. Hierfür verbindet man den Plus Pol des Lüfters direkt mit einem 5V Pin des Raspberry Pi und den Minus Pol des Lüfters mit dem Emitter des NPN Transistors. Der Collector des Transistors wird mit einem Ground des Pi verbunden. Um nun den Lüfter über den Transistor ein- und ausschalten zu können wird die Transistor Basis mit einem GPIO Pin verbunden. Ich habe beispielsweise GPIO27 (entspricht in der „wiringPi“ Library Pin 2) gewählt. In der Nachfolgenden Tabelle werden die Pins des Pi der Nummerierung der „wiringPi“ Library gegenüber gestellt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-940 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png" alt="VLC Textnachrichten visuelle Lichtkommunikation wiringPi Datenübertragung mit Licht" width="599" height="295" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png 600w, https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi-300x148.png 300w" sizes="auto, (max-width: 599px) 100vw, 599px" /></p>
<h2>ADC Board mit einem LM393 Komparator</h2>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-968 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393.jpg" alt="ADC Board mit LM393 Komparator" width="450" height="319" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393.jpg 771w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-300x213.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-768x545.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-120x85.jpg 120w" sizes="auto, (max-width: 450px) 100vw, 450px" /></p>
<p>Die Solarzelle gibt abhängig von der Lichtintensität einen Spannungswert zurück. Leider hat der Raspberry Pi aber keine analogen Pins um diesen Spannungswert auszulesen. Daher muss das analoge Signal in ein digitales Signal umgewandelt werden. Mit Hilfe des <a href="https://www.ti.com/product/LM393" target="_blank" rel="noopener">LM393</a> Komparators ist das möglich. Dieser ist häufig auf ADC Boards verbaut. Hier habe ich einfach den ursprünglichen Sensor (es war ein Fotowiderstand) durch die Solarzelle ersetzt. Mit Hilfe eines Potentiometers kann der Komparator eingestellt werden. Das bedeutet, sobald der Spannungswert der Solarzelle, welcher von der Lichtintensität abhängt, den eingestellten Wert des Potentiometers übersteigt, wird eine digitale 1 gemessen, anderenfalls eine digitale 0.</p>
<h2>Aufbau des Datenframes</h2>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-969" src="https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1.jpg" alt="Aufbau Datenframe Lichtübertragung Daten Datentransfer mittels VLC" width="1300" height="469" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1.jpg 1409w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-300x108.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-1024x369.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-768x277.jpg 768w" sizes="auto, (max-width: 1300px) 100vw, 1300px" /></p>
<p>Der Datenframe für das Versenden der Textnachrichten mittels visueller Lichtkommunikation (Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) bestand aus einer Preamble, der Länge der Textnachricht, dem Textinhalt und der zyklischen Redundanzprüfung. Um aber statt Textnachrichten alle möglichen Arten von Daten verschicken zu können muss anstelle der Länge der Textnachricht der Dateiname, die Dateiendung, die Gesamtzahl der Pakete und die Nummer des aktuellen Pakets angegeben werden. Anschließend kann der Dateninhalt und der Code der zyklischen Redundanzprüfung angefügt werden.</p>
<h2>Softwarecode für Datentransfer mittels VLC</h2>
<p>Im Grunde wurden die Empfänger- und Senderskripte aus dem vorherigen Projekt zum Senden von Textnachrichten mittels visueller Lichtkommunikation (Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/" target="_blank" rel="noopener">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) weiterentwickelt und zu einem gemeinsamen Skript zusammengefasst. Welches auf beiden Raspberry Pi’s Anwendung findet. Es wurde beispielsweise eine „ReadFile“ und „WriteFile“ Funktion ergänzt, welche Dateien einlesen und empfangene Datenpakete zu einer Datei zusammenfassen und abspeichern können. Das Programm wurde wieder in C geschrieben, da eine hohe Geschwindigkeit bei der Datenübertragung erreicht werden soll. Details zur präzisen Programmierung in C für eine schnelle Datenübertragung in diesem Beitrag: <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/" target="_blank" rel="noopener">https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/</a></p>
<p>Der gesamte Softwarecode zum Datentransfer mittels VLC kann am Ende des Artikels heruntergeladen werden. Der Kern des Programms ist wieder eine State Maschine mit Hilfe derer ausgewählt werden kann, ob Daten gesendet oder empfangen werden sollen. Außerdem schaltet das Programm automatisch den Lüfter an, wenn keine Datenübertragung stattfindet. Wichtig: Beim Kompilieren bitte nicht die „<a href="http://wiringpi.com/" target="_blank" rel="noopener">wiringPi</a>“ Bibliothek und die &#8222;math.h&#8220; Bibliothek vergessen! Der Befehl lautet: „gcc -o transceiver transceiver.c -lwiringPi -lm“</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-group="transceiver" data-enlighter-title="transceiver.c">while(1)
    {
        digitalWrite (2, HIGH);
        printf("Press the R button for Receiver Mode or any other key for Sender Mode\n");
        scanf(" %c",&amp;mode);
        
        if (mode=='R'||mode=='r')
        {
            digitalWrite(2,LOW);
            modeReceiver=true;
        }
        
        if (mode!='R'&amp;&amp;mode!='r')
        {
            digitalWrite(2,LOW);
            modeReceiver=false;
            
            char dataName[NAME_MAX];
            char dataExtension[NAME_MAX];
            
               
            printf("\n Name of file WITHOUT extension: ");
            scanf("%s",dataName);

            printf("\n Extension: ");
            scanf("%s",dataExtension);

            if (read_file(dataName, dataExtension, file_content) != OK)
            {
                printf("File read error, size exceeds array size\n");
                return -1;
            }
            BuildDataFrame(dataName, dataExtension, file_content);
        }
        
        
        
        while(modeReceiver)
        {
            gettimeofday(&amp;tval_after, NULL);
            timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
            double time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
            
            while(time_elapsed &lt; 0.001)
            {
                gettimeofday(&amp;tval_after, NULL);
                timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
                time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
            }
            gettimeofday(&amp;tval_before, NULL);
            
            int data = digitalRead(0);
            
            
            switch (state)
            {
                case 0:
                    //looking for preamble pattern
                    synchro_Done=false;
                    LookForSynchro(data);
                    
                    if (synchro_Done==true)
                    {
                        state=1;
                    }
                    break;
                    
                case 1:
                    //receive the actual data
                    receiveData_Done=false;
                    senderState=false;
                    ReceiveData(data);
                    
                    if(receiveData_Done&amp;&amp;senderState==false)
                    {
                        state=0;
                    }
                    if(senderState==true){
                        senderState=false;
                        state=0;
                        modeReceiver=false;
                        }
                    break;
                  
            }
            
        }
    }</pre>
<p>&nbsp;</p>
<h2>Gehäuse</h2>
<p>Um die Komponenten an Ort und Stelle fixieren zu können, wurde im CAD ein Gehäuse konstruiert. Dies hat auch den Vorteil, dass keine komplizierte Ausrichtung der Laser und der Solarzellen für die Datenübertragung notwendig ist. Für Anfänger eignet sich TinkerCAD zum Gehäuse design. TinkerCAD ist kostenlos und kann direkt im Browser benutzt werden. Alternativ können die STL Files für den 3D Drucker auch hier heruntergeladen werden.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-970" src="https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD.jpg" alt="Datenübertragung per Licht Gehäuse Datentransfer mittels VLC" width="600" height="530" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD.jpg 682w, https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD-300x265.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Das Gehäuse zum Datentransfer mittels VLC besitzt eine Öffnung für die Solarzelle und den Laser. Außerdem wurde ein Abluftschacht für den Lüfter konstruiert und zusätzlich Platz für ein Raspberry Pi Gehäuse frei gelassen. Im nachfolgenden Bild wird der Einbau der Komponenten dargestellt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-971 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-scaled.jpg" alt="Datenübertragung per Licht Lifi VLC" width="2500" height="1875" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-300x225.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-1024x768.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-768x576.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-1536x1152.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-2048x1536.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Fazit zum Datentransfer mittels VLC</h2>
<p>Es wurde das bereits bestehende System zum Senden von Textnachrichten mittels visueller Lichtsignale weiterentwickelt, sodass jetzt alle Arten von Daten gesendet und empfangen werden können. Das System funktioniert erstaunlich erfolgreich. Es ist sehr robust und erreicht eine Datenrate von 1 kBit/s bis 10 kBit/s. Alle ankommenden Datenpakete können durch den intelligenten Aufbau des Datenframes direkt zugeordnet werden. Lediglich ein Acknowledgement Signal wäre noch eine sinnvolle Ergänzung. Ein solches Signal wäre eine Rückmeldung vom Empfänger an den Sender um dem Sender mitzuteilen, dass alle Pakete angekommen sind, oder eventuell ein bestimmtes Paket fehlerhaft war und erneut gesendet werden muss.</p>
<p>Ebenfalls interessant für die Zukunft wäre andere Modulationsarten auszuprobieren. Besonders das speziell für visuelle Lichtkommunikation erdachte Colour Shift Keying würde ich gerne näher untersuchen und die daraus resultierenden Datenraten vergleichen.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-972" src="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-scaled.jpg" alt="Datenübertragung per Licht Gehäuse Lifi VLC Datentransfer mittels VLC" width="2500" height="1125" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-300x135.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-1024x461.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-768x346.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-1536x691.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-2048x922.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Dateien herunterladen:</h2>
<ul>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/977/?tmstv=1755805620" rel="nofollow" id="download-link-977" data-redirect="false" >
	Softwarecode Transceiver</a>
</li>
<li><a href="https://cults3d.com/en/3d-model/various/visible-light-communication-pi-housing" target="_blank" rel="noopener">STL files housing</a></li>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/991/?tmstv=1755805620" rel="nofollow" id="download-link-991" data-redirect="false" >
	Pi Case with free pins (Creative Common License from Thingiverse)</a>
</li>
</ul>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/">Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Textnachrichten mittels Lichtsignale senden &#8211; Pi zu Arduino</title>
		<link>https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</link>
					<comments>https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sun, 20 Jun 2021 22:42:56 +0000</pubDate>
				<category><![CDATA[Arduino Projekte]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[Linux-DE]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[Datenübertragung]]></category>
		<category><![CDATA[Datenübertragung per Licht]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[LiFi]]></category>
		<category><![CDATA[LiFi Arduino Projekt]]></category>
		<category><![CDATA[LiFI Router]]></category>
		<category><![CDATA[Light Fidelity]]></category>
		<category><![CDATA[Textnachrichten]]></category>
		<category><![CDATA[Textnachrichten versenden]]></category>
		<category><![CDATA[Textnachrichten vom Pi zum Arduino]]></category>
		<category><![CDATA[visible Light communication]]></category>
		<category><![CDATA[visuelle Lichtkommunikation]]></category>
		<category><![CDATA[Visuelle Lichtkommunikation Arduino Projekt]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[VLC Arduino Projekt]]></category>
		<category><![CDATA[VLC Raspberry Pi Projekt]]></category>
		<category><![CDATA[zyklische Redundanzprüfung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=935</guid>

					<description><![CDATA[<p>Mir gefällt die Idee Daten über sichtbarem Licht zu versenden. Allgemein wird Li-Fi (Light Fidelity) und VLC (Visible Light Communication) im Moment heiß diskutiert. Dabei &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">Textnachrichten mittels Lichtsignale senden &#8211; Pi zu Arduino</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Mir gefällt die Idee Daten über sichtbarem Licht zu versenden. Allgemein wird Li-Fi (Light Fidelity) und VLC (Visible Light Communication) im Moment heiß diskutiert. Dabei ist VLC eine Visuelle Lichtkommunikation, also primär ein Kabel Ersatz und LiFi dagegen eine Anlehnung an WiFi. Ein LiFi Gerät wäre eine Art Internetfähiger Router, der Daten über Lichtsignale statt Radio Frequenzsignale überträgt. Gegenwärtig hat jedoch noch keine Firma einen Li-Fi Router entwickelt bzw. im Verkauf. Die VLC Technik wird aktuell von Elon Musks StarLink Projekt prominent eingesetzt. So können die Satelliten mittels Laserstrahlen Daten austauschen. Das habe ich vereinfacht in diesem Blogartikel nachgebaut.</p>
<p>Zunächst möchte ich nur einzelne Textnachrichten in eine Richtung übertragen. In einem nächsten Schritt kann dies dann ausgeweitet werden um ganze Dateien bidirektional zu übertragen. Zum Empfangen der Nachrichten habe ich einen Ardunio ausgewählt, da dieser im Gegensatz zum Raspberry Pi analoge Eingänge besitzt und somit leicht mit analogen Sensoren verbunden werden kann. Zum Senden eignet sich ein Raspberry Pi, da hier nur digitale Pins benötigt werden und ein Pi allgemein leistungsfähiger bzw. schneller Daten übertragen kann. Das wurde bereits in den vorrangegangenen Posts zum Definieren einer Taktfrequenz beim Arduino und beim Raspberry Pi getestet. Alle Skripte zum Betrieb der VLC Kommunikation können am Ende des Artikels heruntergeladen werden. Die folgenden drei Blogposts stehen in direktem Zusammenhang zu diesem Projekt:</p>
<p><em><strong>UPGRADE:</strong> <a href="https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/" target="_blank" rel="noopener">ALLE ARTEN VON DATEN MITTELS VISUELLER LICHTKUMMUNIKATION ÜBERTRAGEN</a></em></p>
<p><em><strong>So programmiert man die Taktfrequenz des Arduino:</strong> <a href="https://nerd-corner.com/de/arduino-timer-interrupts-arduino-register-programmieren/" target="_blank" rel="noopener">Timer Interrupts nutzen als Taktfrequenz.</a></em></p>
<p><em><strong>So programmiert man die Taktfrequenz des Pi:</strong> <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/" target="_blank" rel="noopener">Präzise Timer Funktion in C für den Pi.</a></em></p>
<p><em><strong>So verhinderst man Fehler in der Datenübertragung:</strong> <a href="https://nerd-corner.com/de/zyklische-redundanzpruefung-in-c/" target="_blank" rel="noopener">Mit CRC fehlerhafte Pakete erkennen.</a></em></p>
<h2>Liste der Bauteile</h2>
<ul>
<li><a href="https://amzn.to/3xUQSkZ" target="_blank" rel="noopener">Arduino Uno</a></li>
<li><a href="https://amzn.to/3zlaLSJ" target="_blank" rel="noopener">Raspberry Pi 4</a></li>
<li><a href="https://amzn.to/3zhH6to" target="_blank" rel="noopener">5V Solarzelle</a></li>
<li><a href="https://amzn.to/3rkpOZU" target="_blank" rel="noopener">5V Laserdiode</a></li>
<li><a href="https://amzn.to/2Uu9AkT" target="_blank" rel="noopener">Jumper Kabel</a></li>
</ul>
<h2>Verkabelung für die Visuelle Lichtkommunikation</h2>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-939" src="https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino.png" alt="Textnachrichten VLC Fritzing Verkabelung für Visuelle Lichtkommunikation" width="2770" height="1130" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino.png 2772w, https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino-300x122.png 300w, https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino-1024x418.png 1024w, https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino-768x313.png 768w, https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino-1536x627.png 1536w, https://nerd-corner.com/wp-content/uploads/2021/06/FritzingPi_Arduino-2048x836.png 2048w" sizes="auto, (max-width: 2770px) 100vw, 2770px" /></p>
<p>Die Verkabelung gestaltet sich eher simpel. Die 5V Solarzelle ist sehr gut geeignet um Lichtsignale zu detektieren. Daher wird die Solarzelle mit dem Empfänger, also dem Arduino verbunden. Der Ground der Solarzelle wird mit einem Ground des Arduinos verbunden. Die Plusleitung der Solarzelle wird mit einem analogen Pin des Arduinos verbunden. Hier eignet sich beispielsweise A0.</p>
<p>Vom Raspberry Pi aus werden die Nachrichten über Lichtsignale des Lasers an den Arduino übermittelt. Hierfür wird der Ground einer Laserdiode (5V) mit einen Ground Pin des Pi verbunden (siehe Grafik). Anschließend wird die Plusleitung der Laserdiode mit einer der digitalen Pins des Raspberry Pis verbunden. Hier habe ich den GPIO17 Pin gewählt, welcher in der „wiringPi“ Library Pin 0 entspricht (siehe Grafik).</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-940 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png" alt="VLC Textnachrichten visuelle Lichtkommunikation wiringPi" width="598" height="294" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png 600w, https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi-300x148.png 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></p>
<p>Als Alternative zu dem Laser und der Solarzellen Kombination kann auch eine LED und ein Photowiderstand genutzt werden. Allerdings eignet sich ein Laser besser für schnellere und präzisere Datenübertragung. Dazu bietet eine Solarzelle eine große Fläche um die Laserstrahlen zu detektieren.</p>
<h2>Modulationsmethode On-Off-Keying</h2>
<p>Die Textnachrichten werden im Binärcode als „1“ oder „0“ übertragen. Es gibt verschiedene Möglichkeiten diese Daten zu modulieren. Eine der einfachsten Möglichkeiten ist es eine identische Taktfrequenz für den Sender und Empfänger festzulegen. Dann wird in jedem Takt entweder eine „1“ oder eine „0“ übertragen.</p>
<p>Die Vorgehensweise nennt sich Aplituden-Shift-Keying. Wenn die Laserdiode besonders stark die Solarplatte anleuchtet wird das vom Empfänger als binäre „1“ detektiert. Wenn aber die Laserdiode nur schwach leuchtet wird das als binäre „0“ detektiert.</p>
<p>Tatsächlich macht es aber Sinn die Laserdiode gar nicht leuchten zu lassen für eine binäre „0“. Dann spricht man von On-Off-Keying. Das ist sozusagen eine Vereinfachung des Amplituden-Shift-Keyings. Die nachfolgende Grafik verdeutlicht den Unterschied zwischen Amplituden-Shift-Keying und On-Off-Keying.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-942 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/OOK-ASK-1.jpg" alt="Modulationstechnik Visuelle Lichtkommunikation" width="848" height="587" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/OOK-ASK-1.jpg 850w, https://nerd-corner.com/wp-content/uploads/2021/06/OOK-ASK-1-300x208.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/06/OOK-ASK-1-768x531.jpg 768w" sizes="auto, (max-width: 848px) 100vw, 848px" /></p>
<p>Das bedeutet, immer wenn die Solarzelle Licht detektiert, wird ein entsprechender Spannungswert an den analogen Pin des Arduino übergeben. Wenn dieser Spannungswert einen vordefinierten Wert übersteigt, registriert der Arduino es als eine binäre „1“, ansonsten als binäre „0“. Es macht durchaus Sinn den vordefinierten Wert an das Tageslicht anzupassen. Eventuell mit Hilfe eines zusätzlichen Lichtsensors.</p>
<h2>Arduino Code zum Nachrichten empfangen</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-group="Receiver" data-enlighter-title="Receiver.ino" data-enlighter-theme="beyond">//This is the "real" loop function
  switch (state)
  {
    case 0:
      //looking for synchronization sequence
      synchro_Done=false;
      lookForSynchro(data);

      if (synchro_Done== true)
      {
        state=1;
      }
      break;
    case 1:
      //receive Data
      receiveData_Done =false;
      receiveData(data);

      if (receiveData_Done==true)
      {
        state=0; 
      }
      break;
  }</pre>
<p>Die Software des Arduino ist im Prinzip als State Machine aufgebaut. Es gibt zwei States. Ein State für die Synchronisierung und einer für das Auslesen der Textnachricht. Im State Synchronisierung wartet der Empfänger auf eine festgelegte Bitsequenz (Preambel) beispielsweise „10101010101111111111“. Diese Sequenz bedeutet, dass der Empfänger jetzt zuhören muss, weil eine Textnachricht folgt. Der vollständige Arduino Code kann am Ende des Artikels heruntergeladen werden. Die nachfolgende Grafik zeigt den genauen Aufbau der Datenpakete.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-943 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLength.jpg" alt="Aufbau Textnachrichten VLC" width="953" height="554" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLength.jpg 955w, https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLength-300x174.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLength-768x446.jpg 768w" sizes="auto, (max-width: 953px) 100vw, 953px" /></p>
<p>Sobald die Preambel erkannt wurde, wechselt der Empfänger automatisch in den zweiten State und empfangt die eigentliche Nachricht. Wobei jedoch die ersten 16 Bits der Textnachricht einer Dezimalzahl entsprechen, die dem Empfänger mitteilt, wie viele Zeichen die ankommende Textnachricht umfasst. Sobald diese Zahl erreicht wurde, wird der Text im Serial Monitor des Arduino ausgegeben und der State wechselt wieder zurück. Jetzt wird erneut auf die Synchronisierungsequenz gewartet. Der vollständige Softwarecode kann am Ende des Blog Artikels heruntergeladen werden. Zur Verbesserung der Übertragungsqualität kann noch eine <a href="https://nerd-corner.com/de/zyklische-redundanzpruefung-in-c/" target="_blank" rel="noopener">zyklische Redundanzprüfung</a> durchgeführt werden wie in der nachfolgenden Grafik.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-944 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLengthAndCRC.jpg" alt="CRC Datenpakete Aufbau VLC" width="1264" height="555" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLengthAndCRC.jpg 1266w, https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLengthAndCRC-300x132.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLengthAndCRC-1024x450.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/06/FrameVariableDataLengthAndCRC-768x337.jpg 768w" sizes="auto, (max-width: 1264px) 100vw, 1264px" /></p>
<h2>Raspberry Pi Code zum Nachrichten senden</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-group="simpleLaser" data-enlighter-title="simpleLaser.c">//Read message
        char msg[3000]; 
        int len, k, length;
       
        printf("\n Enter the Message: ");
        scanf("%[^'\n']",msg);
        
        len=strlen(msg);
        
        
        int2bin(len*8, 16); //len*8, because 8 bits are one byte
        
        for(k=0;k&lt;len;k++)
        {
                chartobin(msg[k]);            
        }</pre>
<p>Der Programmcode des Raspberry Pi muss in C geschrieben werden. Python wäre zu langsam und würde keine stabile Taktfrequenz zum Senden der Daten erreichen. Der vollständige Programmcode kann am Ende der Artikels heruntergeladen werden. Damit der Pi die Laserdiode steuern kann wird die „wiringPi.h“ library benötigt. Über „digitalWrite(0, HIGH)“ kann so die Diode eingeschalten werden und mittels „digitalWrite(0, LOW)“ wieder aus. Wichtig: Beim Kompilieren bitte nicht die „<a href="http://wiringpi.com/" target="_blank" rel="noopener">wiringPi</a>“ library vergessen! Der Befehl lautet: „gcc -o simpleLaser simpleLaser.c -lwiringPi“</p>
<p>Am Anfang fordert das Programm mittels printf Funktion eine Textnachricht einzugeben. Diese wird mittels scanf Funktion eingelesen und gespeichert. Anschließend wird jeder Buchstabe in Binärcode umgewandelt und in einem Array abgespeichert. Die Umwandlung wird in der nachfolgenden Grafik gezeigt. Am Ende wird in einem festgelegten Takt der Binärcode aus dem Array übermittelt. Für eine binäre „1“ wird die Laserdiode eingeschaltet und für eine binäre „0“ wieder aus.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-945 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/BinToDec.jpg" alt="Character to binary conversion" width="750" height="389" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/BinToDec.jpg 758w, https://nerd-corner.com/wp-content/uploads/2021/06/BinToDec-300x156.jpg 300w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<h2>Fazit zum Projekt Visuelle Lichtkommunikation</h2>
<p>Die Übertragung der Textnachrichten mittels Visuelle Lichtkommunikation funktioniert hervorragend. Dank der zyklischen Redundanzprüfung auch absolut fehlerfrei. Allerdings ist der Nutzen einer eindimensionalen Nachrichtenkommunikation eher gering. Es wäre besser, wenn jegliche Art von Dateien übertragen werden könnte und das in beiden Richtungen. Hier wird wohl bald ein Update folgen.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-953" src="https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-scaled.jpg" alt="Set Up VLC Arduino Pi Visuelle Lichtkommunikation" width="2550" height="1913" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-300x225.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-1024x768.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-768x576.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-1536x1152.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/06/SetUp-Arduino-Pi-2048x1536.jpg 2048w" sizes="auto, (max-width: 2550px) 100vw, 2550px" /></p>
<h2>Dateien zum Herunterladen</h2>
<ul>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/946/?tmstv=1755805620" rel="nofollow" id="download-link-946" data-redirect="false" >
	Arduino Code VLC to receive text messages</a>
</li>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/949/?tmstv=1755805620" rel="nofollow" id="download-link-949" data-redirect="false" >
	Raspberry Pi code to send text messages with VLC</a>
</li>
</ul>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">Textnachrichten mittels Lichtsignale senden &#8211; Pi zu Arduino</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
