[{"content":"Stand: Oktober 2026\nDiese Erklärung gilt für fkainka.de und iot.fkainka.de. Beide Seiten sind statische Webseiten: Es gibt\nkeine Benutzerkonten, keine Kommentarfunktion, keine Analyse- oder Werbedienste und keine Cookies.\nVerantwortlicher Fabian Kainka\nAhrfelstr. 29\n45136 Essen\nE-Mail: f.kainka [at] gmx.de Hosting und Server-Protokolle Die Seiten liegen auf einem gemieteten Server der Contabo GmbH, Aschauer Straße 32a, 81549 München, in einem\nRechenzentrum in Deutschland.\nBei jedem Aufruf speichert der Webserver ein Protokoll mit: IP-Adresse, Datum und Uhrzeit, aufgerufener Adresse,\nStatuscode, übertragener Datenmenge, der zuvor besuchten Seite (Referrer) und der Browserkennung (User-Agent).\nDas dient dem sicheren und stabilen Betrieb, insbesondere der Abwehr von Angriffen und der Fehlersuche\n(berechtigtes Interesse, Art. 6 Abs. 1 lit. f DSGVO). Die Protokolle werden nach höchstens\nfünf Wochen (Fehlerprotokolle nach höchstens zehn Wochen) automatisch gelöscht und nicht mit anderen Daten\nzusammengeführt.\nKeine Cookies, lokale Einstellungen Es werden keine Cookies gesetzt. Wenn Sie den Hell-/Dunkelmodus oder die Seitengestaltung umschalten, merkt sich\nIhr Browser diese Wahl im lokalen Speicher (localStorage). Diese Angabe verlässt Ihr Gerät nicht und kann über die\nBrowser-Einstellungen gelöscht werden (§ 25 Abs. 2 Nr. 2 TDDDG).\nSchriften, Skripte und Bilder werden vom eigenen Server geladen. Die Suche läuft vollständig in Ihrem Browser.\nEingebettete Inhalte anderer Anbieter Einige ältere Beiträge zeigen Programmcode, Diagramme oder Videos anderer Dienste. Diese Inhalte werden erst\ngeladen, wenn Sie auf „Inhalt laden“ klicken (Einwilligung, Art. 6 Abs. 1 lit. a DSGVO). Erst dann überträgt\nIhr Browser Ihre IP-Adresse und technische Daten an den jeweiligen Anbieter, der dabei auch Cookies setzen kann:\nAnbieter Inhalt Sitz Pastebin (Pastebin.com) Programmcode USA Codebender (codebender.cc) Programmcode nicht angegeben ThingSpeak (The MathWorks, Inc.) Messwert-Diagramme USA YouTube (Google Ireland Limited), über youtube-nocookie.com Videos Irland / USA Bei Anbietern in den USA ist eine Übermittlung in ein Drittland möglich. Ob der Anbieter nach dem\nEU-US Data Privacy Framework zertifiziert ist, steht in dessen Datenschutzerklärung. Die Einwilligung gilt nur für\nden einzelnen Klick und wird nicht gespeichert.\nArchivierte Kommentare und Forenbeiträge iot.fkainka.de zeigt Kommentare und Forenbeiträge, die Nutzerinnen und Nutzer früher selbst veröffentlicht haben,\nals schreibgeschütztes Archiv. Angezeigt werden nur der damals gewählte Name, das Datum und der Text;\nE-Mail-Adressen und IP-Adressen wurden bei der Umstellung nicht übernommen. Das Archiv bleibt erhalten, weil viele\nFragen und Antworten anderen weiterhin helfen (Art. 6 Abs. 1 lit. f DSGVO). Wenn Sie möchten, dass ein Beitrag\noder Name entfernt wird, genügt eine E-Mail.\nKontakt per E-Mail Wenn Sie mir schreiben, verwende ich Ihre Angaben nur, um die Anfrage zu beantworten (Art. 6 Abs. 1 lit. f DSGVO).\nDie E-Mail liegt beim Postfach-Anbieter (GMX, 1\u0026amp;1 Mail \u0026amp; Media GmbH). Ich lösche sie, wenn die Sache erledigt ist\nund keine Aufbewahrungspflicht besteht.\nIhre Rechte Sie haben das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16), Löschung (Art. 17), Einschränkung der\nVerarbeitung (Art. 18), Datenübertragbarkeit (Art. 20) und Widerspruch gegen Verarbeitungen auf Grundlage\nberechtigter Interessen (Art. 21). Eine Einwilligung können Sie jederzeit für die Zukunft widerrufen.\nAußerdem können Sie sich bei einer Datenschutz-Aufsichtsbehörde beschweren, zum Beispiel bei der Behörde Ihres\nWohnorts oder bei der für mich zuständigen Landesbeauftragten für Datenschutz und Informationsfreiheit\nNordrhein-Westfalen (LDI NRW), Kavalleriestraße 2–4, 40213 Düsseldorf.\n","permalink":"https://fkainka.de/datenschutzerklaerung/","summary":"\u003cp\u003eStand: Oktober 2026\u003c/p\u003e\n\u003cp\u003eDiese Erklärung gilt für \u003cstrong\u003efkainka.de\u003c/strong\u003e und \u003cstrong\u003eiot.fkainka.de\u003c/strong\u003e. Beide Seiten sind statische Webseiten: Es gibt\u003cbr\u003e\nkeine Benutzerkonten, keine Kommentarfunktion, keine Analyse- oder Werbedienste und keine Cookies.\u003c/p\u003e\n\u003ch2 id=\"verantwortlicher\"\u003eVerantwortlicher\u003c/h2\u003e\n\u003cp\u003eFabian Kainka\u003cbr\u003e\nAhrfelstr. 29\u003cbr\u003e\n45136 Essen\u003cbr\u003e\nE-Mail: \u003ca class=\"obf-email\" data-u=\"f.kainka\" data-d=\"gmx.de\" href=\"#kontakt\"\u003ef.kainka [at] gmx.de\u003c/a\u003e\n\u003c/p\u003e\n\u003ch2 id=\"hosting-und-server-protokolle\"\u003eHosting und Server-Protokolle\u003c/h2\u003e\n\u003cp\u003eDie Seiten liegen auf einem gemieteten Server der Contabo GmbH, Aschauer Straße 32a, 81549 München, in einem\u003cbr\u003e\nRechenzentrum in Deutschland.\u003c/p\u003e\n\u003cp\u003eBei jedem Aufruf speichert der Webserver ein Protokoll mit: IP-Adresse, Datum und Uhrzeit, aufgerufener Adresse,\u003cbr\u003e\nStatuscode, übertragener Datenmenge, der zuvor besuchten Seite (Referrer) und der Browserkennung (User-Agent).\u003cbr\u003e\nDas dient dem sicheren und stabilen Betrieb, insbesondere der Abwehr von Angriffen und der Fehlersuche\u003cbr\u003e\n(berechtigtes Interesse, Art. 6 Abs. 1 lit. f DSGVO). Die Protokolle werden nach höchstens\u003cbr\u003e\nfünf Wochen (Fehlerprotokolle nach höchstens zehn Wochen) automatisch gelöscht und nicht mit anderen Daten\u003cbr\u003e\nzusammengeführt.\u003c/p\u003e","title":"Datenschutzerklärung"},{"content":"Halloween steht vor der Tür und ich habe beschlossen, eine kleine Party bei mir zu feiern. Als kleines Plus kam mir die Idee einen automatischen Gäste Schocker für das Badezimmer zu basteln\nFunktionsweise: Wenn jemand das Licht im Badezimmer einschaltet, kann es vorkommen, dass nach einer gewissen Wartezeit ein schauriges Lachen ertönt und gleichzeitig für ca. eine Sekunde grelle Blitze den abgedunkelten Raum erhellen. Das sollte für einen kurzen Schock ausreichen.\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Aufbau: Die Funktionsweise ist folgendermaßen: Der Lichtschalter meiner Toilette steuert als Sicherheitsmaßname auch alle Steckdosen im Badezimmer. Wenn nun jemand das Licht einschaltet, wird auch die Steckdose aktiviert, an der ein Ladegerät für Smartphones hängt, an dem wiederum ein NanoESP hängt.\nDer Aufbau schnell zusammengesteckt Dieser NanoESP ist mit einer kleinen Sound-Platine verdrahtet, welches ein hässliches Lachen ertönen lässt. Diese Platine war Teil einer Black-Story-Verpackung, welche ich damals als Geschenk bekommen habe. Die Kontakte, an denen vorher die Batterien hingen, ich einfach an den NanoESP gehängt, da der Strom eines Pins ausreicht, um die Platine zu versorgen.\nGleichzeitig ist an dem NanoESP auch ein 433 MHz Funkmodul angeschlossen, mit dem man z.B. Funksteckdosen steuern kann. Ich habe dieses System und die benötigte Library bereits beschrieben. Das Funkmodul aktiviert eine Funksteckdose, an der wiederum ein Stroboskoplicht hängt.\nProgramm: Das Programm ist denkbar einfach. Wenn das Board gestartet, also mit Strom versorgt wird, entscheidet eine Zufallsfunktion, ob der Effekt überhaupt ausgelöst wird. Die Spannung soll nämlich längere Zeit erhalten bleiben und der Effekt evtl. auch nicht beim ersten Besuch auffallen. Sollte der Zufallsgenerator entschieden haben, dass der Effekt kommen soll, entscheidet eine weitere Zufallsfunktion darüber, nach wie vielen Sekunden (bis zu 50 Sekunden) der Effekt eintritt.\nNach also maximal 50 Sekunden wird zuerst der Port 3, an dem der Pluspol der Soundplatine angeschlossen ist, aktiviert. Nach weiteren 200 ms wird die Steckdose und damit das Stroboskoplicht aktiviert. Dieser kleine Zeitunterschied liegt einfach an den Eigenschaften der Platine. Nach weiteren 800 ms wird die Steckdose wieder ausgeschaltet, der Lichteffekt dauert also nur sehr kurz, reicht aber um bis zu 5-mal zu Blitzen. Ich sende den Befehl zum Steckdosen aktiveren/deaktivieren zweimal, um Ausfälle wegen eines Übertragungsfehlers zu vermeiden. Nach weiteren 5 Sekunden ist auch das Lachen zu Ende und der Port wird wieder ausgeschaltet. Das Programm geht in eine Endlosschleife und kann nur durch erneutes Starten des Systems wieder von vorne beginnen, also wenn der nächste in das Badezimmer muss.\n(Hier war ein Programm von Arduino Create eingebettet, das dort nicht mehr verfügbar ist: https://create.arduino.cc/editor/FKainka/7360bfe0-d034-4725-9512-51e61aab2bc1/preview?embed)\n","permalink":"https://fkainka.de/halloween-schocker/","summary":"\u003cp\u003eHalloween steht vor der Tür und ich habe beschlossen, eine kleine Party bei mir zu feiern. Als kleines Plus kam mir die Idee einen automatischen Gäste Schocker für das Badezimmer zu basteln\u003c/p\u003e\n\u003ch2 id=\"funktionsweise\"\u003eFunktionsweise:\u003c/h2\u003e\n\u003cp\u003eWenn jemand das Licht im Badezimmer einschaltet, kann es vorkommen, dass nach einer gewissen Wartezeit ein schauriges Lachen ertönt und gleichzeitig für ca. eine Sekunde grelle Blitze den abgedunkelten Raum erhellen. Das sollte für einen kurzen Schock ausreichen.\u003c/p\u003e","title":"Halloween Schocker"},{"content":"In vorangegangen Projekten mit dem NanoESP, z.B. dem Lichtsensor Projekt vom Adventskalender, konnten im Browser neue Messwerte nur durch neues Laden der kompletten, veränderten Webseite dargestellt werden. Dies ist logischerweise sehr ineffizient. Auf der Suche nach besseren Möglichkeiten bin ich schließlich auf eine HTML5-Funktion ServerSentEvents gestoßen. Kurz gesagt handelt es sich hierbei um eine sehr praktische Funktion um Daten von einem Webserver zu empfangen, auch wenn die Webseite schon komplett geladen ist Und das Beste ist, wenn die Verbindung einmal steh, kann der Server jederzeit und kontinuierlich neue Daten senden.\nIm HTML Quelltext wird dies folgendermaßen realisiert:\nvar source = new EventSource(\u0026ldquo;document.URL\u0026rdquo;);\nMit dieser kleinen Zeile wird eine neue Verbindung zu einem TCP-Server aufgebaut. Hier würde normalerweise eine URL stehen, hinter der sich z.B. ein PHP-Script verbirgt, wie in dem Beispiel der folgenden Seite:\nhttp://www.w3schools.com/html/html5_serversentevents.asp\nIn unserem Fall steht hier document.URL (also die aktuellen Adresse die auch in der Adressleiste steht). Da Sie eine Verbindung zum NanoESP öffnen, ist die URL gleich der IP des Boards. Es wird also automatisch eine weitere Verbindung zum Board aufgebaut und Sie müssen die IP nicht individuell anpassen.\nBeim Verbindungsaufbau wird nun folgender Request vom Browser gesendet (aus dem Seriellen Monitor kopiert):\nGET / HTTP/1.1\nHost: 192.168.178.41\nConnection: keep-alive\nAccept: text/event-stream\nCache-Control: no-cache\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36\nReferer: http://192.168.178.41/\nAccept-Encoding: gzip, deflate, sdch\nAccept-Language: en-US,en;q=0.8,de;q=0.6\nDas spannende an diesem Request ist die Stelle: Accept: text/event-stream. Anhand dieser wird auch im Programm eine event-stream Anfrage erkannt und die ID gesondert gespeichert. Der Server, also hier unser NanoESP, muss nun passend auf die Anfrage reagieren und zwar in etwa so:\nHTTP/1.1 200 OK \\n\nContent-Type: text/event-stream\\n\nConnection: close\\n\nAccess-Control-Allow-Origin: *\\n\nCache-Control: no-cache\n\\r\\n\\r\\n\nIch habe den Antwort-Header bewusst mit den New-Line Symbolen geschrieben, denn die New-Line Zeichen, besonder die am Ende, haben mir bei den Versuchen einige Schwierigkeiten bereitet. Nun ist die Verbindung zustande gekommen und bleibt auch bestehen. Sollte es eine Trennung geben, baut der Browser die Verbindung selbstständig wieder auf (!). Der Server (aka. NanoESP) kann nun jederzeit Daten senden, z.B. in dieser Form:\ndata: Connection Established\\n\\n\nSowohl das data: am Anfang als auch die beiden New Lines am Ende sind sehr wichtig und werden interpretiert. Alles dazwischen kann man frei anpassen. Diese Daten könnten nun einfach eingelesen werden, wie in dem oben verlinkten Beispiel vorgestellt. Dies ist auch praktisch wenn Sie einfache Statusnachrichten empfangen wollen. Es gebt aber noch besser!\nNeben diesen einfachen Nachrichten können nämlich noch sogenannt events mitgeschickt werden, mit denen man Nachrichten-Typen unterscheiden kann. Ein Beispiel wie die Sache aussehen kann:\nDer Server sendet mit\nevent: msg\\n\ndata: Wichtige Nachricht! \\n\\n\neine einfache Nachrichr oder aber mit\nevent: ao\\n\ndata: analogRead(A0) \\n\\n\nden aktuellen Wert von A0 an den Browser. Im Browser kann nun mit EventListener auf die eine oder andere Art der Nachricht reagiert werden\nsource.addEventListener(\u0026lsquo;a0\u0026rsquo;, function(e) {\ndocument.getElementById(\u0026ldquo;a0\u0026rdquo;).value = e.data;\n}, false);\nsource.addEventListener(\u0026lsquo;msg\u0026rsquo;, function(e) {\ndocument.getElementById(\u0026ldquo;msg\u0026rdquo;).value += e.data + \u0026ldquo;\\n\u0026rdquo;;\n}, false);\nIn diesem Fall wird also eine Nachricht die das Event-Label a0 trägt in der Webseite als Value des Elements mit der ID a0 eingetragen, was in dem Fall ein Slider ist. Nachrichten mit dem Tag msg werden dagegen dem Textarea-Feld mit der ID msg hinzugefügt. Was noch alles möglicht ist mit data und event (z.B. sogar JSON-Codierung) lässt sich am Besten auf der folgenden Webseite nachlesen:\nhttps://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events\nDas Beste an der ganzen Geschichte ist nun aber die Geschwindigkeit, mit der Daten vom NanoESP zum Browser gesendet werden können. Ich habe die Datenrate nicht genau gemessen aber ich schätze das mindestens 4 Messwerte pro Sekunde übertragen werden können, und das mit dem ineffektiven Code den ich hingeschmiert habe!\nÜbrigens: Windows Internet Explorer funktioniert nicht, auch nicht der neue Edge Browser. Wohl aber andere gängige PC und Mobile Browser.\nDas Programm: Das Programm lädt, ähnlich dem vorherigen Projekt, die Webseite mit einer JS-Datei von meiner Internetseite nach (eine ungewöhnliche Methode die aber Ressourcen auf dem NanoESP spart). Es muss also unbedingt eine Internetverbindung bestehen. Sie können das Script betrachten unter\nhttp://www.temp.fkainka.de/EventStream1.js\nLaden Sie das Programm runter und öffnen Sie es in einer Arduino IDE ab Version 1.6.5. Passen Sie Ihre WLAN-Daten an und laden Sie es hoch. Dann öffnen Sie die IP des Boards im Browser. Die IP wird beim Start des Boards im Seriellen Monitor angezeigt. Die LED D3 leuchtet wenn eine Verbindung zum WLAN hergestellt wurde.\nBeim Öffnen der Seite gibt es eine Meldung im Text-Area-Feld, dass die SerialEvent-Verbindung besteht. Im Browser wird nun permanent der aktuelle Wert von A0 empfangen und mit der Position des Sliders dargestellt. Wenn D9 auf High geschaltet wird, gibt es zusätzlich eine Statusmeldung im Textarea-Feld.\nExterner Inhalt von codebender.cc\nBeim Laden werden Daten wie Ihre IP-Adresse an codebender.cc übertragen. Datenschutz Inhalt laden direkt öffnen ↗ ","permalink":"https://fkainka.de/livedaten-vom-nanoesp-mit-serversentevents/","summary":"\u003cp\u003eIn vorangegangen Projekten mit dem NanoESP, z.B. dem \u003ca href=\"http://iot.fkainka.de/day-15\"\u003eLichtsensor Projekt vom Adventskalender\u003c/a\u003e, konnten im Browser neue Messwerte  nur durch neues Laden der kompletten, veränderten Webseite dargestellt werden. Dies ist logischerweise sehr ineffizient. Auf der Suche nach besseren Möglichkeiten bin ich schließlich auf eine HTML5-Funktion ServerSentEvents gestoßen. Kurz gesagt handelt es sich hierbei um eine sehr praktische Funktion um Daten von einem Webserver zu empfangen, auch wenn die Webseite schon komplett geladen ist  Und das Beste ist, wenn die Verbindung einmal steh, kann der Server jederzeit und kontinuierlich neue Daten senden.\u003c/p\u003e","title":"Livedaten vom NanoESP mit ServerSentEvents"},{"content":"Gerade im Kontext des Adventskalenders oder den anderen Lernpaketen habe ich einige HTML-Seiten für den NanoESP entworfen. Allerdings hat mich dabei immer gestört, dass zum einen der Speicherplatz ziemlich gering ist zum anderen die Übertragung etwas langsam sein kann, vor allem, wenn die Seite oft neu geladen werden muss. Deswegen habe ich mir eine neue Methode überlegt, bei der die dazustellenden Webseite auf einem anderen Webserver liegt und beim Verbinden mit dem TCP-Server des Boards einfach nachgeladen wird. Der Nachteil ist hier vor allem, dass der Client mit dem Internet verbunden sein muss. Das bedeutet auch, das ein privates Netzwerk mit dem NanoESP als AccesPoint nicht möglich ist. Die Vorteile sind aber komplexere Seiten und schnellere Ladezeiten sowie eine insgesamt Entlastung des Boards. Im Folgenden Stelle ich das System anhand des RGB-LED-Beispiels vor.\nZunächst das Arduino-Programm Externer Inhalt von codebender.cc\nBeim Laden werden Daten wie Ihre IP-Adresse an codebender.cc übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Hinweis: Arduino-Programm downloaden und mit Arduino ab Version 1.6.5 auf den Controller uploaden.\nHier ändert sich gar nicht soviel. Auf dem Board läuft immer noch ein TCP-Server der beim Aufruf der IP einen HTML-Text verschickt. Dieser ist diesmal aber sehr viel kleiner und besteht im Grund nur aus folgenden Zeilen:\n\u0026lt;html\u0026gt;\u0026lt;script src=\u0026#34;http://temp.fkainka.de/RGB2.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt;draw());\u0026lt;/script\u0026gt;\u0026lt;/html\u0026gt; Mit anderen Worten wird nichts anderes gemacht, als die JavaScript-Datei :\nhttp://temp.fkainka.de/RGB2.js\nnachzuladen und anschließend die Funktion draw() aufzurufen. Diese Funktion macht nun die ganze Arbeit.\nfunction draw(rgb){ document.write(\u0026#39;\\ \u0026lt;HEAD\u0026gt;\\ \u0026lt;link rel=\u0026#34;icon\u0026#34; href=\u0026#34;data:;base64,iVBORw0KGgo=\u0026#34;\u0026gt;\\ \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=2.0, user-scalable=yes\u0026#34;\u0026gt;\\ \u0026lt;title\u0026gt;\\ RGB LED\\ \u0026lt;/title\u0026gt;\\ \u0026lt;/HEAD\u0026gt;\\ \\ \u0026lt;BODY bgcolor=\u0026#34;#FFFF99\u0026#34; text=\u0026#34;#000000\u0026#34;\u0026gt;\\ \u0026lt;FONT size=\u0026#34;6\u0026#34; FACE=\u0026#34;Verdana\u0026#34;\u0026gt;\\ Select Color\\ \u0026lt;/FONT\u0026gt;\\ \\ \u0026lt;HR\u0026gt;\\ \u0026lt;BR\u0026gt;\\ \u0026lt;FONT size=\u0026#34;3\u0026#34; FACE=\u0026#34;Verdana\u0026#34;\u0026gt;\\ Change the Color\u0026lt;BR\u0026gt;\\ of the RGB-LED\\ \u0026lt;BR\u0026gt;\\ \u0026lt;BR\u0026gt;\\ \u0026lt;form method=\u0026#34;GET\u0026#34;\u0026gt;\\ \u0026lt;input type=\u0026#34;color\u0026#34; name=\u0026#34;rgb\u0026#34; value=\u0026#34;#\u0026#39;+rgb+\u0026#39;\u0026#34; onchange=\u0026#34;this.form.submit()\u0026#34;\u0026gt;\u0026lt;BR\u0026gt;\\ \u0026lt;/form\u0026gt;\\ \u0026lt;BR\u0026gt;\\ \u0026lt;HR\u0026gt;\\ \\ \u0026lt;/font\u0026gt;\\ \u0026#39;); } In draw() wird nun mit der JavaScript Funktion document.write() der sonst aus der ColorPicker.html-Seite bekannte Inhalt in den Browser geschrieben. Dadurch baut sich die bekannte Seite im Browser auf und das auch mit der gleichen Funktionalität die beim Übertragen vom Board direkt zustande gekommen wäre. Das ermöglicht es uns nun im Grunde, noch viel größere und komplexere Seite mit eigenen JavaScripts und großer Funktionalität nachzuladen, ohne den NanoESP groß zu belasten.\nEinen weiten Vorteil gibt es bei dieser Seite auch noch, denn die Seite stellt nun auch dar, welche Farbe gerade gewählt wurde. Dazu wird in späteren Aufrufen der draw()-Funktion der Parameter rgb übergeben, der in der document.write()-Funktion als Value von ColorPicker eingefügt wird. Der richtige Hex-Code wird einfach aus den immer noch in der URL-Verschlüsselten Daten übernommen. Ein weitere Vorteil dieser Version also.\n","permalink":"https://fkainka.de/groessere-webseiten-auf-dem-nanoesp/","summary":"\u003cp\u003eGerade im Kontext des Adventskalenders oder den anderen Lernpaketen habe ich einige HTML-Seiten für den NanoESP entworfen. Allerdings hat mich dabei immer gestört, dass zum einen der Speicherplatz ziemlich gering ist zum anderen die Übertragung etwas langsam sein kann, vor allem, wenn die Seite oft neu geladen werden muss. Deswegen habe ich mir eine neue Methode überlegt, bei der die dazustellenden Webseite auf einem anderen Webserver liegt und beim Verbinden mit dem TCP-Server des Boards einfach nachgeladen wird. Der Nachteil ist hier vor allem, dass der Client mit dem Internet verbunden sein muss. Das bedeutet auch, das ein privates Netzwerk mit dem NanoESP als AccesPoint nicht möglich ist. Die Vorteile sind aber komplexere Seiten und schnellere Ladezeiten sowie eine insgesamt Entlastung des Boards. Im Folgenden Stelle ich das System anhand des \u003ca href=\"http://iot.fkainka.de/day-14\"\u003eRGB-LED-Beispiels\u003c/a\u003e vor.\u003c/p\u003e","title":"Ausgelagerte Webseiten für den NanoESP"},{"content":"Das Cheerlights-Projekt ist ein wirklich schönen Projekt. Doch hat mich manchmal gestört, dass ich nicht passend zur Farbe auch die aktuelle Nachricht des Cheerlights-Users lesen konnte. Zumindest nicht ohne das Handy zu Hilfe zu nehmen. Ein NanoESP mit Display und schon könnte man auch den passenden Tweet verfolgen. So schwer kann das ja nicht sein - dachte ich.\nAlso habe ich mich die Twitter API nach einer einfachen Möglichkeit durchsucht, Tweets anhand eines bestimmten Stichwortes zu suchen. Die Funktion gibt es, allerdings ist dafür eine etwas kompliziertes Authentifizierungsverfahren notwendig. Mit einem kleinen Mikrocontroller nicht zu machen. Wohl aber mit Hilfe einer php-Bibliothek:\nGithup: Twitter API PHP Wiki von J7mbo\nEs hat schon einiges an Stunden gedauert, diesen Weg überhaupt zu finden. Eine große Hilfe beim Verständnis einer generellen API-Abfragen war übrigens:\nApiGee.com\nMit Hilfe dieses Online-Tools kann man verschiedene Online-APIs ausprobieren und die Nachrichten erforschen. So kam ich erst darauf, dass es keine einfache Authentifizierung von wegen Passwort-Nutzer, sondern ein kompliziertes aber auch sicheres Verfahren mit zeitlich begrenzten Token und mehreren Parametern verwendet wird.\nDie Lösung: Nun ist es mir gelungen ein kleine PHP-Skript zu schreiben, mit dem das Abrufen des letzen Tweets zu einem Stichwort möglich ist. Dieses Skript läuft auf dem Server, auf dem ich auch damals die Temperaturabfrage eingerichtet hatte.\nDamit es nicht zu kompliziert wird habe ich mit Thingspeak GetHTTP zwei Kanäle erstellt, über die die neuste Cheerlights und NanoESP Tweets direkt empfangen werden können. Diese werden auch in dem Arduino Programm verwendet. Falls Sie eigene Suchbegriffe suchen wollen, finden Sie weiter unten eine mini Anleitung der Schritte die nötig sind, damit Sie das Skript nutzen können.\nNanoESP: http://api.thingspeak.com/apps/thinghttp/send_request?api_key=WLLQ6TB5K2EXGF13 Cheerlights: http://api.thingspeak.com/apps/thinghttp/send_request?api_key=AV7QCJ0BDRIT3ZSF Die Ausgabe erfolgt in der Form\nTwitterUsernamen: Tweet\nund zwar auf einem Nokia 5110 Display. Die nötige Library finden Sie unter\nhttps://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library\noder im Library Manger. Angeschlossen ist das Display direkt an den Pins D3-D10.\nDas Programm selbst hat zwar noch einige Macken, aber die Anzeige funktioniert soweit ganz gut:\nNanoESP hat Tweet mit dem Stichwort NanoESP empfangen Externer Inhalt von codebender.cc\nBeim Laden werden Daten wie Ihre IP-Adresse an codebender.cc übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Hinweis: Das Programm downloaden und mit der Arduino IDE ab Version 1.6.5 aufspielen. Sonst gibt es Fehler. Mini Anleitung Bevor Sie das Skript für eigene, individuelle Abfragen nutzen können, müssen Sie zunächst noch einige Schritte bei Twitter vornehmen, die in dem folgenden Video erläutert werden.\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Um das Skript nun nutzen zu können muss man die Seite\nwww.temp.fkainka.de/twitter.php\nmit den Parametern aufrufen:\nhttp://temp.fkainka.de/twitter.php?oat=YourOAccesToken\u0026amp;oats=YourOAccesTokenSecret\u0026amp;ck=YourConsumerKey\u0026amp;cs=YourConsumerSecret\u0026amp;search=YourSerachWord\nIch empfehle Thingspeak GetHTTP-App zu benutzen, damit der Controller nicht mit einer zu langen URL belastet wird.\n","permalink":"https://fkainka.de/neueste-twitter-nachricht-auf-dem-nanoesp/","summary":"\u003cp\u003eDas Cheerlights-Projekt ist ein wirklich schönen Projekt. Doch hat mich manchmal gestört, dass ich nicht passend zur Farbe auch die aktuelle Nachricht des Cheerlights-Users lesen konnte. Zumindest nicht ohne das Handy zu Hilfe zu nehmen. Ein NanoESP mit Display und schon könnte man auch den passenden Tweet verfolgen. So schwer kann das ja nicht sein - dachte ich.\u003c/p\u003e\n\u003cp\u003eAlso habe ich mich die Twitter API nach einer einfachen Möglichkeit durchsucht, Tweets anhand eines bestimmten Stichwortes zu suchen. Die Funktion gibt es, allerdings ist dafür eine etwas kompliziertes Authentifizierungsverfahren notwendig. Mit einem kleinen Mikrocontroller nicht zu machen. Wohl aber mit Hilfe einer php-Bibliothek:\u003c/p\u003e","title":"Twitter Nachrichten auf dem NanoESP"},{"content":"Zur Zeit habe ich massive Internet Probleme. Immer wieder bricht die Verbindung zum Provider aus unerklärlichen Gründen ab. Es waren schon mehrere Male waren Techniker der Telekom vor Ort um die Leitung zu vermessen - ohne Befund. Natürlich tritt der Fehler auch gerade dann nicht auf, wenn ein Techniker vor Ort ist.\nExterner Inhalt von thingspeak.com\nBeim Laden werden Daten wie Ihre IP-Adresse an thingspeak.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Deswegen ist das Ziel meines Projektes nun, meine Leitung über längere Zeit zu überwachen. Dafür ist der NanoESP (Pretzelboard) in Verbindung mit Thingspeak genau richtig. Über die Ping-Funktion wird die Dauer der Ping-Antwort in ms gemessen. Dieser Wert wird an Thingspeak übertragen. Zusätzlich leuchtet die RGB-LED grün, als Zeichen, dass eine Internetverbindung besteht. Sollte die Verbindung mal abbrechen geht der Ping-Request ins Leere, die LED wird rot und neue Werte auf Thingspeak bleiben aus. In dem Diagramm müsste dann eine deutliche Lücke in den ansonsten alle 15 s übertragenen Messwerten zu sehen sein.\nAnschluss der RGB-LED Mit dieser Laufzeitmessung lassen sich evtl bestimmte systematische Wiederholungen des Fehlers finden und so eventuell die Ursache der Probleme auf den Grund gehen.\nExterner Inhalt von codebender.cc\nBeim Laden werden Daten wie Ihre IP-Adresse an codebender.cc übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Noch ein Hinweis zu dem hier verwendeten Codebender-Plugin:\nDie Codebender Webseite ist im Grunde sehr praktisch um Arduino-Programme in einer Cloud zu speichern und auf einer Webseite vorstellen zu können. In der Regel lassen sich sogar Programme über den Browser direkt auf einen Arduino übertragen, ohne die Arduino Oberfläche starten zu müssen. Ein kleiner Browserplugin muss dafür zunächst installiert werden. In diesem Fall und auch bei anderen Prezelboard (NanoESP) Programmen gibt es allerdings noch ungeklärte Probleme mit der SoftwareSerial-Library. Ich vermute, dass die Core-Dateien etwas älter sind. Deswegen gibt es Fehler bei der Kommunikation mit dem Board. Ich habe das Plugin hier dennoch verwendet, denn zum einen gibt es eine gute Übersicht über das Programm und zum anderen kann man das Programm über den Download Button oben rechts auch direkt herunterladen.\nDer richte Weg zum nachbasten also: Programm runterladen, in Arduino öffnen, WLAN-Daten etc. anpassen und dann hochladen.\n","permalink":"https://fkainka.de/ping-watch/","summary":"\u003cp\u003eZur Zeit habe ich massive Internet Probleme. Immer wieder bricht die Verbindung zum Provider aus unerklärlichen Gründen ab. Es waren schon mehrere Male waren Techniker der Telekom vor Ort um die Leitung zu vermessen - ohne Befund. Natürlich tritt der Fehler auch gerade dann nicht auf, wenn ein Techniker vor Ort ist.\u003c/p\u003e\n\n\u003cdiv class=\"ext-embed\" data-src=\"https://thingspeak.com/channels/101832/charts/1?bgcolor=%23ffffff\u0026amp;color=%23d62020\u0026amp;dynamic=true\u0026amp;results=100000\u0026amp;type=column\" data-height=\"260px\" data-title=\"thingspeak.com\"\u003e\n  \u003cdiv\u003e\u003cstrong\u003eExterner Inhalt von thingspeak.com\u003c/strong\u003e\u003cbr\u003eBeim Laden werden Daten wie Ihre IP-Adresse an thingspeak.com übertragen.\n  \u003ca href=\"https://fkainka.de/datenschutzerklaerung/#eingebettete-inhalte-anderer-anbieter\"\u003eDatenschutz\u003c/a\u003e\u003c/div\u003e\n  \u003cdiv class=\"ext-embed-actions\"\u003e\u003cbutton type=\"button\"\u003eInhalt laden\u003c/button\u003e\n  \u003ca href=\"https://thingspeak.com/channels/101832/charts/1?bgcolor=%23ffffff\u0026amp;color=%23d62020\u0026amp;dynamic=true\u0026amp;results=100000\u0026amp;type=column\" target=\"_blank\" rel=\"noopener noreferrer\"\u003edirekt öffnen ↗\u003c/a\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript\u003e\ndocument.addEventListener(\"click\", function (e) {\n  var b = e.target.closest(\".ext-embed button\"); if (!b) return;\n  var box = b.closest(\".ext-embed\"), f = document.createElement(\"iframe\");\n  f.src = box.dataset.src; f.style.height = box.dataset.height; f.title = box.dataset.title;\n  f.setAttribute(\"allowfullscreen\", \"\"); f.loading = \"lazy\";\n  box.replaceChildren(f); box.classList.add(\"loaded\");\n});\n\u003c/script\u003e\n\n\n\u003cp\u003eDeswegen ist das Ziel meines Projektes nun, meine Leitung über längere Zeit zu überwachen. Dafür ist der NanoESP (Pretzelboard) in Verbindung mit \u003ca href=\"http://www.thingspeak.com\"\u003eThingspeak\u003c/a\u003e genau richtig. Über die Ping-Funktion wird die Dauer der Ping-Antwort in ms gemessen. Dieser Wert wird an Thingspeak übertragen. Zusätzlich leuchtet die RGB-LED grün, als Zeichen, dass eine Internetverbindung besteht. Sollte die Verbindung mal abbrechen geht der Ping-Request ins Leere, die LED wird rot und neue Werte auf Thingspeak bleiben aus. In dem Diagramm müsste dann eine deutliche Lücke in den ansonsten alle 15 s übertragenen Messwerten zu sehen sein.\u003c/p\u003e","title":"Ping Watch mit dem NanoESP"},{"content":"So langsam sammeln sich die Beiträge zu dem ausgeschriebenen Wettbewerb. Auf dieser Seite finden Sie eine Liste aller bisher eingegangener Beiträge und wo diese zu finden sind.\nBeiträge Temperaturdifferenz mit Transistoren messen von Fritjof Flechsig Strömungswächter zur Lüfterüberwachung von Wolfgang Triebig Blumenwächter von Leander Hackmann Wassermelder mit Twitter-Alarmmeldung von Bernhard Kaiser \u0026amp; Michael Gaus Neigungssensor – auslesen per IoT- Board, übertragen per WLAN von Holger Fritzsch Füllstandsmesser „Waran“ von Günther Zöppel Erdbeben-Sensor von Andreas Biernath Der Briefkastenwächter von von Jürgen Kuhn Lichttechnischer Gitarren-Tonabnehmer von Günther Zöppel IoTeaTimer von General Overnight Kabelsucher von Frank Schacht Der Briefkastenassistent von Wolfgang und Jonatan Polarfuchsvon Nicolaus Cüppers Quadrocopter Landing Pad von Paul Kaczmarczyk Die Sieger Die Qualität der eingesandten Beiträge war sehr gut. Deshalb war die Entscheidung nicht einfach. Aber am Ende sind wir zu diesem Ergebnis gelangt:\nPlatz: Quadrocopter Landing Pad von Paul Kaczmarczyk Platz: Polarfuchs von Nicolaus Cüppers Platz: Kabelsucher von Frank Schacht Gewinner der Sonderverlosung: Blumenwächter von Leander Hackmann\nHerzlichen Glückwunsch!\n","permalink":"https://fkainka.de/alle-beitraege-zum-adventskalender-wettbewerb-2015/","summary":"\u003cp\u003eSo langsam sammeln sich die Beiträge zu dem \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eausgeschriebenen Wettbewerb\u003c/a\u003e. Auf dieser Seite finden Sie eine Liste aller bisher eingegangener Beiträge und wo diese zu finden sind.\u003c/p\u003e\n\u003ch2 id=\"beiträge\"\u003eBeiträge\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Tempsensor.html\"\u003eTemperaturdifferenz mit Transistoren messen\u003c/a\u003e  von Fritjof Flechsig\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Stroemung.html\"\u003eStrömungswächter zur Lüfterüberwachung\u003c/a\u003e  von Wolfgang Triebig\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/wettbewerbsbeitrag-blumenwaechter/\"\u003eBlumenwächter\u003c/a\u003e von Leander Hackmann\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/wettbewerbsbeitrag-wassermelder/\"\u003eWassermelder mit Twitter-Alarmmeldung\u003c/a\u003e von Bernhard Kaiser \u0026amp; Michael Gaus\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/wettbewerbsbeitrag-neigungssensor-auslesen-per-iot-board-uebertragen-per-wlan/\"\u003eNeigungssensor – auslesen per IoT- Board, übertragen per WLAN\u003c/a\u003e von Holger Fritzsch\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Notizen/Fuellstand.html\"\u003eFüllstandsmesser „Waran“\u003c/a\u003e  von Günther Zöppel\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Erdbeben.html\"\u003eErdbeben-Sensor\u003c/a\u003e  von Andreas Biernath\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Briefkasten.html\"\u003eDer Briefkastenwächter\u003c/a\u003e  von von Jürgen Kuhn\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Tonabnehmer.html\"\u003eLichttechnischer\u003c/a\u003e \u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Tonabnehmer.html\"\u003eGitarren-\u003c/a\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Tonabnehmer.html\"\u003eTonabnehmer\u003c/a\u003e von Günther Zöppel\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://iot.fkainka.de/wettbewerbsbeitrag-ioteatimer\"\u003eIoTeaTimer\u003c/a\u003e  von General Overnight\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Kabelsucher.html\"\u003eKabelsucher\u003c/a\u003e  von Frank Schacht\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/BriefkastenAssistent.html\"\u003eDer Briefkastenassistent\u003c/a\u003e  von Wolfgang und Jonatan\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/wettbewerbsbeitrag-polarfuchs/\"\u003ePolarfuchs\u003c/a\u003evon Nicolaus Cüppers\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/wettbewerbsbeitrag-quadrocopter-landing-pad/\"\u003eQuadrocopter Landing Pad\u003c/a\u003e von Paul Kaczmarczyk\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"die-sieger\"\u003eDie Sieger\u003c/h2\u003e\n\u003cp\u003eDie Qualität der eingesandten Beiträge war sehr gut. Deshalb war die Entscheidung nicht einfach. Aber am Ende sind wir zu diesem Ergebnis gelangt:\u003c/p\u003e","title":"Alle Beiträge zum Adventskalender Wettbewerb 2015"},{"content":"Beitrag zum Kalenderwettbewerb 2015 von Nicolaus Cüppers Der Conrad-Adventskalender „Internet of Things“ war für mich der Einstieg, mich einmal mit dem Thema Arduino zu befassen. Herausgekommen ist das Projekt „Polarfuchs“. Der Name ist angelehnt an das kleinste mir bekannte deutsche Forschungsschiff. Es handelt sich um einen Versuchsaufbau, der ein unbemanntes „Schiff“ nachbildet, was einige Umgebungsdaten erfasst und weiterleitet und parallel dazu seinen eigenen Zustand überwacht.\nEs wurde nur der Kalender und zusätzlich eine Stromquelle verwendet. Daher sind die Messmethoden auch nicht unbedingt praxisnahe. Normalerweise würde man für die einzelnen Werte passende Sensoren einsetzen. Das war allerdings nicht die Aufgabe. Vielmehr ging es ja darum, aus einer Hand voll vorhandener Bauelemente das Maximale herauszuholen. Als Schiffsrumpf wird daher der Kalender selbst verwendet. Er bildet durch seinen Plastikkörper mit zahlreichen Einsenkungen eine ideale Schwimmplattform. Es wurden jedoch die üblichen konfektionierten Steckkabel verwendet. Das dem Kalender beiliegende Kabel hätte aber auch gereicht, um die Schaltung aufzubauen. Dann hätte man nur alles etwas enger am Board platzieren müssen.\nFolgende Umweltwerte sammelt „Polarfuchs“ ein, um sie auf einer eigenen Webseite darzustellen:\nWassertmperatur mittels NTC\nBedeckungsgrad des Himmels mittels Photodiode\nRegen mittels Spannungsabfall\nAußerdem überwacht Polarfuchs sich selbst auf Lecks (Wassereinbruch aka Bilgenalarm) mittels Spannungsabfall und gibt auf seiner Webseite Auskunft über seine Betriebsspannung. Die Überwachung von Wasser beruht darauf, dass Wasser etwas Strom leitet ( und zwar nicht nur Leitungswasser haahaaa\u0026hellip; ). Taucht man zwei Kontakte, an denen eine Spannung anliegt, in Wasser, fließt ein geringer Strom, wodurch die Spannung abfällt. Diesen Spannungsabfall kann man messen. Im Falle des Leckalarms (Bilgenalarm) platziert man einfach innenbords zwei Drähte an eine Stelle, die normalerweise trocken ist. An diese Drähte legt man eine Spannung an, die man wiederum mit einem Analogeingang überwacht. Solange alles so ist wie es sein soll, fließt kein Strom, da die beiden Drahtenden nur durch Luft verbunden sind. Gelangt jetzt Wasser an die überwachte Stelle, fließt ein geringer Strom, was sich am angeschlossenen Analogeingang durch eine geringere Spannung bemerkbar macht. Man muss dann nur noch empirisch einen Schwellenwert definieren, und fertig ist der Wassersensor.\nDie Überwachung auf Regen funktioniert nach dem gleichen Prinzip. Hier hat man allerdings das Problem, dass man das Regenwasser nicht sammeln möchte, also erst einmal keinen Ort hat, wo man es abgreifen kann. Eine kleine Hilfskonstruktion soll das Problem lösen: Eine geneigte Ebene als Sammelfläche für Wasser, die einen zentralen Auslaufpunkt hat. Dort platziert man die beiden Drähte so eng es nur irgendwie geht aneinander, ohne dass sie sich berühren. Dafür wird die Rückseite des Kalenders verwendet, die dafür passend gefaltet auf die Oberseite des Kalenders gesteckt wird und so gleichzeitig ein Dach über der Elektronik bildet. Die Messkontakte werden einfach am tiefsten Punkt dicht nebeneinander von unten durch die Pappe gesteckt.\nRegnet es jetzt auf die Sammelfläche, fließt das Wasser durch die Schwerkraft zusammen und in Richtung des Auslaufs, wo sich ab einer gewissen Regenintensität ein kleines Rinnsal bildet, was wiederum über die Drähte fließt und diese so verbindet. Solange also Wasser fließt, ist ein Spannungsabfall messbar. Hört es auf zu regnen, versiegt das Rinnsal, und der NanoESP weiß, das es nicht mehr regnet. Im Badewannen-Versuch erwies sich das als der Schwachpunkt des Systems, denn die Pappe sog sich voll Wasser, weshalb „Polarfuchs“ auch nach dem Begießen mit Wasser erstmal weiterhin Regen anzeigte. Das ändert aber nichts an der Funktionsfähigkeit des Konzepts.\nDie Temperatur wird über einen NTC gemessen, der ebenfalls dem Kalender beilag. Er kann durch das Poti mit einer externen Referenztemperatur „geeicht“ werden.\nFür den Bedeckungsgrad des Himmels kann man den Photowiderstand des Kalenders verwenden. So wird das Umgebungslicht gemessen und anhand empirisch vordefinierter Bereiche einem von drei Zuständen zugeordnet: sonnig, bedeckt, Nacht. Das ist zwar zugegeben nicht sehr genau, aber andererseits nicht unzuverlässig. Wir haben also einen Wetterbericht mit Temperatur, Himmel und Niederschlag. Dies wird per WLAN auf einer Webseite zur Verfügung gestellt. Natürlich wird hier vorausgesetzt, dass das Schiff Internetzugang hat und auch erreichbar ist.\nNeben der Webseite verfügt das „Schiff“ noch über ein Toplicht (LED), was bei Dunkelheit automatisch leuchtet und einen Buzzer, der im Notfall (Wassereinbruch) zusammen mit der LED SOS signalisiert. Der Versuchsaufbau wurde tatsächlich erfolgreich in der Badewanne getestet!\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ Download: PolarfuchsFinal.zip Der Quelltext /* Forschungsschiff \u0026#34;Polarfuchs\u0026#34; N. Cueppers www.nicnet.de/wordpress Stellt Wetterdaten über einen Browser zur Verfuegung: Wassertemperatur mittels Thermistor Himmel mittels Photodiode Regen mittels Spannungsabfall Ausserdem ueberwacht Polarfuchs sich selbst auf Lecks (Wassereinbruch aka Bilgenalarm) mittels Spannungsabfall und gibt auf der Webseite Auskunft über seine Betriebsspannung. Ist der Wert kritisch, sendet Polarfuchs das Notsignal SOS per Toplicht (LED) und Horn (Buzzer). Bei Dunkelheit schaltet Polarfuchs das Toplicht ein. Da es keinen eigenen Atrieb hat, genuegt dafuer tatsaechlich ein weisses Rundumlicht. (§ 3.13 Abs. 5 BinSchStrO) Der Name ist angelehnt an das kleinste mir bekannte deutsche Forschungsschiff: http://www.deutsche-meeresforschung.de/de/polarfuchs */ #define SSID \u0026#34;SSID\u0026#34; #define PASSWORD \u0026#34;PASSWORD\u0026#34; #define LED_WLAN 13 #define DEBUG true //Pins I/O #define THERMO A0 #define PHOTO A1 #define vRegen_pin 4 #define vBilge_pin 5 #define LED 9 #define buzzer 8 #include SoftwareSerial.h\u0026gt; SoftwareSerial esp8266(11, 12); // RX, TX const byte site[] PROGMEM = { 60,72,84,77,76,62,60,72,69,65,68,62,13,10,60,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,104,114,101,102,61,34,100,97,116,97,58,59,98,97,115,101,54,52,44,105,86,66,79,82,119,48,75,71,103,111,61,34,62,13,10,60,109,101,116,97,32,110,97,109,101,61,34,118,105,101,119,112,111,114,116,34,32,99,111,110,116,101,110,116,61,34,119,105,100,116,104,61,100,101,118,105,99,101,45,119,105,100,116,104,44,32,105,110,105,116,105,97,108,45,115,99,97,108,101,61,50,46,48,44,32,117,115,101,114,45,115,99,97,108,97,98,108,101,61,121,101,115,34,62,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,114,101,102,114,101,115,104,34,32,99,111,110,116,101,110,116,61,34,51,34,62,13,10,60,116,105,116,108,101,62,13,10,80,111,108,97,114,102,117,99,104,115,13,10,60,47,116,105,116,108,101,62,13,10,60,47,72,69,65,68,62,13,10,60,66,79,68,89,32,98,103,99,111,108,111,114,61,34,35,70,70,70,70,70,70,34,32,116,101,120,116,61,34,35,48,48,48,48,48,48,34,62,13,10,60,70,79,78,84,32,115,105,122,101,61,34,51,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,13,10,60,98,62,80,79,76,65,82,70,85,67,72,83,60,47,98,62,13,10,60,47,70,79,78,84,62,13,10,60,70,79,78,84,32,115,105,122,101,61,34,50,34,32,70,65,67,69,61,34,86,101,114,100,97,110,97,34,62,13,10,60,66,82,62,13,10,42,98,114,105,103,104,116,42,13,10,60,47,102,111,110,116,62,13,10,60,47,72,84,77,76,62,13,10 }; void setup() { pinMode(vRegen_pin, INPUT); digitalWrite(vRegen_pin, HIGH); pinMode(vBilge_pin, INPUT); digitalWrite(vBilge_pin, HIGH); pinMode(LED, OUTPUT); digitalWrite(LED, LOW); pinMode(buzzer, OUTPUT); digitalWrite(buzzer, LOW); Serial.begin(19200); esp8266.begin(19200); if (!espConfig()) serialDebug(); else digitalWrite(LED_WLAN, HIGH); if (configTCPServer()) debug(\u0026#34;Server Aktiv\u0026#34;); else debug(\u0026#34;Server Error\u0026#34;); } void loop() { if (analogRead(PHOTO) \u0026gt; 100) digitalWrite(LED, LOW); else digitalWrite(LED, HIGH); int bilge=analogRead(A4); if ((bilge 800) || (readVcc() 4200 )) //Achtung, EasterEgg: Mit wenigen weiteren Widerständen könnte man über Spannungsteiler SINNVOLL die Batteriespannung überwachen. Dann gibt es auch ein Notsignal, wenn die Spannung zu niedrig wird! { digitalWrite(LED, LOW); delay(600); did(); did(); did(); da(); da(); da(); did(); did(); did(); delay(600); } String xBuffer; if (esp8266.available()) // check if the esp is sending a message { if (esp8266.find(\u0026#34;+IPD,\u0026#34;)) { debug(\u0026#34;Incomming Request\u0026#34;); int connectionId = esp8266.parseInt(); if (sendWebsite(connectionId, createWebsite())) debug(\u0026#34;Website send OK\u0026#34;); else debug(\u0026#34;Website send Error\u0026#34;); } } } boolean sendWebsite(int connectionId, String webpage) { boolean succes = true; if (sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(connectionId) + \u0026#34;,\u0026#34; + String(webpage.length()), \u0026#34;\u0026gt;\u0026#34;)) { esp8266.print(webpage); esp8266.find(\u0026#34;SEND OK\u0026#34;); succes \u0026amp;= sendCom(\u0026#34;AT+CIPCLOSE=\u0026#34; + String(connectionId), \u0026#34;OK\u0026#34;); } else { succes = false; } return succes; } String createWebsite() { String xBuffer; double vTemp = Thermistor(analogRead(THERMO)); String br = \u0026#34;\u0026#34;; int vcc = readVcc(); String stringOne = \u0026#34;Wetterdaten: \u0026#34;; int webregen = analogRead(A5); String esregnet; if (webregen \u0026gt; 900) esregnet = \u0026#34;trocken\u0026#34;; else esregnet =\u0026#34;Regen\u0026#34;; int licht = analogRead(PHOTO); String webhimmel; if (licht \u0026gt;= 100 \u0026amp; licht 700) webhimmel = \u0026#34;bedeckt\u0026#34;; else if (licht \u0026gt; 700) webhimmel = \u0026#34;sonnig\u0026#34;; else webhimmel =\u0026#34;Nacht\u0026#34;; int bilgenwasser = analogRead(A4); String webbilge; if (bilgenwasser \u0026gt; 900) webbilge = \u0026#34;trocken\u0026#34;; else webbilge =\u0026#34;Wassereinruch\u0026#34;; String stringThree = stringOne + vTemp + \u0026#34; Grad \u0026#34; + br + webhimmel + br + esregnet + br + \u0026#34;Schiffsstatus\u0026#34;+ br + br + \u0026#34;Bordspannung: \u0026#34; + vcc + \u0026#34; mV\u0026#34; + br + \u0026#34;Bilge: \u0026#34; + webbilge; for (int i = 0; i sizeof(site); i++) { char myChar = pgm_read_byte_near(site + i); xBuffer += myChar; } xBuffer.replace(\u0026#34;*bright*\u0026#34;, stringThree); return xBuffer; } //-----------------------------------------Config ESP8266------------------------------------ boolean espConfig() { boolean succes = true; esp8266.setTimeout(5000); succes \u0026amp;= sendCom(\u0026#34;AT+RST\u0026#34;, \u0026#34;ready\u0026#34;); esp8266.setTimeout(1000); if (configStation(SSID, PASSWORD)) { succes \u0026amp;= true; debug(\u0026#34;WLAN Connected\u0026#34;); debug(\u0026#34;My IP is:\u0026#34;); debug(sendCom(\u0026#34;AT+CIFSR\u0026#34;)); } else { succes \u0026amp;= false; } //shorter Timeout for faster wrong UPD-Comands handling succes \u0026amp;= sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;); succes \u0026amp;= sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;); return succes; } boolean configTCPServer() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=1\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configTCPClient() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;)); //succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configStation(String vSSID, String vPASSWORT) { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=1\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(20000); succes \u0026amp;= (sendCom(\u0026#34;AT+CWJAP=\\\u0026#34;\u0026#34; + String(vSSID) + \u0026#34;\\\u0026#34;,\\\u0026#34;\u0026#34; + String(vPASSWORT) + \u0026#34;\\\u0026#34;\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(1000); return succes; } boolean configAP() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=2\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CWSAP=\\\u0026#34;NanoESP\\\u0026#34;,\\\u0026#34;\\\u0026#34;,5,0\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configUDP() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;UDP\\\u0026#34;,\\\u0026#34;192.168.255.255\\\u0026#34;,90,91,2\u0026#34;, \u0026#34;OK\u0026#34;); //Importand Boradcast...Reconnect IP return succes; } //-----------------------------------------------Controll ESP----------------------------------------------------- boolean sendUDP(String Msg) { boolean succes = true; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(Msg.length() + 2), \u0026#34;\u0026gt;\u0026#34;); //+\u0026#34;,\\\u0026#34;192.168.4.2\\\u0026#34;,90\u0026#34;, \u0026#34;\u0026gt;\u0026#34;); if (succes) { succes \u0026amp;= sendCom(Msg, \u0026#34;OK\u0026#34;); } return succes; } boolean sendCom(String command, char respond[]) { esp8266.println(command); if (esp8266.findUntil(respond, \u0026#34;ERROR\u0026#34;)) { return true; } else { debug(\u0026#34;ESP SEND ERROR: \u0026#34; + command); return false; } } String sendCom(String command) { esp8266.println(command); return esp8266.readString(); } //-------------------------------------------------Debug Functions------------------------------------------------------ void serialDebug() { while (true) { if (esp8266.available()) Serial.write(esp8266.read()); if (Serial.available()) esp8266.write(Serial.read()); } } void debug(String Msg) { if (DEBUG) { Serial.println(Msg); } } //Spannungsmessung gefunden auf //https://code.google.com/p/tinkerit/wiki/SecretVoltmeter long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(5); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH8; result = 1126400L / result; // Back-calculate AVcc in mV return result; } //EasterEgg2: Interne Temperatur des Boards könnte man auch noch ausgeben! :) long readTemp() { // Read temperature sensor against 1.1V reference #if defined(__AVR_ATmega32U4__) ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); ADCSRB = _BV(MUX5); // the MUX5 bit is in the ADCSRB register #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(REFS1) | _BV(MUX5) | _BV(MUX1); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); #else ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); #endif delay(5); // Wait for ADMUX setting to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high 8) | low; // combine the two return result; } double Thermistor(int RawADC) { //Source: http://playground.arduino.cc/ComponentLib/Thermistor2 double Temp; Temp = log(10000.0 * ((1024.0 / RawADC - 1))); // =log(10000.0/(1024.0/RawADC-1)) // for pull-up configuration Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp ); Temp = Temp - 273.15; // Convert Kelvin to Celcius // Temp = (Temp * 9.0)/ 4.7 + 32.0; // Convert Celcius to Fahrenheit return Temp; } void did() { tone(buzzer, 440, 100); digitalWrite(LED, HIGH); delay(200); noTone(buzzer); digitalWrite(LED, LOW); delay(200); } void da() { tone(buzzer, 440, 600); digitalWrite(LED, HIGH); delay(600); noTone(buzzer); digitalWrite(LED, LOW); delay(200); } ","permalink":"https://fkainka.de/wettbewerbsbeitrag-polarfuchs/","summary":"\u003ch2 id=\"beitrag-zum-kalenderwettbewerb-2015-von-nicolaus-cüppers\"\u003eBeitrag zum \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eKalenderwettbewerb\u003c/a\u003e 2015 von Nicolaus Cüppers\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Polar3.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eDer Conrad-Adventskalender „Internet of Things“ war für mich der Einstieg, mich einmal mit dem Thema Arduino zu befassen. Herausgekommen ist das Projekt „Polarfuchs“. Der Name ist angelehnt an das kleinste mir bekannte deutsche Forschungsschiff. Es handelt sich um einen Versuchsaufbau, der ein unbemanntes „Schiff“ nachbildet, was einige Umgebungsdaten erfasst und weiterleitet und parallel dazu seinen eigenen Zustand überwacht.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Polar1.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eEs wurde nur der Kalender und zusätzlich eine Stromquelle verwendet. Daher sind die Messmethoden auch nicht unbedingt praxisnahe. Normalerweise würde man für die einzelnen Werte passende Sensoren einsetzen.  Das war allerdings nicht die Aufgabe. Vielmehr ging es ja darum, aus einer Hand voll vorhandener Bauelemente das Maximale herauszuholen. Als Schiffsrumpf wird daher der Kalender selbst verwendet. Er bildet durch seinen Plastikkörper mit zahlreichen Einsenkungen eine ideale Schwimmplattform. Es wurden jedoch die üblichen konfektionierten Steckkabel verwendet. Das dem Kalender beiliegende Kabel hätte aber auch gereicht, um die Schaltung aufzubauen. Dann hätte man nur alles etwas enger am Board platzieren müssen.\u003c/p\u003e","title":"Wettbewerbsbeitrag: Polarfuchs"},{"content":"Beitrag zum Kalenderwettbewerb 2015 von Paul Kaczmarczyk Auszug ausdem PDF: Projektbeschreibung: An Weihnachten erhielt ich einen Quadrocopter als Geschenk von meinem Opa. Ich hatte so viel Freude damit, dass ich mir gleich ein zweites Modell vom Typ Blade Inductrix zulegte. Das Fliegen mit dem Quadrocopter macht allerdings besonders viel Spaß, wenn man Aufgaben zu erfüllen hat.\nSpielidee Für die zu bewältigenden Aufgaben kam mir der Gedanke das Landing Pad zu bauen, bei dem die Aufgabe darin besteht durch einen Ring zu fliegen, ohne hängen zu bleiben und dann zu landen, sofern man eine Landefreigabe erhält. Wird die Landefreigabe vom Tower nicht gegeben, so muss man schweben, bis die Landefreigabe erteilt wird. Wird ohne Landefreigabe gelandet, erhält man als Strafe für die Landung einen Punktabzug. Landet man mit Freigabe erhält man Punkte auf sein Konto. Ein Hängenbleiben am Ring soll auch einen Punktabzug zur Folge haben. Um sich mit anderen zu messen, sollen die erreichten Punkte auch in einer Internet-weiten Highscore-Liste namentlich geführt werden. Dieses Geschicklichkeitsspiel soll rundenbasiert ablaufen, wobei die Rundenzeit 60 s beträgt. Läuft die Runde ab, werden die addierten Punkte in die Highscore-Liste eingetragen. Der Start einer neuen Runde soll durch Druck auf einen Taster ermöglicht werden. [\u0026hellip;]\nMehr zu diesem spannednen Projekte gibt es in diesem PDF: LandingPad-Projektbeschreibung Download Programm: Quadrocopter_LandingPad ","permalink":"https://fkainka.de/wettbewerbsbeitrag-quadrocopter-landing-pad/","summary":"\u003ch2 id=\"beitrag-zum-kalenderwettbewerb-2015-von-paul-kaczmarczyk\"\u003eBeitrag zum \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eKalenderwettbewerb\u003c/a\u003e 2015 von Paul Kaczmarczyk\u003c/h2\u003e\n\u003ch3 id=\"auszug-ausdem-pdf\"\u003e\u003cem\u003e\u003cstrong\u003eAuszug aus\u003c/strong\u003e\u003c/em\u003e\u003cem\u003e\u003cstrong\u003edem PDF:\u003c/strong\u003e\u003c/em\u003e\u003c/h3\u003e\n\u003ch2 id=\"projektbeschreibung\"\u003eProjektbeschreibung:\u003c/h2\u003e\n\u003cp\u003eAn Weihnachten erhielt ich einen Quadrocopter als Geschenk von meinem Opa. Ich hatte so viel Freude damit, dass ich mir gleich ein zweites Modell vom Typ Blade Inductrix zulegte. Das Fliegen mit dem Quadrocopter macht allerdings besonders viel Spaß, wenn man Aufgaben zu erfüllen hat.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/2016/02/Quadro2.jpg\"\u003e\u003cimg alt=\"Quadro2\" loading=\"lazy\" src=\"/images/2016/02/Quadro2.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"spielidee\"\u003eSpielidee\u003c/h2\u003e\n\u003cp\u003eFür die zu bewältigenden Aufgaben kam mir der Gedanke das Landing Pad zu bauen, bei dem die Aufgabe darin besteht durch einen Ring zu fliegen, ohne hängen zu bleiben und dann zu landen, sofern man eine Landefreigabe erhält. Wird die Landefreigabe vom Tower nicht gegeben, so muss man schweben, bis die Landefreigabe erteilt wird. Wird ohne Landefreigabe gelandet, erhält man als Strafe für die Landung einen Punktabzug. Landet man mit Freigabe erhält man Punkte auf sein Konto. Ein Hängenbleiben am Ring soll auch einen Punktabzug zur Folge haben. Um sich mit anderen zu messen, sollen die erreichten Punkte auch in einer Internet-weiten Highscore-Liste namentlich geführt werden. Dieses Geschicklichkeitsspiel soll rundenbasiert ablaufen, wobei die Rundenzeit 60 s beträgt. Läuft die Runde ab, werden die addierten Punkte in die Highscore-Liste eingetragen. Der Start einer neuen Runde soll durch Druck auf einen Taster ermöglicht werden. [\u0026hellip;]\u003c/p\u003e","title":"Wettbewerbsbeitrag: Quadrocopter Landing Pad"},{"content":"Beitrag zum Kalenderwettbewerb 2015 von Holger Fritzsch Mit einer einfachen Zusatzschaltung läßt sich mit dem IoT- Board eine Erschütterung oder Lageänderung von Gegenständen oder Türen detektieren.\nZur Anwendung kommt hier ein RS- Flip Flop bestehend aus 2 Transistoren vom Typ BC547.\nOb man nun eine Tür , Fenster oder Fahrrad überwachen oder Teile vor unbefugter Entnahme sichern will,der kompakte Aufbau des Moduls machts möglich.\nDie Schaltung kennt zwei stabile Zustände, nämlich Bereitschaft- und Alarmzustand.\nTechnisch gesehen entsprechend dem Set- und Reset- Zustand.\nNatürlich könnte man den Sensor auch statt des Tasters an Pin8 des Arduino- Nano anschließen.\nDiese Kontakte könnten aber prellen und Fehlauslösungen verursachen.\nDer vorgestellte RS- FlipFlop hat dieses Problem nicht und zusätzlich die Möglichkeit den jeweiligen Zustand zweifelsfrei zu speichern..Eine Manipulation ist ausgeschlossen.\nDenkbar wären auch mehrere RS- FF an einem Port abzufragen und an der jeweils leuchtenden roten Led den Auslöseort festzustellen.\nDie Funktion:\nNach Anlegen der Spannung schaltet T2 dimensionierungs bedingt.sofort durch. Die grüne Led leuchtet. Die Schaltung ist nun „scharf“. Gleichzeitig dient die grüne Led als Bereitschaftsanzeige.\nT1 ist über R4 gesperrt, somit leuchtet die rote Led nicht. Wird der Sensor bewegt, wird die Basisspannung von T2 kurzgeschlossen, so sperrt T2. Dessen Kollektorspannung, steigt an.\nÜber R4 findet eine Erhöhung der Basisvorspannung des T1 statt. Dieser wird durchgeschaltet und am Kollektor entsteht eine H- L- Flanke. Die rote Led leuchtet auf. Das ist der „Alarmfall“\nWird nun mit dem Taster die Basis- Emitter – Strecke des T1 kurzgeschlossen , so sperrt dieser sofort. Das entspricht einem Reset.\nDie Kollektorspannung steigt an und über R3 wird nun T2 durch gesteuert..Das Flip- Flop kippt wieder in die Ausgangslage zurück, d.h. die grüne Led leuchtet. Das entspricht einem Set.\nDas Programm vom Tag 6 (Autor F. Kainka) wurde nur gering geändert , so das im Falle der Aktivierung nicht die Ausgabe „Button=1, sondern „Alarm“. erscheint.\n}\nif (!digitalRead(SWITCH))\n{\ndebug(\u0026ldquo;Button=1\u0026rdquo;);\n// sendUDP(\u0026ldquo;Button=1\u0026rdquo;);\nsendUDP(\u0026ldquo;ALARM\u0026rdquo;);\nwhile (!digitalRead(SWITCH)) {}\n}\n}\nAls Ausgabe- Terminal bietet sich „Packet -Sender“ für PC an.\nDas, in meinem 1. Beitrag genannte Programm, für Android „WIFI UDP Test- Tool“ , funktioniert hier nur nach mehrmaligem Reset, also nicht zuverlässig.\nAufbauhinweis:\nDer Kollektor des T1 wird mit dem pin8 des Arduino verbunden.\nDie Betriebsspanung (5V) bezieht die Schaltung ebenfalls vom IoT- Board.\nSchaltung Bereitschaftsanzeige Optische Alarmausgabe praktischer Aufbau ","permalink":"https://fkainka.de/wettbewerbsbeitrag-neigungssensor-auslesen-per-iot-board-uebertragen-per-wlan/","summary":"\u003ch2 id=\"beitrag-zum-kalenderwettbewerb-2015-vonholger-fritzsch\"\u003eBeitrag zum \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eKalenderwettbewerb\u003c/a\u003e 2015 von Holger Fritzsch\u003c/h2\u003e\n\u003cp\u003eMit einer einfachen Zusatzschaltung läßt sich mit dem IoT- Board eine Erschütterung oder Lageänderung von Gegenständen oder Türen detektieren.\u003cbr\u003e\nZur Anwendung kommt hier ein RS- Flip Flop bestehend aus 2 Transistoren vom Typ BC547.\u003c/p\u003e\n\u003cp\u003eOb man nun eine Tür , Fenster oder Fahrrad überwachen oder Teile vor unbefugter Entnahme sichern will,der kompakte Aufbau des Moduls machts möglich.\u003cbr\u003e\nDie Schaltung kennt zwei stabile Zustände, nämlich Bereitschaft- und Alarmzustand.\u003cbr\u003e\nTechnisch gesehen entsprechend dem Set- und Reset- Zustand.\u003c/p\u003e","title":"Wettbewerbsbeitrag: Neigungssensor – auslesen per IoT- Board, übertragen per WLAN"},{"content":"Beitrag zum Kalenderwettbewerb 2015 von Bernhard Kaiser \u0026amp; Michael Gaus Bei diesem Projekt handelt es sich um einen Wassermelder, der optisch, akustisch und per Twitter-Meldung Alarm gibt, sobald an den Sensorkontakten Wasser detektiert wird. Er kann z.B. zur Überwachung auf austretendes Wasser aus Waschmaschine oder Spülmaschine dienen und helfen, rechtzeitig vor größeren Überschwemmungen eingreifen zu können. Als Sensorkontakt können einfach 2 Drähte mit abisolierten Enden genommen werden, so wie es auch auf dem Foto zu sehen ist. Verwendet wurden ausschließlich die Bauteile der beiden Adventskalender.\nSchaltplan Im Ruhezustand der Schaltung sperrt die Darlingtonstufe bestehend aus den beiden Transistoren T1 und T2. Bei Benetzung mit Wasser am Sensorkontakt J1 entsteht eine leitfähige Verbindung, sodass die Darlingtonstufe durchschaltet und die rote LED1 eingeschaltet wird. Zusätzlich wird durch den LOW-Pegel am Kollektor das IoT-Modul (NanoESP) über den Digitaleingang D2 getriggert, sodass dann per Software eine Twitter-Meldung als weltweiter Alarm abgesetzt wird. Damit jedoch nicht die ganze Welt im Klartext das Wasserleck mitbekommt, erfolgt die Twitter-Textmeldung in bester Geheimdienst-Manier:\n\u0026ldquo;Achtung, alle Mann an Bord! Das Boot ist bereit zum Ablegen!\u0026rdquo; :-)\nZusätzlich wird per Software ein optisches (gelbe LED2 blinkt) und akustisches Alarmsignal per Piezo solange erzeugt, bis der Sensorkontakt keine leitfähige Verbindung mehr hat. Somit ist der Alarm auch direkt lokal vor Ort seh- und hörbar.\nAls Basis für die Software wurde das Projekt \u0026ldquo;Alarmanlage\u0026rdquo; (Tag 21 des IoT-Adventskalenders) verwendet und entsprechend abgeändert.\nGanz oben im Quellcode müssen für die 3 Defines SSID, PASSWORD und TwitterKEY anstatt der Platzhalter die entsprechenden Werte eingetragen werden. Benötigt werden ein Thingspeak und ein Twitter Account, so wie im IoT-Adventskalender beschrieben.\nDownload: Arduino Programm Noch ein Hinweis zur Software:\nDie Arduino-Stringverarbeitung verwendet dynamisch allokierten Heap-Speicher, wobei es zu einer starken Fragmentierung kommen kann. Dies kann zu RAM-Problemen führen. Da in den Adventskalender-Beispielen sehr viele Strings angelegt und hintereinander gehängt werden, kann dies teilweise zu scheinbar unerklärlichem Softwareverhalten führen und sogar Softwareabstürze zur Folge haben, da es zum Überschreiben von RAM-Inhalten kommen kann. Als beispielsweise in dieser Softwareanpassung für den Wassermelder der zu sendende Twitter-Text länger gemacht wurde als im Adventskalender-Beispiel, hat das Versenden der Twitter-Meldung zunächst nicht mehr funktioniert. Um statisch verwendetes RAM zu sparen, sodass mehr RAM für den dynamischen Heap zur Verfügung steht, wurden deshalb hier Strings, die als Debugausgabe auf der seriellen Schnittstelle ausgegeben werden, ins Flash gelegt mit folgendem Mechanismus: statt \u0026ldquo;Textausgabe\u0026rdquo; wird verwendet: F(\u0026ldquo;Textausgabe\u0026rdquo;).\nBeispiel:\ndebug(F(\u0026ldquo;WLAN Connected\u0026rdquo;));\nDer Quelltext /* Wassermelder Alarm SSID, PASSWORD und TwitterKEY muessen angepasst werden */ #define SSID \u0026#34;[Your SSID]\u0026#34; #define PASSWORD \u0026#34;[Your Password]\u0026#34; #define TwitterKEY \u0026#34;[Your Key]\u0026#34; #define SENSOR_INPUT 7 // Wasser-Sensor ist am digital input D2 abgeschlossen #define LED_ALARM 9 // Alarm-LED ist am digital input D3 angeschlossen #define PIEZO 8 #define LED_WLAN 13 #define DEBUG true #include SoftwareSerial.h\u0026gt; SoftwareSerial esp8266(11, 12); // RX, TX const byte thingPost[] PROGMEM = { 80, 79, 83, 84, 32, 42, 85, 82, 76, 42, 32, 72, 84, 84, 80, 47, 49, 46, 49, 10, 72, 111, 115, 116, 58, 32, 97, 112, 105, 46, 116, 104, 105, 110, 103, 115, 112, 101, 97, 107, 46, 99, 111, 109, 10, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 58, 32, 99, 108, 111, 115, 101, 10, 67, 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 120, 45, 119, 119, 119, 45, 102, 111, 114, 109, 45, 117, 114, 108, 101, 110, 99, 111, 100, 101, 100, 10, 67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 32, 42, 76, 69, 78, 42, 10, 10, 42, 65, 80, 80, 69, 78, 68, 42, 10 }; void setup() { Serial.begin(19200); Serial.println(\u0026#34;Wassermelder\u0026#34;); esp8266.begin(19200); if (!espConfig()) serialDebug(); else digitalWrite(LED_WLAN, HIGH); pinMode(SENSOR_INPUT, INPUT); pinMode(LED_ALARM, OUTPUT); } void loop() { if(digitalRead(SENSOR_INPUT) == LOW) { alarm(); } else { debug(F(\u0026#34;Alles im trockenen Bereich.\u0026#34;)); } delay(500); } void alarm(void) { debug(F(\u0026#34;Achtung, alle Mann an Bord! Das Boot ist bereit zum Ablegen!\u0026#34;)); sendTwitterPost(TwitterKEY, \u0026#34;Achtung, alle Mann an Bord! Das Boot ist bereit zum Ablegen!\u0026#34;); do { digitalWrite(LED_ALARM, HIGH); tone(PIEZO, 400, 500); delay(500); digitalWrite(LED_ALARM, LOW); tone(PIEZO, 800, 500); delay(500); } while (digitalRead(SENSOR_INPUT) == LOW); } boolean sendTwitterPost(String key, String twitterMsg) { boolean succes = true; String Host = \u0026#34;api.thingspeak.com\u0026#34;; String Url = \u0026#34;/apps/thingtweet/1/statuses/update\u0026#34;; String msg = \u0026#34;\u0026amp;status=\u0026#34; + twitterMsg; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;); String postRequest = createThingPost(Url, key, msg); if (sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(postRequest.length()), \u0026#34;\u0026gt;\u0026#34;)) { esp8266.print(postRequest); debug (postRequest); esp8266.find(\u0026#34;SEND OK\u0026#34;); succes \u0026amp;= sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;); } else { succes = false; } return succes; } //-----------------------------------------ThingsSpeak Functions------------------------------------ boolean sendThingPost(String key, int value) { boolean succes = true; String Host = \u0026#34;api.thingspeak.com\u0026#34;; String msg = \u0026#34;field1=\u0026#34; + String(value); succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;); String postRequest = createThingPost(\u0026#34;/update\u0026#34;, key, msg); if (sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(postRequest.length()), \u0026#34;\u0026gt;\u0026#34;)) { esp8266.print(postRequest); esp8266.find(\u0026#34;SEND OK\u0026#34;); if (!esp8266.find(\u0026#34;CLOSED\u0026#34;)) succes \u0026amp;= sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;); } else { succes = false; } return succes; } String createThingPost(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg; xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } String createThingGet(String url, String key) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key; xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;); xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } String createThingGet(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg; xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;); xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } //-----------------------------------------Config ESP8266------------------------------------ boolean espConfig() { boolean succes = true; esp8266.setTimeout(5000); succes \u0026amp;= sendCom(\u0026#34;AT+RST\u0026#34;, \u0026#34;ready\u0026#34;); esp8266.setTimeout(1000); if (configStation(SSID, PASSWORD)) { succes \u0026amp;= true; debug(F(\u0026#34;WLAN Connected\u0026#34;)); debug(F(\u0026#34;My IP is:\u0026#34;)); debug(sendCom(F(\u0026#34;AT+CIFSR\u0026#34;))); } else { succes \u0026amp;= false; } //shorter Timeout for faster wrong UPD-Comands handling succes \u0026amp;= sendCom(F(\u0026#34;AT+CIPMUX=0\u0026#34;), \u0026#34;OK\u0026#34;); succes \u0026amp;= sendCom(F(\u0026#34;AT+CIPMODE=0\u0026#34;), \u0026#34;OK\u0026#34;); return succes; } boolean configTCPServer() { boolean succes = true; succes \u0026amp;= (sendCom(F(\u0026#34;AT+CIPMUX=1\u0026#34;), \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(F(\u0026#34;AT+CIPSERVER=1,80\u0026#34;), \u0026#34;OK\u0026#34;)); return succes; } boolean configTCPClient() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;)); //succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configStation(String vSSID, String vPASSWORT) { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=1\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(20000); succes \u0026amp;= (sendCom(\u0026#34;AT+CWJAP=\\\u0026#34;\u0026#34; + String(vSSID) + \u0026#34;\\\u0026#34;,\\\u0026#34;\u0026#34; + String(vPASSWORT) + \u0026#34;\\\u0026#34;\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(1000); return succes; } boolean configAP() { boolean succes = true; succes \u0026amp;= (sendCom(F(\u0026#34;AT+CWMODE=2\u0026#34;), \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CWSAP=\\\u0026#34;NanoESP\\\u0026#34;,\\\u0026#34;\\\u0026#34;,5,0\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configUDP() { boolean succes = true; succes \u0026amp;= (sendCom(F(\u0026#34;AT+CIPMODE=0\u0026#34;), \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(F(\u0026#34;AT+CIPMUX=0\u0026#34;), \u0026#34;OK\u0026#34;)); succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;UDP\\\u0026#34;,\\\u0026#34;192.168.255.255\\\u0026#34;,90,91,2\u0026#34;, \u0026#34;OK\u0026#34;); //Importand Boradcast...Reconnect IP return succes; } //-----------------------------------------------Controll ESP----------------------------------------------------- boolean sendUDP(String Msg) { boolean succes = true; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(Msg.length() + 2), \u0026#34;\u0026gt;\u0026#34;); //+\u0026#34;,\\\u0026#34;192.168.4.2\\\u0026#34;,90\u0026#34;, \u0026#34;\u0026gt;\u0026#34;); if (succes) { succes \u0026amp;= sendCom(Msg, \u0026#34;OK\u0026#34;); } return succes; } boolean sendCom(String command, char respond[]) { esp8266.println(command); if (esp8266.findUntil(respond, \u0026#34;ERROR\u0026#34;)) { return true; } else { debug(\u0026#34;ESP SEND ERROR: \u0026#34; + command); return false; } } String sendCom(String command) { esp8266.println(command); return esp8266.readString(); } //-------------------------------------------------Debug Functions------------------------------------------------------ void serialDebug() { while (true) { if (esp8266.available()) Serial.write(esp8266.read()); if (Serial.available()) esp8266.write(Serial.read()); } } void debug(String Msg) { if (DEBUG) { Serial.println(Msg); } } ","permalink":"https://fkainka.de/wettbewerbsbeitrag-wassermelder/","summary":"\u003ch2 id=\"beitrag-zum-kalenderwettbewerb-2015-vonbernhard-kaiser-michael-gaus\"\u003eBeitrag zum \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eKalenderwettbewerb\u003c/a\u003e 2015 von Bernhard Kaiser \u0026amp; Michael Gaus\u003c/h2\u003e\n\u003cp\u003eBei diesem Projekt handelt es sich um einen Wassermelder, der optisch, akustisch und per Twitter-Meldung Alarm gibt, sobald an den Sensorkontakten Wasser detektiert wird. Er kann z.B. zur Überwachung auf austretendes Wasser aus Waschmaschine oder Spülmaschine dienen und helfen, rechtzeitig vor größeren Überschwemmungen eingreifen zu können. Als Sensorkontakt können einfach 2 Drähte mit abisolierten Enden genommen werden, so wie es auch auf dem Foto zu sehen ist. Verwendet wurden ausschließlich die Bauteile der beiden Adventskalender.\u003c/p\u003e","title":"Wettbewerbsbeitrag: Wassermelder mit Twitter-Alarmmeldung"},{"content":"Beitrag zum Kalenderwettbewerb 2015 von Leander Hackmann: Jeder hat Topfpflanzen. Sie verschönern unseren Alltag, benötigen jedoch auch häufig unsere Aufmerksamkeit in Form von Pflege. Um den besten Standort herauszufinden und das regelmäßige Giessen nicht zu vergessen, habe ich folgende Anwendung mit dem Iot-Board entworfen und umgesetzt: ein Datenlogger für Licht und Feuchtigkeit.\nDownload des Programms Das Programm //Blumenwaechter für das NanoESP-Board //2016 von Leander H. //Misst alle 30min. Feuchtigkeit und Helligkeit //Mit Druck auf Taster kann ein Nullpunkt in der Messung als markanter Punkt gesetzt werden# //Es werden zwei Channels auf Thingspeak.com verwendet (API-Keys in \u0026#34;LightKEY und \u0026#34;MoistureKEY\u0026#34;) //Über \u0026#34;threshold\u0026#34; kann der Pegel zur Warnung eingestellt werden //Code und Idee von Leander H. -- Funktionen von Fabian Kainka #include SoftwareSerial.h\u0026gt; #include Time.h\u0026gt; //Setup-Bereich #define SSID \u0026#34;[SSID]\u0026#34; #define PASSWORD \u0026#34;[Passwort]\u0026#34; #define LightKEY \u0026#34;[API-KEY]\u0026#34; #define MoistureKEY \u0026#34;[API-KEY]\u0026#34; #define threshold 400 // #define DEBUG true #define LED_WLAN 13 SoftwareSerial esp8266(11, 12); // RX, TX int ledGreen = 5; int ledYellow = 4; int ledRed = 3; int sensorPower = 2; int moistSensor = 2; String lastminute; const byte thingPost[] PROGMEM = { 80, 79, 83, 84, 32, 42, 85, 82, 76, 42, 32, 72, 84, 84, 80, 47, 49, 46, 49, 10, 72, 111, 115, 116, 58, 32, 97, 112, 105, 46, 116, 104, 105, 110, 103, 115, 112, 101, 97, 107, 46, 99, 111, 109, 10, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 58, 32, 99, 108, 111, 115, 101, 10, 67, 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 120, 45, 119, 119, 119, 45, 102, 111, 114, 109, 45, 117, 114, 108, 101, 110, 99, 111, 100, 101, 100, 10, 67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 32, 42, 76, 69, 78, 42, 10, 10, 42, 65, 80, 80, 69, 78, 68, 42, 10 }; void setup() { pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledRed, OUTPUT); pinMode(sensorPower, OUTPUT); Serial.begin(19200); esp8266.begin(19200); while(!espConfig()){ //Failsafe für WLAN delay(200); } digitalWrite(LED_WLAN, HIGH); while(!getTime(\u0026#34;chronic.herokuapp.com\u0026#34;, \u0026#34;/utc/in+one+hours\u0026#34;) == false){ //Failsafe für Zeitsynchro delay(200); } sendThingPost(LightKEY, analogRead(A0)); //Erste Übermittlung digitalWrite(sensorPower, HIGH); delay(200); int tmp = analogRead(A2); sendThingPost(MoistureKEY, tmp); digitalWrite(sensorPower, LOW); if(tmp threshold){ digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); }else{ digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); } } void loop() { String shour, sminute, ssecond; if (hour() 9) shour = \u0026#34;0\u0026#34; + String(hour()); else shour = String(hour()); // adjust for 0-9 if (minute() 9) sminute = \u0026#34;0\u0026#34; + String(minute()); else sminute = String(minute()); if (second() 9) ssecond = \u0026#34;0\u0026#34; + String(second()); else ssecond = String(second()); //debug(shour + \u0026#34;:\u0026#34; + sminute + \u0026#34;:\u0026#34; + ssecond); if(sminute == \u0026#34;0\u0026#34; || sminute == \u0026#34;30\u0026#34;){ //Wird zur halben und vollen Stunde ausgeführt if(sminute != lastminute){ digitalWrite(ledYellow, HIGH); if(sendThingPost(LightKEY, analogRead(A0) == false)){ while(sendThingPost(LightKEY, analogRead(A0) == false)){ sendThingPost(LightKEY, analogRead(A0)); delay(200); } } digitalWrite(ledYellow, LOW); delay(500); digitalWrite(ledYellow, HIGH); digitalWrite(sensorPower, HIGH); delay(100); if(sendThingPost(MoistureKEY, analogRead(A2) == false)){ while(sendThingPost(MoistureKEY, analogRead(A2) == false)){ sendThingPost(MoistureKEY, analogRead(A2)); delay(200); } } digitalWrite(sensorPower, LOW); digitalWrite(ledYellow, LOW); digitalWrite(sensorPower, HIGH); delay(100); int tmp = analogRead(A2); digitalWrite(sensorPower, LOW); if(tmp threshold){ digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); }else{ digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); } lastminute = sminute; } } if(analogRead(A1) \u0026gt; 500){ //Button zum Setzen eines Nullpunktes digitalWrite(ledYellow, HIGH); sendThingPost(LightKEY, 0); digitalWrite(ledYellow, LOW); delay(500); digitalWrite(ledYellow, HIGH); sendThingPost(MoistureKEY, 0); digitalWrite(ledYellow, LOW); delay(1000); } } //Verwendete Funktionen von Fabian Kainka folgen ab hier: //-----------------------------------------ThingsSpeak Functions------------------------------------ boolean sendThingPost(String key, int value) { boolean succes = true; String Host = \u0026#34;api.thingspeak.com\u0026#34;; String msg = \u0026#34;field1=\u0026#34; + String(value); succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;); String postRequest = createThingPost(\u0026#34;/update\u0026#34;, key, msg); if (sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(postRequest.length()), \u0026#34;\u0026gt;\u0026#34;)) { esp8266.print(postRequest); esp8266.find(\u0026#34;SEND OK\u0026#34;); if (!esp8266.find(\u0026#34;CLOSED\u0026#34;)) succes \u0026amp;= sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;); } else { succes = false; } return succes; } String createThingPost(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg; xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } String createThingGet(String url, String key) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key; xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;); xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } String createThingGet(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg; xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;); xBuffer.replace(\u0026#34;*URL*\u0026#34;, url); xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length())); xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append); return xBuffer; } String getTCP(String Host, String Subpage) { boolean succes = true; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;); String getRequest = \u0026#34;GET \u0026#34; + Subpage + \u0026#34; HTTP/1.1\\r\\nHost:\u0026#34; + Host + \u0026#34;\\r\\n\\r\\n\u0026#34;; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(getRequest.length() + 2), \u0026#34;\u0026gt;\u0026#34;); return sendCom(getRequest); } boolean getTime(String Host, String Subpage) { boolean succes = true; int xyear, xmonth, xday, xhour, xminute, xsecond; //lokal variables succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;); String getRequest = \u0026#34;GET \u0026#34; + Subpage + \u0026#34; HTTP/1.1\\r\\nHost:\u0026#34; + Host + \u0026#34;\\r\\n\u0026#34;; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(getRequest.length() + 2), \u0026#34;\u0026gt;\u0026#34;); esp8266.println(getRequest); if (esp8266.find(\u0026#34;+IPD\u0026#34;)) { if (esp8266.find(\u0026#34;\\r\\n\\r\\n\u0026#34;)) { xyear = esp8266.parseInt(); xmonth = esp8266.parseInt(); xday = esp8266.parseInt(); xhour = esp8266.parseInt(); xminute = esp8266.parseInt(); xsecond = esp8266.parseInt(); if (xday 0) xday *= -1; //Because of date seperator - parseInt detects negativ integer if (xmonth 0) xmonth *= -1; //Because of date seperator - parseInt detects negativ integer setTime(xhour, xminute, xsecond, xday, xmonth, xyear); sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;); return true; } else return false; } else return false; } //-----------------------------------------Config ESP8266------------------------------------ boolean espConfig() { boolean succes = true; esp8266.setTimeout(5000); succes \u0026amp;= sendCom(\u0026#34;AT+RST\u0026#34;, \u0026#34;ready\u0026#34;); esp8266.setTimeout(1000); if (configStation(SSID, PASSWORD)) { succes \u0026amp;= true; debug(\u0026#34;WLAN Connected\u0026#34;); debug(\u0026#34;My IP is:\u0026#34;); debug(sendCom(\u0026#34;AT+CIFSR\u0026#34;)); } else { succes \u0026amp;= false; } //shorter Timeout for faster wrong UPD-Comands handling succes \u0026amp;= sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;); //So rum scheit wichtig! succes \u0026amp;= sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;); return succes; } boolean configTCPServer() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=1\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configTCPClient() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;)); //succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configStation(String vSSID, String vPASSWORT) { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=1\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(20000); succes \u0026amp;= (sendCom(\u0026#34;AT+CWJAP=\\\u0026#34;\u0026#34; + String(vSSID) + \u0026#34;\\\u0026#34;,\\\u0026#34;\u0026#34; + String(vPASSWORT) + \u0026#34;\\\u0026#34;\u0026#34;, \u0026#34;OK\u0026#34;)); esp8266.setTimeout(1000); return succes; } boolean configAP() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=2\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CWSAP=\\\u0026#34;NanoESP\\\u0026#34;,\\\u0026#34;\\\u0026#34;,5,0\u0026#34;, \u0026#34;OK\u0026#34;)); return succes; } boolean configUDP() { boolean succes = true; succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;)); succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;UDP\\\u0026#34;,\\\u0026#34;192.168.255.255\\\u0026#34;,90,91,2\u0026#34;, \u0026#34;OK\u0026#34;); //Importand Boradcast...Reconnect IP return succes; } //-----------------------------------------------Controll ESP----------------------------------------------------- boolean sendUDP(String Msg) { boolean succes = true; succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(Msg.length() + 2), \u0026#34;\u0026gt;\u0026#34;); //+\u0026#34;,\\\u0026#34;192.168.4.2\\\u0026#34;,90\u0026#34;, \u0026#34;\u0026gt;\u0026#34;); if (succes) { succes \u0026amp;= sendCom(Msg, \u0026#34;OK\u0026#34;); } return succes; } boolean sendCom(String command, char respond[]) { esp8266.println(command); if (esp8266.findUntil(respond, \u0026#34;ERROR\u0026#34;)) { return true; } else { debug(\u0026#34;ESP SEND ERROR: \u0026#34; + command); return false; } } String sendCom(String command) { esp8266.println(command); return esp8266.readString(); } //-------------------------------------------------Debug Functions------------------------------------------------------ void serialDebug() { while (true) { if (esp8266.available()) Serial.write(esp8266.read()); if (Serial.available()) esp8266.write(Serial.read()); } } void debug(String Msg) { if (DEBUG) { Serial.println(Msg); } } Das Programm misst zur vollen und halben Stunde (Zeit wird aus dem Internet bezogen) Helligkeit und Feuchtigkeit, um diese dann in zwei Graphen auf Thingspeak.com zu schreiben. Bei zu trockener Erde (der Wert „threshold“ muss individuell angepasst werden, bei mir lag der Wert für feuchte Erde bei rund 400) leuchtet dann eine rote LED und ansonsten eine grüne. Die Stromzufuhr für den Feuchtigkeitssensor (ein Spannungsteiler), wird nur periodisch eingeschaltet, um Elektrolyse in der Erde zu vermeiden. Außerdem müssen Graphitelektroden (z.B. Bleistiftminen) verwendet werden, um die Pflanze nicht durch Ionen einer Elektrolyse zu vergiften (besonders bei Kupfer besteht Gefahr).\nAuf Knopfdruck wird in beide Graphen ein Nullwert geschrieben, beispielsweise um Anfang und Ende einer Messung auf dem Graphen festzuhalten. Während der Übermittlung von Daten und bei Messungen wird zur Kontrolle die gelbe LED eingeschaltet.\nDas Bild zeigt einen experimentellen Aufbau (es wurden nur andersfarbige LEDs mit eingebautem Vorwiderstand verwendet, der Aufbau ist aber nach der Fritzing-Abbildung mit Bauteilen aus den Kalendern realisierbar).\n","permalink":"https://fkainka.de/wettbewerbsbeitrag-blumenwaechter/","summary":"\u003ch2 id=\"beitrag-zum-kalenderwettbewerb-2015-von-leander-hackmann\"\u003eBeitrag zum \u003ca href=\"/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/\"\u003eKalenderwettbewerb\u003c/a\u003e 2015 von Leander Hackmann:\u003c/h2\u003e\n\u003cp\u003eJeder hat Topfpflanzen. Sie verschönern unseren Alltag, benötigen jedoch auch häufig unsere Aufmerksamkeit in Form von Pflege. Um den besten Standort herauszufinden und das regelmäßige Giessen nicht zu vergessen, habe ich folgende Anwendung mit dem Iot-Board entworfen und umgesetzt: ein Datenlogger für Licht und Feuchtigkeit.\u003c/p\u003e\n\u003ch3 id=\"download-des-programms\"\u003e\u003ca href=\"/images/2016/01/blumenwaechter-final-160125a.zip\"\u003eDownload des Programms\u003c/a\u003e\u003c/h3\u003e\n\u003cdetails class=\"spoiler\"\u003e\n  \u003csummary\u003eDas Programm\u003c/summary\u003e\n  \u003cpre tabindex=\"0\"\u003e\u003ccode\u003e//Blumenwaechter für das NanoESP-Board\n//2016 von Leander H.\n//Misst alle 30min. Feuchtigkeit und Helligkeit\n//Mit Druck auf Taster kann ein Nullpunkt in der Messung als markanter Punkt gesetzt werden#\n//Es werden zwei Channels auf Thingspeak.com verwendet (API-Keys in \u0026#34;LightKEY und \u0026#34;MoistureKEY\u0026#34;)\n//Über \u0026#34;threshold\u0026#34; kann der Pegel zur Warnung eingestellt werden\n//Code und Idee von Leander H. -- Funktionen von Fabian Kainka\n\n#include SoftwareSerial.h\u0026gt;\n#include Time.h\u0026gt;\n\n//Setup-Bereich\n#define SSID \u0026#34;[SSID]\u0026#34;\n#define PASSWORD \u0026#34;[Passwort]\u0026#34;\n#define LightKEY \u0026#34;[API-KEY]\u0026#34;\n#define MoistureKEY \u0026#34;[API-KEY]\u0026#34;\n#define threshold 400 //\n#define DEBUG true\n#define LED_WLAN 13\n\nSoftwareSerial esp8266(11, 12); // RX, TX\n\nint ledGreen = 5;\nint ledYellow = 4;\nint ledRed = 3;\nint sensorPower = 2;\nint moistSensor = 2;\nString lastminute;\n  \nconst byte thingPost[] PROGMEM = {\n  80, 79, 83, 84, 32, 42, 85, 82, 76, 42, 32, 72, 84, 84, 80, 47, 49, 46, 49, 10, 72, 111, 115, 116, 58, 32, 97, 112, 105, 46, 116, 104, 105, 110, 103, 115, 112, 101, 97, 107, 46, 99, 111, 109, 10, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 58, 32, 99, 108, 111, 115, 101, 10, 67, 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 120, 45, 119, 119, 119, 45, 102, 111, 114, 109, 45, 117, 114, 108, 101, 110, 99, 111, 100, 101, 100, 10, 67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 32, 42, 76, 69, 78, 42, 10, 10, 42, 65, 80, 80, 69, 78, 68, 42, 10\n};\n\nvoid setup() {\n  pinMode(ledGreen, OUTPUT);\n  pinMode(ledYellow, OUTPUT);\n  pinMode(ledRed, OUTPUT);\n  pinMode(sensorPower, OUTPUT);\n  \n  Serial.begin(19200);\n  esp8266.begin(19200);\n\n  while(!espConfig()){ //Failsafe für WLAN\n    delay(200);\n  }\n  digitalWrite(LED_WLAN, HIGH);\n\n  while(!getTime(\u0026#34;chronic.herokuapp.com\u0026#34;, \u0026#34;/utc/in+one+hours\u0026#34;) == false){ //Failsafe für Zeitsynchro\n    delay(200);\n  }\n  \n  sendThingPost(LightKEY, analogRead(A0)); //Erste Übermittlung\n  digitalWrite(sensorPower, HIGH);\n  delay(200);\n  int tmp = analogRead(A2);\n  sendThingPost(MoistureKEY, tmp);\n  digitalWrite(sensorPower, LOW);\n  if(tmp  threshold){\n     digitalWrite(ledRed, HIGH);\n     digitalWrite(ledGreen, LOW);\n  }else{\n     digitalWrite(ledRed, LOW);\n     digitalWrite(ledGreen, HIGH);\n  }\n}\n\nvoid loop() {\n  String shour, sminute, ssecond;\n\n  if (hour()  9) shour = \u0026#34;0\u0026#34; + String(hour()); else shour = String(hour()); // adjust for 0-9\n  if (minute()  9) sminute = \u0026#34;0\u0026#34; + String(minute());  else sminute = String(minute());\n  if (second()  9) ssecond = \u0026#34;0\u0026#34; + String(second());  else ssecond = String(second());\n\n  //debug(shour + \u0026#34;:\u0026#34; + sminute + \u0026#34;:\u0026#34; + ssecond);\n  \n  if(sminute == \u0026#34;0\u0026#34; || sminute == \u0026#34;30\u0026#34;){ //Wird zur halben und vollen Stunde ausgeführt\n    if(sminute != lastminute){\n          digitalWrite(ledYellow, HIGH);\n          if(sendThingPost(LightKEY, analogRead(A0) == false)){\n            while(sendThingPost(LightKEY, analogRead(A0) == false)){\n              sendThingPost(LightKEY, analogRead(A0));\n              delay(200);\n            }\n          }\n          digitalWrite(ledYellow, LOW);\n          delay(500);\n          digitalWrite(ledYellow, HIGH);\n          digitalWrite(sensorPower, HIGH);\n          delay(100);\n          if(sendThingPost(MoistureKEY, analogRead(A2) == false)){\n            while(sendThingPost(MoistureKEY, analogRead(A2) == false)){\n              sendThingPost(MoistureKEY, analogRead(A2));\n              delay(200);\n            }\n          }\n          digitalWrite(sensorPower, LOW);\n          digitalWrite(ledYellow, LOW);\n          \n          digitalWrite(sensorPower, HIGH);\n          delay(100);\n          int tmp = analogRead(A2);\n          digitalWrite(sensorPower, LOW);\n          \n          if(tmp  threshold){\n            digitalWrite(ledRed, HIGH);\n            digitalWrite(ledGreen, LOW);\n          }else{\n            digitalWrite(ledRed, LOW);\n            digitalWrite(ledGreen, HIGH);\n          }\n          \n          lastminute = sminute;\n    }\n  }\n  \n  if(analogRead(A1) \u0026gt; 500){ //Button zum Setzen eines Nullpunktes\n    digitalWrite(ledYellow, HIGH);\n    sendThingPost(LightKEY, 0);\n    digitalWrite(ledYellow, LOW);\n    delay(500);\n    digitalWrite(ledYellow, HIGH);\n    sendThingPost(MoistureKEY, 0);\n    digitalWrite(ledYellow, LOW);\n    delay(1000);\n  }\n}\n\n//Verwendete Funktionen von Fabian Kainka folgen ab hier:\n//-----------------------------------------ThingsSpeak Functions------------------------------------\n\nboolean sendThingPost(String key, int value)\n{\n  boolean succes = true;\n  String  Host = \u0026#34;api.thingspeak.com\u0026#34;;\n  String msg = \u0026#34;field1=\u0026#34; + String(value);\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;);\n\n  String postRequest = createThingPost(\u0026#34;/update\u0026#34;, key, msg);\n\n  if (sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(postRequest.length()), \u0026#34;\u0026gt;\u0026#34;))\n  {\n    esp8266.print(postRequest);\n    esp8266.find(\u0026#34;SEND OK\u0026#34;);\n    if (!esp8266.find(\u0026#34;CLOSED\u0026#34;)) succes \u0026amp;= sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;);\n  }\n  else\n  {\n    succes = false;\n  }\n  return succes;\n}  \n\nString createThingPost(String url, String key, String msg)\n{\n  String xBuffer;\n\n  for (int i = 0; i  sizeof(thingPost); i++)\n  {\n    char myChar = pgm_read_byte_near(thingPost + i);\n    xBuffer += myChar;\n  }\n\n  String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg;\n  xBuffer.replace(\u0026#34;*URL*\u0026#34;, url);\n  xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length()));\n  xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append);\n\n  return xBuffer;\n}\n\nString createThingGet(String url, String key)\n{\n  String xBuffer;\n\n  for (int i = 0; i  sizeof(thingPost); i++)\n  {\n    char myChar = pgm_read_byte_near(thingPost + i);\n    xBuffer += myChar;\n  }\n\n  String append = \u0026#34;api_key=\u0026#34; + key;\n  xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;);\n  xBuffer.replace(\u0026#34;*URL*\u0026#34;, url);\n  xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length()));\n  xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append);\n\n  return xBuffer;\n}\n\nString createThingGet(String url, String key, String msg)\n{\n  String xBuffer;\n\n  for (int i = 0; i  sizeof(thingPost); i++)\n  {\n    char myChar = pgm_read_byte_near(thingPost + i);\n    xBuffer += myChar;\n  }\n\n  String append = \u0026#34;api_key=\u0026#34; + key + \u0026#34;\u0026amp;\u0026#34; + msg;\n\n  xBuffer.replace(\u0026#34;POST\u0026#34;, \u0026#34;GET\u0026#34;);\n  xBuffer.replace(\u0026#34;*URL*\u0026#34;, url);\n  xBuffer.replace(\u0026#34;*LEN*\u0026#34;, String( append.length()));\n  xBuffer.replace(\u0026#34;*APPEND*\u0026#34;, append);\n\n  return xBuffer;\n}\n\nString getTCP(String Host, String Subpage)\n{\n  boolean succes = true;\n\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;);\n  String getRequest = \u0026#34;GET \u0026#34; + Subpage + \u0026#34; HTTP/1.1\\r\\nHost:\u0026#34; + Host + \u0026#34;\\r\\n\\r\\n\u0026#34;;\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(getRequest.length() + 2), \u0026#34;\u0026gt;\u0026#34;);\n\n  return sendCom(getRequest);\n}\n\nboolean getTime(String Host, String Subpage)\n{\n  boolean succes = true;\n  int xyear, xmonth, xday, xhour, xminute, xsecond;  //lokal variables\n\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;TCP\\\u0026#34;,\\\u0026#34;\u0026#34; + Host + \u0026#34;\\\u0026#34;,80\u0026#34;, \u0026#34;OK\u0026#34;);\n  String getRequest = \u0026#34;GET \u0026#34; + Subpage + \u0026#34; HTTP/1.1\\r\\nHost:\u0026#34; + Host + \u0026#34;\\r\\n\u0026#34;;\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(getRequest.length() + 2), \u0026#34;\u0026gt;\u0026#34;);\n\n  esp8266.println(getRequest);\n\n  if (esp8266.find(\u0026#34;+IPD\u0026#34;))\n  {\n    if (esp8266.find(\u0026#34;\\r\\n\\r\\n\u0026#34;))\n    {\n      xyear = esp8266.parseInt();\n      xmonth = esp8266.parseInt();\n      xday = esp8266.parseInt();\n      xhour = esp8266.parseInt();\n      xminute = esp8266.parseInt();\n      xsecond = esp8266.parseInt();\n\n      if (xday  0) xday *= -1;          //Because of date seperator - parseInt detects negativ integer\n      if (xmonth  0) xmonth *= -1;    //Because of date seperator - parseInt detects negativ integer\n\n      setTime(xhour, xminute, xsecond, xday, xmonth, xyear);\n      sendCom(\u0026#34;AT+CIPCLOSE\u0026#34;, \u0026#34;OK\u0026#34;);\n      return true;\n    }\n    else return false;\n  }\n  else return false;\n}\n\n//-----------------------------------------Config ESP8266------------------------------------\n\nboolean espConfig()\n{\n  boolean succes = true;\n  esp8266.setTimeout(5000);\n  succes \u0026amp;= sendCom(\u0026#34;AT+RST\u0026#34;, \u0026#34;ready\u0026#34;);\n  esp8266.setTimeout(1000);\n  if (configStation(SSID, PASSWORD)) {\n    succes \u0026amp;= true;\n    debug(\u0026#34;WLAN Connected\u0026#34;);\n    debug(\u0026#34;My IP is:\u0026#34;);\n    debug(sendCom(\u0026#34;AT+CIFSR\u0026#34;));\n  }\n  else\n  {\n    succes \u0026amp;= false;\n  }\n  //shorter Timeout for faster wrong UPD-Comands handling\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;);  //So rum scheit wichtig!\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;);\n\n  return succes;\n}\n\nboolean configTCPServer()\n{\n  boolean succes = true;\n\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=1\u0026#34;, \u0026#34;OK\u0026#34;));\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;));\n\n  return succes;\n\n}\n\nboolean configTCPClient()\n{\n  boolean succes = true;\n\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;));\n  //succes \u0026amp;= (sendCom(\u0026#34;AT+CIPSERVER=1,80\u0026#34;, \u0026#34;OK\u0026#34;));\n\n  return succes;\n\n}\n\nboolean configStation(String vSSID, String vPASSWORT)\n{\n  boolean succes = true;\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=1\u0026#34;, \u0026#34;OK\u0026#34;));\n  esp8266.setTimeout(20000);\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CWJAP=\\\u0026#34;\u0026#34; + String(vSSID) + \u0026#34;\\\u0026#34;,\\\u0026#34;\u0026#34; + String(vPASSWORT) + \u0026#34;\\\u0026#34;\u0026#34;, \u0026#34;OK\u0026#34;));\n  esp8266.setTimeout(1000);\n  return succes;\n}\n\nboolean configAP()\n{\n  boolean succes = true;\n\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CWMODE=2\u0026#34;, \u0026#34;OK\u0026#34;));\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CWSAP=\\\u0026#34;NanoESP\\\u0026#34;,\\\u0026#34;\\\u0026#34;,5,0\u0026#34;, \u0026#34;OK\u0026#34;));\n\n  return succes;\n}\n\nboolean configUDP()\n{\n  boolean succes = true;\n\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMODE=0\u0026#34;, \u0026#34;OK\u0026#34;));\n  succes \u0026amp;= (sendCom(\u0026#34;AT+CIPMUX=0\u0026#34;, \u0026#34;OK\u0026#34;));\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSTART=\\\u0026#34;UDP\\\u0026#34;,\\\u0026#34;192.168.255.255\\\u0026#34;,90,91,2\u0026#34;, \u0026#34;OK\u0026#34;); //Importand Boradcast...Reconnect IP\n  return succes;\n}\n\n//-----------------------------------------------Controll ESP-----------------------------------------------------\n\nboolean sendUDP(String Msg)\n{\n  boolean succes = true;\n\n  succes \u0026amp;= sendCom(\u0026#34;AT+CIPSEND=\u0026#34; + String(Msg.length() + 2), \u0026#34;\u0026gt;\u0026#34;);    //+\u0026#34;,\\\u0026#34;192.168.4.2\\\u0026#34;,90\u0026#34;, \u0026#34;\u0026gt;\u0026#34;);\n  if (succes)\n  {\n    succes \u0026amp;= sendCom(Msg, \u0026#34;OK\u0026#34;);\n  }\n  return succes;\n}\n\nboolean sendCom(String command, char respond[])\n{\n  esp8266.println(command);\n  if (esp8266.findUntil(respond, \u0026#34;ERROR\u0026#34;))\n  {\n    return true;\n  }\n  else\n  {\n    debug(\u0026#34;ESP SEND ERROR: \u0026#34; + command);\n    return false;\n  }\n}\n\nString sendCom(String command)\n{\n  esp8266.println(command);\n  return esp8266.readString();\n}\n\n//-------------------------------------------------Debug Functions------------------------------------------------------\nvoid serialDebug() {\n  while (true)\n  {\n    if (esp8266.available())\n      Serial.write(esp8266.read());\n    if (Serial.available())\n      esp8266.write(Serial.read());\n  }\n}\n\nvoid debug(String Msg)\n{\n  if (DEBUG)\n  {\n    Serial.println(Msg);\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/details\u003e\n\n\u003cp\u003eDas Programm misst zur vollen und halben Stunde (Zeit wird aus dem Internet bezogen) Helligkeit und Feuchtigkeit, um diese dann in zwei Graphen auf Thingspeak.com zu schreiben. Bei zu trockener Erde (der Wert „threshold“ muss individuell angepasst werden, bei mir lag der Wert für feuchte Erde bei rund 400) leuchtet dann eine rote LED und ansonsten eine grüne. Die Stromzufuhr für den Feuchtigkeitssensor (ein Spannungsteiler), wird nur periodisch eingeschaltet, um Elektrolyse in der Erde zu vermeiden. Außerdem müssen Graphitelektroden (z.B. Bleistiftminen) verwendet werden, um die Pflanze nicht durch Ionen einer Elektrolyse zu vergiften (besonders bei Kupfer besteht Gefahr).\u003c/p\u003e","title":"Wettbewerbsbeitrag: Blumenwächter"},{"content":"In diesem Artikel finden Sie Auszüge aus einem meiner ersten Bücher „Schnellstart mit dem Arduino Micro“. Ich habe den Text etwas für das NanoESP-Board angepasst. Screenshots etc. können aber immer noch Text für einen anderen Arduino enthalten. Gedacht ist dieser Artikel vor allem für diejenigen, die sich für das NanoESP-Board (Pretzelboard) interessieren, aber noch nie mit Arduino gearbeitet haben.\nVorbereitung Nach dem theoretischen Einstieg in die Arduino-Welt ist es nun an der Zeit, sich mit den praktischen Grundlagen zu beschäftigen. Als ersten Schritt sollte man sich ein praktikables System für die Hardwareaufbauten aneignen. Für den NanoESP bietet sich ein mittleres bis großes Steckboard an.\nDer NanoESP auf dem Steckboard Um meine Aufbauten übersichtlicher zu gestalten habe ich mir den Masse Pegel auf die obere, auf der ganzen Länge durchkontaktierte Leitung gelegt. Die untere Leitung hat dagegen 5 V. Dadurch ist der Zugang zu diesen wichtigen Versorgungsleisten erleichtert.\nEs gibt natürlich auch andere Möglichkeiten um sich eine handliche Entwicklungsumgebung zu kreieren. Ein größeres Board schafft z.B. mehr Raum für größere Projekte. Wichtig ist nur, dass Sie den Überblick über Ihr System nicht verlieren und schnell und unkompliziert Bauteile austauschen oder Schaltungen erweitern können. Dadurch bleibt der Stress minimal und der Spaßfaktor erhalten.\nAlle folgenden Programme können Sie hier herunterladen:Programme_NanoESP Die erste LED Genug vorbereitet, jetzt geht es endlich los mit dem ersten eigenen Programm. Zuerst schließen Sie eine LED an Pin0 an. Vor die LED gehört natürlich immer ein Vorwiderstand um den Strom zu begrenzen. Der Pin hat, wenn er HIGH geschaltet ist, einen Pegel von +5 V. Außerdem liefert er bis zu 40 mA. Also berechnet Sie den Widerstand wie folgt:\nSpannung am Widerstand: 5 V – 1,7 V (Spannungsabfall an der LED) = 3,3 V\nStrom am Widerstand = erlaubter Strom an der LED = 20 mA\nWiderstand R = U / I à R = 3,3 V / 20 mA = 165 Ohm.\nDas bedeutet also, dass Sie mindestens einen Widerstand von 165 Ohm einsetzen sollten, um die LED nicht zu überlasten. In meinem Fall habe ich 1,0 kOhm (Farbringe: Braun, Schwarz, Schwarz) benutzt. Das bedeutet zwar, dass durch die LED nur 5 mA fließen, das ist aber immer noch ausreichend um sie hell leuchten zu lassen. Auf dem Bild sehen Sie, wie die LED auf einem Steckbrett angeschlossen werden könnte.\nDie LED an Pin 9 Achten Sie darauf, dass der negative Pol der LED (die Kathode) an Masse liegt. Sie erkennen die Kathode in den meisten Fällen an folgenden Merkmalen:\nKürzeres Kontaktbeinchen Abflachung am Gehäuserand Größere Kontaktfläche im inneren der LED In der Programmierumgebung müssen Sie jetzt schrittweise folgendes tun:\nGrundlegende Programmstruktur anlegen Den Pin der LED als Ausgang definieren Den besagten Pin auf HIGH schalten Heraus kommt folgendes Programm:\nvoid setup() {\npinMode (9, OUTPUT); //Pin9 als Ausgang definieren\n}\nvoid loop() {\ndigitalWrite(9,HIGH); //Pin9 auf HIGH setzen\n}\nKompilieren und uploaden Sie das Programm. Die LED sollte jetzt leuchten. Ist dies nicht der Fall überprüfen Sie folgendes:\nHaben Sie den richtigen Pin getroffen Haben Sie die LED richtig herum angeschlossen Haben Sie die LED gegen Masse geschaltet Wurde eine Fehlermeldung angezeigt Haben Sie die Groß- und Kleinschreibung im Programm beachtet Wenn alles funktioniert, können Sie noch etwas tun, um das Programm übersichtlicher zu gestallten. Es ist nämlich möglich, Ihren Pins Namen zu geben. Das kann später bei komplexeren Programmen sehr hilfreich sein.\nDies funktioniert, indem Sie eine Variable definieren. Globale Variablen (die man in allen Prozeduren benutzen kann) definiert man grundsätzlich noch vor der Setup-Prozedur. Möchten Sie eine Variable lokal (nur in genau dieser Prozedur) benutzen, müssen Sie diese zu Beginn der Prozedur deklarieren.\nDiese Variable ist aber global und steht noch vor der Setup-Prozedur. Die Zeile, die Sie dort einfügen müssen lautet:\nint led = 9;\nint steht für Integer, einem Variablentypen, der für Ganzzahlen steht. led ist der Variablenname und nach dem Gleichheitszeichen steht der Wert, den Sie dieser Variable beim Start zuweisen. Der Compiler sorgt nun beim Übersetzen des Programms dafür, dass alle *led-*Variablen durch den entsprechenden Wert ersetzt werden. Das neue Programm sieht nun so aus:\nint led = 9; //Ab nun bedeutet led = 9\nvoid setup() {\npinMode (led, OUTPUT); //Pin0 als Ausgang definieren\n}\nvoid loop() {\ndigitalWrite(led,HIGH); //Pin0 auf HIGH setzen\n}\nDieses Programm lässt sich schon leichter lesen.\nSchalter Beim Anschließen eines Schalters muss man folgendes beachten: der zu lesende Zustand sollte eindeutig High (hier 5 V) oder Low (0 V = GND) sein. Um das garantieren zu können gibt es zwei Möglichkeiten: Externer Pulldown und interner Pullup.\nPulldown bedeutet, dass der Pin von außen mit einem Widerstand auf das Null-Niveau von GND heruntergezogen wird. Wenn der Pin dann gelesen wird, ist er im Normalfall eindeutig LOW. Der Schalter wird dann so angeschlossen, dass er beim Betätigen den Port auf +5 V hochzieht, und somit auf eindeutig HIGH.\nDie zweite Möglichkeit einen Schalter anzuschließen ist, den internen Pullup zu benutzen. Der Controller hat intern zuschaltbare Widerstände in der Größenordnung von etwa 20 kOhm, die einen zu hohen Kurzschlussstrom bei einer direkten Verbindung mit dem Masse-Pin verhindern.\nUm einen Pullup einzuschalten müssen Sie den Eingangs-Pin im Programm auf HIGH setzen und über einen Taster an Masse anschließen. Drücken Sie nun auf den Button, wird der Port über den Schalter eindeutig auf GND-Niveau heruntergezogen. Der Vorteil an dieser Methode ist, dass Sie auf der Hardwareseite den Widerstand sparen. Der Nachteil: Die Funktion digitalRead() ist LOW wenn der Taster gedrückt wird, also Intuitiv vertauscht.\nEin Schalter an D6 Das Programm sieht so aus :\nint led = 9; //Ab nun bedeutet led = 9\nint schalter = 6; //Ab nun bedeutet schalter = 6\nvoid setup() {\npinMode (led, OUTPUT); //Pin9 als Ausgang definieren\npinMode (schalter, INPUT); //Pin6 als Eingang definieren\ndigitalWrite (schalter, HIGH); //Pin6 High setzen für internen Pullup\n}\nvoid loop() {\ndigitalWrite(led,digitalRead(schalter)); //Pin0 auf den Wert von Pin6 setzen\n}\nDer Unterschied zum ersten Programm liegt darin, dass Sie per Tastendruck die LED ausschalten.\nEs gibt noch eine weite Möglichkeit sich Zeilen zu sparen und das Programm übersichtlicher zu machen. Sie können bei der Angabe des Pin-Modus in Zeile 6 einfach folgendes schreiben:\npinMode (schalter, INPUT_PULLUP); //Pin6 als Eingang mit internen Pullup definieren\nEs passiert im Grunde das gleiche wie davor: der interne Pullup-Widerstand zieht den Pin hoch. Allerdings ist dieser Befehl um einiges praktischer und Sie können sich die Zeile 7 komplett sparen.\nKleiner Tipp: Wenn Sie die Ihre Programms wieder Intuitiv gestalten wollen, können Sie vor digitalRead() ein Ausrufezeichen schreiben. Dadurch wird der Zustand negiert: aus HIGH wird LOW und umgekehrt. Die LED leuchtet nur, wenn Sie auf den Button drücken.\ndigitalWrite(led,!digitalRead(schalter)); //Pin9 auf den Wert von Pin5 setzen\nPWM Mit dem PWM-Verfahren kann man die Helligkeit einer LED steuern oder auch die Geschwindigkeit eines Motors. Das geht aber nicht mit jedem beliebigen Anschluss sondern nur mit den Anschlüssen D3,D5,D6, D9, D10 und D11 des NanoESP. In dem nächsten Beispiel wird nicht mehr Pin0 sondern Pin3 benutzt, da sich Pin0 nicht mit PWM ansteuern lässt:\nD6 ist auch ein PWM Ausgang Wie Sie sehen ist der Schalter aus dem vorherigen Beispiel noch angeschlossen. In Verbindung mit einer Entscheidungsabfrage (IF-Abfrage) ist es deswegen möglich, die Helligkeit zu steuern. Trotzdem wird das Programm nicht viel komplizierter und Sie können etwas über IF-Abfragen lernen. Aber zuerst der Quelltext:\nint led = 9; //Ab nun bedeutet led = 9\nint schalter = 6; //Ab nun bedeutet schalter = 6\nbyte helligkeit = 0; //Zustandsvariable der Helligkeit\nvoid setup() {\npinMode (led, OUTPUT); //Pin0 als Ausgang definieren\npinMode (schalter, INPUT_PULLUP); //Pin6 als Eingang definieren\n}\nvoid loop() {\nif (digitalRead (schalter) == LOW) { //WENN Schalter gedrückt DANN {\u0026hellip;}\nhelligkeit = helligkeit +1; //Helligkeitsvariable um 1 erhöhen\nanalogWrite(led, helligkeit); //Helligkeit an LED ausgeben\ndelay(5); //Wartezeit\n}\n}\nDie wichtigsten Befehle zum Verständnis:\nif (digitalRead (schalter) == LOW) { } //WENN Schalter gedrückt DANN {\u0026hellip;}\nDies ist die IF-Abfrage. In den runden Klammern steht die Bedingung (hier Schalter gleich LOW, denn Sie haben den internen Pullup benutzt). Beachten Sie, dass Vergleiche immer mit Doppel-Gleichheitszeichen geschrieben werden müssen und nicht wie bei Zuweisungen mit einem einzelnen Gleichheitszeichen. In den geschweiften Klammern steht der Programmteil, der bei erfüllter Bedingung ausgeführt wird. Sie können an Ihre IF-Abfrage noch mit ELSE { } einen Programmteil anhängen, der ausgeführt wird, wenn die IF-Bedingung nicht erfüllt ist. Die genaue Schreibweise finden Sie im Anhang.\nhelligkeit = helligkeit +1; //Helligkeitsvariable um 1 erhöhen\nDieser Teil steht zwischen den geschweiften Klammern der If-Abfrage und wird deshalb immer nur ausgeführt, wenn der Button gedrückt ist. Die Variable helligkeit wird immer um eins erhöht. Das gilt, bis der Maximalwert 255 erreicht ist. Wenn die Taste dann immer noch gedrückt wird passiert ein sogenannter Overflow (Überlauf). Das bedeutet, dass die Variable wieder bei 0 beginnt, da ein Byte keine Werte über 255 annehmen kann.\nanalogWrite(led, helligkeit); //Helligkeit an LED ausgeben\nBei diesem Befehl handelt es sich um den eigentlichen PWM-Befehl. Der Name des Befehls ließe vermuten, dass hier einfach die Spannung an dem Pin verändert würde. Tatsächlich passiert bei PWM aber folgendes:\nPWM steht für Pulsweitenmodulation und bedeutet, dass ein Pin sehr schnell An und Aus geschaltet wird. Dabei kann man das Verhältnis von An- und Auszeit variieren, sodass es aussieht als würde eine an diesem Pin angeschlossene LED ihre Helligkeit verändern. Im Fall der Arduino sind in der Regel 8-Bit-Timer für die Steuerung der An/Auszeiten zuständig. Das ist auch der Grund warum der Maximalwert des PWM bei 255 liegt (8 bit = 1 Byte = Werte von 0 bis 255). Es gibt aber auch 10-Bit oder 16-Bit PWM-Timer. Durch die höhere Auflösung kann man z.B. das Flackern einer LED verringern und die Helligkeit kleinschrittiger Steuern.\ndelay(5); //Wartezeit\nBei dem Befehl delay() handelt es sich um einen Wartebefehl der das Programm kurzzeitig stoppt. Die Zahl in den Klammern steht für die Wartezeit in Millisekunden (ms). Diese Wartezeit wird hier benötigt da sonst die Helligkeitsvariable zu schnell durchlaufen würde und man von einer Veränderung nichts mitbekommen würde.\nSenden über die serielle Schnittstelle Mit einer seriellen Schnittstelle kann man Texte oder Zahlenwerte senden und empfangen. Das ist z.B. nützlich um ein Programm zu debuggen, also Bugs (Fehler) zu finden. Es ist oft schwierig nachzuvollziehen, warum ein Programm nicht funktioniert da man nicht in den Controller reingucken kann. Aber dank der seriellen Schnittstelle kann man Informationen ans Terminal am PC (hier Serial Monitor genannt) senden lassen. Dadurch ist es möglich, Zwischenwerte zu überprüfen. In diesem Beispiel ändern Sie nichts am Hardwareaufbau sondern nur am Programm selbst:\nint led = 9; //Ab nun bedeutet led = 3\nint schalter = 6; //Ab nun bedeutet schalter = 6\nbyte helligkeit = 0; //Zustandsvariable der Helligkeit\nvoid setup() {\npinMode (led, OUTPUT); //Pin0 als Ausgang definieren\npinMode (schalter, INPUT_PULLUP); //Pin6 als Eingang definieren\nSerial.begin (9600); //Serielle Schnittstelle initialisieren\n}\nvoid loop() {\nif (digitalRead (schalter) == LOW) { //WENN Schalter gedrückt DANN {\u0026hellip;}\nhelligkeit = helligkeit +1; //Helligkeitsvariable um 1 erhöhen\nSerial.print (\u0026ldquo;Helligkeit: \u0026quot; ); //Helligkeit ausgeben (Text)\nSerial.println (helligkeit); //Helligkeit ausgeben (Wert)\nanalogWrite(led, helligkeit); //Helligkeit an LED ausgeben\ndelay(5); //Wartezeit\n}\n}\nIn Zeile 8 wird die serielle Schnittstelle initialisiert und die Baudrate einstellt. Die Baudrate (hier 9600 bit/s) ist die Übertragungsgeschwindigkeit. Es ist wichtig, dass das Programm und das Terminal auf dieselbe Geschwindigkeit eingestellt sind.\nIn Zeile 14 steht zum ersten Mal eine Ausgabe. Der Befehl Serial.print (); sendet, was zwischen den Klammern steht. Dabei kann es sich, wie in diesem Fall, um einen Text in Anführungszeichen handeln, oder um eine Variable, wie in der nächsten Zeile. Hier steht allerdings nicht Serial.print() , sondern Serial.println (); . Das ln bedeutet, dass eine neue Zeile (ln für engl. line) angefangen wird. Würde hier wieder nur print stehen, käme alles in eine Zeile.\nÜbertagen Sie das Programm in ihren Controller und starten Sie das Terminal mit Klick auf das Symbol in der rechten, oberen Ecke. Achten Sie darauf, dass im Terminal unten rechts „9600 baud“ ausgewählt ist. Drücken Sie dann den Taster auf Ihrem Board. Im Terminal können Sie nach jedem Tastendruck die aktuelle Helligkeit ablesen.\nDer Serielle Monitor Analog einlesen Die meisten Sensoren geben keine digitalen Signale sondern analoge Spannungswerte aus. Beispielsweise misst man bei Temperatur- und Lichtsensoren eine Spannung, und der ADC (Analog-Digital-Converter) macht daraus einen programmtauglichen Wert.\nEin Beispiel für einen Lichtsensor wäre z.B. ein LDR (Light Dependent Resistor = Lichtabhängiger Widerstand), dessen Widerstandswert geringer wird, je mehr Licht auf ihn fällt. Um die Lichtintensität messen zu können, würden Sie einen LDR nehmen und mit einem Widerstand (günstig sind 10 kOhm: Braun, Schwarz, Orange) als Teil eines Spannungsteilers anschließen.\nIn diesem Fall simulieren wir allerdings nur einen analogen Sensor mithilfe eines Potentiometers. Dieser ist schon ein Spannungsteiler, mit Widerstandswerten zwischen 0 und 10 kOhm. Wenn beide äußeren Pins auf GND und 5V verbunden sind, kann man so auf dem mittleren Pin Spannungen von 0-5V einstellen. Der mittlere Pin wird nun an A0 angeschlossen.\nDas Poti an A0 Der hier verwendetet ADC hat eine Auflösung von 10 Bit. Das bedeutet einen Wertebereich von 0 (bei 0V = GND) bis 1023 (bei 5V, der Referenzspannung). Überprüfen lässt sich das mit dem Terminal. Das Programm überträgt permanent den gemessenen Wert an den PC.\nBei einer Lichtmessung müssen Sie beachten, dass die Intensität des Lichtes nicht linear empfunden wird. Liegt Ihr Arbeitsplatz gerade in der Sonne, wird ein sehr niedriger Wert angezeigt. Arbeiten Sie nachts, ist der Wert vermutlich sehr hoch und die LED leuchtet hell. Unser Auge stellt sich auf verschiedene Helligkeiten ein und deswegen täuschen wir uns leicht in der tatsächlichen Helligkeit. Dabei ist der Unterschied zwischen einem nachts gut beleuchteten Arbeitsplatz (Ca. 1000 Lux) und direkter Sonneinstrahlung (bis zu 100.000 Lux) enorm.\nDer Quelltext:\nint led = 9; //Ab nun bedeutet led = 9\nint LDR = A0; //Ab nun bedeutet LDR = 0\nbyte helligkeit = 0; //Zustandsvariable der Helligkeit\nvoid setup() {\npinMode (led, OUTPUT); //Pin0 als Ausgang definieren\nSerial.begin (9600); //Serielle Schnittstelle initialisieren\n}\nvoid loop() {\nhelligkeit = analogRead(LDR); //Messen\nSerial.println(helligkeit); //Messergebnis an PC senden\nanalogWrite(led, helligkeit/4); //angepasste Helligkeit an LED ausgeben\ndelay(10); //Wartezeit\n}\nUm einen analogen Eingang zu messen benutzt man den Befehl aus Zeile 11: analogRead();. In Klammern steht der zu messende analoge Kanal (hier A0, zu unterscheiden vom digitalen Eingang/Ausgang 0).\nDer gemessene Wert wird in die Varible helligkeit geschrieben und am den PC gesendet. Anschließend muss der Wert vor der PWM-Ausgabe an der LED durch 4 geteilt werden, damit aus einem 10-bit-Wert ein 8-bit-Wert wird (1023/4 =255, gerechnet in Ganzzahlen).\nEine alternative um den Sensorbereich an einen Ausgabebereich anzupassen bietet der map Befehl. Z.B. könnte man Zeile 13 auch wie folgt schreiben:\nhelligkeit = map(analogRead(LDR), 0, 1023, 0, 255);\nIm Grund passiert in beiden Verfahren das gleiche aber wenn Sie später mal andere Sensoren benutzen wollen die einen ganz anderen Messebereich haben können Sie sich mit diesem Befehl eine Menge Rechnerei ersparen.\nIn Zeile 14 steht erneut ein Wartebefehl. Dieser ist nötig, damit das Programm den PC nicht unter Dauerfeuer mit Informationen überlastet. Der Serielle Monitor und das Programm würden abstürzen\n","permalink":"https://fkainka.de/schnellstart-mit-dem-nanoesp-teil2/","summary":"\u003cp\u003e\u003cem\u003eIn diesem Artikel finden Sie Auszüge aus einem meiner ersten Bücher „Schnellstart mit dem Arduino Micro“. Ich habe den Text etwas für das NanoESP-Board angepasst. Screenshots etc. können aber immer noch Text für einen anderen Arduino enthalten. Gedacht ist dieser Artikel vor allem für diejenigen, die sich für das NanoESP-Board (Pretzelboard) interessieren, aber noch nie mit Arduino gearbeitet haben.\u003c/em\u003e\u003c/p\u003e\n\u003ch1 id=\"vorbereitung\"\u003eVorbereitung\u003c/h1\u003e\n\u003cp\u003eNach dem theoretischen Einstieg in die Arduino-Welt ist es nun an der Zeit, sich mit den praktischen Grundlagen zu beschäftigen. Als ersten Schritt sollte man sich ein praktikables System für die Hardwareaufbauten aneignen. Für den NanoESP bietet sich ein mittleres bis großes Steckboard an.\u003c/p\u003e","title":"Schnellstart mit dem NanoESP - Teil2"},{"content":"In diesem Artikel finden Sie Auszüge aus einem meiner ersten Bücher \u0026ldquo;Schnellstart mit dem Arduino Uno\u0026rdquo;. Ich habe den Text etwas für das NanoESP-Board angepasst. Screenshots etc. können aber immer noch Text für einen anderen Arduino enthalten. Gedacht ist dieser Artikel vor allem für diejenigen, die sich für das NanoESP-Board (Pretzelboard) interessieren, aber noch nie mit Arduino gearbeitet haben.\nTeil 1: Schnellstart Schnellstart Ich schätze es juckt Ihnen schon seit dem Öffnen des Paketes in den Fingern, ein Programm auf Ihrem Arduino auszuprobieren. Deshalb gibt es hier noch vor anderen wichtigen Informationen eine Schnellstartanleitung und ein paar Beispiele.\nSollten Sie allerdings auf Probleme stoßen, finden Sie später noch eine ausführlichere Anleitung für die Installation. Aber mit etwas Vorerfahrung reichen die folgenden Schritte für den ersten Erfolg.\nAktuelle Software von http://www.arduino.cc/en/Main/software laden und installieren Treiber herunterladen und installieren (iot.fkainka.de/driver) Controller anschließen (microUSB-Kabel) Arduino-Programmierumgebung starten Unter Tools \u0026gt; Board die verwendete Hardware (Arduino Nano) auswählen Unter Tools \u0026gt; Serieller Port den entsprechenden COM-Port wählen Unter Datei \u0026gt; Beispiele \u0026gt; 01.Basics \u0026gt; Blink Beispiel laden Den Upload-Button klicken Auf die Meldung „Upload abgeschlossen“ warten Die LED „D3“ auf dem Board blinkt – Fertig! Die Umgebung nach erfolgreichem Upload Herzlichen Glückwunsch! Auf Ihren Arduino läuft nun ein funktionsfähiges Programm.\nDrei weitere Beispiele Für die folgenden drei Beispiele brauchen Sie keine zusätzliche Hardware, nur ein kleines Stück Verbindungsdraht. Sie bekommen anhand der Beispiele einen ersten Eindruck von den Möglichkeiten des Arduino-Controllers. Die Beispiele sind in die Arduino-Software integriert und werden nur minimal variiert. Dadurch können nicht viele Fehler passieren und Sie sammeln erste Erfahrungen. Falls doch etwas schief geht finden Sie Hilfe auf den letzten Seiten dieses Handbuches.\n1. Button Das nächste Beispiel finden Sie unter\nDatei \u0026gt; Beispiele \u0026gt; 02.Digital \u0026gt; DigitalInputPullup.\nHier wird demonstriert, wie Sie mit einem Schalter eine LED schalten können, ohne externe Pullup-Widerstände zu benötigen.\nDas Button Programm Nach einem erfolgreichen Upload können Sie mit einer Drahtbrücke eine Verbindung vom digital Pin D2 (nicht A2) zu einem GND-Pin herstellen. Sie sehen, dass die LED leuchtet. Wenn Sie die Verbindung trennen, geht die LED wieder aus. Zusätzlich sendet das Programm den aktuellen Button-Status an den Serial Monitor (auch Terminal genannt), den Sie mit dem Symbol oben rechts starten können. Immer wenn Sie die Drahtverbindung herstellen wird eine 0 gesendet, ansonsten eine 1.\n2. Spannung messen Das folgende Beispiel finden Sie unter\nDatei \u0026gt; Beispiele \u0026gt; 01.Basics \u0026gt; ReadAnalogVoltage.\nIn diesem Sketch wird eine analoge Spannung gemessen und das Ergebnis an das Terminal gesendet.\nAnaloge Werte im Serial Monitor Nach dem Upload können Sie im Serial Monitor eine Menge Werte sehen, die aber relativ wild hin und her flackern. Diese Änderungen liegen daran, dass der Port offen ist und alle möglichen uns umgebenden Störfelder erfasst. Sie können aber eine Drahtverbindung vom analogen Pin A0 zu einem GND-Pin herstellen. Nun wird 0.00 angezeigt, also 0 Volt. Wenn Sie das Drahtende statt in den GND-Pins in den 5-V-Pin stecken, werden Sie 5.00 lesen können. Das ist das Maximum, das der Controller mit der gegenwärtigen Einstellung messen kann. Sie können auch mal probieren was passiert, wenn Sie anstelle des 5-V-Pins den 3,3-V-Pin benutzen.\n3. Blinkfrequenz steuern Im folgenden Programm wird wieder eine Spannung gemessen. Der Controller wertet das Ergebnis diesmal aber selbständig aus und berechnet die Blinkfrequenz der L-LED. Laden Sie das Beispiel\nDatei \u0026gt; Beispiele \u0026gt; 03.Analog \u0026gt; AnalogInput\nin Ihren Controller.\nDas AnalogInput Programm Wenn Sie noch eine Drahtbrücke vom A0 zum 5-V-Pin stecken haben, blinkt die LED ca. einmal pro Sekunde. Wenn Sie den 3.3-V-Pin benutzen, blinkt die LED deutlich schneller. Bei offenem Pin ändert sich die Blinkfrequenz ständig und unregelmäßig und beim GND-Pin bleibt die LED vollständig aus. Der Controller im Hintergrund hat aus der gemessenen Spannung eine Zeit berechnet nach der sich der Zustand der LED jedes Mal wechselt. Mit einem Lichtsensor könnte man so z.B. eine automatisierte Steuerung von Warnsignalen programmieren, aber dazu später mehr.\nTeil 2: Hintergrundwissen Einleitung Arduino ist ein Schlagwort, an dem man in der Mikrocontroller-Welt nicht mehr vorbei kommt. Aber was steckt eigentlich hinter diesem Namen?\nGeschaffen wurde die Arduino-Plattform vor allem für Künstler, Designer und Bastler. Die Mischung aus leicht verständlicher Software und einer unkomplizierten Hardware macht den Einstieg besonders einfach. Was aber macht Arduino gegenüber anderen Entwicklungsplattformen mit ähnlichen Ansprüchen so besonders? Dazu folgendes:\nDie Software ist nicht nur einfach und übersichtlich, sie ist auch auf allen gängigen Betriebssystemen nutzbar (Windows, OSX, Linux). Das komplexere AVR-C wurde zu einem etwas übersichtlicheren Arduino-C vereinfacht. Dennoch kann C-Code direkt in ein Programm eingefügt werden, sodass erfahrenere Programmierer auf keine Funktionen verzichten müssen. Zudem können Sie auch C-Libraries einbinden. Diese werden in der großen Arduino-Community offen verbreitet und machen komplizierte Prozeduren für jedermann zugänglich.\nDieses modulare Konzept wurde auch in der Hardware konsequent weitergeführt. Nicht nur, dass Programmer und Controller auf eine Platine integriert wurden, das Board lässt sich zu zusätzlich noch mit sogenannten Shields um elementare Funktionen erweitern. Egal ob man sein System vom Internet aus zugänglich machen möchte oder eine eigene Funkkommunikation zwischen verschiedenen Controllern aufbauen möchte, ein vorgefertigtes Shield steht schon bereit und erspart das Planen einer eigenen Hardwareerweiterung. Natürlich ist es trotzdem noch möglich, schnell mit einem Steckboard ein paar Versuche zusammen zu stecken oder sogar sein eigenes Shield zu bauen.\nEin weiterer großer Pluspunkt: Die gesamte Soft- und Hardware ist Open-Source. Das bedeutet jeder kann die vorliegenden Beispiele, Programme und Tools frei nutzen. Und jeder darf seine eigene Library oder Hardware entwickeln und dennoch den Arduino-Bootloader und die Software benutzen.\nAlles in allem bietet Arduino die ideale Plattform um Ihrer Kreativität freien Lauf zu lassen.\nDie Software Installieren und Verbinden Unter Windows ist die Software-Installation ist im Grunde ganz einfach. Die aktuelle Version findet Sie immer unter: http://www.arduino.cc/en/Main/software. Es handelt sich dabei um eine einfache Installationsdatei. Das Programm zu starten würde jetzt noch nicht viel bringen, denn Sie müssen erst den Treiber des Boards installieren.\nWenn Sie das Board per USB mit dem Rechner verbinden, versucht der PC in der Regel, den Treiber selbst zu finden und zu installieren. Das wird in den meisten Fällen aber zu keinem Ergebnis führen. Sie müssen zunächst einmal den Treiber von der Webseite www.iot.fkainka.de/driver herunterladen, und installieren. Im Gerätemanager Gerätemanager (Start \u0026gt; Systemsteuerung \u0026gt; System \u0026gt; Gerätemanager) können Sie dann die aktuelle COM-Schnittstelle des Boards finden. Diese sollten Sie sich für später merken.\nDer Gerätemanager Nach der erfolgreichen Treiber-Installation können Sie nun die Arduino-Software starten und anschließend eine Verbindung zu Ihrem Board herstellen. Das geht ganz einfach indem Sie Tools \u0026gt; Board \u0026gt; Arduino Nano auswählen und anschließend unter Tools \u0026gt; Serieller Port den bei der Installation vergebenen Port auswählen. Es werden automatisch mögliche COM-Schnittstellen angezeigt.\nDie möglichen COM-Schnittstellen Ob der Verbindungsaufbau erfolgreich war, sehen Sie erst, wenn Sie Ihr erstes Programm übertragen. Deswegen laden Sie einfach durch Klick auf Datei \u0026gt; Beispiele \u0026gt; 01.Basics \u0026gt; Blink ein Beispiel und übertragen es anschließend mit dem Upload-Button in der Symbolleiste. Das Programm wird nun kompiliert und anschließend auf den Controller geladen. Sie sollten die RX-LED auf Ihrem Controller während des Upload-Vorgangs unregelmäßig blinken sehen. War der Vorgang erfolgreich, erscheint nach kurzer Wartezeit die Meldung „Upload abgeschlossen“. Das bedeutet der Verbindungsaufbau war erfolgreich. Außerdem können Sie die D3-LED im Sekundentakt blinken sehen.\nDie Umgebung nach erfolgreichem Upload Die Programmierumgebung Nach einer erfolgreichen Installation können Sie die Arduino-Programmierumgebung starten. Sie sehen einen Bildschirm der unabhängig vom Betriebssystem in etwa dem untern Bild entspricht. Die mit Zahlen markierten Bereiche werde Ich hier kurz erläutern.\nDie Programmierumgebung Quelltext: Hier wird später Ihr Programm (Sketch) stehen Symbolleiste: Hier finden Sie die wichtigsten Funktionen für den Schnellzugriff. Von links nach rechts finden Sie dort: Überprüfen (durchsucht das Programm nach Fehlern), Upload (Programm auf Controller übertragen), Neu, Öffnen, Speichern und rechts den „Serial Monitor“ (Terminalprogramm). Menü: In dieser Zeile finden Sie erweiterte Funktionen. Die Arduino-Entwickler haben kleine Tools eingebaut, die den Einstieg erleichtern und Programme übersichtlicher gestalten. Entsprechende Tastenkombinationen für den Schnellzugriff stehen direkt hinter den Menüeinträgen. Einige besondere Funktionen sind es wert, genauer unter die Lupe genommen zu werden: Datei Beispiele: Hier finden Sie einen großen Stapel von sortierten Beispielen für Einstiger und Fortgeschrittene. Upload mit Programmer: Hierbei handelt es sich um eine Sonderfunktion für externe Programmiergeräte (z.B. STK500). Bearbeiten Für Forum kopieren: Das Programm wird in ein für Arduino-Foren geeignetes Format umgewandelt und in die Zwischenablage kopiert. Farben und Formate bleiben erhalten und die Darstellung übersichtlich. Als HTML kopieren: Das Programm wird in HTML-Quelltext umgewandelt und in die Zwischenablage kopiert. Dadurch hat man es einfacher den Quelltext auf Webseiten zu veröffentlichen. Kommentieren: Möchte man einen ganzen Bereich auskommentieren hilft diese Funktion weiter. Vor allen markierten Zeilen wird // eingefügt, sodass diese beim Kompilieren nicht interpretiert werden. Einrücken/Ausrücken: Um die Übersichtlichkeit zu behalten ist es üblich, zusammenhängende Bereiche einzurücken. Mit dieser Funktion müssen Sie nicht jede Zeile einzeln bearbeiten.\nSketch\nSketchordner anzeigen: Öffnet den Ordner, in den Sie ihr Programm (Sketch) gespeichert haben. Datei hinzufügen: Hier können Sie externe Ressource Ihrem Programm hinzufügen. Library importieren: In diesem Untermenü können Sie im entsprechenden Ordner gespeicherte Libraries zu Ihrem Programm hinzufügen. Tools Automatisch formatieren: Schafft mit einem Klick ein übersichtlicheres Programm. Sketch archivieren: Hier können Sie Ihr Programm und alle zusätzlichen Ressourcen in eine Zip-Datei speichern. Kodierung reparieren und neu laden: Lädt den zuletzt gespeicherten Stand neu Programmer: Hier können Sie Ihren externen Programmer wählen, falls Sie einen benutzen.\nBootloader installieren: Mit einem externen Programmer und dieser Funktion können Sie den Arduino Bootloader auf einen anderen Controller überspielen.\nSketch-Leiste: In dieser Leiste finden Sie Ihre sogenannten Sketches (Ihre Programme). In einem Untermenü auf der rechten Seite finden Sie weitere Funktionen.\nDebug-Fenster: Dieser Bereich zeigt Ihnen Informationen und Fehlermeldungen an.\nInformations-Zeile: In dieser Leiste finden Sie Informationen zu dem aktuell gewählten Controller und COM-Port. Die Zahl links gibt an, in welcher Zeile sich der Cursors gerade befindet.\nGrundstruktur eines Programms Ihre erste Verbindung war erfolgreich, dann ist es nun an der Zeit, sich mit den Grundstrukturen eines Arduino-Programms zu beschäftigen. Sie sollten zur Veranschaulichung das Beispiel Datei \u0026gt; Beispiele \u0026gt; 01.Basics \u0026gt; BareMinimum laden. Es erscheint folgender Quelltext:\nvoid setup() {\n// put your setup code here, to run once:\n}\nvoid loop() {\n// put your main code here, to run repeatedly:\n}\nBei diesen Zeilen handelt es sich um die Programmteile, die mindestens vorhanden sein müssen, damit sich der Text ein Arduino-Programm nennen darf. Die Grundstruktur bestehen aus zwei Prozeduren: setup und loop.\nSetup*:* In diese Prozedur gehören alle Voreinstellungen des Programms. Hier werden beispielsweise Ports konfiguriert oder serielle Schnittstellen initialisiert.\nLoop*:* Hierbei handelt es sich um die Hauptprozedur. Alles was zwischen diesen eckigen Klammern steht wird Schritt für Schritt ausgeführt. Ist das Ende der Prozedur erreicht beginnt sie von vorne. Daher auch der Name loop (Schleife).\nAlles was sonst noch an Text und Zeichen dort steht gehört zu der Syntax der Programmiersprache. Unter Syntax versteht man quasi die Grammatik, die festlegt, wie etwas geschrieben werden muss, damit es in ausführbaren Code übersetzt werden kann. Ein Ausschnitt aus der Syntax-Beschreibung klärt über die hier vorkommenden Schreibweisen auf:\nDurch geschweifte Klammern {} werden zusammengehörige Programmteile, wie z.B. Prozeduren, Schleifen oder IF-Anweisungen gegenüber anderen Teilen abgegrenzt. void (deutsch: leer) steht vor Funktionen, die keinen Wert zurückgeben (Prozeduren genannt). Gibt eine Funktion einen Wert zurück, muss der Typ des Wertes angegeben werden (z.B. int berechnen() {}) zwischen den runden Klammern einer Prozedur/Funktion können Sie Parameter angeben, die der Prozedur übergeben werden müssen (z.b. void berechnen (int zahl1) {} ). Texte die hinter // stehen sind Kommentare und haben keinen Einfluss auf den Programmablauf. Die Grundstruktur eines Programms wäre damit geklärt. Besonders praktisch an diesem Beispiel: Sie können es immer öffnen und unter einem anderen Namen speichern, wenn Sie ein neues Projekt beginnen wollen.\n","permalink":"https://fkainka.de/schnellstart-mit-dem-nanoesp-fuer-arduino-neulinge/","summary":"\u003cp\u003e\u003cem\u003eIn diesem Artikel finden Sie Auszüge aus einem meiner ersten Bücher \u0026ldquo;Schnellstart mit dem Arduino Uno\u0026rdquo;. Ich habe den Text etwas für das NanoESP-Board angepasst. Screenshots etc. können aber immer noch Text für einen anderen Arduino enthalten. Gedacht ist dieser Artikel vor allem für diejenigen, die sich für das NanoESP-Board (Pretzelboard) interessieren, aber noch nie mit Arduino gearbeitet haben.\u003c/em\u003e\u003c/p\u003e\n\u003ch1 id=\"teil-1-schnellstart\"\u003eTeil 1: Schnellstart\u003c/h1\u003e\n\u003ch2 id=\"schnellstart\"\u003eSchnellstart\u003c/h2\u003e\n\u003cp\u003eIch schätze es juckt Ihnen schon seit dem Öffnen des Paketes in den Fingern, ein Programm auf Ihrem Arduino auszuprobieren. Deshalb gibt es hier noch vor anderen wichtigen Informationen eine Schnellstartanleitung und ein paar Beispiele.\u003c/p\u003e","title":"Schnellstart mit dem NanoESP für Arduino Neulinge"},{"content":"Zur Liste mit allen Beiträgen Entwickeln Sie ein eigenes Projekt mit den Bauteilen aus den Elektronik-Kalender 2015 und dem Internet of Things Kalender in Verbindung mit dem NanoESP-Board (im IoT-Kalender enthalten) und nehmen Sie am Wettbewerb teil! Falls Sie den Kalender nicht haben, können Sie trotzdem teilnehmen, denn die Bauteile sind leicht zu besorgen. Der NanoESP wird ab Anfang Dezember ebenfalls im Einzelverkauf erhältlich sein. Der Aufbau kann gesteckt oder gelötet sein, ganz egal wie. Einsendeschluss ist der 31.01.2016. Aber Sie können jetzt schon loslegen und Ihren Beitrag einsenden oder selbst auf Instructables.com veröffentlichen.\nWenn Sie den Beitrag per Mail senden, wird er zeitnah entweder im Elektronik-Labor oder in der Elektronik Dachbude veröffentlicht, je nachdem ob der Schwerpunkt eher in der Elektronik oder in der Software liegt. Sie können also jederzeit sehen, was andere schon entwickelt haben. Das soll den Wettbewerb richtig in Fahrt bringen, denn vielleicht sagen Sie dann, das kann ich besser! Umgekehrt können Sie sehen, wenn jemand schon genau die gleiche Idee hatte.\nDie Teilnahmebedingungen\nVerwenden Sie das NanoESP-Board und maximal die Bauteile aus dem IoT-Kalender und dem Elektronik-Kalender 2015. Zur Einsendung gehören mindestens ein Schaltbild, ein Programm, ein Foto und ein beschreibender Text. Das Projekt soll sich von den Projekten aus den Kalendern unterscheiden. Jeder Teilnehmer kann bis zu zwei Beiträge einsenden. Einsendungsschluss ist der 31.01.2016. Sie können den Beitrag über folgende Wege einreichen: über ein eigenes Projekt, das auf Instructables.com eingestellt wird und mindestens die Tags NanoESP und CC15 enthält (Sprache kann deutsch sein) Per Mail mit allen Projektdateien an fk@fkainka.de Per Mail mit allen Projektdateien an kainka@elektronik-labor.de Bauteile im IoT-Kalender\nNanoESP Kabel/Verbindungdraht Steckboard SYB-46 LED (weiß) RGB-LED 4 Widerstände 1 kOhm 10 kOhm Widerstand 2 Taster 1 Poti (10 kOhm) 1 IR-Sende-Diode IR-Empfangs-Modul (36 kHz) Batterieclip (9V - Block) Fototransitor Piezo Temperatursensor (NTC 10 kOhm) Bauteile im Elektronik-Kalender 2015\nBatterieclip Mini-Steckboard Widerstände 1 k, 4,7 k, 10 k, 47 k, 100k, 1M Neigungssensor 3 NPN-Transistor3n BC547C 2 Keramische Scheibenkondensatoren 100 nF Elko 22 µF LED rot LED Gelb LED grün mit internem Vorwiderstand 1kΩ Die Bewertungskriterien\nKreativität des Projekts Qualität der Umsetzung Qualität der Dokumentation Preise\nDie Preise des diesjährigen Wettbewerbs werden vom Franzis-Verlag zur Verfügung gestellt. Die drei ersten Gewinner dürfen sich Bücher, Bausätze oder Lernpakte im Wert von 100 Euro (1. Platz), 50 Euro (2. Platz) und 25 Euro (3. Platz) im ELO-Shop aussuchen. Unter allen Teilnehmern verlosen wir außerdem ein NanoESP - Developer Edition in schwarz.\n","permalink":"https://fkainka.de/der-kalender-wettbewerb-2015-sensoren-im-internet-of-things/","summary":"\u003ch4 id=\"zur-liste-mit-allen-beiträgen\"\u003e\u003ca href=\"/alle-beitraege-zum-adventskalender-wettbewerb-2015\"\u003eZur Liste mit allen Beiträgen\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eEntwickeln Sie ein eigenes Projekt mit den Bauteilen aus den \u003ca href=\"http://www.elektronik-labor.de/Lernpakete/Kalender15/Kalender15.html\"\u003eElektronik-Kalender 2015\u003c/a\u003e und dem \u003ca href=\"/der-conrad-adventskalender-internet-of-things/\"\u003eInternet of Things Kalender\u003c/a\u003e in Verbindung mit dem NanoESP-Board (im IoT-Kalender enthalten) und nehmen Sie am Wettbewerb teil! Falls Sie den Kalender nicht haben, können Sie trotzdem teilnehmen, denn die Bauteile sind leicht zu besorgen. Der NanoESP wird ab Anfang Dezember ebenfalls im Einzelverkauf erhältlich sein. Der Aufbau kann gesteckt oder gelötet sein, ganz egal wie. Einsendeschluss ist der 31.01.2016. Aber Sie können jetzt schon loslegen und Ihren Beitrag einsenden oder selbst auf \u003ca href=\"http://www.instructables.com/\"\u003eInstructables.com\u003c/a\u003e veröffentlichen.\u003c/p\u003e","title":"Der Kalender-Wettbewerb 2015: Sensoren im Internet Of Things"},{"content":"In den letzen Monaten war ich ziemlich eingespannt. Grund dafür war, dass Franzis am Anfang des Jahres zu mir gekommen ist mit dem Auftrag, einen Adventskalender mit dem Thema Internet of Things zu entwickeln. Eine spannende Aufgabe wie ich fand und habe mich gleich ans Werk gemacht. Heraus kam nicht nur ein Adventskalender, sondern auch ein Entwicklungsboard, dass ich NanoESP getauft habe (denn es besteht quasi aus einem Arduino Nano Replikat und einem ESP8266 WLAN Modul). Franzis verkauft ab Anfang Dezember das Board unter dem Namen Pretzelboard und Conrad wollte auch eine eigene Version, die den Namen C-Controll IoT WiFi Board trägt. Der Inhalt ist allerdings immer der selbe: eine WLAN fähiges, Arduino kompatibles Entwicklungsboard für einen moderaten Preis (Einzelverkaufspreis 29,95€).\nZum Zeitpunkt, an dem ich den Artikel schreibe, ist das Board allerdings nur im Adventskalender zu bekommen. Dieser enthält neben dem Board noch einige praktische Bauteile. Welche genau wird an dieser Stelle noch nicht verraten. Details zum Board kann man aber auf der eigens für das Thema Internet of Things und NanoESP erstellten Webseite\niot.fkainka.de\nsehen. Auf der Seite wird im Dezember außerdem jeden Tag ein neuer Versuch veröffentlicht, den man dann nachbauen und auch wer mag weiterentwickeln kann. Doch auch schon jetzt findet man viele interessante Informationen rund um das Board und auch Projekte, die man schon vorher testen kann. Eine Library zu dem Board gibt es mittlerweile ebenfalls als Download auf der iot.fkainke.de Homepage. Es lohnt sich also mal ein Blick zu riskieren.\n","permalink":"https://fkainka.de/der-conrad-adventskalender-internet-of-things/","summary":"\u003cp\u003eIn den letzen Monaten war ich ziemlich eingespannt. Grund dafür war, dass Franzis am Anfang des Jahres zu mir gekommen ist mit dem Auftrag, einen Adventskalender mit dem Thema Internet of Things zu entwickeln. Eine spannende Aufgabe wie ich fand und habe mich gleich ans Werk gemacht. Heraus kam nicht nur ein Adventskalender, sondern auch ein Entwicklungsboard, dass ich NanoESP getauft habe (denn es besteht quasi aus einem Arduino Nano Replikat und einem ESP8266 WLAN Modul). Franzis verkauft ab Anfang Dezember das Board unter dem Namen Pretzelboard und Conrad wollte auch eine eigene Version, die den Namen C-Controll IoT WiFi Board trägt. Der Inhalt ist allerdings immer der selbe: eine WLAN fähiges, Arduino kompatibles Entwicklungsboard für einen moderaten Preis (Einzelverkaufspreis 29,95€).\u003cbr\u003e\nZum Zeitpunkt, an dem ich den Artikel schreibe, ist das Board allerdings nur im Adventskalender zu bekommen. Dieser enthält neben dem Board noch einige praktische Bauteile. Welche genau wird an dieser Stelle noch nicht verraten. Details zum Board kann man aber auf der eigens für das Thema Internet of Things und NanoESP erstellten Webseite\u003c/p\u003e","title":"Der Conrad Adventskalender: Internet of Things"},{"content":"In Zusammenarbeit mit Thomas Baum ist ein spannendes und vielseitiges Lernpaket rund um das Thema Grafikdisplay programmieren entstanden. Hauptbestandteil des Pakets ist ein stromsparendes Display-Shield für Arduino Boards, auf dem sich zusätzlich noch zwei programmierbare Buttons befinden.\nAnhand von 20 praxisnahen Versuchen bekommt der Leser Schritt für Schritt die Grundlagen des Displayprogammierung vermittelt. Egal ob es um das einfach Darstellen von Text oder das Zeichnen von geometrischen Figuren geht, für jeden Anwendungsbereich gibt es ein praktisches Projekt. Egal ob handliches Oszilloskop für die schnelle Messung nebenbei oder grafische Statusmonitor eines SmartHomes, man bekommt immer gleich einen Eindruck für was das Gelernte gut sein könnte. Um das Paket abzurunden gibt es am Ende noch ein Spiel, nämlich das beliebte Flappy Birds. So kann man nach all dem neuen Wissen noch einmal richtig abschalten.\nMehr Informationen finden Sie auf der Homepage von Thomas Baum unter http://tiny.systems/categorie/lcdProjekt/ oder im Elo-Shop.\nAlle Projektdateien zum Download inklusive Library finden Sie hier Projekte:\nPixel auf dem Display darstellen Analoge Messergebnisse anzeigen Nutzung als Textdisplay Eigenen Zeichensatz erstellen ASCII-Zeichen darstellen Display über PuTTY beschreiben Messdaten übersichtlich ausgeben Nutzung als Grafikdisplay Eigenes Oszilloskop entwickeln Einfache Linien zeichnen Komplexe Grafiken darstellen Statusmonitor für SmartHome Analoge Uhr auf dem Display Geometrische Figuren zeichnen VuMeter umsetzen Kalender darstellen Navigationsmenü auf dem Display Programmierung über Turtle-Grafik Flappy Bird programmieren Im Paket nicht enthalten: Arduino™-Platine\n","permalink":"https://fkainka.de/grafikdisplays-programmieren/","summary":"\u003cp\u003eIn Zusammenarbeit mit \u003ca href=\"http://tiny.systems/\"\u003eThomas Baum\u003c/a\u003e ist ein spannendes und vielseitiges Lernpaket rund um das Thema Grafikdisplay programmieren entstanden. Hauptbestandteil des Pakets ist ein stromsparendes Display-Shield für Arduino Boards, auf dem sich zusätzlich noch zwei programmierbare Buttons befinden.\u003c/p\u003e\n\u003cp\u003eAnhand von 20 praxisnahen Versuchen bekommt der Leser Schritt für Schritt die Grundlagen des Displayprogammierung vermittelt. Egal ob es um das einfach Darstellen von Text oder das Zeichnen von geometrischen Figuren geht, für jeden Anwendungsbereich gibt es ein praktisches Projekt. Egal ob handliches Oszilloskop für die schnelle Messung nebenbei oder grafische Statusmonitor eines SmartHomes, man bekommt immer gleich einen Eindruck für was das Gelernte gut sein könnte. Um das Paket abzurunden gibt es am Ende noch ein Spiel, nämlich das beliebte Flappy Birds. So kann man nach all dem neuen Wissen noch einmal richtig abschalten.\u003c/p\u003e","title":"Grafikdisplays programmieren"},{"content":"Die Crossfade-Library von Radek Wierzbicki ist aus einem Arduino Artikel zum Thema Crossfade entstanden. Sie ermöglicht es unter anderem Farben zu definieren, und zwar nach dem Schema:\nRGBColor white = RGBColor(100, 100, 100);\nDie Werte werden in Prozent angegeben, das Maximum ist also 100.\nQuellen:\nCrossfade-Library\nAuf Github in Unterordner Libraries/RGB-LED\nDiese Farben können dann per Crossfade-Befehl oder per setColor-Befehl ausgegeben werden.\nFunktionen der Library:\nRGBLED(int redPin, int greenPin, int bluePin, int hold, int wait, int commonAnode); void crossfade(RGBColor \u0026amp;color); void setColor(RGBColor \u0026amp;color); void setIntensity(int intensity); void setCrossfadeWait(int wait); void setCrossfadeHold(int hold); In der Initialisierungsfunktion RGBLED werden in den ersten drei Parametern die einzelnen Pins angegeben, an denen die Farben liegen. Danach folgen die Festlegung der Standartwere für Hold und Wait. Zuletzt kann man noch festlegen ob die RGB-LED eine gemeinsame Anode (int = 1) oder Kathode (int = 0) hat. Dies ist wichtig, da bei einer gemeinsamen Anode die PWM-Werte umgekehrt werden müssen.\nMit Wait (gesetzt über setCrossfadeWait oder Standardwert) kann man die Länge eines Fadeübergangs einstellen. Diese Zeit ist ungefähr in Sekunden zu verstehen.\nMit Hold (setCrossfadeHold oder Standardwert) kann man eine Wartezeit nach einem Fadevorgang festlegen. In einem Programm mit mehren Fadevorgängen also nützlich, um die Farben eine weile Verweilen zu lassen.\nSowohl Wait als auch Hold verwenden Delays. Also sollte man vorsichtig bei zeitkritischen Vorgängen sein.\nMit setIntensity legt man die gesamte Helligkeit fest. Das Maximum ist 100. Die Änderungen der Helligkeit wird erst sichtbar, wenn ein neuer setColor oder crossfade Befehl ausgeführt wird.\n","permalink":"https://fkainka.de/rgb-crossfade-library/","summary":"\u003cp\u003eDie Crossfade-Library von Radek Wierzbicki ist aus einem Arduino Artikel zum Thema Crossfade entstanden. Sie ermöglicht es unter anderem Farben zu definieren, und zwar nach dem Schema:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRGBColor white = RGBColor(100, 100, 100);\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDie Werte werden in Prozent angegeben, das Maximum ist also 100.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQuellen:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.radekw.com/blog/2011/01/08/arduino-remote-rgb-light/\"\u003eCrossfade-Library\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/radekw/Arduino/tree/5f24ce7c8db9dfbb5252b59824c3217d851b3a3c\"\u003eAuf Github in Unterordner Libraries/RGB-LED\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDiese Farben können dann per Crossfade-Befehl oder per setColor-Befehl ausgegeben werden.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFunktionen der Library:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRGBLED(int redPin, int greenPin, int bluePin, int hold, int wait, int commonAnode);\u003c/li\u003e\n\u003cli\u003evoid crossfade(RGBColor \u0026amp;color);\u003c/li\u003e\n\u003cli\u003evoid setColor(RGBColor \u0026amp;color);\u003c/li\u003e\n\u003cli\u003evoid setIntensity(int intensity);\u003c/li\u003e\n\u003cli\u003evoid setCrossfadeWait(int wait);\u003c/li\u003e\n\u003cli\u003evoid setCrossfadeHold(int hold);\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn der Initialisierungsfunktion RGBLED werden in den \u003cstrong\u003eersten drei Parametern die einzelnen Pins\u003c/strong\u003e angegeben, an denen die Farben liegen. Danach folgen die Festlegung der \u003cstrong\u003eStandartwere für Hold und Wait\u003c/strong\u003e. Zuletzt kann man noch festlegen ob die RGB-LED eine \u003cstrong\u003egemeinsame Anode (int = 1)  oder Kathode (int = 0)\u003c/strong\u003e hat. Dies ist wichtig, da bei einer gemeinsamen Anode die PWM-Werte umgekehrt werden müssen.\u003c/p\u003e","title":"RGB Crossfade Library"},{"content":"In diesem Artikel möchte ich eine einfache Möglichkeit vorstellen sich eine eigene Smartphone Fernbedienung zusammenzustellen. Ich möchte gleich am Anfang darauf hinweisen, dass die App leider nicht kostenlos ist. Für Android Geräte kostet die App zu dem Zeitpunkt an dem der Artikel geschrieben wurde 4.99€. In Apples App-Store muss man sogar 10,99€ bezahlen. Dennoch denke ich, dass der Preis bei dem Service nicht völlig ungerechtfertigt ist.\nDie Webseite Das Designen einer eigenen Steueroberfläche geschieht einfach über die Internetseite:\nhttp://netio.davideickhoff.de/\nDiese Seite ist sogar mehr als nur ein reiner Editor. Die Nutzer bekommen ebenfalls die Möglichkeit, ihre eigenen Projekte vorzustellen und zu veröffentlichen. Dadurch können sich andere Nutzer sowohl inspirieren lassen als auch die Projekte anderer als Vorlage für eigene Entwicklungen verwenden.\nVerschiedene Nutzerprojekte Das System selbst eignet sich gleich für verschiedene Systeme, die sich über TCP-Befehle steuern lassen. So finden sich beispielsweise Projekte zum Steuern eines Raspberry Pis oder auch verschiedene Arduinos in der Liste der vorgestellten Projekte. Ich selbst beziehe mich bei der Vorstellung auf einen Arduino Yun - genauer gesagt auf das Projekt der Universall Fernbedieung. Die Oberfläche werde ich ebenfalls auf der NetIO Webseite veröffentlichen.\nErstellen einer eigenen Fernbedienung Um sich sein eigenes Design testweise zusammenzustellen muss man nicht einmal registriert sein. Möchte man das Projekt aber speichern ist es natürlich sinnvoll, sich auf der Seite zu registrieren. Möchte mann dann die Oberfläche auf sein Smartphone/Tablet übertragen, muss man sich zusätzlich die App kaufen. In der App selbst kann man sich dann mit seinen Logindaten anmelden und aus den erstellten Designs das richtige auswählen. Dies wird dann auf das Smartphone oder Tablet geladen und ist immer aktiv, wenn die App gestartet wird. Alle Einstellungen können jederzeit über die Webseite verändert und über den Sync-Button neu geladen werden.\nDer Editor selbst ist sehr übersichtlich gestallten. Es können verschiedene Buttons oder andere Steuerlemente zusammengeklickt und angeordnet werden.\nDie Oberfläche des Designeditors Unter Connections müssen die Einstellungen zur IP (lokal aber auch global) sowie das verwendete Protokoll eingestellt werden. Mein Universal-Fernbedieungsprojekt arbeitet mit dem HTTP-Protokoll und ist z.Z. nur lokal erreichbar.\nConnections Einstellungen Bei den Buttons muss dann noch der zu sendende Befehl eingeben werden.\nDie Einstellungen des Buttons In der App kann nun nach dem erfolgreichen Erstellen einer Oberfläche das Design mit den Einstellungen synchronisiert werden. Dazu müssen, wie bereits oben erwähnt, die Logindaten eingegeben werden. Die Oberfläche läd sich dann automatisch auf das Handy und kann verwendet werden.\nIn der App: Sync-Einstellungen Die Oberfläche in der App Durch die App hat die Universalfernbedienung nun endlich an zusätzlichen Komfort gewonnen.\n","permalink":"https://fkainka.de/remote-app-netio/","summary":"\u003cp\u003eIn diesem Artikel möchte ich eine einfache Möglichkeit vorstellen sich eine eigene Smartphone Fernbedienung zusammenzustellen. Ich möchte gleich am Anfang darauf hinweisen, dass die App leider nicht kostenlos ist. Für \u003ca href=\"https://play.google.com/store/apps/details?id=com.luvago.netio\"\u003eAndroid Geräte\u003c/a\u003e kostet die App zu dem Zeitpunkt an dem der Artikel geschrieben wurde 4.99€. In \u003ca href=\"https://itunes.apple.com/app/netio/id464924297?mt=8\"\u003eApples App-Store\u003c/a\u003e muss man sogar 10,99€ bezahlen. Dennoch denke ich, dass der Preis bei dem Service nicht völlig ungerechtfertigt ist.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/images/2015/04/Test53.jpeg\"\u003e\u003cimg class=\"size-medium wp-image-684\" src=\"/images/2015/04/Test53.jpeg\" alt=\"Die Webseite\" width=\"300\" height=\"281\" /\u003e\u003c/a\u003e\u003cfigcaption\u003eDie Webseite\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cp\u003eDas Designen einer eigenen Steueroberfläche geschieht einfach über die Internetseite:\u003c/p\u003e","title":"Remote App - NetIO"},{"content":"In diesem Projekt habe ich mich daran versucht, einen gängigen RGB-Controller mit leichten Veränderungen nachzuprogrammieren. Diese RGB-Controller werden meist beim Bestellen von RGB-Bändern mitgeliefert und sind über eine ebenfalls mitgelieferte IR-Fernbedienung steuerbar. Es gibt zwei gängige Varianten: 24-Taste und 44-Taste. In diesem Projekt habe ich eine 24-Tasten Fernbedienung verwendet.\nIn das Programm habe ich einige Veränderungen gegenüber den bekannten RGB-Controllern eingebaut. Zum einen erfolgt der Farbwechsel immer über ein Crossfade von ca. einer Sekunde. Außerdem ist die Startfarbe immer ein Gelbton, ebenfalls innerhalb von einer Sekunde gefaded, um die Augen an den Lichtwechsel zu gewöhnen. Die automatischen Programme sind ebenfalls angepasst. Sie lassen sich im Programm einfach anpassen. Dazu später mehr.\nDie Hardware Aufbau auf einer Steckboardplatine Im Folgenden werde ich die verwendete Hardware stichwortartig erläutern:\nController Arduino Nano nachbau (XTWduino Nano) Mindestens Arduino Uno kompatibel Steckt auf einem angepassten Board, geht aber auch auf einem Steckboard IR-Modul Das IR-Modul Typ: TSOP 31236 Reichelt LINK A3 = Daten-Pin A0 = GND, Low geschaltet A1 = 5V, High geschaltet RGB-Diode Die RGB-LED mit gemeinsamer Kathode gemeinsamte Kathode an D8, D8 Low geschaltet Anoden an PWM Kanälen D5, D6, D9 RGB-Shield Das LED-Treiber Shield Link zur Bauanleitung Link zur Beschreibung Zum Anschluss von RGB-Bändern verbunden mit PWM Kanälen D5, D6, D9 verbunden an PWM Kanal D10 (für PowerLED) Fernbedienung RGB-Controller Fernbedienung - 24 Tasten Die Software Das Programm benötigt zwei Libraries:\nIR-Library (meist Vorinstalliert, bei Error siehe Anpassungen im Link) Crossfade-Library Auf Github in Unterordner Libraries/RGB-LED Zu der IR-Library habe ich bereits einiges in dem verlinkten Artikel geschrieben. Eine wichtige Sache ist noch, dass die Library den Timer1 benutzt und auch resetet. Das wiederum bedeutet, das die ebenfalls an Timer1 hängenden PWM Kanäle D3 und D11 nicht verwendet werden können. Dies musste ich leidlich feststellen und mein Board anpassen. Der Timer ließe sich zur not auch auf Timer2 umstellen. Mehr dazu im verlinkten Artikel.\nDie Crossfade-Library ist aus einem Arduino Artikel zum Thema Crossfade entstanden. Sie ermöglicht es unter anderem Farben zu definieren, und zwar nach dem Schema:\nRGBColor white = RGBColor(100, 100, 100);\nDie Werte werden in Prozent angegeben, das Maximum ist also 100.\nDiese Farben können dann per Crossfade-Befehl oder per setColor-Befehl ausgegeben werden.\nFunktionen der Library:\nRGBLED(int redPin, int greenPin, int bluePin, int hold, int wait, int commonAnode); void crossfade(RGBColor \u0026amp;color); void setColor(RGBColor \u0026amp;color); void setIntensity(int intensity); void setCrossfadeWait(int wait); void setCrossfadeHold(int hold); In der Initialisierungsfunktion RGBLED werden in den ersten drei Parametern die einzelnen Pins angegeben, an denen die Farben liegen. Danach folgen die Festlegung der Standartwere für Hold und Wait. Zuletzt kann man noch festlegen ob die RGB-LED eine gemeinsame Anode (int = 1) oder Kathode (int = 0) hat. Dies ist wichtig, da bei einer gemeinsamen Anode die PWM-Werte umgekehrt werden müssen.\nMit Wait (gesetzt über setCrossfadeWait oder Standardwert) kann man die Länge eines Fadeübergangs einstellen. Diese Zeit ist ungefähr in Sekunden zu verstehen.\nMit Hold (setCrossfadeHold oder Standardwert) kann man eine Wartezeit nach einem Fadevorgang festlegen. In einem Programm mit mehren Fadevorgängen also nützlich, um die Farben eine weile Verweilen zu lassen.\nSowohl Wait als auch Hold verwenden Delays. Also sollte man vorsichtig bei zeitkritischen Vorgängen sein.\nMit setIntensity legt man die gesamte Helligkeit fest. Das Maximum ist 100. Die Änderungen der Helligkeit wird erst sichtbar, wenn ein neuer setColor oder crossfade Befehl ausgeführt wird.\nMögliche Anpassungen im Programm Ich werde hier das Programm nicht im Detail analysieren, allerdings gebe ich hier ein paar Möglichkeiten an, das Programm nach persönlichen Wünschen anzupassen:\nIR-Codes anpassen: Vermutlich haben Sie eine andere Fernbedienung die Sie nutzen Möchten. Wenn die DEBUG-Defnition am Anfang 1 ist (Standardwert), werden verschiedene Meldungen über die serielle Schnittstelle an das Terminal übergeben. Unter anderem auch der Code eines empfangenen IR-Signals. Diesen Code können Sie dann einfach an die gewüschte Stelle der select Case-Abfrage in der sIRGet()-Routine einfügen.\nFarben ändern: Auf meiner verwendeten Fernbedienung sind verschiedene Töne zu den Grundfarben angegeben. Ich habe diese Töne in Arrays behandelt (z.B. toneRed[5]). Möchten Sie diese Töne anpassen müssen Sie die Farbe des entsprechenden Index verändern.\nEin Paar Farben sind ebenfalls als Fixwerte angegeben. Diese Farben lauten: black, white, red, green, blue, yellow.\nDie Startfarbe yellow ist in der Setup-Routine festgelegt.\nProgramme: Programme sind in Arrays von Farben angegeben. In diesem Programm gibt es vier Varianten (programmOne-programmFour). Die größe des Arrays sowieo die Farben in dem Array können leicht angepasst werden. Zusätzliche Parameter für die Programme sind (am Beispiel programmThree):\nFadedauer: programmThreeWait = 30; //Speed of Programm (in ca. Seconds) Holddauer: programmThreeHold = 0; //Hold after Steps Wiederholung: programmThreeRepeat = false; und stehen jeweils unter dem Programmarray.\nDownload des Arduino Programms Ein Problem gibt es mit dem Programm. Wenn ein Programm gestartet wurde, lässt es sich aufgrund der delays nicht direkt unterbrechen. Das bedeutet, dass ein Fadevorgang, also ein Schritt eines Programms, erst durchlaufen werden muss, bevor der Programmdurchlauf unterbrochen werden kann. Die Dauer die gewartet werden muss hängt also vor allem von den Variablen Hold und Wait des Programms ab.\n","permalink":"https://fkainka.de/arduino-ir-rgb-controller/","summary":"\u003cp\u003eIn diesem Projekt habe ich mich daran versucht, einen gängigen RGB-Controller mit leichten Veränderungen nachzuprogrammieren. Diese RGB-Controller werden meist beim Bestellen von RGB-Bändern mitgeliefert und sind über eine ebenfalls mitgelieferte IR-Fernbedienung steuerbar. Es gibt zwei gängige Varianten: 24-Taste und 44-Taste. In diesem Projekt habe ich eine \u003cstrong\u003e24-Tasten\u003c/strong\u003e Fernbedienung verwendet.\u003c/p\u003e\n\u003cp\u003eIn das Programm habe ich einige Veränderungen gegenüber den bekannten RGB-Controllern eingebaut. Zum einen erfolgt der Farbwechsel immer über ein Crossfade von ca. einer Sekunde. Außerdem ist die Startfarbe immer ein Gelbton, ebenfalls innerhalb von einer Sekunde gefaded, um die Augen an den Lichtwechsel zu gewöhnen. Die automatischen Programme sind ebenfalls angepasst. Sie lassen sich im Programm einfach anpassen. Dazu später mehr.\u003c/p\u003e","title":"Arduino IR RGB Controller"},{"content":"Vor kurzem kam die Meldung bei verschiedenen Online-Magazinen, dass findige Entwickler nun eine eigene Arduino IDE mit integriertem Support für das WLAN-Modul ESP8266 entwickelt haben (Beitrag auf Electronic-Lab ; Link ESP8266.com ; Github mit Download). Es handelt sich hierbei um eine angepasste Arduino IDE, die man alternativ zur eigentlichen IDE installieren kann. Beim stöbern im Forum habe ich aber auch eine Möglichkeit entdeckt, bei der die notwendigen Dateien einfach in die bestehende Arduino Version (ab 1.6) eingebunden werden können\nESP8266.com Forum Beitrag\nGithub Link\nZusätzliche Infos\nDer Vorteil ist natürlich, dass man keine alternative IDE Version auf dem Rechner installieren muss. Die Dateien werden einfach in den Unterordner hardware im Arduino Sketchorder kopiert.Sollte noch kein hardware-Ordner im Sktechorder vorhanden sein, kann dieser manuell erstellt werden. Wo sich der Sketchorder befindet kann unter den Arudino Voreinstellungen (Datei -\u0026gt; Voreinstellungen oder Strg+Komma) nachgeschaut werden.\nSketchordner nachschauen Wichtig: Bei mir hat AntiVir beim Entpacken des Zipp-Ordners über die Datei esptool.exe gemeckert. Ich habe die Datei bei verschiedenen Online Vierenscannern upgeloaded und checken lassen. Bis auf Antivir hat kein weiterer Scanner einen Virus finden können. Deswegen bin ich davon ausgegangen, dass es sich um eine Fehlmeldung handelt und habe die Datei als Ausnahme in Antivir definiert.\nDie Struktur der Ordner sollte folgendermaßen aussehen:\n[Arduino Sketchordner]/hardware/arduino-esp8266-master/\u0026hellip;\nHaben Sie alle Dateien ordungsgemäß installiert, sollte beim Neustarten der Arduino Software unter Werkzeuge -\u0026gt; Platine der Punkt Generic ESP8266 aufgetaucht sein. Diesen sollten Sie auswählen. Außerdem müssen Sie unter Werkzeuge -\u0026gt; Programmer den Punkt esptool wählen, damit der Upload gelingen kann. Unter Datei-\u0026gt; Beispiele -\u0026gt; ESP8266Wifi -\u0026gt; WifiScan finden Sie außerdem ein Beispiel, dass bei mir auf Anhieb funktioniert hat. Bevor Sie dieses Beispiel allerdings uploaden können, müssen Sie noch einige Dinge auf der Hardwareseite beachten.\nESP8266 in der Arduino IDE Als Schnittstelle zwischen PC und ESP können Sie wie üblich einen USB-Serielwandler benutzen. Beachten Sie allerdings die 3,3-V-Pegel und den großen Strombedarf des Moduls (Infos Erste Schritte). Wichtig ist außerdem, dass Sie eine Verbindung zum Reset-Pin und zum GPIO0 Pin herstellen können. Um das Modul nämlich in den Programmmodus versetzen zu können, müssen Sie den GPIO0 Pin auf Masse legen und einen Reset ausführen (RST Pin kurz mit Masse verbinden). Erst dann kann der Upload beginnen.\nESP8266 mit Programmier Option Am einfachsten hat sich folgende Methode herausgestellt, bei der zwei Buttons jeweils für GPIO0 to GND und RST to GND zur Verfügung stehen:\nDrücken und halten Sie den GPIO0-Button Drücken Sie kurz den RST-Button Lassen Sie den GPIO0-Button los Starten Sie den Upload in der Arduino IDE warten Sie bis Hochladen\u0026hellip; erscheint Warten Sie bis eine Fortschrittsanzeige mit den Punkten durchläuft und die blaue LED nicht mehr schnell Blinkt. Sollte sofort die Meldung flush completeerscheinen hat es vermutlich nicht funktioniert, Der Upload dauert ein paar Sekunden Bei der Meldung error: espcomm_open failed müssen Sie den Vorgang ebenfalls erneut starten Wenn nach einiger Zeit die meldung flush complete erscheint hat das Uploaden vermutlich funktioniert. Drücken Sie ggf. kurz Reset Nun können Sie mit dem Serial Monitor sehen, wie die Wlan-Netzwerke der Umgebung gescannt und angezeigt werden. Sollte der Serial Monitor aber auch bei der richtigen Baudrate (steht im Programm) nur Kauderwelsch zeigen, starten Sie den Uploadvorgang erneut. Das Beispiel WifiScan zeigt alle Wlan-Netzwerke in der Umgebung Das Timing kann manchmal etwas schwierig sein. Ein wenig rumprobieren kann hilfreich sein.\nEbenfalls funktioniert haben bei mir das Beispiel WifiWebServer - hier muss man allerdings zunächst die Wlan Zugangsdaten eingeben.\nAchtung: der bekannte Modus mit den AT-Befehlen ist beim einspielen eines eigenen Programms nicht mehr möglich. Sie müssen dann erst wieder die richtige Firmware einspielen!\n","permalink":"https://fkainka.de/esp8266-in-der-arduino-ide/","summary":"\u003cp\u003eVor kurzem kam die Meldung bei verschiedenen Online-Magazinen, dass findige Entwickler nun eine eigene Arduino IDE mit integriertem Support für das WLAN-Modul ESP8266 entwickelt haben (\u003ca href=\"http://www.electronics-lab.com/blog/?p=33488\"\u003eBeitrag auf Electronic-Lab\u003c/a\u003e ; \u003ca href=\"http://www.esp8266.com/viewforum.php?f=25\"\u003eLink ESP8266.com\u003c/a\u003e ; \u003ca href=\"https://github.com/esp8266/arduino\"\u003eGithub mit Download)\u003c/a\u003e. Es handelt sich hierbei um eine angepasste Arduino IDE, die man alternativ zur eigentlichen IDE installieren kann. Beim stöbern im Forum habe ich aber auch eine Möglichkeit entdeckt, bei der die notwendigen Dateien einfach in die bestehende Arduino Version (ab 1.6) eingebunden werden können\u003c/p\u003e","title":"ESP8266 in der Arduino IDE"},{"content":"Das Ziel dieses Arduino Yun Projekt war es, eine Art übers WLAN steuerbare Universalfernbedienung für sowohl Infrarot als auch Funksignale zu realisieren. Dabei kommen einige bereits vorgestellte Bauteile und Libraries zum Einsatz.\nDieses Projekt ist eigentlich schon seid einiger Zeit fertig und im Einsatz, allerdings habe ich die Projektdateien nicht wiedergefunden. Nun sind sie aber wieder aufgetaucht und ich versuche mal alle Erkenntnisse zu rekonstruieren. Die Dokumentation ist deswegen allerdings nicht so ausführlich.\nDer Aufbau: Der Aufbau ist recht unkompliziert. Das Funkmodul ist in die analogen Pins A1-A3 gesteckt. Masse befindet sich im A1 Pin und VCC in A3. Beide Pins sind im Programm entsprechend geschaltet sodass die Stromversorgung gewärleistet ist.\nAufbau der Yun Universal Fernbedienung Bei den IR-Dioden war etwas mehr Arbeit nötig. Eine einzelne Dioden würde zwar auch Signale übertragen, da das Board aber entfernt von allen Geräten steht brauchte ich ein stärkeres Signal. Dies wird dadurch erzeugt, dass drei IR-Dioden direkt in Reihe geschaltet sind und mit 5 V ohne Vorwiderstand angesteuert werden. Im Dauerbetrieb würde der Strom die Dioden sicher killen, da die Impulse aber nur sehr kurz sind, ist dies verkraftbar, auch wenn die Lebensdauer der Dioden sicher dezimiert wird. Die rund 10 Monate die ich diese Konstellation in Betrieb habe gab es zumindest keine Ausfälle.\nIR Mini Shield (oben) IR Mini Shield (unten) Die IR Sendedioden sind nicht direkt am Steuerpin D13 angeschlossen, da die Arduino Pins maximal 20 mA liefern können. Deswegen steuert der Pin einen Leistungstransistor durch, der auch schon u.a. durch das RGB Treiber Modul bekannt ist. Dieser steuert dann die 5 V aus dem Spannungswandler durch. Diese Spannung kann über den ISP Stecker abgegriffen werden. Dadurch gewinnt das Minishield an Stabilität. Zwei Kontaktpins stecken zudem in Pins D2 und D3 und stabilisieren das Shield zusätzlich. Für die Schaltung sind sie aber unerheblich.\nSchematischer Aufbau des Minishields mit Fritzing IR Mini Shield (aufgesteckt) Das Programm: Das Programm basiert auf dem Bridge Beispiel (Beispiel -\u0026gt; Bridge -\u0026gt; Bridge). Es wird ein Server am Port 5555 gestartet an den dann Kommandos gesendet werden können. Diese Kommandos werden über ein Querstrich nach der IP des Yuns übermittelt. Nach einem zweiten Querstrich folgt dann meinst ein zweites Kommando in Form einer Zahl. So wird zunächst das anzusteuernde Gerät ermittelt und dann welcher Befehl gesendet werden soll. Als Beispiel:\n192.168.2.5/tv/5\nDamit das Beispiel funktionieren kann, müssen ebenfalls folgende Libraries installiert sein:\nArtikel: IR-Library(in neueren Arduino Versionen meist enthalten)\nDirekt: Funkmodul Library (Artikel: Funksteckdosen steuern)\nInsgesamt kann mit dem Programm folgende Geräte angesteuert werden: RGB-Controller (24 Tasten Fernbedienung Version)\nKommando: rgb24/\nIR-Codes in Hexformat // RGB 24-Taste\n//An, Aus, Heller, Dunkler\n//Rot 4-8\n//Grün 9-13\n//Blau 14-18\n//Weiß 19\n//Flash Strobe Fade Smooth 20-23\nlong RGB24[24] = {\n0xF7C03F, 0xF740BF, 0xF700FF, 0xF7807F,\n0xF720DF, 0xF710EF, 0xF730CF, 0xF708F7, 0xF728D7,\n0xF7A05F, 0xF7906F, 0xF7B04F, 0xF78877, 0xF7A857,\n0xF7609F, 0xF750AF, 0xF7708F, 0xF748B7, 0xF76897,\n0xF7E01F,\n0xF7D02F, 0xF7F00F, 0xF7C837, 0xF7E817\n}; RGB-Controller (44 Tasten Fernbedieung Version)\nKommando: rgb44/\nIR-Codes in Hexformat // RGB 44-Tasten\n//Power Play Heller Dunkler 0-3\n//Rot 4-8\n//Grün 9-13\n//Blau 14-18\n//Weiß 19-23\n//Quick Slow Auto Fade3 Fade7 24-28\n//Rot+ Rot- Grün+ Grün- Blau+ Blau-\nlong RGB44[44] = {\n0xFF02FD, 0xFF827D, 0xFF3AC5, 0xFFBA45,\n0xFF1AE5, 0xFF2AD5, 0xFF0AF5, 0xFF38C7, 0xFF18E7,\n0xFF9A65, 0xFFAA55, 0xFF8A75, 0xFFB847, 0xFF9867,\n0xFFA25D, 0xFF926D, 0xFFB24D, 0xFF7887, 0xFF58A7,\n0xFF22DD, 0xFF12ED, 0xFF32CD, 0xFFF807, 0xFFD827,\n0xFFE817, 0xFFC837, 0xFFF00F, 0xFF609F, 0xFFE01F,\n0xFF28D7, 0xFF08F7, 0xFFA857, 0xFF8877, 0xFF6897, 0xFF48B7\n}; LG TV\nKommando: tv/\nIR-Codes in Hexformat // LG TV\n//Power Laut+ Laut– Mute 0-3\n// CH+ CH– AV OK Back 4-8\n//Rechts Links Oben Unten 9-12\n// 1-5 13-17\n//6-0 18-22\nunsigned long TV[23] = {\n0x20DF10EF, 0x20DF40BF, 0x20DFC03F, 0x20DF906F,\n0x20DF00FF, 0x20DF807F, 0x20DFD02F, 0x20DF22DD, 0x20DFDA25,\n0x20DF609F, 0x20DFE01F, 0x20DF02FD, 0x20DF827D,\n0x20DF8877, 0x20DF48B7, 0x20DFC837, 0x20DF28D7, 0x20DFA857,\n0x20DF6897, 0x20DFE817, 0x20DF18E7, 0x20DF9867, 0x20DF08F7\n}; Internet Radio: IPdio mini\nKommando: radio/\nIR-Codes in Hexformat // Radio\n// Power Lauter Leiser 0-2\n//Ch1-4 3-7\n//Ch7-9 8-10\nlong RAD[11] = {\n0xFFB24D, 0xFF32CD, 0xFF12ED,\n0xFF08F7, 0xFFC03F, 0xFF807F, 0xFF906F,\n0xFF9867, 0xFFD827, 0xFF8877\n}; Funksteckdosen Typ ME\nKommando: funk/\nArtikel\nDie IR-Kommandos können aber natürlich mithilfe der IR-Library aus einer Fernbedienung ausgelesen und im Quelltext angepasst werden.\n","permalink":"https://fkainka.de/yun-projekt-universalfernbedienung/","summary":"\u003cp\u003eDas Ziel dieses Arduino Yun Projekt war es, eine Art übers WLAN steuerbare Universalfernbedienung für sowohl Infrarot als auch Funksignale zu realisieren. Dabei kommen einige bereits vorgestellte Bauteile und Libraries zum Einsatz.\u003c/p\u003e\n\u003cp\u003eDieses Projekt ist eigentlich schon seid einiger Zeit fertig und im Einsatz, allerdings habe ich die Projektdateien nicht wiedergefunden. Nun sind sie aber wieder aufgetaucht und ich versuche mal alle Erkenntnisse zu rekonstruieren. Die Dokumentation ist deswegen allerdings nicht so ausführlich.\u003c/p\u003e","title":"Yun Projekt Universalfernbedienung"},{"content":"In diesem Beitrag stelle ich auf der einen Seite eine Bauanleitung zum Nachbau des RGB Treiber Moduls vor und teste gleichzeitig ob sich eine Diashow zum Vorstellen der Schritte eignet.\nDie verwendeten Bauteile können mithilfe dieses öffentlichen Einkaufswagen auf Reichelt.de gefunden werden. Selbstverständlich können die Teile auch irgendwo anders gekauft werden. Die hier vorgestellte Liste dient allein zur Orientierung.\nEinkaufswagen RGB Treiber Modul\nSchritt 1: Platine zuschneiden Zunächst einmal sollte man sich ein passendes Platinenstück zuschneiden. Die Lochrasterplatine hat ein Rastermaß von 2,54 mm und ist einseitig mit Lötpunkten beschichtet. Die Dimensionen des mit einer Laubsäge rausgetrennten Stückes sind 6x10 Rasterpunkte.\nSchritt 2: Löthilfe vorbereiten Es hat einen großen Vorteil ein altes Steckboard als Löthilfe zu verwenden. Die Stiftkontakte können wie auf dem Bild zu sehen auf dem Steckboard angeordnet werden. Man sollte eine Zange verwenden und darauf achten, dass die Kontakte nicht zu weit im Steckboard verschwinden.\nSchritt 3: Platinenstück anlöten Als nächstes kann das Platinenstück wie auf dem Bild zu sehen angelötet werden.\nSchritt 4: Transistoren anlöten Nun kann bereits der erste Transistor angelötet werden. Man sollte noch nicht alle Kontaktbeinchen festlöten sondern den Gatekontakt (unten links) noch frei lassen. Die beiden Lötpunkte rechts dienen als Löthilfen für die nächsten Transistoren. Die Löstellen werden mit dem Lötkolben heiß gemacht und der Sourcekontakt (unten rechts) des Transistore einfach in die flüssige Lötstelle geschoben.\nSchritt 5: Transistoren anlöten Mit der Methode kann man nach und nach die Transistor anlöten. Auf dem Bild sind drei der vier Transistoren bestückt.\nSchritt 6: PowerLED Stecker anlöten Der letze Transistor ist leicht versetzt gegenüber den anderen angebracht. Der Sourcekontakt ist hier direkt mit dem rechten Stiftkontakt verbunden, über den auch später die gesamte Masseversorgung läuft. Ausserdem wurde der PowerLED Stecker auf dem Bild bereits oben rechts angelötet.\nSchritt 7: Masse und VCC Als nächstes kann die Versorgungsspannungsleitung VCC (in der Mitte) verlegt werden. Sie wird über ein Drahtrest, z.B. von einem Widerstandsbeinchen mit dem linken Kontakt der Power Led verbunden. Auf der rechten Seite des PowerLED-Anschlusses ist die Masse mit dem Massekontakt verbunden. Dies scheint für den Anschluss der PowerLED überflüssig aber ich gedenke den Anschluss auch für andere Dinge zu nutzen. Der Drain-Anschluss des rechten Transistors (oben, mitte) ist auf dem Bild bereits mit dem mittleren Kontakt des Anschlusses verbunden.\nSchritt 8: Kabel für RGB Band In diesem Schritt habe ich ein passendes Kabel nebst Stecker zum Verbinden von RGB Bänder gesucht. Fündig wurde ich bei einem alten PC Lüfter. Der Stecker ist Female und lässt sich über Steckeradapter auch mit Female Steckern verbinden.\nSchritt 9: Kabel anlöten Das Kabel kann angelötet werden. Bei RGB Bändern ist der gemeinsame Pol meist VCC und die äußerste Leitung. In diesem Fall ist es also das schwarze Kabel (Farbtechnisch etwas unglücklich da schwarz mit GND assoziert wird).\nSchritt 10: Widestände anlöten Im nächsten Schritt können die Widerstände angelötet werden. Es zahlt sich hier aus, dass der Gatekontakt der Transistore noch nicht angelötet war, denn so kann die untere Lötstelle wieder erhitzt und der Widestand eingeschoben werden. Erst dann wird der obere Kontakt des Widerstandes an den Transistor angelötet.\nSchritt 11: Widestände anlöten So geht man nun bei allen vier Transistoren vor. Sollte der Weg vom Widerstand bis zum entsprechenden Stiftkontakt zu weit sein kann man die Lücke durch großzügiges Verschwenden von Lötzinn (siehe Bild) oder durch Drahtreste überbrücken.\nSchritt 12: Masse verlegen Der letzte Schritt ist zugleich der Kniffligste. Es müsse noch alle Sourcekontakte der Transistoren mit Masse verbunden werden. Ich habe dafür Spulendraht benutzt. Dieser ist grundsätzlich isoliert. Mann kann die Isolierung aber durch erhitzen mit dem Lötkolben oder durch abreiben entfernen. Der leichteste Weg die mittleren Kontakte zu verbinden ist, den Draht zur nächsten Stelle zu verlegen und dann auf richtiger Distanz einzuknicken ohne ihn abzutrennen. Die eingeknickte Stelle kann man dann mit Lötkolben und Lötzinn bearbeiten bis etwas Lötzinn hängen bleibt. Dies ist meist das Zeichen, dass die Isolierung verdampft ist. Diese Knickstelle kann man dann an den Kontakt anlöten und zur nächsten Stellen vorgehen.\nSchritt 13: Testen und Fertig Bevor man nun des fette Netzteil rausholt und voll aufdreht sollte man noch einmal kurz mit einem Widerstandmesser überprüfen, ob alles stimmt. Beliebte Fehlerquellen sind unsaubere Verbindungen am Sourcekontakt oder Kurzschlüsse an den Transistoren. Wenn alles so weit zu Stimmen scheint kann’s losgehen.\n","permalink":"https://fkainka.de/bauanleitung-rgb-treiber-modul/","summary":"\u003cp\u003eIn diesem Beitrag stelle ich auf der einen Seite eine Bauanleitung zum Nachbau des RGB Treiber Moduls vor und teste gleichzeitig ob sich eine Diashow zum Vorstellen der Schritte eignet.\u003c/p\u003e\n\u003cp\u003eDie verwendeten Bauteile können mithilfe dieses öffentlichen Einkaufswagen auf Reichelt.de gefunden werden. Selbstverständlich können die Teile auch irgendwo anders gekauft werden. Die hier vorgestellte Liste dient allein zur Orientierung.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.reichelt.de/?ACTION=20;AWKID=1021687;PROVID=2084\"\u003eEinkaufswagen RGB Treiber Modul\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Schritt 1: Platine zuschneiden\" loading=\"lazy\" src=\"/images/2015/02/IMG_20150201_184324.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eSchritt 1: Platine zuschneiden Zunächst einmal sollte man sich ein passendes Platinenstück zuschneiden. Die Lochrasterplatine hat ein Rastermaß von 2,54 mm und ist einseitig mit Lötpunkten beschichtet. Die Dimensionen des mit einer Laubsäge rausgetrennten Stückes sind 6x10 Rasterpunkte.\u003c/p\u003e","title":"Bauanleitung RGB Treiber Modul"},{"content":"In der Vergangenheit habe ich mich schon des Öfteren mit dem Bau eines RGB Treiber Shields für Arduino oder andere Mikrocontroller versucht. Verschiedenste Versionen der Module sind bereits bei mir im Einsatz. Diese neue Variante soll nun verschiedenste Bedürfnisse auf einmal decken.\nRGB Treiber Modul von unten RGB Treiber Modul auf einem Steckboard (auf der rechten Seite VCC, nach links gelegt GND) Die erste Bedingung war die Kompatibilität zu gängigen Steckboards. Die Platine sollte möglichst leicht in das Board stecken lassen und sich genauso leicht wieder entfernen lassen. Das hat außerdem auch den Vorteil, dass ich später eines der Steckboard Platinen benutzen kann um eine dauerhafte Lösung zusammen zu löten.\nRGB Treiber Modul im Einsatz mit einem RGB Band Die nächste Bedingung ist natürlich der Kosten/Nutzen Faktor. Es gibt sehr viele verschiedene Leistungstreiber auf verschieden RGB-Shield´s für Arduino. Doch die verwendeten Leistungstransistoren sind meist relativ Teuer. Zudem sind die Bauteile recht groß und müssen eine menge Verlust-Wärme abführen. Deswegen habe ich mich wieder für die SMD Variante entschieden. Diese kleinen Transitoren im SMD Format eignen sich perfekt zum durchsteuern von z.B. RGB-Bändern. Das liegt daran, dass Sie beim Durchschalten nahezu keinen Innenwiderstand haben und deswegen auch kaum Leistung verloren und Wärme abgeführt werden muss. Die geringe Wärme die entstehen kann wird durch die großzügigen Lötstellen abgeführt. Ströme bis 4,2 A sind somit kein Problem. Als zusätzliche Schutzmaßname für den Controller habe ich noch jeweils einen 1kOhm Widerstand, ebenfalls in SMD Form, vor die Transistoren geschaltet. Rein von den benutzen Bauteilen liegen die Kosten für eine solche Platine im ein Euro Bereich während die Effizienz enorm ist.\nDer Aufbau selbst darf natürlich auch nicht zu kompliziert sein. Obwohl hier nur SMD-Bauteile verwendet wurde ließ sich die Platine überraschend leicht zusammen löten. Die Widerstände passen perfekt zwischen zwei Kontakte und die Transistoren lassen sich zwischen insgesamt vier Kontakten leicht platzieren. Also trotz SMD kein Hindernis.\nEine spezielle Anforderung hatte ich noch an das RGB Modul nämlich einen zusätzlichen Kanal für meine Power LEDs. Eine Mischung aus Stimmungslicht und Leselampe ist also realisierbar.\nIch habe auch überlegt das Modul von einer externen Herstellungsfirma in kleinen Stückzahlen produzieren zu lassen, um immer genug von den Modulen rumliegen zu haben. Ich habe die Kosten noch nicht durchgerechnet und überlegt ob sich das wirklich lohnen würde. Allerdings habe zum Spaß bereist eine Zeichnung in Target 3001! gemacht. Auf dem 3D-Bild kann man sich die Dimensionen des Moduls recht gut vorstellen.\nRGB Treiber Modul in Target 3001!\nZur Bauanleitung ","permalink":"https://fkainka.de/neues-rgb-treiber-modul/","summary":"\u003cp\u003eIn der Vergangenheit habe ich mich schon des Öfteren mit dem Bau eines \u003ca href=\"/power-led-mini-shield/\" title=\"RGB Strip Mini Shield\"\u003eRGB Treiber Shields für Arduino\u003c/a\u003e oder andere Mikrocontroller versucht. Verschiedenste Versionen der Module sind bereits bei mir im Einsatz. Diese neue Variante soll nun verschiedenste Bedürfnisse auf einmal decken.\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/images/2015/02/IMG_20150121_151138.jpg\"\u003e\u003cimg class=\"wp-image-518 size-medium\" src=\"/images/2015/02/IMG_20150121_151138.jpg\" alt=\"RGB Treiber Modul von unten\" width=\"300\" height=\"237\" data-id=\"518\" /\u003e\u003c/a\u003e\u003cfigcaption\u003eRGB Treiber Modul von unten\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cfigure\u003e\u003ca href=\"/images/2015/02/IMG_20150121_152938.jpg\"\u003e\u003cimg class=\"wp-image-519 size-medium\" src=\"/images/2015/02/IMG_20150121_152938.jpg\" alt=\"RGB Treiber Modul auf Steckboard\" width=\"220\" height=\"300\" data-id=\"519\" /\u003e\u003c/a\u003e\u003cfigcaption\u003eRGB Treiber Modul auf einem Steckboard (auf der rechten Seite VCC, nach links gelegt GND)\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cp\u003eDie erste Bedingung war die Kompatibilität zu gängigen Steckboards. Die Platine sollte möglichst leicht in das Board stecken lassen und sich genauso leicht wieder entfernen lassen. Das hat außerdem auch den Vorteil, dass ich später eines der \u003ca href=\"/die-neue-steckboardplatine-als-arduino-shield-2/\" title=\"Die neue Steckboardplatine als Arduino Shield\"\u003eSteckboard Platinen\u003c/a\u003e benutzen kann um eine dauerhafte Lösung zusammen zu löten.\u003c/p\u003e","title":"Neues RGB Treiber Modul"},{"content":"Oft ist es so, dass man plötzlich vergisst, wie man jetzt gerade in dieser Programmiersprache einen bestimmten Befehl formulieren muss. Deswegen steht hier eine Auflistung einiger wichtiger Bascom Befehle. Die Liste ist nicht vollständig aber wird von Zeit zu Zeit ergänzt.\nBenutzen Sie Stg+F um in der Seite nach etwas bestimmten zu suchen.\nBefehl Schreibweise Grundlegendes Variable Dimensionieren Dim vByte As Byte Dim Bt_recieve_text As String * 50 Sub Deklarieren Declare Sub Begin() Wartezeiten Waitms 500 Wait 1 Pin an Port = High Portb.1 = 1 Port = High Portb = 255 Abfragen/Schleifen If Abfragen If x=1 Then Elseif x=3 Then Else End If Select Case Select Case X Case 0: Case 1 To 9: Case Else: End Select Loop-Schleife Do Loop Until ok =1 For-Schleife For I = 1 To X Next I Kommunikation Com1 konfigurieren (Hardware, lesen und schreiben) Open \u0026ldquo;com1:\u0026rdquo; For Binary As #1 Serielle schreiben Print “Hallo” Spezielle Com konfigurieren (schreiben, Ch #3, Pind.3) Open \u0026ldquo;comd.3:9600,8,n,1\u0026rdquo; For Output As #3 Serielle #3 schreiben Print #3 , “Hallo” Serielle Spezial-Prozedur Config Serialin = Buffered , Size = 50 , Bytematch = 10Serial0charmatch() Input Bt_recieve_text Noecho End Sub RC5 Konfigurieren (Portb.1) Portb.1 = 1 \u0026lsquo;Pulup Rc5 Config Rc5 = Pinb.1 Enable Interrupts RC5 Empfangen Getrc5(vrc5_address , Vrc5_com) I²C Konfigurieren Config Scl = Portc.5 Config Sda = Portc.4 I2cinit I²C Senden I2cstart I2cwbyte 48 I2cstop I²C Empfangen I2cstart I2cwbyte 35 I2crbyte Status , Ack \u0026rsquo; I2crbyte Antenna , Nack I2cstop ","permalink":"https://fkainka.de/befehlsliste-bascom/","summary":"\u003cp\u003eOft ist es so, dass man plötzlich vergisst, wie man jetzt gerade in dieser Programmiersprache einen bestimmten Befehl formulieren muss. Deswegen steht hier eine Auflistung einiger wichtiger Bascom Befehle. Die Liste ist nicht vollständig aber wird von Zeit zu Zeit ergänzt.\u003c/p\u003e\n\u003cp\u003eBenutzen Sie Stg+F um in der Seite nach etwas bestimmten zu suchen.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBefehl\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSchreibweise\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eGrundlegendes\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVariable Dimensionieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDim vByte As Byte Dim Bt_recieve_text As String * 50\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSub Deklarieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDeclare Sub Begin()\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWartezeiten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eWaitms 500 Wait 1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePin an Port = High\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePortb.1 = 1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePort = High\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePortb = 255\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eAbfragen/Schleifen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIf Abfragen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eIf\u003c/strong\u003e x=1 \u003cstrong\u003eThen\u003c/strong\u003e \u003cstrong\u003eElseif\u003c/strong\u003e x=3 \u003cstrong\u003eThen\u003c/strong\u003e \u003cstrong\u003eElse\u003c/strong\u003e \u003cstrong\u003eEnd If\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSelect Case\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSelect Case X\u003c/strong\u003e \u003cstrong\u003eCase 0:\u003c/strong\u003e \u003cstrong\u003eCase 1 To 9:\u003c/strong\u003e  \u003cstrong\u003eCase Else:\u003c/strong\u003e \u003cstrong\u003eEnd Select\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLoop-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eDo\u003c/strong\u003e \u003cstrong\u003eLoop Until\u003c/strong\u003e ok =1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFor-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eFor\u003c/strong\u003e I = 1 \u003cstrong\u003eTo\u003c/strong\u003e X \u003cstrong\u003eNext I\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eKommunikation\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eCom1 konfigurieren (Hardware, lesen und schreiben)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOpen \u0026ldquo;com1:\u0026rdquo; For Binary As #1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSerielle schreiben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePrint “Hallo”\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSpezielle Com konfigurieren  (schreiben, Ch #3, Pind.3)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOpen \u0026ldquo;comd.3:9600,8,n,1\u0026rdquo; For Output As #3\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSerielle #3 schreiben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePrint #3 , “Hallo”\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSerielle Spezial-Prozedur\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eConfig Serialin = Buffered , Size = 50 , Bytematch = 10Serial0charmatch() Input Bt_recieve_text Noecho End Sub\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRC5 Konfigurieren (Portb.1)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePortb.1 = 1                                              \u0026lsquo;Pulup Rc5 Config Rc5 = Pinb.1 Enable Interrupts\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRC5 Empfangen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGetrc5(vrc5_address , Vrc5_com)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eI²C Konfigurieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eConfig Scl = Portc.5 Config Sda = Portc.4 I2cinit\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eI²C Senden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eI2cstart I2cwbyte 48 I2cstop\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eI²C Empfangen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eI2cstart I2cwbyte 35 I2crbyte Status , Ack                                     \u0026rsquo; I2crbyte Antenna , Nack I2cstop\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Befehlsliste Bascom"},{"content":"Dieses Programm ist mein erster Versuch, das WLAN Modul ESP8266 über den Arduino Uno zu bändigen. Die Funktion des Programms erscheint recht simpel. Über Steuerbefehle lässt sich die L-Led (digital Pin13), die auf fast jedem Arduino Board vorhanden ist, Ein- und Ausschalten. Es gibt zwei Varianten. Die erste Variante erlaubt über den Browser direkt durch Eingabe einer URL die LED zu schalten. Die zweite Variante läuft über einen eigenen TCP-Client, wie ich ihn z.B. in dem Artikel über die ersten Schritte verwendet habe.\nVerwendung In dem Programm können über die Variablen\n#define xSSID \u0026ldquo;Hier könnte Ihr Netzwerk stehen“\n#define xPASSWORT \u0026quot; Hier könnte Ihr Netzwerk stehen \u0026ldquo;\n#define xPORT 80\npassende Einstellungen zum Netzwerk, Passwort und Port des Servers vorgenommen werden.\nZum Aktiveren der LED über den Browser muss man die IP-Adresse gefolgt von Doppelpunkt dem Port und /Led1 eingeben.\nBeispiel:\n192.168.178.37:80/Led1\nZum Deaktivieren hängt man nichts oder beliebiges hinten an\n192.168.178.37:80/Led0\n192.168.178.37:80\n192.168.178.37:80/Lalelu\nBeim Senden über einen TCP-Client muss das Kommando\nset 0\nOder\nset 1\nLauten. Dass Leerzeichen nach set ist wichtig.\nApp: TCP-Client im Google PlayStore\nDies ist natürlich nur ein erster Test. Wenn das Modul irgendwo zum Einsatz kommt, muss sollte man eine praktischere Befehlsstruktur entwickeln\nDas Programm Das WLAN-Modul wird über die Software basierte serielle Schnittstelle angesprochen und hängt an den Pins 10 und 11. Ich musste die SoftwareSerial-Library etwas anpassen. Genauer gesagt habe ich den internen Buffer von 64 Bytes auf 256 Bytes erhöht. Dies war wichtig, da mir am Anfang zu viele Zeichen verloren gegangen sind. Evtl. erlaubt die aktuelle Version auch einen kleineren Buffer, ich habe dies noch nicht getestet. Damit es keine Verwechslungen gibt, ist die Library in dem Sketchordner mit dabei. Es handelt sich wie um die gleiche Library die auch mit der Arduino Software installiert wird allerdings ist an der Stelle\n#define _SS_MAX_RX_BUFF 256 // RX buffer size auf\nin der SoftwareSerial.h.-Datei die Größe angepasst worden.\nDas Verwenden der Software-Seriellen hat hat zwei Vorteile. Zum einen kann das Modul den Programmupload nicht unerwartet stören. Zum anderen ist die Hardwareserielle noch frei fürs Debugging. Dies ist hier auch oft genutzt worden. Wenn man das Terminal nebenbei mitlaufen lässt, bekommt man einiges an Feedback. Man kann auch direkt AT-Befehle über das Terminal an das Modul verschicken.\nDas Programm ist mit rund 311 Zeilen recht lang geworden. Deswegen werde ich den Quelltext nur Teilweise hier vorstellen. Der Quelltext lässt sich aber herunterladen und ist auch mit einigen, wenn auch sehr schlampig geschriebenen, Kommentaren versehen.\nIch habe versucht, möglichst viele Modul-Funktionen in eigene Routinen zu packen. Eine Liste dieser Funktionen mit Parametern:\nboolean ESP_Test() Testet die Bereitschaft des Moduls durch AT boolean ESP_Reset() Resetet das Modul void ESP_TotalStart() Resetet Modul, Verbindet WLAN, Startet Server boolean WLAN_Connect(char SSID[], char PASSWORT[] ) Verbindet WLAN boolean SERVER_Start(int Port) Startet Server int SERVER_Status() Server Status void SERVER_IPD() Behandelt reinkommende Befehle Der Programmablauf ganz grob Startet WLAN- Verbindet mit angegeben Netzwerk Startet Server an Port 80 Wartet auf Kommando eingeleitet durch +IPD Analyse des Kommandos in eigner Routine Das Problem lag vor allem in der Auswertung unerwartet kommender Daten. Dies kann durch verschiedene Sachen hervorgerufen werden.\nEin besonders ungünstiger Fall wäre, dass das Modul ready meldet. Das würde bedeuten, dass sich das Modul resetet hat. Dies ist im Test bei mir vorgekommen, wenn auch nur selten. Um diese Fehlerquelle abzufangen wird die ESP_TotalStart in diesem Fall neu ausgeführt.\nEin andere Fall wäre eine Link oder Unlink Meldung. Das bedeutet, dass sich ein Client auf dem Server des Moduls an- bzw. abgemeldet hat. Dies erzeugt z.Z. nur eine Debugmeldung, wäre aber auch ein möglicher Ansatz für eine erweiterte Kommunikation.\nEin weiter Fall ist, dass Daten empfangen wurden. Empfangene Daten werden grundsätzlich in der Form\n+IPD,0,376:DATEN\nEmpfangen. +IPD kennzeichnet also reinkommende Daten. Die erste Zahl, hier die Null, gibt an, von welchem der verbundenen Clients Daten gesendet wurden. Die zweite Zahl sagt aus, wie viele Zeichen gesendet wurden. Nach dem Doppelpunkt folgen schließlich die übermittelten Daten.\nBesonderheiten im Programm Variable NC:\nIn der Loop Routine werden Zeichen für Zeichen durchgereicht. Damit nicht jedes Zeichen auf den Anfang eines möglichen Kommandos analysiert werden muss, wird überprüft ob das vorherige Zeichen ein NewLine Zeichen war (Befehle fangen immer in neuer Zeile an). Ist dies der Fall wurde NC = true gesetzt und das Zeichen genauer betrachtet.\nWLAN-Connect\nIn der Routine für die WLAN-Verbindung wird zunächst mittels AT+CWJAP? überprüft, ob das Modul bereits mit dem angegebenen Netzwerk verbunden ist. Dies kommt öfter vor da sich das Modul wohl nach einem Reset auch automatisch verbindet. Ein ERROR bedeutet keine Verbindung und ansonsten wird der Name des Verbunden Netzwerkes zurückgegeben und mit der vorgegeben SSID verglichen. Ist diese identisch wird die Routine vorzeitig verlassen.\nServer-Status\nAnhand des Server-Status wird überprüft, ob der Server bereits gestartet ist. Das kann sehr gut sein, das beim Neuaufspielen eines Programms zwar der Arduino-Controller resetet wird, das Modul aber nicht. Ich vermute das Status 4 und 5 auf Inaktivität hinweisen und dann führe ich die komplette Startroutine neu aus.\nLoop-Routine Quelltext void loop() { while (ESPSerial.available()) { char inChar = ESPSerial.read(); if (NC == true) //Nur wenn NL das letze Zeichen war wird dieses Zeichen auf +,r, L oder U untersucht!! dadruch beschleunigt //Wenn hier false in die If-Afrage einteragen wird, gehjt alles in Debug durch- keine interpretation { if (inChar == \u0026#39;+\u0026#39; || inChar == \u0026#39;r\u0026#39; || inChar == \u0026#39;L\u0026#39; || inChar == \u0026#39;U\u0026#39;) //Diese 4 sind der beginn eines evtl interessanten Kommandos { switch (inChar) { case \u0026#39;+\u0026#39;: { //debug(\u0026#34;Befehl/Request?\u0026#34;); delay (1); //Delay scheont die Zuverlässigkeit von der Befehlserkennung zu erhhöhen char NextPeek = ESPSerial.peek(); if (NextPeek == \u0026#39;C\u0026#39;) { break; //z.B. durch CWLAP möglichst schneller austieg damit keine DAten aus Buffer verloren gehen } if (NextPeek == \u0026#39;I\u0026#39;) {//Vermutung IPD = Einkommender Befehl if (ESPSerial.findUntil(\u0026#34;IPD\u0026#34;, \u0026#34; \u0026#34;)) { //Bestätigen debug(\u0026#34;IPD-Kommando\u0026#34;); SERVER_IPD(); //Unterfunktion zum analysieren des IPD-Kommandos inChar = 0; } } break; } case \u0026#39;r\u0026#39;: //ready vom Modul gesendet=? //debug(\u0026#34;Ungeplanter Neustart??\u0026#34;); if (ESPSerial.findUntil(\u0026#34;eady\u0026#34;, \u0026#34;/n\u0026#34;)) { debug(\u0026#34;Ungeplanter ModulReset -\u0026gt; Neustart\u0026#34;); inChar = 0; ESP_TotalStart(); //Aufruf der Startroutine } break; case \u0026#39;L\u0026#39;: //debug(\u0026#34;Link? \u0026#34;); //Linked: eine Verbindung wurde aufgebaut... Evtl für später zu gerbauchen -\u0026gt; senden an Clients if (ESPSerial.findUntil(\u0026#34;ink\u0026#34;, \u0026#34; \u0026#34;)) { debug(\u0026#34;Linked!\u0026#34;); inChar = 0; } break; case \u0026#39;U\u0026#39;: //UnLinked: eine Verbindung wurde getrennt... Evtl für später zu gerbauchen -\u0026gt; senden an Clients //ALLERDINGS: scheint selten ausgeläst zu werden debug(\u0026#34;Unlink?\u0026#34;); //Hier kommen Daten gelegentlich weg die mit U beginnen in neuer Zeile --- kommt eher bei Browser request vor.. sowieso abfangen in request befehl if (ESPSerial.findUntil(\u0026#34;nlink\u0026#34;, \u0026#34; \u0026#34;)) { debug(\u0026#34;Unlinked\u0026#34;); inChar = 0; } break; } } } //New Line ermöglicht einkommenden Befehl // damit beschleunigt if (inChar == \u0026#39;\\n\u0026#39;) { NC = true; } else { NC = false; } //Debug-\u0026gt; alles lässt sich über die Konsole verfolgen Serial.write(inChar); } } Routine: Analyse der Befehle Quelltext void SERVER_IPD() { //Beispiel +IPD,0,376:GET / HTTP/1.1 = Typischer Browser request int Client; //Client ID int NZeichen; //Anzahl der gesendeten Zeichen char buffer[5]; //Buffer eig nur für Müll char Kommando1[10]; //Buffer für das erste Kommando direkt nach dem : bis Leerzeichen char Kommando2[10]; //Buffer für zweites Kommando... noch nicht ausgereift //Löscht alles aus Kommando1 und 2- Scheint wichtig sonst bleibt müll...memset schnellste möglichkeit memset(Kommando1, 0, sizeof(Kommando1)); memset(Kommando2, 0, sizeof(Kommando2)); Client = ESPSerial.parseInt(); NZeichen = ESPSerial.parseInt(); ESPSerial.readBytesUntil(\u0026#39;:\u0026#39;, buffer, 5); ESPSerial.readBytesUntil(\u0026#39; \u0026#39;, Kommando1, 10); //hier konvention für Kommandolänge oder Ähnliches //Vorrausslich Request über Server if (strcmp (Kommando1, \u0026#34;GET\u0026#34;) == 0) { ESPSerial.readBytesUntil(\u0026#39; \u0026#39;, Kommando2, 10); debug (\u0026#34;kommando2: \u0026#34; + String(Kommando2)); //Das aktivierende Kommando ist im browser IP:80/Led1 - Alles andere deaktivert die LED if (strcmp (Kommando2, \u0026#34;/Led1\u0026#34;) == 0) { digitalWrite (LED, HIGH); debug(\u0026#34;LED AN\u0026#34;); } else { digitalWrite (LED, LOW); debug(\u0026#34;LED AUS\u0026#34;); } if ( ESPSerial.find(\u0026#34;OK\u0026#34;)) { debug (\u0026#34;OK Skipt\u0026#34;); //hier wird der ganze Quatsch vom Browser Request übersprungen... Dauet ne weile } } //Vorrausslich Request über TCP-Cient else if (strcmp (Kommando1, \u0026#34;set\u0026#34;) == 0) { debug(\u0026#34;set\u0026#34;); //kommando über TCP client: set 1 oder set 0 digitalWrite(13, ESPSerial.parseInt()); } //Ausgabe zu debug zwecken debug(\u0026#34;von Client: \u0026#34; + String(Client) + \u0026#34; Zeichenanzahl: \u0026#34; + String(NZeichen) + \u0026#34; Kommando1: \u0026#34; + Kommando1); //+ \u0026#34; Kommando2: \u0026#34;+ Kommando2 } ESP8266_SetLED1 ","permalink":"https://fkainka.de/esp8266-arduino-programm-setled/","summary":"\u003cp\u003eDieses Programm ist mein erster Versuch, das \u003ca href=\"/kurzinfos-zum-wlan-modul-esp8266-wi07c/\" title=\"Kurzinfos zum WLAN-Modul ESP8266 (Wi07c)\"\u003eWLAN Modul ESP8266\u003c/a\u003e über den Arduino Uno zu bändigen. Die Funktion des Programms erscheint recht simpel. Über \u003cstrong\u003eSteuerbefehle\u003c/strong\u003e lässt sich di\u003cstrong\u003ee L-Led (digital Pin13)\u003c/strong\u003e, die auf fast jedem Arduino Board vorhanden ist, \u003cstrong\u003eEin- und Ausschalten\u003c/strong\u003e. Es gibt zwei Varianten. Die erste Variante erlaubt \u003cstrong\u003eüber den Browser direkt durch Eingabe einer URL\u003c/strong\u003e die LED zu schalten. Die zweite Variante läuft \u003cstrong\u003eüber einen eigenen TCP-Client\u003c/strong\u003e, wie ich ihn z.B. in dem Artikel über \u003ca href=\"/wlan-modul-esp8266-erste-schritte/\" title=\"WLAN Modul ESP8266 – Erste Schritte\"\u003edie ersten Schritte\u003c/a\u003e verwendet habe.\u003c/p\u003e","title":"ESP8266 Arduino-Programm: setLED"},{"content":" Befehl Schreibweise Grundlegendes Grundstruktur *#include \u0026ldquo;mbed.h\u0026rdquo;*int main() { } Library einbinden #include “libX.h“ Variable deklarieren (Typ Integer, Wert = 0) int led = 0; Array deklarieren (Typ Integer, 6 Werte) int Arrayname[6] = {2, 4, -8, 3, 2}; Warten (0,5 Sekunden) wait(0.5); Pin-Funktionen Digitaler Ausgang DigitalOut meineLED (PTD1); Digitaler Eingang DigitalIn Sch**alter(PTD4); PWM Ausgang (nur an PWM-Pins) PwmOut LedBlau(LED_BLUE); Analoger Eingang (nur an ADC-Pins) AnalogIn LDR(PTC2); Analoger Ausgang (nur an DAC-Pins) AnalogOut Spann(PTE30); Interrupt Pin (nur Interrupts-Pins) InterruptIn event(PTD4); ! Relative Werte (PWM, Analoge Werte ) haben einen Bereich von 0…1, z.B. LedBlau = 0.5; Abfragen/Schleifen If-Abfrage mit Else *if (button == HIGH){ }*else{ } Switch-Abfrage *switch (x) {*case 1: case 2: default: For-Schleife for (x = 2; x \u0026lt; 7; x++) { } While-Schleife *while (schalter== HIGH) { }*ODER: do{ } while (schalter==HIGH); Schleife vorzeitig verlassen break; Überspringt ausführbaren Quelltext in Schleife continue; Printf Hello ausgeben printf(\u0026ldquo;Hello \\n\u0026rdquo;); Textformationen Integer Variable i ausgeben printf(\u0026quot;%d \\n\u0026quot;, i); Variablen Gekürzte Gleitkommazahl ausgeben (xx.xxx) printf(\u0026quot;%2.3f \\n\u0026quot;, f); Spezielle serielle Schnistelle Schnittstellen pc initialisieren (USB) Serial pc(USBTX, USBRX); Bautrate festlegen (9600) pc.baud (9600); An Schnittstelle NAME Text ausgeben pc.printf(\u0026ldquo;TEXT \\n\u0026rdquo;); Zeichen 38 Ausgeben (\u0026amp;-Zeichen) pc.putc(38); Zeichen einlesen pc.getc() Mathematisches Sinus, Cosinus, Tangens sin(),cos(),tan() Wurzel aus X sqrt(x) X hoch Y : xy pow(x, y) Absolut Wert einer Zahl (Betrag von x) abs(x) Zufällige Zahl random() Vergleiche gleich == ungleich != größer, kleiner \u0026lt;, \u0026gt; Größer oder gleich, kleiner oder gleich \u0026lt;= , \u0026gt;= Funktion: kleinere Zahl von x und y min(x, y) Funktion: größere Zahl von x und y max(x, y) Boolsche Operatoren Und \u0026amp;\u0026amp; Oder * Nicht ! Sonstiges Kommentar eine Zeile // Kommentar längerer Bereich /* */ Prozedur void Prozedurname() { } Funktion mit Integer-Rückgabewert und Integer-Parameter int Funktionsname (int Parameter) {**} Zeit setzen (01.06.2014 00:00:00) set_time(1401580800); Interssante Librarys und deren wichtigste Befehle Touch Sensor #include \u0026ldquo;TSISensor.h\u0026rdquo; initialisieren TSISensor tsi; Auslesen in Prozent tsi.readPercentage(); Auslesen in Millimetern tsi.readDistance(); Beschleunigungssensor #include \u0026ldquo;MMA8451Q.h\u0026rdquo; Initialisieren über I²C Pins und Adresse MMA8451Q acc(PTE25, PTE24, 58); Beschleunigung in X-Richtung lesen acc.getAccX(); Alle Beschleunigungsachsen in ein Array lesen acc.getAccAllAxis() USB-Mouse (Lib: USBDevice) #include \u0026ldquo;USBMouse.h\u0026rdquo; Maus initialisieren USBMouse mouse; Maus Bewegen mouse.move(x,y); Linken Maustaste drücken mouse.press(MOUSE_LEFT); Linken Maustaste loslassen mouse.release(MOUSE_ LEFT); Rechte Maustaste Klicken mouse.click(MOUSE_RIGHT); Doppelklick mit linker Maustaste mouse.doubleClick(); ","permalink":"https://fkainka.de/befehlsliste-mbed-org/","summary":"\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBefehl\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSchreibweise\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eGrundlegendes\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGrundstruktur\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*#include \u0026ldquo;mbed.h\u0026rdquo;*\u003cem\u003eint main() {   }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLibrary einbinden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e#include “libX.h“\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVariable deklarieren (Typ Integer, Wert = 0)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint led  = 0;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eArray deklarieren (Typ Integer, 6 Werte)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint Arrayname[6] = {2, 4, -8, 3, 2};\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWarten (0,5 Sekunden)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003ewait(0.5);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003ePin-Funktionen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDigitaler Ausgang\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eDigitalOut meineLED (PTD1);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDigitaler Eingang\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eDigitalIn Sch**alter(PTD4);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePWM Ausgang (nur an PWM-Pins)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003ePwmOut LedBlau(LED_BLUE);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAnaloger Eingang (nur an ADC-Pins)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eAnalogIn LDR(PTC2);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAnaloger Ausgang (nur an DAC-Pins)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eAnalogOut Spann(PTE30);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInterrupt Pin (nur Interrupts-Pins)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eInterruptIn event(PTD4);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e! Relative Werte (PWM, Analoge Werte ) haben einen Bereich von 0…1, z.B. LedBlau = 0.5;\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eAbfragen/Schleifen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIf-Abfrage mit Else\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*if (button == HIGH){    }*\u003cem\u003eelse{   }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSwitch-Abfrage\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*switch (x) {*\u003cem\u003ecase 1:\u003c/em\u003e  \u003cem\u003ecase 2:\u003c/em\u003e  \u003cem\u003edefault:\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFor-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003efor (x = 2; x \u0026lt; 7; x++) {      }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWhile-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*while (schalter== HIGH) {   }*\u003cstrong\u003eODER:\u003c/strong\u003e do{  } while (schalter==HIGH);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSchleife vorzeitig verlassen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003ebreak;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eÜberspringt ausführbaren Quelltext in Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003econtinue;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003ePrintf\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eHello ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eprintf(\u0026ldquo;Hello \\n\u0026rdquo;);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eTextformationen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInteger Variable i ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eprintf(\u0026quot;%d \\n\u0026quot;, i);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVariablen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGekürzte Gleitkommazahl ausgeben (xx.xxx)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eprintf(\u0026quot;%2.3f \\n\u0026quot;, f);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSpezielle serielle Schnistelle\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSchnittstellen \u003cstrong\u003epc\u003c/strong\u003e initialisieren (USB)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSerial pc(USBTX, USBRX);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eBautrate festlegen (9600)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003epc.baud (9600);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAn Schnittstelle NAME Text ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003epc.printf(\u0026ldquo;TEXT \\n\u0026rdquo;);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZeichen 38 Ausgeben (\u0026amp;-Zeichen)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003epc.putc(38);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZeichen einlesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003epc.getc()\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eMathematisches\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSinus, Cosinus, Tangens\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003esin(),cos(),tan()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWurzel aus X\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esqrt(x)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eX hoch Y : xy\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003epow(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAbsolut Wert einer Zahl (Betrag von x)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eabs(x)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZufällige Zahl\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003erandom()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eVergleiche\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003egleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e==\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eungleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e!=\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003egrößer, kleiner\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026lt;, \u0026gt;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGrößer oder gleich, kleiner oder gleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026lt;= , \u0026gt;=\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: kleinere Zahl von x und y\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003emin(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: größere Zahl von x und y\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003emax(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBoolsche Operatoren\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eUnd\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026amp;\u0026amp;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eOder\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eNicht\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e!\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSonstiges\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKommentar eine Zeile\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e//\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKommentar längerer Bereich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e/*                \u003cem\u003e*/\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eProzedur\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003evoid Prozedurname() {   }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion mit Integer-Rückgabewert und Integer-Parameter\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint Funktionsname (int Parameter) {**}\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZeit setzen (01.06.2014 00:00:00)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eset_time(1401580800);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eInterssante Librarys und deren wichtigste Befehle\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eTouch Sensor\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e#include \u0026ldquo;TSISensor.h\u0026rdquo;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003einitialisieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eTSISensor tsi;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAuslesen in Prozent\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003etsi.readPercentage();\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAuslesen in Millimetern\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003etsi.readDistance();\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBeschleunigungssensor\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e#include \u0026ldquo;MMA8451Q.h\u0026rdquo;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInitialisieren über I²C Pins und Adresse\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMMA8451Q acc(PTE25, PTE24, 58);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eBeschleunigung in X-Richtung lesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eacc.getAccX();\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAlle Beschleunigungsachsen in ein Array lesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eacc.getAccAllAxis()\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eUSB-Mouse (Lib: USBDevice)\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e#include \u0026ldquo;USBMouse.h\u0026rdquo;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMaus initialisieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eUSBMouse mouse;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMaus Bewegen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emouse.move(x,y);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLinken Maustaste drücken\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emouse.press(MOUSE_LEFT);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLinken Maustaste loslassen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emouse.release(MOUSE_ LEFT);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRechte Maustaste Klicken\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emouse.click(MOUSE_RIGHT);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDoppelklick mit linker Maustaste\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emouse.doubleClick();\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Befehlsliste Mbed.org"},{"content":"ESP8266 AT Befehle Befehl Schreibweise Grundlegendes Test Befehl AT Reset AT+RST Firmware Infos AT+GMR Baudrate ändern AT+CIOBAUD= WLAN Befehle WLAN-Modus (1 = Client, 2 = AP, 3 = Dual) AT+CWMODE= Mehrere Verbindungen zulassen AT+CIPMUX= WLAN-Netzwerke suchen AT+CWLAP WLAN Verbinden AT+CWJAP=\u0026quot;\u0026quot;,\u0026quot;\u0026quot; WLAN Trennen AT+CWQAP WLAN-AccesPoint Einstellungen AT+CWSAP=\u0026quot;\u0026quot;,\u0026quot;\u0026quot;[,,] IP-Adresse Ausgeben AT+CIFSR Kommunikation Datenmodus (0=Transparent, 1=Datenmodus) AT+CIPMODE= Struktur empfangener Daten +IPD,,: Verbindung aufbauen AT+CIPSTART=\u0026quot;\u0026quot;,\u0026quot;\u0026quot;, Daten Senden AT+CIPSEND=, Verbdingung trennen AT+CIPCLOSE= Server Befehle Server Starten AT+CIPSERVER=1, Server Beenden AT+CIPSERVER=0 Server Status \u0026amp; verbundene Clients AT+CIPSTATUS Server Timeout festlegen AT+CIPSTO= Verbundene Clients anzeigen AT+CWLIF Sonstiges Watchdog starten AT+CSYSWDTENABLE Watchdog beenden AT+CSYSWDTDISABLE Kurzinfos Standartbaudrate 9600 Strombedarf Initialisierung ca. 200 mA Maximaler Strombedarf 235 mA Pinout ESP8266 ESP8266 Pinout von oben Pinbelegung des Moduls von unten Auf Englisch übersetztes Datenblatt Fritzing Bauteil Linkliste http://www.electrodragon.com/w/Wi07c Infoseite zum Modul (Englisch) https://nurdspace.nl/ESP8266 Infoseite zum Modul (Englisch) http://hackaday.com/tag/esp8266/ Hack a Day Projekte mit dem Modul (Englisch) https://www.youtube.com/watch?v=uznq8W9sOKQ Tutorial YouTube-Video (Englisch) ","permalink":"https://fkainka.de/kurzinfos-zum-wlan-modul-esp8266-wi07c/","summary":"\u003ch1 id=\"esp8266-at-befehle\"\u003eESP8266 AT Befehle\u003c/h1\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBefehl\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSchreibweise\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eGrundlegendes\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eTest Befehl\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eReset\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+RST\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFirmware Infos\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+GMR\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eBaudrate ändern\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIOBAUD=\u003cbaud\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eWLAN Befehle\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWLAN-Modus (1 = Client, 2 = AP, 3 = Dual)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWMODE=\u003cmode\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMehrere Verbindungen zulassen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPMUX=\u003cmode\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWLAN-Netzwerke suchen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWLAP\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWLAN Verbinden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWJAP=\u0026quot;\u003cssid\u003e\u0026quot;,\u0026quot;\u003cpass\u003e\u0026quot;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWLAN Trennen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWQAP\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWLAN-AccesPoint Einstellungen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWSAP=\u0026quot;\u003cssid\u003e\u0026quot;,\u0026quot;\u003cpass\u003e\u0026quot;[,\u003cchan\u003e,\u003cenc\u003e]\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIP-Adresse Ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIFSR\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eKommunikation\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDatenmodus (0=Transparent, 1=Datenmodus)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPMODE=\u003cmode\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eStruktur empfangener Daten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e+IPD,\u003cid\u003e,\u003clen\u003e:\u003cdata\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVerbindung aufbauen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSTART=\u0026quot;\u003ctype\u003e\u0026quot;,\u0026quot;\u003caddress\u003e\u0026quot;,\u003cport\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDaten Senden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSEND=\u003cid\u003e,\u003clen\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVerbdingung trennen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPCLOSE=\u003cid\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eServer Befehle\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eServer Starten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSERVER=1,\u003cport\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eServer Beenden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSERVER=0\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eServer Status \u0026amp; verbundene Clients\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSTATUS\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eServer Timeout festlegen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CIPSTO=\u003ctimeout\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVerbundene Clients anzeigen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CWLIF\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSonstiges\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWatchdog starten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CSYSWDTENABLE\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWatchdog beenden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAT+CSYSWDTDISABLE\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch1 id=\"kurzinfos\"\u003eKurzinfos\u003c/h1\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eStandartbaudrate\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e9600\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eStrombedarf Initialisierung\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eca. 200 mA\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMaximaler Strombedarf\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e235 mA\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch1 id=\"pinout-esp8266\"\u003ePinout ESP8266\u003c/h1\u003e\n\u003cfigure\u003e\u003ca href=\"/images/2015/01/ESP8266-Pinout.jpg\"\u003e\u003cimg class=\"size-full wp-image-511\" src=\"/images/2015/01/ESP8266-Pinout.jpg\" alt=\"ESP8266 Pinout von oben\" width=\"1781\" height=\"1269\" data-id=\"511\" /\u003e\u003c/a\u003e\u003cfigcaption\u003eESP8266 Pinout von oben\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cfigure\u003e\u003ca href=\"/images/2015/01/WlanPinout.jpg\"\u003e\u003cimg class=\"size-full wp-image-74\" src=\"/images/2015/01/WlanPinout.jpg\" alt=\"Pinbelegung des Moduls von unten\" width=\"2176\" height=\"1223\" data-id=\"74\" /\u003e\u003c/a\u003e\u003cfigcaption\u003ePinbelegung des Moduls von unten\u003c/figcaption\u003e\u003c/figure\u003e\n\u003ch1 id=\"auf-englisch-übersetztes-datenblatt\"\u003e\u003ca href=\"https://docs.google.com/file/d/0B9hyK_DA6VIiSWNRZ29sdG1UOVU/edit?pli=1\"\u003eAuf Englisch übersetztes Datenblatt\u003c/a\u003e\u003c/h1\u003e\n\u003ch1 id=\"fritzing-bauteil\"\u003e\u003ca href=\"https://github.com/satsatt/ESP8266_fritzing\"\u003eFritzing Bauteil\u003c/a\u003e\u003c/h1\u003e\n\u003ch1 id=\"linkliste\"\u003eLinkliste\u003c/h1\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ca href=\"http://www.electrodragon.com/w/Wi07c\"\u003ehttp://www.electrodragon.com/w/Wi07c\u003c/a\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInfoseite zum Modul (Englisch)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ca href=\"https://nurdspace.nl/ESP8266\"\u003ehttps://nurdspace.nl/ESP8266\u003c/a\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInfoseite zum Modul (Englisch)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ca href=\"http://hackaday.com/tag/esp8266/\"\u003ehttp://hackaday.com/tag/esp8266/\u003c/a\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eHack a Day Projekte mit dem Modul (Englisch)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ca href=\"https://www.youtube.com/watch?v=uznq8W9sOKQ\"\u003ehttps://www.youtube.com/watch?v=uznq8W9sOKQ\u003c/a\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eTutorial YouTube-Video (Englisch)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Kurzinfos WLAN-Modul ESP8266 (Wi07c)"},{"content":"Angaben nach § 18 Abs. 1 Medienstaatsvertrag Fabian Kainka\nAhrfelstr. 29\n45136 Essen\nKontakt: f.kainka [at] gmx.de Diese Seite ist ein privates Projekt ohne Werbung und ohne Gewinnabsicht. Das Impressum gilt auch für\niot.fkainka.de.\nVerantwortlich für den Inhalt nach § 18 Abs. 2 MStV Fabian Kainka, Anschrift wie oben\nHaftung für Inhalte und Links Die Informationen werden ohne Gewähr und ohne Rücksicht auf mögliche Patente weitergegeben. Für Fehler\nübernehme ich keine Verantwortung. Markennamen und eingetragene Warenzeichen sind auch ohne ausdrücklichen\nHinweis zu beachten. Für die Inhalte verlinkter Seiten sind ausschließlich deren Betreiber verantwortlich.\nUrheberrecht Texte, Bilder und Programme dieser Seite sind urheberrechtlich geschützt. Für eine Weiterverwendung über den\nprivaten Gebrauch hinaus fragen Sie bitte vorher nach.\nWie diese Seite entstanden ist Die Beiträge stammen von mir. Die technische Umsetzung dieser Seite – Umzug von WordPress, Gestaltung,\nWeiterleitungen und Prüfskripte – habe ich 2026 mit Unterstützung eines KI-Assistenten (Claude von Anthropic)\nerstellt. Die Inhalte wurden dabei nur übernommen und formal angepasst, nicht von der KI geschrieben.\nDatenschutzerklärung\n","permalink":"https://fkainka.de/impressum/","summary":"\u003ch2 id=\"angaben-nach--18-abs-1-medienstaatsvertrag\"\u003eAngaben nach § 18 Abs. 1 Medienstaatsvertrag\u003c/h2\u003e\n\u003cp\u003eFabian Kainka\u003cbr\u003e\nAhrfelstr. 29\u003cbr\u003e\n45136 Essen\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKontakt:\u003c/strong\u003e \u003ca class=\"obf-email\" data-u=\"f.kainka\" data-d=\"gmx.de\" href=\"#kontakt\"\u003ef.kainka [at] gmx.de\u003c/a\u003e\n\u003cscript\u003edocument.querySelectorAll(\"a.obf-email\").forEach(function(a){var m=a.dataset.u+\"@\"+a.dataset.d;a.href=\"mailto:\"+m;a.textContent=m;});\u003c/script\u003e\n\u003c/p\u003e\n\u003cp\u003eDiese Seite ist ein privates Projekt ohne Werbung und ohne Gewinnabsicht. Das Impressum gilt auch für\u003cbr\u003e\n\u003ca href=\"https://iot.fkainka.de/\"\u003eiot.fkainka.de\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"verantwortlich-für-den-inhalt-nach--18-abs-2-mstv\"\u003eVerantwortlich für den Inhalt nach § 18 Abs. 2 MStV\u003c/h2\u003e\n\u003cp\u003eFabian Kainka, Anschrift wie oben\u003c/p\u003e\n\u003ch2 id=\"haftung-für-inhalte-und-links\"\u003eHaftung für Inhalte und Links\u003c/h2\u003e\n\u003cp\u003eDie Informationen werden ohne Gewähr und ohne Rücksicht auf mögliche Patente weitergegeben. Für Fehler\u003cbr\u003e\nübernehme ich keine Verantwortung. Markennamen und eingetragene Warenzeichen sind auch ohne ausdrücklichen\u003cbr\u003e\nHinweis zu beachten. Für die Inhalte verlinkter Seiten sind ausschließlich deren Betreiber verantwortlich.\u003c/p\u003e","title":"Impressum"},{"content":"Der nächste Schritt ist nun, das ESP8266 Modul mit einem Arduino zu verbinden um das ganze portabler zu haben. Meine erste Wahl war ein Arduino Nano Nachbau aus China**,** den ich ebenfalls mitbestellt habe. Dieser hat einen 3,3 V Pin so dass die Sache auf den ersten Blick ganz einfach aussah. Tatsächlich hat das Modul aber ähnlich reagiert, wie schon bei den ersten Versuchen mit der FTDI Platine. Das Modul startete nicht richtig. Nach einigem Suchen fand ich auch den Grund heraus.\nAuf dem Nachbau des Nanos befindet sich ein alternativer USB-To-Serial Chip. Dieser wird mit geregelten 5 V versorgt, hat aber auch selbst einen 3,3 V Ausgang, der am entsprechenden Power-Pin der Arduino Patine herausgeführt ist. Das Problem ist allerdings, dass dieser PIN maximal 50 mA liefern kann. Das WLAN-Modul braucht beim Start bis zu 200mA. Laut Datenblatt kann es sogar bis zu 235 mAbenötigen. Der Serial-Chip kann den Strombedarf also nicht decken. Ein originaler FTDI Chip hätte übrigens genauso wenig genützt. Dieser liefert ebenfalls maximal 50mA am 3,3 V-Pin.\nEine Möglichkeit das Problem zu lösen wäre, einen Spannungswandler an den 5V Pin anzuschließen und das Modul darüber zu versorgen. Diese Variante werde ich noch ausprobieren, doch für meinen ersten Versuch habe ich doch einen Arduino Uno genommen. Der 3,3 V Pin des Arduino wird nämlich über einen Spannungswandler erzeugt und kann den nötigen Strom liefern. Für die ersten Versuche also die besser Wahl. Der Aufbau des Versuchs sieht folgendermaßen aus:\nESP8266 auf einem Arduino Uno Zum Aufbau:\nAn die Modul-Pins GND (grauer Draht) und RXD (weiß) habe ich jeweils kurze Verbindungsdrähte angelötet. Das Modul selbst ist leicht schräg in ein Steckboard gesteckt, so dass die beiden oben erwähnten Pins keine Verbindung haben. Dafür kommt man über die interne Verdahtung des Steckboards gut an die Pins VCC (gelb/orange) undTXD (braun). Der PD Pin ist direkt mit einer Drahtbrücke mit VCC verbunden. RXD (weiß) ist mit dem Arduino Pin 11und TXD (braun) mit Pin10verbunden. VCC wird mit dem 3,3 V-Power-Pin verbunden und GNDmit GND.\nWie man sieht sind RXD und TXDnicht mit dem Serial Pins des Arduino Unos Verbunden, sondern stattdessen mit den digitalen Pins 11 und 10. Das liegt daran, dass ich eine softwarebasierte Serielle Schnittstelle verwende. Dadurch bleibt die Hardwareschnittstelle fürs Debugging frei und es gibt auch keine Probleme beim Uploaden von Programmen.\nFür den ersten Test hat sich das BeispielprogrammSoftwareSerialExample (Beispiele \u0026gt; SoftwareSerial) bewährt. Ich musste lediglich die Baudraten anpassen. Dann war es möglich über das Terminal Befehle zu schicken und zu empfangen. Im Grunde ist dieser Aufbau in Verbindung mit diesem Beispielprogramm auch einegute Alternative für alle, die kein passendes FTDI-Board zur Verfügung haben.\n","permalink":"https://fkainka.de/wlan-modul-esp8266-und-arduino/","summary":"\u003cp\u003eDer nächste Schritt ist nun, das ESP8266 Modul mit einem Arduino zu verbinden um das ganze portabler zu haben. Meine erste Wahl war ein \u003cstrong\u003eArduino Nano\u003c/strong\u003e Nachbau aus China**,** den ich ebenfalls mitbestellt habe. Dieser hat einen 3,3 V Pin so dass die Sache auf den ersten Blick ganz einfach aussah. Tatsächlich hat das Modul aber ähnlich reagiert, wie schon bei den ersten Versuchen mit der FTDI Platine. Das Modul startete nicht richtig. Nach einigem Suchen fand ich auch den Grund heraus.\u003c/p\u003e","title":"WLAN Modul ESP8266 und Arduino"},{"content":"Die Verbindung zu anderen Geräten steht nun, egal ob Sie das Modul als AP oder als Client benutzen. Doch nun sollten die Geräte auch miteinander kommunizieren können. Deswegen wird in diesem Teil ein Server eingestellt. Auf diesen Server kann dann z.B. über ein Handy zugegriffen und Daten übermittelt werden. Doch der Reihe nach.\nZunächst einmal muss eine Einstellung vorgenommen werden und zwar die Einstellung AT+CIPMUX=1. Dies ermöglicht, mehrere Verbindungen gleichzeitig aufbauen zu dürfen. Ich habe noch nicht genau herausgefunden warum diese Einstellung nötig ist, Tatsache ist aber, dass sich der Server nicht starten lässt wenn diese Einstellung nicht gemacht wurde. Ein wichtiger Punkt ist, dass sichdiese Konfiguration nicht speichert. Das bedeutet, Sie müssen diesen Befehl jedes Mal neu eingeben, wenn Sie das Modul neu eingeschaltet oder resetet haben.\nNun können Sie den Server mit dem Befehl AT+CIPSERVER=1,80****starten. Der zweite Parameter, also die 80, ist der Port, über den der Server erreicht werden kann. Sie können hier auch einen anderen Port verwenden. In diesem Beispiel ist der Server aber unter dem Port 80 zu erreichen.\nNun wird es spannend. Sollte das Starten des Servers mit OK bestätigt worden sein, können Sie nun versuchen den Server über ein Gerät Ihrer Wahl zu erreichen. Wenn Sie sich nicht mehr sicher sind, wie die IP des Moduls lautet verwenden Sie den AT+CIFSR Befehl. Auf dem Bild unten sehen Sie die beiden IP-Adressen. Die erste ist gültig, wenn Sie eine direkte Verbindung über den AP benutzen, die zweite gilt, wenn Sie über den Router das Modul erreichen möchten.\nIch versuche nun also über den PC und den Router das Modul zu erreichen. Dazu öffne ich einen Browser und gebe die IP-Adresse des Moduls gefolgt von einem Doppelpunkt und dem Port des Servers ein. In diesem Fall also:\n192.168.178.35:80\nWenn Sie nun Enter drücken versucht der Browser eine Seite zu laden. Dies hat allerdings kein Erfolgt. Im Serial Monitor können Sie allerdings sehen, dass Daten empfangen wurden:\nZunächst steht dort Link, was verdeutlicht, dass eine Verbindung hergestellt wurde. Dann folgen empfangene Daten. Allgemein werdenempfangene Daten durch +IPD gekennzeichnet. Danach folgen zwei Zahlen. Die erste Zahl zeigt, welche der bestehenden Verbindungen die Daten geschickt hat. Da z.Z. nur ein Rechner die Seite geöffnet hat, steht dort eine 0. Eine zweite Anfrage würde dann den Index 1 bekommen usw. Die zweite Zahl gibt die Länge der empfangenen Daten an. Hier wurden also anscheinend 376 Zeichen empfangen. Wer möchte kann ja mal nachzählen. Nach dem Doppelpunkt stehen nun die eben beschriebenen Daten. Es scheint sich hier um eine Anforderung zu handeln, die allgemein beim Öffnen einer Seite vom Browser geschickt wird.\nDiese Verbindung bleibt nun eine Weile stehen, ohne dass etwas passiert. Nach in der Regel 180s = 3 Minuten, wird die Verdingung automatisch getrennt. Dies wird durch die Meldung Unlinked verdeutlicht. Sie können die Zeit bis zur automatischen Trennungübrigens auch Einstellen und zwar mit dem Befehl AT+CIPSTO=Xwobei X maximal 28800 für 28800s = 8h entsprechen darf.\nFalls Sie sich gerade nicht sicher sind, ob und wenn ja wie viele Verbindungen zum Modul bestehen, können Sie dies mit dem BefehlAT+CIPSTATUS erfragen. Status 4 scheint zu bedeuten, dass keine Verbindungen bestehen. Status 3 bedeutet anscheinend Verbindungen und wird mit einer Liste von verbunden Gerätenergänz.\nNun soll aber die Verbindung nicht völlig nutzlos sein, sondern es sollenDaten an den Browser geschickt werden. Dazu gibt es denAT+CIPSEND Befehl. Dieser hat zwei Parameter, die ähnlich dem Empfangsparametern sind. Der erste Parameter gibt also den Index der Verbindung an, der zweite die Anzahl der zu sendenden Zeichen. Die einfachste Form von Daten sei nun ein Text. Dieser kann tatsächlich auch so im Browser angezeigt werden. Wenn Sie also den Server im Browser andressiert haben und eine Linked Verbindung besteht, können Sie mit AT+CIPSEND=0,5 einen Text senden. Nach eintippen des Befehls ins Terminal erscheint ein \u0026gt; das verdeutlichen soll, dass Sie nun den Text eintippen können. Fünf Zeichen reichen für ein Hallo. Ein Wechsel zu dem Browser ist aber leider enttäuschend, denn dort wird immer noch das Seite-Laden Symbol angezeigt. Das liegt scheinbar daran, dass die Verbindung noch nicht geschlossen wurde. Sie können also nun entweder die 3 Minuten warten, oder Sie schließen mit AT+CIPCLOSE=0 die Verbindung zu diesem Gerät. Nach dem Schließen sehen Sie nun ein einfaches Hallo im Browser.\nNach dem Eintippen dem und Senden einer Nachricht mittel CISENDerscheint übrigens oft die Meldung wrong syntax und ERROR gefolgt von SEND OK. Das scheint vorzukommen, wenn man mehr Zeichen sendet als vorher angegeben. Ich schätze, dass man zwei Zeichen extra eingeplant werden müssen, vermutlich wegen dem CR und NL des Terminals. Gelegentlich trifft man aber auch die richtige Anzahl von Zeichen und die Fehlermeldungen erscheinen nicht. Ich muss diesbezüglich noch ein wenig rumprobieren, aber des Senden scheint nicht beeinträchtigt zu sein.\nEs gibt auch die Möglichkeit außerhalb eines Browser eine Verbindung aufzubauen. Dazu kann ein TCP-Client genutzt werden. Ich habe mir einen solchen Client im Google Playstore heruntergeladen und konnte so eine Verbindung herstellen und Daten hin und her schicken. Der erste Schritt für eine App wäre also gemacht.\nApp: TCP-Client im Google PlayStore\n","permalink":"https://fkainka.de/wlan-modul-server-einrichten/","summary":"\u003cp\u003eDie Verbindung zu anderen Geräten steht nun, egal ob Sie das Modul als AP oder als Client benutzen. Doch nun sollten die Geräte auch miteinander kommunizieren können. Deswegen wird in diesem Teil ein Server eingestellt. Auf diesen Server kann dann z.B. über ein Handy zugegriffen und Daten übermittelt werden. Doch der Reihe nach.\u003c/p\u003e\n\u003cp\u003eZunächst einmal muss eine Einstellung vorgenommen werden und zwar die Einstellung \u003cstrong\u003eAT+CIPMUX=1\u003c/strong\u003e. Dies ermöglicht, \u003cstrong\u003emehrere Verbindungen gleichzeitig\u003c/strong\u003e aufbauen zu dürfen. Ich habe noch nicht genau herausgefunden warum diese Einstellung nötig ist, Tatsache ist aber, dass sich der \u003cstrong\u003eServer nicht starten lässt wenn diese Einstellung nicht gemacht wurde\u003c/strong\u003e. Ein wichtiger Punkt ist, dass sich\u003cstrong\u003ediese Konfiguration nicht speichert\u003c/strong\u003e. Das bedeutet, Sie müssen diesen Befehl \u003cstrong\u003ejedes Mal neu eingeben,\u003c/strong\u003e wenn Sie das Modul neu eingeschaltet oder resetet haben.\u003c/p\u003e","title":"WLAN Modul ESP8266 - Server einrichten"},{"content":"Die erste Verbindung war nun bereits insofern erfolgreich, dass Daten die das Modul geschickt hat, ausgelesen werden konnten. Ob auch Daten in Form von Befehlen an das WLAN-Modul gesendet werden können steht also noch nicht fest. Dazu benötigen Sie nun wieder ein Terminal Programm – am besten den Serial Monitor der Arduino Software. Sie können zwar auch andere Terminals benutzen, allerdings werden die Befehle nur erkannt, wenn sie in einem besonderen Format geschickt werden. Sie müssen nämlich nach jedem Befehl nicht nur das (Carriage Return) Zeichen, sondern auch das NL (New Line) Zeichen senden. Die meisten Terminalprogramme senden CR wenn Sie Enter drücken, allerdings nicht NL. Im Arduino Terminal lässt sich diese Funktion einstellen, wie Sie auf dem unteren Bild sehen können.\nDie Baudrate betrug bei mir übrigens 9600. Auf diversen Seiten habe ich aber auch von einer Standarteinstellung von 115200 oder 57600 gelesen. Wenn Sie also Nichts oder nur Kauderwelsch empfangen, probieren Sie ein bisschen mit der Baudrate herum. Wenn Sie beim Einschalten des Moduls den Text empfangen ist das ja schon ein gutes Zeichen, dass die Baudrate stimmt. Nun können Sie testen, ob Sie Befehle senden können. Bei den Befehlen handelt es sich um sogenannte AT-Befehle (at steht für attention). Das erste Kommando das Sie ausprobieren können lautet einfach AT. Es sollt ein einfaches OKzurückkommen. Das Kommando hat keine Funktion, außer dass Sie nun wissen, dass die Kommunikation einwandfrei funktioniert. Sie können nun auch einen der folgenden Befehle ausprobieren:\nAT+GMR Gibt Firmware Version aus\nAT+RST Resetet den Controller\nAT+CIOBAUD= Stellt neue Baudrate ein (in diskreten Werten bis 921600)\nAT+CIOBAUD? Fragt die aktuelle Baudrate ab\nSie sollten immer auf die Großbuchstaben achten, sonst kommt ein Error zurück. Übrigens können Sie bei fast allen Befehlen ein Fragezeichen anhängen, um die aktuelle Einstellung abzufragen.\nNun wird es Zeit das Modul mit einem anderen WLAN-fähigen Gerät verbunden werden. Es gibt drei Varianten, wie sich das Modul dabei verhalten soll.\nDie erste Variante ist das Modul als AccesPoint zu verwenden. Das bedeutet, dass das Modul sozusagen wie ein Router funktioniert und ein WLAN-Netzwerk bereitstellt. Andere Geräte, wie z.B. Smartphones können sich dann in dieses Netzwerk einwählen. Die Verbindung zwischen Modul und Handy ist also direkt. Der Vorteil ist vor allem, dass kein Router oder WLAN vorhanden sein muss.\nDie zweite Variante ist, dass das Modul als Client funktioniert. Das bedeutet, dass das sich das Modul mit einem bestehenden, z.B. von einem Router bereitgestellten WLAN, verbindet. Dazu muss natürlich das WLAN-Passwort vorhanden sein. DerVorteil ist hier natürlich, dass von allen Geräten im WLAN auf das Modul zugegriffen werden kann. Außerdem kann das Modul über einen Router der mit dem Internet verbunden ist, auch auf das Internet zugreifen.\nDie dritte Variante ist, dass das Modul beide oberen Varianten gleichzeitig zu Verfügung stellt. Es können Sich also Geräte direkt mit dem Modul als AP verbinden oder über den Router eine Verbindung aufbauen.\nModul als AP (Acces Point) Um den Controller als reinen AccesPoint einzustellen müssen Sie den BefehlAT+CWMODE=2 senden. Dies ist meist auch die Standarteinstellung des Moduls. Nun können Sie ein anderes WLAN-Fähiges Gerät nehmen und das die SSID (=WLAN-Name) des Moduls suchen. Auf dem Bild habe ich meinen Rechner benutzt um die SSID zu finden. Der Name lautete ESP_9EE10B.\nWenn Sie nun auf das WLAN-Netz klicken, wird automatisch eine Verbindung aufgebaut. Ein Passwort ist nicht nötig, da keins definiert wurde. Mit dem Befehl AT+CWLIFkönnen Sie alle verbundenen Clients anzeigen lassen. Über den folgenden Befehl können Sie den Netzwerknamen ändern und ein Passwort sowie andere Parameter einstellen:\nAT+CWSAP=\u0026quot;\u0026quot;,\u0026quot;\u0026quot;[,,]\n= SSID\n= Password\n= Kanal 1\u0026hellip;14\n= Verschlüsselung: 0 = Offen, 1 = WEP, 2 = WPA_PSK, 3 = WPA2_PSK, 4 WPA_WPA2_PSK\nModuls als Client Wenn Sie das Modul als Client verwenden möchten, müssen Sie zunächst die EinstellungCWMODE auf 1 oder 3 (für AP und Client) setzen. Also mit z.B. folgendem Befehl: AT+CWMODE=1. Nun können Sie zunächst einmal nach bestehenden Netzwerken suchen und zwar mit dem Befehl AT+CWLAP. Nach einer kurzen Zeit werden alle gefundenen WLAN-Netzwerke aufgelistet.\nSie können sich nun mit folgendem Befehl mit einem der Netzwerke verbinden:\nAT+CWJAP=\u0026quot;\u0026quot;,\u0026quot;\u0026quot;\n= SSID\n= Passwort\nWenn der Verbindungsaufbau erfolgreich war erscheint die Meldung OK.\nMit dem Befehl AT+CIFSR kann nun die aktuelle IP ausgegeben werden. Sollten Sie das Modul im AP und Client Modus simultan laufen haben, werden hier zwei IPs angezeigt. Die Daten des WLANs sowie die meisten andere Einstellungen bleiben übrigens gespeichert. Das bedeutet, dass sich das Modul auch nach wiederanschließen an eine Spannungsversorgung automatisch mit dem gespeicherten WLAN verbindet.\n","permalink":"https://fkainka.de/wlan-modul-verbindung-aufbauen/","summary":"\u003cp\u003eDie erste Verbindung war nun bereits insofern erfolgreich, dass Daten die das Modul geschickt hat, ausgelesen werden konnten. Ob auch Daten in Form von Befehlen an das WLAN-Modul gesendet werden können steht also noch nicht fest. Dazu benötigen Sie nun wieder ein Terminal Programm – am besten den \u003cstrong\u003eSerial Monitor der Arduino Software\u003c/strong\u003e. Sie können zwar auch andere Terminals benutzen, allerdings werden die Befehle nur erkannt, wenn sie in einem \u003cstrong\u003ebesonderen Format\u003c/strong\u003e geschickt werden. Sie müssen nämlich \u003cstrong\u003enach jedem Befehl nicht nur das \u003cCR\u003e (Carriage Return) Zeichen, sondern auch das NL (New Line) Zeichen senden\u003c/strong\u003e. Die meisten Terminalprogramme senden CR wenn Sie Enter drücken, allerdings nicht NL. Im Ar\u003cstrong\u003eduino Terminal lässt sich diese Funktion einstellen\u003c/strong\u003e, wie Sie auf dem unteren Bild sehen können.\u003c/p\u003e","title":"WLAN-Modul ESP8266 - Verbindung aufbauen"},{"content":"Vielleicht ist dem ein oder anderen bereits das WLAN Modul ESP8266 über den Weg gelaufen. Es scheint sehr populär zu sein. Das liegt vermutlich daran, dass es besonders günstig ist. Mit nicht einmal 3-4€ direkt aus China oder für 7-10€ von einem Distributor in Deutschland ist das Modul bei Ebay zu finden. Also ein sehr günstige Alternative beispielswiese zum Arduino Yun mit rund 70€. Also habe ich mir gleich eines dieser Module bei einem deutschen Ebay-Händler bestellt und einige erste Versuche zum Thema Internet of Things unternommen.\nInbetriebnahme des ESP8266 Moduls Es scheint verschiedene Versionen und Typen des Moduls zu geben. Meine Variante ist auf dem Bild oben abgebildet. Vermutlich handelt es sich um Version 3. Die Platine hat einen 8-Pin-Stecker und muss mit 3,3 V betrieben werden. Dies scheint besonders wichtig zu sein, da es an mehreren Stellen erwähnt wird. Die des Öfteren vorkommende 5-V-Toleranz von Modulen gilt hier nicht.\nAuf 3,3V umgebautes FTDI-Board mit aufsteckten Steckverbindungen (damit die Kabel passen) Auf 3,3 V umgebautes FTDI-Board mit aufsteckten Steckverbindungen (damit die Kabel passen)\nAngesteuert wird das Modul über eine serielle Schnittstelle, ebenfalls mit 3,3-V-Pegeln. Deswegen habe ich ein umgebautes FTDI-Board benutzt, wie auf dem Bild ersichtlich. Allerdings muss man die einen oder anderen Besonderheiten beachten.\nESP8266 Pinout von oben Pinbelegung des Moduls von unten Dies ist das Pinout des Moduls von unten (auf meisten anderen Seiten andersherum!). In meinem ersten Versuch habe ich das Modul ganz gewöhnlich mit Spannung versorgt, und RXT und TXD über kreuzt (RXD mit TXD vom FTDI-Board verbinden und andersherum) mit den Pins des FTDI-Boards verbunden. Die rote PowerLED des Boards hat auch geleuchtet, allerdings blieben alle Kommunikationsversuche ohne Reaktion. Nach ein wenig Recherche fand ich schließlich raus, dass der PD Pin auf High geschaltet werden muss. Doch als ich den Pin mit VCC vom FTDI-Board verbunden habe, kam der USB-Disconect-Sound und das Modul war Spannungslos. Ich dachte zunächst, dass ich den Reset-Pin erwischt hätte. Es hat sich allerdings rausgestellt, dass die Leistung des FTDI-Boards in dieser Konstellation tatsächlich nicht ausreichte. Auf einer Seite habe ich gelesen, dass das Modul beim Start bis zu 200mA benötigt. Also musste ich eine externe Spannungsquelle dazuschalten.\nNun ist das aufgetreten, was in mehreren Quellen beschrieben wurde: Beim Einschalten blinkt die blaue Status LED kurz auf und die rote Power LED bleibt konstant an. Bei geöffneten Arduino Terminal erscheint zudem folgende Meldung:\nEin erster Erfolg: Die Kommunikation steht.\n","permalink":"https://fkainka.de/wlan-modul-esp8266-erste-schritte/","summary":"\u003cp\u003eVielleicht ist dem ein oder anderen bereits das \u003cstrong\u003eWLAN Modul ESP8266\u003c/strong\u003e über den Weg gelaufen. Es scheint sehr populär zu sein. Das liegt vermutlich daran, dass es besonders günstig ist. Mit nicht einmal \u003cstrong\u003e3-4€ direkt aus China\u003c/strong\u003e oder für \u003cstrong\u003e7-10€ von einem Distributor in Deutschland\u003c/strong\u003e ist das Modul bei Ebay zu finden. Also ein sehr günstige Alternative beispielswiese zum Arduino Yun mit rund 70€. Also habe ich mir gleich eines dieser Module bei einem deutschen Ebay-Händler bestellt und einige erste Versuche zum Thema \u003cstrong\u003eInternet of Things\u003c/strong\u003e unternommen.\u003c/p\u003e","title":"WLAN Modul ESP8266 - Erste Schritte"},{"content":"auf meiner Homepage.\nHier finden Sie verschiedene Projekte, Informationen und Support zu meinen Büchern und Lernpaketen.\nDiejenigen, die bereits öfter auf meine Seite gestoßen sind, werden sich eventuell über das neue Design wundern. Ich verspreche mir durch die Umstellung auf Wordpress eine bessere Übersicht über die Artikel und auch mehr Spaß beim Stöbern. Weitere praktische Funktionen sind unter anderem die Auflistung von Stichwörtern, über die man direkt alle themenspezifischen Beiträge aufgelistet bekommt, sowie die neue Suchfunktion am rechten Rand. Ich hoffe, dass man so schneller findet, was man wirklich braucht.\nDie alte Webseite ist übrigens immer noch unter old.fkainka.de zu erreichen, wird aber in Zukunft nicht mehr mit neuen Artikeln versorgt. Ich habe mir Mühe gegeben, die alten Links, die in Büchern und an anderen Stellen zu findenden sind, mit der neuen Struktur der Seite in Einklang zu bringen. Sollte dennoch ein Link ins Leere laufen, können Sie mir jederzeit eine Mail schreiben. Ein passendes Kontaktformular finden Sie im Impressum.\nIn diesem Sinne, viel Spaß beim Stöbern,\nFabian Kainka\nDie letzen Änderungen Befehlsliste Mbed.org 29/01/2015\nMehr Lesen \u0026gt;\nKurzinfos zum WLAN-Mod\u0026hellip; 28/01/2015\nMehr Lesen \u0026gt;\n[![Zum Aufbau:\nAn die Modul-Pins GND (grauer Draht) und RXD (weiß) habe ich jeweils kurze Verbindungsdrähte angelötet. Das Modul selbst ist leicht schräg in ein Steckboard gesteckt, so dass die beiden oben erwähnten Pins keine Verbindung haben. Dafür kommt man über die interne Verdahtung des Steckboards gut an die Pins VCC (gelb/orange) undTXD (braun). Der PD Pin ist direkt mit einer Drahtbrücke mit VCC verbunden. RXD ist mit dem Arduino Pin 10 und TXD mit Pin11verbunden. VCC wird mit dem 3,3 V-Power-Pin verbunden und GND mit GND.](/images/2015/01/Wlan17.jpg)](/wlan-modul-esp8266-und-arduino/ \"WLAN Modul ESP8266 und Arduino\") WLAN Modul ESP8266 und\u0026hellip; 28/01/2015\nMehr Lesen \u0026gt;\nWLAN Modul ESP8266 \b\u0026hellip; 28/01/2015\nMehr Lesen \u0026gt;\nWLAN-Modul ESP8266 \b\u0026hellip; 28/01/2015\nMehr Lesen \u0026gt;\nWLAN Modul ESP8266 \b\u0026hellip; 28/01/2015\nMehr Lesen \u0026gt;\nFeatured [![Zum Aufbau:\nAn die Modul-Pins GND (grauer Draht) und RXD (weiß) habe ich jeweils kurze Verbindungsdrähte angelötet. Das Modul selbst ist leicht schräg in ein Steckboard gesteckt, so dass die beiden oben erwähnten Pins keine Verbindung haben. Dafür kommt man über die interne Verdahtung des Steckboards gut an die Pins VCC (gelb/orange) undTXD (braun). Der PD Pin ist direkt mit einer Drahtbrücke mit VCC verbunden. RXD ist mit dem Arduino Pin 10 und TXD mit Pin11verbunden. VCC wird mit dem 3,3 V-Power-Pin verbunden und GND mit GND.](/images/2015/01/Wlan17.jpg)](/wlan-modul-esp8266-und-arduino/ \"WLAN Modul ESP8266 und Arduino\")[WLAN Modul ESP8266 und...](/wlan-modul-esp8266-und-arduino/ \"WLAN Modul ESP8266 und Arduino\") Programmieren für Kid\u0026hellip;\nSchnellstart: Arduino \u0026hellip;\nDie automatisierte Kü\u0026hellip;\nDie Arduino IR-Library\nService Programmieren für Kid\u0026hellip;\nSchnellstart mit dem C\u0026hellip;\nSchnellstart mit dem \u0026hellip;\nAnmerkungen zum „GMC\u0026hellip;\nArduino Starterpakete\n","permalink":"https://fkainka.de/home/","summary":"\u003cp\u003eauf meiner Homepage.\u003c/p\u003e\n\u003cp\u003eHier finden Sie verschiedene \u003cstrong\u003eProjekte\u003c/strong\u003e, \u003cstrong\u003eInformationen\u003c/strong\u003e und \u003cstrong\u003eSupport\u003c/strong\u003e zu meinen Büchern und Lernpaketen.\u003c/p\u003e\n\u003cp\u003eDiejenigen, die bereits öfter auf meine Seite gestoßen sind, werden sich eventuell über das neue Design wundern. Ich verspreche mir durch die Umstellung auf Wordpress eine bessere Übersicht über die Artikel und auch mehr Spaß beim Stöbern. Weitere praktische Funktionen sind unter anderem die Auflistung von Stichwörtern, über die man direkt alle themenspezifischen Beiträge aufgelistet bekommt, sowie die neue Suchfunktion am rechten Rand. Ich hoffe, dass man so schneller findet, was man wirklich braucht.\u003c/p\u003e","title":"Willkommen"},{"content":"Mit diesem Paket baust du dir einen eigenen programmierbaren Computer. Entwickle deine ersten selbst-geschriebenen Programme und steig ein in die coole Welt der Softwareprogrammierung. Mit nur wenigen Handgriffen steht dein Computer bereit. Drück auf den Startknopf und erlebe den Spaß, den selbst programmierte Spiele bereiten.\nProgrammieren für Kids im Elo-Shop\nBefehlsliste GMC-4\n","permalink":"https://fkainka.de/programmieren-fuer-kids/","summary":"\u003cp\u003eMit diesem Paket baust du dir einen eigenen programmierbaren Computer. Entwickle deine ersten selbst-geschriebenen Programme und steig ein in die coole Welt der Softwareprogrammierung. Mit nur wenigen Handgriffen steht dein Computer bereit. Drück auf den Startknopf und erlebe den Spaß, den selbst programmierte Spiele bereiten.\u003c/p\u003e\n\u003cp\u003eProgrammieren für Kids im Elo-Shop\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/der-gmc-4-befehlssatz/\" title=\"Der GMC-4 Befehlssatz\"\u003eBefehlsliste GMC-4\u003c/a\u003e\u003c/p\u003e","title":"Programmieren für Kids"},{"content":"Ich habe mir schon vor geraumer Zeit kleine 433MHz Sender- und Empfänger-Module bestellt, mit dem Ziel, meine kaputte Funksteckdosenfernbedienung zu ersetzen. Nun habe ich die Module wiederentdeckt und mich an einen neuen Versuch gewagt. Ich muss sagen ich war sehr überrascht, dass alles auf Anhieb funktioniert hat.\nDas von mir verwendetet Funkmodul trägt den Namen XD-FST und ist besonders günstig. Auf dieser Seite sind die wenigen zu bekommenden Informationen zusammengengefasst:\nhttp://forum.hobbycomponents.com/viewtopic.php?f=39\u0026amp;t=1324\nSteuern wollte ich Funksteckdosen vom Typ ME FLS 100 die ich vor einiger Zeit bei Reichelt bestellt hatte:\nAls Controller habe ich einen Arduino Uno verwendet. Der Aufbau ist sehr simpel:\nDer Grund warum das Projekt so einfach war, lag vor allem an der guten Library, die einem fast alle Arbeit abnimmt. Gefunden habe ich Sie unter\nhttps://code.google.com/p/rc-switch/\nDas Beispiel TypeB_WithRotaryOrSlidingSwitches entsprach genau dem Protokoll der von mir verwendeten Funksteckdosen. Die einzigen Anpassungen musste ich bei den beiden Parametern in dem SiwtchON/OFF Aufruf machen. Nach dem Einspielen hat alles auf anhieb funktioniert. Das erlebt man wirklich nicht alle Tage!\nZum Schluss noch der Quelltext zum erwähnten Beispiel:\n/*\nExample for outlets which are configured with two rotary/sliding switches.\nhttp://code.google.com/p/rc-switch/\n*/\n#include \u0026lt;RCSwitch.h\u0026gt;\nRCSwitch mySwitch = RCSwitch();\nvoid setup() {\n// Transmitter is connected to Arduino Pin #10\nmySwitch.enableTransmit(10);\n// Optional set pulse length.\n// mySwitch.setPulseLength(320);\n}\nvoid loop() {\n// Switch on:\n// The first parameter represents the setting of the first rotary switch.\n// In this example it\u0026rsquo;s switched to \u0026ldquo;1\u0026rdquo; or \u0026ldquo;A\u0026rdquo; or \u0026ldquo;I\u0026rdquo;.\n//\n// The second parameter represents the setting of the second rotary switch.\n// In this example it\u0026rsquo;s switched to \u0026ldquo;4\u0026rdquo; or \u0026ldquo;D\u0026rdquo; or \u0026ldquo;IV\u0026rdquo;.\nmySwitch.switchOn(1,4);\n// Wait a second\ndelay(1000);\n// Switch off\nmySwitch.switchOff(1, 4);\n// Wait another second\ndelay(1000);\n}\n","permalink":"https://fkainka.de/funksteckdosen-steuern/","summary":"\u003cp\u003eIch habe mir schon vor geraumer Zeit kleine 433MHz Sender- und Empfänger-Module bestellt, mit dem Ziel, meine kaputte Funksteckdosenfernbedienung zu ersetzen. Nun habe ich die Module wiederentdeckt und mich an einen neuen Versuch gewagt. Ich muss sagen ich war sehr überrascht, dass alles auf Anhieb funktioniert hat.\u003cbr\u003e\nDas von mir verwendetet Funkmodul trägt den Namen \u003cstrong\u003eXD-FST\u003c/strong\u003e und ist besonders günstig. Auf dieser Seite sind die wenigen zu bekommenden Informationen zusammengengefasst:\u003c/p\u003e","title":"Funksteckdosen Steuern"},{"content":"Der Arduino Yún gehört zu den neusten Kreationen der Arduino-Macher. Ausgestattet mit einem WLAN-Modul und einem eigenen Linux-Controller sollen Netzwerkbasierte Projekte so einfach werden wie noch nie. Die ersten Spielereien haben mich wirklich überzeugt. Nach kurzer Zeit hatte ich den Controller eingerichtet und mein erstes Programm über das Netzwerk auf den Controller übertragen können. Und schon das zweite Beispielprogramm ermöglicht es, die I/O-Pins des Boards zu Steuern, ganz bequem vom Browser aus. Aber zuerst einmal die ersten Schritte.\nDen Yun Konfigurieren Bevor man mit dem Arduino Yun richtig loslegen kann, muss man diesem zuerst mitteilen in welches WLAN-Netz er sich mit welchem Passwort einloggen soll. Diese Konfiguration geht wirklich sehr einfach.\nZuallererst muss der Arduino mit Strom versorgt werde. Am Einfachsten ist es, den Yún einfach über die Mikro-USB-Buchse mit dem PC zu verbinden. Der Rechner findet dann auch einen Arduino, aber das ist zunächst einmal uninteressant.\nViel interessanter ist, dass man mit PC oder Tablet oder sonst einem Gerät ein neues WLAN-Netzwerk in seiner Umgebung finden kann. Dieses Netzwerk trägt den Text**„Arduino Yun“ und zusätzlich noch die MAC-Adresse**. Verbinden Sie nun ein Gerät, im einfachsten Fall Ihren Heim-PC mit diesem offenen und ungeschützten Netzwerk.\nAls nächstes öffnen Sie mit einem Browser Ihrer Wahl die Seite: http://arduino.local . Es sollte ich nun die unten abgebildete Seite geöffnet haben. Hat dies nicht funktioniert, können Sie es direkt über die IP versuchen: http://192.168.240.1 .\nAuf der Loginseite des Arduinos müssen Sie nun ein Passwort eingeben. Im Auslieferungszustand lautet dies einfach: arduino . Nach dem erfolgreichen Login klicken Sie auf den Configure-Button. Die Konfigurationsoberfläche ist auf dem unteren Bild zu sehen.\nHier können Sie die verschiedensten Dinge einstellen. Am interessantesten sind aber zu Beginn die Wireless Parameters. Hier können Sie Iher Netzwerk auswählen und dasWLAN-Passwort eingeben. Ich empfehle aussderdem dem API-Acces auf Open zu stellen. Das hat den Zweck, dass Sie nicht bei jedem HTML-Befehl das Passwort eingeben müssen. Nachdem Sie alles eingestellt haben klicken Sie auf Configure \u0026amp; Restart.\nDas Arduino-Netzwerk sollte nun verschwunden sein und Sie können sich wieder in Ihrem Netzwerk anmelden, falls Ihr Rechner dies nicht sowieso automatisch macht. Nach einer kurzen Wartezeit können Sie Testen, ob der Yún sich erfolgreich verbunden hat. Dazu rufen Sie wieder die Seite http://arduino.local auf. Der Weg über die IP Funktioniert diesmal voraussichtlich nicht, da Ihr Netzwerk einen anderen Adressraum hat. Sollten Sie den Arduino um genannt haben, müssen Sie das arduino in der Adresse durch den neuen Namen ersetzen.\nWas ist, wenn der Arduino sich nicht verbunden hat, weil Sie sich z.B. Beim WLAN-Passwort vertippt haben? Sie können die WLAN-Einstellungen reseten indem Sie für 5-30 Sekunden auf den WLAN-Button auf dem Controller drücken. Dieser befindet sich neben dem großen USB-Port.\nDie Software Laden Der Yún ist nun mit dem Netzwerk verbunden. Um Ihn aber erfolgreich programmieren zu können, müssen Sie auch die neuste Arduino IDE installieren. Den Link zur Arduino Seite:\nhttp://arduino.cc/en/main/software\nMeine derzeitige Version lautet: Arduino 1.5.6-r2 BETA\nUm die neue Software zu installieren, werden alle älteren Versionen deinstalliert. Wenn Sie also wichtige Änderungen vorgenommen haben, sollten Sie eine Sicherung erstellen. Starten Sie nach der Installation die Software. Im Idealfall finden Sie nun unter Ports eine Bezeichnung mit IP so wie in dem unteren Bild. Aber vor allem unter Windows müssen Sie vermutlich erst einmal den Bonjour-Dienst von Apple installieren. Diese ist eigentlich dafür gedacht, dass sich Computer und WLAN-Drucker schneller finden. Der Link:http://support.apple.com/kb/DL999 .\nBeachten Sie, dass Ihre Firewall den Port 5353 für den Dienst freigegeben haben muss. Ich hatte mit der Windows-Firewall zuerst Probleme.\nBeispiele Testen Wenn die Arduino Software nun den Port sehen kann, können Sie auch versuchen, ein Programm über WLAN auf den Controller zu übertragen. Als ersten Test nehme ich immer das Blink-Beispiel. Nach dem Programmieren sollte die mit L13 gekennzeichnete LED auf dem Board blinken.\nHat der erste Test geklappt, können Sie sich an etwas interessanteres wagen. Öffnen Sie dasBeispiel Bridge im gleichnamigen Unterordner und übertragen Sie es auf den Controller. Das Beispiel zeigt, wie einfach die Steuerung des I/O-Pins über einen belieben Browser sein kann. Folgendes müssen Sie zum Beispiel in Ihren Browser eingeben, damit Pin13 (an dem sich auch die LED L13 befindet) eingeschaltet wird:\nhttp://arduino.local/arduino/digital/13/1\nEine Ausgabe im Browser informiert Sie sogar darüber, ob der Vorgang erfolgreich war.\nWeite Befehle zum Testen finden Sie auch in den Anfangskommentaren des Beispiels. Unter diesen Links können Sie aber ebenfalls verschiedenes ausprobieren, zumindest wenn Sie Ihren Controller nicht umbenannt haben:\nhttp://arduino.local/arduino/analog/13/128\nhttp://arduino.local/arduino/analog/2\nhttp://arduino.local/arduino/mode/13/input\n","permalink":"https://fkainka.de/schnellstart-arduino-yun/","summary":"\u003cp\u003eDer Arduino Yún gehört zu den neusten Kreationen der Arduino-Macher. Ausgestattet mit einem WLAN-Modul und einem eigenen Linux-Controller sollen Netzwerkbasierte Projekte so einfach werden wie noch nie. Die ersten Spielereien haben mich wirklich überzeugt. Nach kurzer Zeit hatte ich den Controller eingerichtet und mein erstes Programm über das Netzwerk auf den Controller übertragen können. Und schon das zweite Beispielprogramm ermöglicht es, die I/O-Pins des Boards zu Steuern, ganz bequem vom Browser aus. Aber zuerst einmal die ersten Schritte.\u003c/p\u003e","title":"Schnellstart: Arduino Yún"},{"content":"Die Welt der Mikrocontroller kann spannend und aufregend sein, doch der Einstieg fällt meist schwer. Eine Fülle neuer Vokabeln und Möglichkeiten machen die ersten Schritte kompliziert. Aus diesem Grund hilft Ihnen dieses Buch beim Einstieg in die Welt der Mikrocontroller an dem Beispiel des Chipkit Uno32 Boards von Mikrochip.\nDateien zum Buch\nDas Buch bei Conrad\nDas Buch mit Board bei Conrad\n","permalink":"https://fkainka.de/schnellstart-mit-dem-chipkit-uno32/","summary":"\u003cp\u003eDie Welt der Mikrocontroller kann spannend und aufregend sein, doch der Einstieg fällt meist schwer. Eine Fülle neuer Vokabeln und Möglichkeiten machen die ersten Schritte kompliziert. Aus diesem Grund hilft Ihnen dieses Buch beim Einstieg in die Welt der Mikrocontroller an dem Beispiel des Chipkit Uno32 Boards von Mikrochip.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/DateienUno32.zip\"\u003eDateien zum Buch\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.conrad.de/ce/de/product/1232737/Franzis-Verlag-Schnellstart-mit-dem-chipKIT-Uno32-Entwicklungs-Board-Fabian-Kainka-Seitenanzahl-48-ISBN-Nr-978-3-645\"\u003eDas Buch bei Conrad\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.conrad.de/ce/de/product/1271063/Schnellstart-mit-dem-chipKIT-Uno32-Entwicklungs-Board-Conrad-TDGL002\"\u003eDas Buch mit Board bei Conrad\u003c/a\u003e\u003c/p\u003e","title":"Schnellstart mit dem ChipKIT-Uno32"},{"content":"Zurzeit spiele ich mit dem Arduino Ethernet Board rum. Dieses Board ist kein Shield, welches man auf einen anderen Arduino aufsteckt, sondern ein eigenständiges Board mit Controller, ähnlich dem Arduino Uno. Nachteil: Es gibt keinen integrierten USB-Controller, mit dem man das Board direkt über USB programmieren kann. Deswegen habe ich einen Arduino Uno als Programmer benutzt.\nUm einen Arduino als ISP-Progammer einsetzen zu können, sind nur wenige Schritte nötig:\nZuallererst mussder Arduino Uno mit dem ISP-Programm bespielt werden. Das Programm findet in unter den Beispielen. Nun kann man das Ethernet Board wie auf dem Bild gezeigt mit dem Arduino Uno verbinden: Unter Tools \u0026gt; Programmer müssen Sie nun Arduino as ISP auswählen und unter Tools \u0026gt; Board das Arduino Ethernet. Bei der Programmierung muss man nun beachten, dass man nicht den üblichen Weg geht, und einfach auf das Upload Symbol klickt. Sollte dies doch passieren muss man den Arduino Uno erneut mit dem ISP-Programm bespielen. Stattdessen gibt es unterDatei den Punkt Upload mit Programmer. Diesen sollten Sie zukünftig für die Programmierung benutzen. Die Tastenkombination für den Schnellzugriff lautet:Strg+Umschalt+U. Man kann den Arduino nun übrigens auch dazu benutzen andere Mikrocontrontroller direkt zu programmieren. Auf den unten verlinkten Seiten finden Sie dazu Details:\nhttp://pdp11.byethost12.com/AVR/ArduinoAsProgrammer.htm\nhttp://arduino.cc/en/Tutorial/ArduinoISP\n","permalink":"https://fkainka.de/arduino-als-isp-programmer/","summary":"\u003cp\u003eZurzeit spiele ich mit dem \u003ca href=\"http://arduino.cc/en/Main/ArduinoBoardEthernet\"\u003eArduino Ethernet Board\u003c/a\u003e rum. Dieses Board ist kein Shield, welches man auf einen anderen Arduino aufsteckt, sondern ein eigenständiges Board mit Controller, ähnlich dem Arduino Uno. Nachteil: Es gibt keinen integrierten USB-Controller, mit dem man das Board direkt über USB programmieren kann. Deswegen habe ich einen Arduino Uno als Programmer benutzt.\u003c/p\u003e\n\u003cp\u003eUm einen Arduino als ISP-Progammer einsetzen zu können, sind nur wenige Schritte nötig:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eZuallererst mussder Arduino Uno mit dem ISP-Programm bespielt werden. Das Programm findet in unter den Beispielen.\u003c/li\u003e\n\u003cli\u003eNun kann man das Ethernet Board wie auf dem Bild gezeigt mit dem Arduino Uno verbinden:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/EthernetIPS31.jpg\"\u003e\u003cimg alt=\"EthernetIPS3\" loading=\"lazy\" src=\"http://wp.fkainka.de/wp-content/uploads/2015/01/EthernetIPS31-213x300.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"Arduino als ISP Programmer"},{"content":"Der schnelle Einstieg in die Welt des Kinetis Series, ARM® Cortex™-M0+32-Bit Mikrocontroller: Dieses Buch hilft Ihnen von den ersten Schritten bis hin zum ersten größeren Projekt. Dabei lernen Sie nicht nur die Eigenschaften und Besonderheiten des vorgestellten Boards FRDM-KL25Z kennen, Sie bekommen ebenfalls Tipps zur Online-Programmierumgebung Mbed.org und den Möglichkeiten der Hardware-Erweiterungen. Dank der vielen praktischen Versuche zum Nachprogrammieren bleibt der Spaß dabei nicht auf der Strecke. Zuletzt hilft Ihnen die Befehlsliste auch nach dem Lesen noch beim Verwirklichen eigener Ideen und Projekte. Also viel Spaß beim Ausprobieren!\nDas Buch bei Conrad\nDas Buch mit Board bei Conrad\nLink zum Online-Compiler\nBefehlsliste Mbed.org\n","permalink":"https://fkainka.de/kl25z/","summary":"\u003ch2 id=\"der-schnelle-einstieg-in-die-welt-des-kinetis-series-arm-cortex-m032-bit-mikrocontroller\"\u003eDer schnelle Einstieg in die Welt des Kinetis Series, ARM® Cortex™-M0+32-Bit Mikrocontroller:\u003c/h2\u003e\n\u003cp\u003eDieses Buch hilft Ihnen von den ersten Schritten bis hin zum ersten größeren Projekt. Dabei lernen Sie nicht nur die Eigenschaften und Besonderheiten des vorgestellten Boards FRDM-KL25Z kennen, Sie bekommen ebenfalls Tipps zur Online-Programmierumgebung Mbed.org und den Möglichkeiten der Hardware-Erweiterungen. Dank der vielen praktischen Versuche zum Nachprogrammieren bleibt der Spaß dabei nicht auf der Strecke. Zuletzt hilft Ihnen die Befehlsliste auch nach dem Lesen noch beim Verwirklichen eigener Ideen und Projekte. Also viel Spaß beim Ausprobieren!\u003c/p\u003e","title":"Schnellstart mit dem FRDM-KL25Z"},{"content":"Das GMC-4-Buch ist zwar mittlerweile schon fast ein Jahr alt, aber es macht mir immer noch Spaß mit dem kleinen Computer zu spielen. Dennoch fallen mir immer wieder Dinge auf, die man hätte besser machen können. Das geht wohl nicht nur mir so, denn vor kurzen erreichte mich die Mail eines Lesers, der neben seiner Begeisterung auch ein paar Anmerkungen formuliert hat.\nAn dieser Stelle vielen Dank Arnd Duschek**, der sich die Mühe gemacht hat das ganze Buch durchzuarbeiten und Verbesserungsvorschläge zu formulieren.**\nKapitel 2.2 Klingeltöne und mehr S.22 Mitte\n„…eine Dauer, die als Vielfaches von 0,1 Sekunden angegeben wird.“\nDas stimmt so nicht. Vielmehr stehen die für die Dauer möglichen Werte noch nicht einmal in einem linearen Verhältnis zueinander, sondern repräsentierten konkrete Längen aus der Notenlehre:\nWert Dauer 0 sechzehntel Note 1 achtel Note 2 achtel Note, punktiert 3 viertel Note 5 viertel Note, punktiert 7 halbe Note B halbe Note, punktiert F ganze Note „Ein A markiert den Start, dann…“\nVorne muss kein A stehen, sondern es sind die Werte 0\u0026hellip;F zulässig, die das Gesamttempo der Melodie bestimmen!\nKapitel 3.2 Das erste Programm S.46 Mitte\n„Starten des Programms: \u0026lt;1\u0026gt; “\nDas stimmt natürlich. Aber für Programmier-Anfänger ist es wirklich wissenswert, dass man ein Programm auch schrittweise ausführen kann.\nEs gibt folgende Möglichkeiten:\nTastenkombination Modus LEDs zeigen Adresse an Tasten-Ton Reset, 1, Run Run Nein Nein Reset, 2, Run Run Ja Nein Reset, 5, Run Step Nein Nein Reset, 6, Run Step Ja Ja Im STEP-Mode wird das Programm dann mittels der INCR-Taste schrittweise ausgeführt.\nKapitel 3.5 Ein Speicher-Rechner S.53\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 02 5 (statt 6) 06 F0D (statt F0C) 0D (statt 0C) 0D (statt 0C) E0 (statt 0E) Der Jump-Befehl (F0A) ab Adresse 0A verbraucht 3 Nibbles in den Adressen 0A, 0B und 0C, weshalb der nachfolgende CAL bei 0D (und eben nicht bei 0C) beginnt.\n„…geht es weiter bei Adresse 0C, sonst bei Adresse 0A, …“\nDas muss verbessert werden zu:\n„…geht es weiter bei Adresse 0D, sonst bei Adresse 09, …“\nKapitel 3.7 LED- und Soundausgabe S.56\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 00 (statt 5) S.57\n„Wenn diese Rechnung einen Übertrag verursacht, gibt es einen Piepton und die sechste LED leuchtet auf.“\nLeider bleibt diese LED ab diesem Zeitpunkt dauerhaft eingeschaltet, selbst wenn man danach wieder eine Addition ohne Übertrag ausführt. Hinter Adresse 09 (Befehl A0) könnte man daher noch ein TIY 6 und ein CAL RSTR einfügen! Natürlich muss dann aber auch der JUMP-Befehl an Adresse 06 angepasst werden, weil sich die Zieladresse 0D durch das Einfügen der Befehle nach hinten verschiebt.\nKapitel 3.8 Der bedienerfreundliche Rechner S.60\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 03 02 (statt 00) Springe nach 02 (statt nach 00) 0F (statt 5) Kapitel 4.1 Sekundenzähler S.65\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 0B Y=Y+1 (statt Y=A+1) Kapitel 4.2 Der Countdown läuft S.66\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 0B Y=Y+F bzw. Y=Y-1(statt Y=A+F, A=A-1) Der JUMP an Adresse 12 ist überflüssig, da er einfach nur zur nächsten Zeile springt.\nS.67 unten\n„Sie benötigen aber eine 9 und tippen diese ein, …“\nDas muss heißen: „Sie benötigen aber ein A und tippen dieses ein, …“\n„Nun folgen mehrere Adressen, an denen schon das Gewünschte steht.“\nDas stimmt nicht: An Adresse 03 muss die 9 des Vorprogramms noch durch eine 7 ersetzt werden.\nKapitel 4.4 Ereigniszähler S.70\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 03 Austausch A mit B, Y mit Z (statt „Tastendruck…“) 04 Hierhin gehört der Kommentar, der fälschlicherweise bei 03 stand („Tastendruck…“) 08 Austausch A und B (statt A und Z) 10 Austausch A und B (statt A und Z) 18 Austausch A und B (statt A und Z) S.71 oben\n„…wird vorübergehend das Z-Register verwendet.“\nDas muss heißen: „…wird vorübergehend das B-Register verwendet.“\nKapitel 4.5 Der automatische Komponist S.73 oben\n„Beim Start nach einem Reset hat das Y-Register den Wert 0.“\nEs hat den Wert F !\nBeweis durch ein kleines Programm mit den Anweisungen CY und AO.\nS.73 Mitte\n„Das A-Register beginnt mit 0. Minus 1 ergibt F, beim nächsten Mal E, dann D usw. bis 0.“\nKorrekt ist:\n„Das A-Register beginnt mit F. Minus 1 ergibt E, beim nächsten Mal dann D usw. bis 0.“\nKapitel 4.6 Ein Lauflicht S.74\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 00 0 (statt 1) 17 EC (statt Ec) 1F 13 (statt 1313) Kapitel 4.7 Blinkenlight S.77\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 14 14 (statt 13) Kapitel 4.8 Memory S.80\nProgramm-Listing (nur verbesserte Zeilen):\nAdresse Code Befehl Daten Kommentar 03 RAM(50+Y)=A (statt A=RAM(50+Y) S.81\nDie JUMP-Befehle an den Adressen 31 und 38 müssen vermutlich nach 12 (und nicht nach 10) springen, weil an Adresse 10 nämlich gar kein Befehl beginnt!\nKapitel 6.1 Der Befehlssatz S.94\nZu Code 7 muss es korrekt heißen:\nA von RAM-Adr(50+Y) subtrahieren (statt RAM-Adr(50+Y) von A subtrahieren).\nKapitel 6.2 Unterprogramme S.96\nWichtig wäre zu erwähnen, dass sämtliche Unterprogramme nur ausgeführt werden, wenn vorher das Flag gesetzt ist!\nAußerdem gibt es noch die Codes EE (Befehl CAL DEM-) und EF (Befehl CAL DEM+), die mit dezimaler(!) Subtraktion und Addition zu tun haben. Der Befehl CAL DEM+ ist sogar sehr mächtig, weil er beliebig viele Überträge auf höherwertige Ziffern selbst managed. Dennoch sind die Befehle relativ kompliziert zu erklären. Man findet aber Näheres im Internet.\n","permalink":"https://fkainka.de/anmerkungen-zum-gmc-4-spielecomputer-buch/","summary":"\u003cp\u003eDas GMC-4-Buch ist zwar mittlerweile schon fast ein Jahr alt, aber es macht mir immer noch Spaß mit dem kleinen Computer zu spielen. Dennoch fallen mir immer wieder Dinge auf, die man hätte besser machen können.  Das geht wohl nicht nur mir so, denn vor kurzen erreichte mich die Mail eines Lesers, der neben seiner Begeisterung auch ein paar Anmerkungen formuliert hat.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAn dieser Stelle vielen Dank Arnd Duschek\u003c/strong\u003e**, der sich die Mühe gemacht hat das ganze Buch durchzuarbeiten und Verbesserungsvorschläge zu formulieren.**\u003c/p\u003e","title":"Anmerkungen zum „GMC-4 Spielecomputer“-Buch"},{"content":"Wie man den Widerstandswert eines Widerstandes berechnet werden\ndie Meisten schon wissen. Allerdings geht es mir manchmal so, dass ich kurz\nvergesse, welche Farbe für welchen Wert steht. Also gibt es hier eine kompakte\nAuflistung für alle diejenigen, die das gleiche Problem haben. Aber nicht vergessen: beim letzten Ring gibt der Wert die Anzahl der nachstehenden Nullen an.\nFarbe Farbe Wert 0 Schwarz 0 1 Braun 1 2 Orange 2 3 Rot 3 4 Gelb 4 5 Grün 5 6 Blau 6 7 Violett 7 8 Grau 8 9 Weiß 9 ","permalink":"https://fkainka.de/widerstand-farcode-tabelle/","summary":"\u003cp\u003eWie man den Widerstandswert eines Widerstandes berechnet werden\u003cbr\u003e\ndie Meisten schon wissen. Allerdings geht es mir manchmal so, dass ich kurz\u003cbr\u003e\nvergesse, welche Farbe für welchen Wert steht. Also gibt es hier eine kompakte\u003cbr\u003e\nAuflistung für alle diejenigen, die das gleiche Problem haben. Aber nicht vergessen: beim letzten Ring gibt der Wert die Anzahl der nachstehenden Nullen an.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eFarbe\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eFarbe\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eWert\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSchwarz\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eBraun\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOrange\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRot\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGelb\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGrün\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eBlau\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eViolett\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e8\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGrau\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e8\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e9\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eWeiß\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e9\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Widerstand Farcode Tabelle"},{"content":"Wie man auf dem Bild recht gut sehen kann, ist der SD-Karten-Slot meines Raspberry Pi’s leicht beschädigt. Am oberen Rand ist eine kleine Kante abgebrochen, die für den Halt der SD-Karte aber sehr wichtig ist. Die Karte ist dank diesem Defekt immer leicht rausgerückt und der kleine Mini-Pc immer wieder abgestürzt. Im Internet habe ich aber folgende Möglichkeit gefunden diesen Defekt zu beheben:\nhttp://raspi.tv/2012/how-to-fix-a-broken-sd-card-slot-on-your-raspberry-pi\nAuf dieser Seite wird eine ausgediente Kreditkarte benutzt, um der SD-Karte wieder den nötigen halt zu geben. Wenn man beide Teile etwas anraut und Kleber an relevanten Stellen (nicht dort wo sich der Metallkontakt befindet) aufbringt hält das System relativ gut. Ich empfehle mit der Feile aber noch etwas vom Plastik zu entfernen, damit die Karte auch wirklich auf die Kontakte gedrückt wird. Bei mir sah das so aus:\nDie Reparatur scheint geglückt zu sein. Trotzdem betrachte ich das nur als Übergangslösung. Den passenden SD-Karten-Slot kann man bestimmt im Internet bestellen und scheint auch leicht auslötbar zu sein.\n","permalink":"https://fkainka.de/sd-kartenslot-eines-raspberry-pis-reparieren/","summary":"\u003cp\u003eWie man auf dem Bild recht gut sehen kann, ist der SD-Karten-Slot meines Raspberry Pi’s leicht beschädigt. Am oberen Rand ist eine kleine Kante abgebrochen, die für den Halt der SD-Karte aber sehr wichtig ist. Die Karte ist dank diesem Defekt immer leicht rausgerückt und der kleine Mini-Pc immer wieder abgestürzt. Im Internet habe ich aber folgende Möglichkeit gefunden diesen Defekt zu beheben:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://raspi.tv/2012/how-to-fix-a-broken-sd-card-slot-on-your-raspberry-pi\"\u003ehttp://raspi.tv/2012/how-to-fix-a-broken-sd-card-slot-on-your-raspberry-pi\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAuf dieser Seite wird eine ausgediente Kreditkarte benutzt, um der SD-Karte wieder den nötigen halt zu geben. Wenn man beide Teile etwas anraut und Kleber an relevanten Stellen (nicht dort wo sich der Metallkontakt befindet) aufbringt hält das System relativ gut. Ich empfehle mit der Feile aber noch etwas vom Plastik zu entfernen, damit die Karte auch wirklich auf die Kontakte gedrückt wird. Bei mir sah das so aus:\u003c/p\u003e","title":"Sd-Kartenslot eines Raspberry Pi’s reparieren"},{"content":"Vor geraumer Zeit habe ich ja bereits meine automatisierte Küchenleuchte vorgestellt (Link). Diese war auch lange Zeit in Benutzung, aber nun war es doch an der Zeit, einen Mikrocontroller den Job übernehmen zu lassen. Der Grund ist vor allem, dass es leichter ist das Programm seinen Wünschen anzupassen. Insgesamt habe ich nämlich vor, die Automatisierung immer weiter zu verbessern.\nDie derzeitige Konfiguration sieht so aus:\nDie Hauptsteuereinheit ist hier ein Arduino Uno. Dieser steuert via PWM vier der hier vorgestellten Power-MOSFETs an. An diese habe ich ein RGB-Stripe und eine Power-LED angeschlossen. Als Auslöser dient folgendes Bewegungsmelder-Modul:\nGleich fünf dieser Module hab ich günstig in einem namen haften Online-Auktionshaus erworben. Mit zwei Reglern kann man die Empfindlichkeit und die Schaltdauer einstellen. Die Empfindlichkeit habe ich komplett hoch gesetzt, die Schaltdauer auf gering, denn der Arduino soll das Signal selbst auswerten. Allerdings wäre es mit diesen Modulen auch möglich, irgendetwas direkt anzusteuern. Das Modul selbst läuft mit 5 V. Der Ausgangspegel liegt bei 3,3 V, was aber dennoch ausreicht um von einem Arduino als high erkannt zu werden.\nAlles in allem sieht das gelötete Shield schließlich so aus:\nAn den Pins 11-9 ist der RGB Stripe angeschlossen, am Pin 3 die Power-LED und an Pin 7 der Bewegungsmelder. Genaueres kann man im Sketch aber noch gut lesen.\nDas Programm funktioniert ähnlich wie die Analoge-Lösung von damals, hat aber auch einige Verbesserungen:\nWenn der Bewegungsmelder ausgelöst wird, werden die RGB-LEDs langsam (ca. 2 Sekunden) auf einen angenehmen Gold-Gelb-Ton geschaltet. Diese Stufe wird dann eine Minute beibehalten. Zeigt der Melder dann immer noch eine Bewegung, wird die Power LED dazu geschaltet. Das hat den Zweck, dass man sich eben was aus der Küche holen kann, dabei aber nicht die volle Beleuchtung braucht. Bleibt man aber länger dort, um z.B. zu Kochen, wird auch das Arbeitslicht aktiviert. Wenn eine Minute lang keine Bewegung registriert wird, werden alle LEDs etwas dunkler. Das dient als Warnung, sodass man gegebenenfalls nochmal Triggern kann, und die LEDs wieder hell werden. Bleibt die Bewegung aus, erlischt das Licht komplett.\nDas Listing Listing //Die LEDs int rot= 10; int gruen= 9; int blau= 11; int weiss = 3; int iRot, iGruen, iBlau, iWeiss; int sRot, sGruen,sBlau,sWeiss; //Die Sensoren int sens1 = 7; int sens2 = A5; void setup() { pinMode(rot, OUTPUT); pinMode(blau, OUTPUT); pinMode(gruen, OUTPUT); pinMode(weiss, OUTPUT); pinMode (sens1, INPUT); pinMode (sens2, INPUT); } void loop() { if (digitalRead(sens1)){pKueche();} } void pKueche() { sFade (255,150,10,0,10); delay(30000); while (digitalRead(sens1)){ sFade (255,150,10,255,10); for (int x=0; x iRot){sRot= sRot+1;} if (vRot iGruen){sGruen= sGruen+1;} if (vGruen iBlau){sBlau= sBlau+1;} if (vBlau iWeiss){sWeiss= sWeiss+1;} if (vWeiss \u0026lt; iWeiss){sWeiss= sWeiss-1;} sPwm(sRot, sGruen, sBlau, sWeiss); delay(vZeit); } } void sPwm(byte vRot, byte vGruen, byte vBlau, byte vWeiss) { analogWrite(rot, vRot) ; analogWrite(gruen, vGruen) ; analogWrite(blau, vBlau) ; analogWrite(weiss, vWeiss) ; iRot = vRot; iGruen= vGruen; iBlau = vBlau; iWeiss = vWeiss; } YouTube Film Externer Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ ","permalink":"https://fkainka.de/die-automatisierte-kuechenbeleuchtung/","summary":"\u003cp\u003eVor geraumer Zeit habe ich ja bereits meine automatisierte Küchenleuchte vorgestellt (\u003ca href=\"http://wp.fkainka.de/bewegungsmelder-fuer-die-kueche/\" title=\"Bewegungsmelder für die  Küche\"\u003eLink\u003c/a\u003e). Diese war auch lange Zeit in Benutzung, aber nun war es doch an der Zeit, einen Mikrocontroller den Job übernehmen zu lassen. Der Grund ist vor allem, dass es leichter ist das Programm seinen Wünschen anzupassen. Insgesamt habe ich nämlich vor, die Automatisierung immer weiter zu verbessern.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDie derzeitige Konfiguration sieht so aus:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDie Hauptsteuereinheit ist hier ein Arduino Uno. Dieser steuert via PWM vier der \u003ca href=\"http://wp.fkainka.de/power-led-mini-shield/\" title=\"RGB Strip Mini Shield\"\u003ehier vorgestellten\u003c/a\u003e Power-MOSFETs an. An diese habe ich ein RGB-Stripe und eine \u003ca href=\"http://wp.fkainka.de/10-w-powerleds/\" title=\"10-W-PowerLEDs\"\u003ePower-LED\u003c/a\u003e angeschlossen. Als Auslöser dient folgendes Bewegungsmelder-Modul:\u003c/p\u003e","title":"Die automatisierte Küchenbeleuchtung"},{"content":"ACHTUNG: Bei diesem Projekt ist leider ein Arduino Uno über den Jordan gegangen. Am Ende des Artikels steht mehr dazu, also vor dem Nachbau bitte lesen!\nViele werden das Problem mit Arduino kennen: die Leistung an den Pins reicht einfach nicht aus um damit größere Lasten zu steuern. Bei mir ist das Problem aufgetreten, als ich meine Power-LED-Lampen und meine RGB-Stripes mit einem Arduino Uno steuern wollte. Die 40 mA und 5 V pro Pin reichen nicht mal annähernd um diese Dinge vernünftig ansteuern zu können. Die Lösung ist bekannt: Leistungstreiber.\nIch habe ein paar Leistungstreiber auf einem Steckboard ausprobiert und die meisten funktionierten auch recht gut. Viele sind aber vergleichsweise teuer oder packen die geforderte Leistung nicht (einen ULN2003 habe ich so auch gekillt). Aber dann hat mich mein Vater auf folgende SMD-Mosfet aufmerksam gemacht:\nReichelt Link\nInfos auf Mikrocontroller.net\nDie Eckdaten:\nN-Kanal MOSFET Sehr geringer Innenwiderstand Max. Drain-Source Spannung: 20V Maximaler Drain Strom: 4.2A Also im Grunde genau das, was der Mensch immer mal wieder braucht, und dann noch für kleines Geld. Einziger Nachteil: die Bauteile sind SMD und somit etwas komplizierter zu löten. Nach ein wenig gefummelt hatte ich aber dieses kleine System zusammengebaut:\nDer Widerstand (hier 260 Ohm, weil gerade da) ist eine Sicherheitsmaßname um den Controller zu schützen und dient gleichzeitig als Anschluss-Beinchen, z.B. für ein Steckboard. Auf dem Bild sieht man auch, wie man dieses System anschließen muss, um mit dem 5V Ausgang eines Controllers eine Last mit größerer Spannung ansteuern zu können (hier 12 V und ca 1A). Nach ersten Tests habe ich mich an eine weitere Variante getraut:\nDieses kleine, sagen wir mal Shield, ist quasi das System von oben, nur mit 3 weiteren Transistoren. Außerdem kann man an dem Stecker, der vom Shield weg ragt, direkt ein RGB-Stripe anschließen. Die Wiederstände dienen auch hier wieder als Stecker. Die Abstände wurden dabei so gewählt, das man recht unkompliziert die PWM-Pins und den GND-Anschluss eines Arduinos (hier Uno, geht aber mit den meisten anderen System genauso) treffen kann.\nDas große Rote Kabel muss an die +12 V Versorgungsspannung angeschlossen werden. Ich hatte dies Kabel zuerst in den Vin-Pin des Arduinos, allerdings ist der Polyswitch Widerstand dabei sehr warm geworden. Vermutlich ist der Pin also nicht direkt mit dem Stecker der externen Spannungsversorgung verbunden. Also habe ich einfach das Kabel an den Stecker angelötet und damit das Problem gelöst\nNachtrag: Der Artikel war gerade fertig und ich war gerade dabei die letzten Fotos zu mache, da stieg eine kleine Rauchwolke vom ATmega328 des Arduino Unos auf. Es ist noch nicht hundertprozentig geklärt was die Ursache war. Einige Messungen haben aber ergeben, dass auch ein Transistor seine Eigenschaften verändert hat. Es wird noch ermittelt was die genau Ursache war. Zur Zeit ist ein klassischer Kurzschluss in Verdacht. Mehr dazu in Balde.\nNachtrag 2: Ich habe das Shield noch einmal nachgebaut und es scheint sich wirklich um einen Kurzschluss an der Power-Led gehandelt zu haben. Die genauen Umstände wie dabei der Uno etwas abbekommen konnte werden z.Z. noch geklärt.\n","permalink":"https://fkainka.de/power-led-mini-shield/","summary":"\u003cp\u003e\u003cstrong\u003eACHTUNG\u003c/strong\u003e: Bei diesem Projekt ist leider ein Arduino Uno über den Jordan gegangen. Am Ende des Artikels steht mehr dazu, also vor dem Nachbau bitte lesen!\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eViele werden das Problem mit Arduino kennen:  die Leistung an den Pins reicht einfach nicht aus um damit größere Lasten zu steuern. Bei mir ist das Problem aufgetreten, als ich meine Power-LED-Lampen und meine RGB-Stripes mit einem Arduino Uno steuern wollte. Die 40 mA und 5 V pro Pin reichen nicht mal annähernd um diese Dinge vernünftig ansteuern zu können. Die Lösung ist bekannt:  Leistungstreiber.\u003c/p\u003e","title":"RGB Strip Mini Shield"},{"content":"Ich habe nach einer möglichst einfachen Art gesucht, Infrarot Fernbedienungen auszulesen. Wie für Arduino üblich habe ich auch nach kurzer Zeit eine passende Library gefunden:\nhttp://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html\nAuf der Seite von Ken Shirriff kann man sich die Dateien runterladen, inlusive einiger Beispiele. Besonders geeignet: IRrecDemo um damit Signale direkt auszulesen oder IRrecDump um auch Informationen über das verwendete Protokoll zu bekommen. Alles was man dafür benötigt ist ein IR-Empfangs-Modul. Die Ausgabe erfolgt über das Terminal.\nAuf dem Bild sieht man im Terminal den Code der empfangen wurde. Die Eins steht für das Protokoll (NEC) und die lange Zahl repräsentiert den Code. Auf dem unten Bild ist das verwendete IR-Modul abgebildet. Die Pins sind aber von Typ zu Typ unterschiedlich.\nBei meinem ersten Test habe ich das Beispiel IRrecvDemo angepasst. Die Versorgungspins des Moduls habe ich einfach die in freie Pins des Controllers gesteckt, um mir Arbeit bei der Verdrahtung zu sparen. Im Programm musste ich nur die entsprechenden Pins High oder Low setzen. Da das Modul unter 40 mA benötigt und 5 V kompatibel ist, kann in diesem Fall ohne Bedenken so vorgehen.\nNachtrag zu neueren Arduino Versionen: In den neueren Arduino Versionen (vermutlich ab 1.5 BETA) ist die IR-Library in der Robot-Library integriert. Das führt aber anscheinend zu Problemen beim Kompilieren. In einem Forumeintrag habe ich die Lösung zu diesem Problem gefunden. Die Dateien IRremoteTools.cpp und IRremoteTools.h in dem Arduino Programmordner *libraries\\RobotIRremote\\src* scheinen doppelt vorhanden zu sein. Deswegen habe ich diese beiden Dateien in einen Ordner unabhängig der Arduino Umgebung zwischen gespeichert. Mutige können die Dateien auch einfach löschen. Danach kann man die Library einfach einbinden und das Programm kompilieren. Der Fehler wurde anscheinend auch in der neuen Version 1.6 nicht behoben.\nDas angepasste Programm:\nQuelltext /*\n* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv\n* An IR detector/demodulator must be connected to the input RECV_PIN.\n* Version 0.1 July, 2009\n* Copyright 2009 Ken Shirriff\n* http://arcfn.com\n*/\n#include \u0026lt;IRremote.h\u0026gt;\nint RECV_PIN = 11;\nint gnd = 12;\nint vcc = 13;\nIRrecv irrecv(RECV_PIN);\ndecode_results results;\nvoid setup()\n{\nSerial.begin(9600);\nirrecv.enableIRIn(); // Start the receiver\npinMode(gnd, OUTPUT);\npinMode(vcc, OUTPUT);\ndigitalWrite (gnd, LOW);\ndigitalWrite (vcc, HIGH);\n}\nvoid loop() {\nif (irrecv.decode(\u0026amp;results)) {\nSerial.println(results.value);\nSerial.println(results.decode_type);\nirrecv.resume(); // Receive the next value\n}\n}\n","permalink":"https://fkainka.de/die-arduino-ir-library/","summary":"\u003cp\u003eIch habe nach einer möglichst einfachen Art gesucht, Infrarot Fernbedienungen auszulesen. Wie für Arduino üblich habe ich auch nach kurzer Zeit eine passende Library gefunden:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html\"\u003ehttp://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAuf der Seite von Ken Shirriff kann man sich die Dateien runterladen, inlusive einiger Beispiele. Besonders geeignet: IRrecDemo um damit Signale direkt auszulesen oder IRrecDump um auch Informationen über das verwendete Protokoll zu bekommen. Alles was man dafür benötigt ist ein IR-Empfangs-Modul. Die Ausgabe erfolgt über das Terminal.\u003c/p\u003e","title":"Die Arduino IR-Library"},{"content":"Arduino ist eine ganz eigene Welt mit einer großen Vielfalt unterschiedlicher Platinen und eigenen Begriffen wie Sketch (Programm) oder Shield (aufsteckbare Zusatzplatine). Das System richtet sich auch an Leute, die sonst weniger mit Mikrocontrollern zu tun haben. Und trotzdem können sich hier und da kleinere Hürden auftun.\nDeswegen bietet werden bei Franzis bestellte Arduino-Controller mit einem kleinen Handbuch ausgeliefert das beim Einstieg in die Arduino-Welt zur Hand geht. Auf dieser Seite finden Sie die im Buch erwähnten Materialien und Links zum Downloaden und Durchklicken.\nViel Spaß beim Entdecken!\nService zu den Büchern: Befehlsliste\nLinkliste\nDownloads: Arduino Uno\nArduino Leonardo/Micro\nArduino Mega\nMehr Informationen im Elo-Shop: Das Franzis Starterpaket Arduino Mega 2560\nDas Franzis Starterpaket Arduino Uno\nDas Franzis Starterpaket Arduino Leonardo\nAlle Bücher auch als Ebooks: Arduino Mega 2560\nArduno Uno\nArduino Leonardo\nArduino Micro\n","permalink":"https://fkainka.de/arduino-starterpakete/","summary":"\u003cp\u003eArduino ist eine ganz eigene Welt mit einer großen Vielfalt unterschiedlicher Platinen und eigenen Begriffen wie Sketch (Programm) oder Shield (aufsteckbare Zusatzplatine). Das System richtet sich auch an Leute, die sonst weniger mit Mikrocontrollern zu tun haben. Und trotzdem können sich hier und da kleinere Hürden auftun.\u003c/p\u003e\n\u003cp\u003eDeswegen bietet werden bei Franzis bestellte Arduino-Controller mit einem kleinen Handbuch ausgeliefert das beim Einstieg in die Arduino-Welt zur Hand geht. Auf dieser Seite finden Sie die im Buch erwähnten Materialien und Links zum Downloaden und Durchklicken.\u003c/p\u003e","title":"Arduino Starterpakete"},{"content":"Linkliste Link Beschreibung Sprache http://arduino.cc/forum/ Offizielles Arduino Forum Viel in Englisch aber auch auf Deutsch http://playground.arduino.cc/ Tutorials, Anleitungen und mehr. Auf Englisch mit deutscher Unterseite (z.Z. noch im Aufbau) http://www.mikrocontroller.net Immer eine gute Wahl, wenn es um Mikrocontroller geht Komplett auf Deutsch mit unzähligen, strukturierten Themen http://arduino.cc/en/Reference/HomePage Komplette Befehlsliste Auf Englisch http://www.arduino-tutorial.de/ Gutes Tutorial mit vielen Erklärungen für Einsteiger Deutsch http://playground.arduino.cc/ interfacing/processing Hilfe zum Thema Arduino und Processing Englisch http://shieldlist.org/ Liste aller Arduino-Shields Englisch http://www.golem.de/specials/arduino/ Interessante Projekte mit ausführlichen Artikeln Deutsch http://www.arduinoforum.de/ Projekte und Hilfe Deutsch http://fff2.at/drupal/content/arduino-projekte Projekte und Code-Beispiele Deutsch http://www.ladyada.net/make/ Projekte Englisch http://wiring.org.co/ learning/basics/index.html Code-Beispiele Englisch http://playground.arduino.cc/Projects/Ideas Projekt Ideen Englisch http://hacknmod.com/hack/ top-40-arduino-projects-of-the-web/ Top 40 Arduino Projekte Englisch http://practicalarduino.com/projects Projekte Englisch http://fritzing.org/projects/ Projekte Englisch http://www.arduinoevilgenius.com/projects Projekte Englisch http://hacknmod.com/topics/arduino/ Projekte ","permalink":"https://fkainka.de/arduino-linkliste/","summary":"\u003ch1 id=\"linkliste\"\u003eLinkliste\u003c/h1\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eLink\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBeschreibung\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSprache\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://arduino.cc/forum/\"\u003ehttp://arduino.cc/forum/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOffizielles Arduino Forum\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eViel in Englisch aber auch auf Deutsch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://playground.arduino.cc/\"\u003ehttp://playground.arduino.cc/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eTutorials, Anleitungen und mehr.\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAuf Englisch mit deutscher Unterseite (z.Z. noch im Aufbau)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.mikrocontroller.net/\"\u003ehttp://www.mikrocontroller.net\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eImmer eine gute Wahl, wenn es um Mikrocontroller geht\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eKomplett auf Deutsch mit unzähligen, strukturierten Themen\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://arduino.cc/en/Reference/HomePage\"\u003ehttp://arduino.cc/en/Reference/HomePage\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eKomplette Befehlsliste\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAuf Englisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.arduino-tutorial.de/\"\u003ehttp://www.arduino-tutorial.de/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGutes Tutorial mit vielen Erklärungen für Einsteiger\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDeutsch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://playground.arduino.cc/interfacing/processing\"\u003ehttp://playground.arduino.cc/ interfacing/processing\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eHilfe zum Thema Arduino und Processing\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://shieldlist.org/\"\u003ehttp://shieldlist.org/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe aller Arduino-Shields\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.golem.de/specials/arduino/\"\u003ehttp://www.golem.de/specials/arduino/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInteressante Projekte mit ausführlichen Artikeln\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDeutsch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.arduinoforum.de/\"\u003ehttp://www.arduinoforum.de/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte und Hilfe\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDeutsch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://fff2.at/drupal/content/arduino-projekte\"\u003ehttp://fff2.at/drupal/content/arduino-projekte\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte und Code-Beispiele\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDeutsch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.ladyada.net/make/\"\u003ehttp://www.ladyada.net/make/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://wiring.org.co/learning/basics/index.html\"\u003ehttp://wiring.org.co/ learning/basics/index.html\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eCode-Beispiele\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://playground.arduino.cc/Projects/Ideas\"\u003ehttp://playground.arduino.cc/Projects/Ideas\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekt Ideen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://hacknmod.com/hack/top-40-arduino-projects-of-the-web/\"\u003ehttp://hacknmod.com/hack/ top-40-arduino-projects-of-the-web/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eTop 40 Arduino Projekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://practicalarduino.com/projects\"\u003ehttp://practicalarduino.com/projects\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://fritzing.org/projects/\"\u003ehttp://fritzing.org/projects/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://www.arduinoevilgenius.com/projects\"\u003ehttp://www.arduinoevilgenius.com/projects\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEnglisch\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003e\u003ca href=\"http://hacknmod.com/topics/arduino/\"\u003ehttp://hacknmod.com/topics/arduino/\u003c/a\u003e\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eProjekte\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Arduino Linkliste"},{"content":"Oft ist es so, dass man plötzlich vergisst, wie man jetzt gerade in dieser Programmiersprache einen Bestimmten Befehl formulieren muss. Deswegen steht hier eine Auflistung der wichtigsten Befehle. Benutzen Sie Stg+F um in der Seite nach etwas bestimmten zu suchen.\nBefehl Schreibweise Grundlegendes Grundstruktur void setup() { }void loop() {} Variable deklarieren (Typ Integer, Wert = 0) int led = 0; Konstante deklarieren (Typ Integer, Wert = A0) const int analogInPin = A0; Array deklarieren (Typ Integer, 6 Werte) int Arrayname[6] = {2, 4, -8, 3, 2}; Pin-Funktion festlegen pinMode(led, OUTPUT); Library einbinden #include \u0026lt;libX.h\u0026gt; Ausgaben/Eigaben Pin auf HIGH schalten digitalWrite(led,HIGH); PWM-Pin auf maximal Wert setzen analogWrite(led, 255); Digitalen Zustand von Pin schalter lesen digitalRead(schalter) Funktion: Analog Pin A0 auslesen analogRead(A0) Ton Ausgabe an Pin8, Frequenz x, länge y tone(8, x, y) Ton Ausgabe an Pin8 stoppen noTone(8) Serielle Schnittstelle Serielle Schnittstelle initialisieren Serial.begin(9600); Text seriell Ausgeben Serial.print(“Hallo”); Text seriell Ausgeben + neue Zeile Serial.println(“Hallo”); Byte seriell Ausgeben Serial.write(val) Funktion: Anzahl von auslesbaren Bytes Serial.available() Funktion: seriell Einlesen Serial.read(); Funktion: Text im Buffer finden (true/false) Serial.find(\u0026ldquo;TEXT\u0026rdquo;) Funktion: Text i. Buffer finden bis Endetext Serial.findUntil(“TEXT“,“ENDE TEXT“) Speichert Anzahl Bytes in Buffer Serial.readBytes(buffer, length) Speichert Bytes in Buffern bis lenght oder Ende-chracter erreicht Serial.readBytesUntil(character, buffer, length) Funktion: Findet nächste Integerzahl Serial.parseInt() Prozedur aufgerufen wenn Daten vorhanden void serialEvent() A****bfragen/Schleifen If-Abfrage mit Else *if (button == HIGH){**}*else{ } Switch-Abfrage *switch (x) {**case 1:**case 2:*default: Wartezeit (500 ms) delay(500); For-Schleife for (x = 2; x \u0026lt; 7; x++) { } While-Schleife *while (schalter== HIGH) {**}***ODER:**do{} while (schalter==HIGH); Schleife vorzeitig verlassen break; Überspringt ausführbaren Quelltext in Schleife continue; Mathematisches Sinus, Cosinus, Tangens sin(),cos(),tan() Wurzel aus X sqrt(x) X hoch Y : xy pow(x, y) Absolut Wert einer Zahl (Betrag von x) abs(x) Zufällige Zahl random() Vergleiche gleich == ungleich != größer, kleiner \u0026lt;, \u0026gt; Größer oder gleich, kleiner oder gleich \u0026lt;= , \u0026gt;= Funktion: kleinere Zahl von x und y min(x, y) Funktion: größere Zahl von x und y max(x, y) Boolsche Operatoren Und \u0026amp;\u0026amp; Oder * Nicht ! Datentypen Boolean; char; unsigned char; byte; int; unsigned int; word; long; unsigned long; short; float; double; string; String; Datentypkonvertierungen char(); byte(); int(); word(); long(); float() Interrupts Interrupts verbieten noInterrupts() Interrupts erlauben nterrupts() Interrupt an Pin mit Funktion verknüpfen attachInterrupt(interrupt, function, mode) Interrupt Verbindung aufheben detachInterrupt(interrupt) Sonstiges Kommentar eine Zeile // Kommentar längerer Bereich /* */ Array definieren Funktion: Wertebereich transformieren (z.B. 10bit Sensor auf 8bit PWM) map(sensorWert, 0, 1024, 0, 255); Funktion Wertgrenzen bestimmen(alles darüber/darunter wird abgeschnitten) constrain(sensorWert, 0, 255); Bein Funktionen: Wert zurückgeben return x; Zum Sprungpunk hier springen goto hier; Prozedur Void Prozedurname() { } Funktion mit Integer-Rückgabewert und Byte-Parameter int Funktionsname (byte Parameter) {return 13;} Eine komplette Befehlsliste auf Englisch und mit erweiterten Erklärungen finden Sie auch unter http://arduino.cc/en/Reference/HomePage.\n","permalink":"https://fkainka.de/befehlsliste-arduino/","summary":"\u003cp\u003eOft ist es so, dass man plötzlich vergisst, wie man jetzt gerade in dieser Programmiersprache einen Bestimmten Befehl formulieren muss. Deswegen steht hier eine Auflistung der wichtigsten Befehle. Benutzen Sie \u003cstrong\u003eStg+F um in der Seite nach etwas bestimmten zu suchen\u003c/strong\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBefehl\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSchreibweise\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eGrundlegendes\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGrundstruktur\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003evoid setup() {   }\u003cstrong\u003evoid loop()  {\u003c/strong\u003e}\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVariable deklarieren (Typ Integer, Wert = 0)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint led  = 0;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKonstante deklarieren (Typ Integer, Wert = A0)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003econst int analogInPin = A0;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eArray deklarieren (Typ Integer, 6 Werte)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint Arrayname[6] = {2, 4, -8, 3, 2};\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePin-Funktion festlegen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003epinMode(led, OUTPUT);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLibrary einbinden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e#include \u0026lt;libX.h\u0026gt;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eAusgaben/Eigaben\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePin auf HIGH schalten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003edigitalWrite(led,HIGH);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ePWM-Pin auf maximal Wert setzen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eanalogWrite(led, 255);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDigitalen Zustand von Pin \u003cem\u003eschalter\u003c/em\u003e lesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003edigitalRead(schalter)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Analog Pin A0 auslesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eanalogRead(A0)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eTon Ausgabe an Pin8, Frequenz x, länge y\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003etone(8, x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eTon Ausgabe an Pin8 stoppen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003enoTone(8)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSerielle Schnittstelle\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSerielle Schnittstelle initialisieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.begin(9600);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eText seriell Ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.print(“Hallo”);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eText seriell Ausgeben + neue Zeile\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.println(“Hallo”);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eByte seriell Ausgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.write(val)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Anzahl von auslesbaren Bytes\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.available()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: seriell Einlesen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.read();\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Text im Buffer finden (true/false)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.find(\u0026ldquo;TEXT\u0026rdquo;)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Text i. Buffer finden bis Endetext\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.findUntil(“TEXT“,“ENDE TEXT“)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSpeichert Anzahl Bytes in Buffer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.readBytes(buffer, length)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSpeichert Bytes in Buffern bis lenght oder Ende-chracter erreicht\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.readBytesUntil(character, buffer, length)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Findet nächste Integerzahl\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eSerial.parseInt()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eProzedur aufgerufen wenn Daten vorhanden\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003evoid serialEvent()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eA****bfragen/Schleifen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIf-Abfrage mit Else\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*if (button == HIGH){**}*\u003cem\u003eelse{   }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSwitch-Abfrage\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*switch (x) {**case 1:**case 2:*\u003cem\u003edefault:\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWartezeit (500 ms)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003edelay(500);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFor-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003efor (x = 2; x \u0026lt; 7; x++) {      }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWhile-Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*while (schalter== HIGH) {**}***ODER:**\u003cem\u003edo{\u003c/em\u003e} while (schalter==HIGH);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSchleife vorzeitig verlassen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003ebreak;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eÜberspringt ausführbaren Quelltext in Schleife\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003econtinue;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eMathematisches\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSinus, Cosinus, Tangens\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003esin(),cos(),tan()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWurzel aus X\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esqrt(x)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eX hoch Y : xy\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003epow(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAbsolut Wert einer Zahl (Betrag von x)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eabs(x)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZufällige Zahl\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003erandom()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eVergleiche\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003egleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e==\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eungleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e!=\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003egrößer, kleiner\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026lt;, \u0026gt;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGrößer oder gleich, kleiner oder gleich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026lt;= , \u0026gt;=\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: kleinere Zahl von x und y\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003emin(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: größere Zahl von x und y\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003emax(x, y)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eBoolsche Operatoren\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eUnd\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e\u0026amp;\u0026amp;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eOder\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e*\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eNicht\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e!\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eDatentypen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eBoolean; char; unsigned char; byte; int; unsigned int; word; long; unsigned long; short; float; double; string; String;\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eDatentypkonvertierungen\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003echar(); byte(); int(); word(); long(); float()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eInterrupts\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInterrupts verbieten\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003enoInterrupts()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInterrupts erlauben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003enterrupts()\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInterrupt an Pin mit Funktion verknüpfen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eattachInterrupt(interrupt, function, mode)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInterrupt Verbindung aufheben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003edetachInterrupt(interrupt)\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eSonstiges\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKommentar eine Zeile\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003e//\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKommentar längerer Bereich\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e/*                \u003cem\u003e*/\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eArray definieren\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion: Wertebereich transformieren (z.B. 10bit Sensor auf 8bit PWM)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003emap(sensorWert, 0, 1024, 0, 255);\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion Wertgrenzen bestimmen(alles darüber/darunter wird abgeschnitten)\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003econstrain(sensorWert, 0, 255);\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eBein Funktionen: Wert zurückgeben\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003ereturn x;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eZum Sprungpunk \u003cem\u003ehier\u003c/em\u003e springen\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003egoto hier;\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eProzedur\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eVoid Prozedurname() {   }\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFunktion mit Integer-Rückgabewert und Byte-Parameter\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cem\u003eint Funktionsname (byte Parameter) {\u003cstrong\u003ereturn 13;\u003c/strong\u003e}\u003c/em\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEine komplette Befehlsliste auf Englisch und mit erweiterten Erklärungen finden Sie auch unter \u003ca href=\"http://arduino.cc/en/Reference/HomePage\"\u003ehttp://arduino.cc/en/Reference/HomePage\u003c/a\u003e.\u003c/p\u003e","title":"Befehlsliste Arduino"},{"content":"Modul Bus hat eine neue Platine rausgebracht, die einem Steckboard nachempfunden ist. Dadurch ist es noch einfacher, seine Prototypen auf eine dauerhafte Platine zu übertragen. Ich hab ein bisschen mit der Platine rumgespielt und bemerkt, dass man daraus auch schnell mal ein Arduino-Shield basteln kann.\nIm Grund ist der Aufbau sehr einfach. Die beiden LEDs sorgen dafür, dass das Board genügend Abstand zum Arduino hat und nicht so hin und her wackelt. Zusätzliche Stabilität verleiht der Stecker in der Mitte des Boards. Er wird einfach auf die beiden äußeren Kontakte des ISP-Steckers gesteckt. Damit liegt die Platine solide auf und verrutsch nicht. Man könnte auch an dem einen Pin des ISP-Steckers die 5-V-Versorgungsspannung der Controller abgreifen, hierbei ist aber Vorsicht geboten. Die beiden Drähte legen die Versorgungsleitungen +5V und GND auf die beiden äußeren Leitungsbahnen, sodass der Zugriff dauerhaft erleichtert wird.\nDie Platine auf dem Arduino Uno\nDie Platine auf dem Arduino Ehternet\nWie man sieht passt die Platine wunderbar zwischen die Kontakte der Arduinos. Beliebige Pins können leicht mit einem kurzen Draht erreicht werden. Außerdem hat man bereits zwei LEDs vorinstalliert, die man nur mit einem Widerstand mit einem Port verbinden muss, je nach Bedarf. Besonders gut passt die Allround-Platine übrigens auf den Arduino Mega oder den Arduino Due. Die hinteren Leiterbahnen stabilisieren das Board nämlich zusätzlich.\nDie Platine auf dem Arduino Mega\n","permalink":"https://fkainka.de/die-neue-steckboardplatine-als-arduino-shield-2/","summary":"\u003cp\u003e\u003ca href=\"http://www.ak-modul-bus.de/stat/steckboardplatine.html\"\u003eModul Bus hat eine neue Platine rausgebracht, die einem Steckboard nachempfunden ist\u003c/a\u003e. Dadurch ist es noch einfacher, seine Prototypen auf eine dauerhafte Platine zu übertragen. Ich hab ein bisschen mit der Platine rumgespielt und bemerkt, dass man daraus auch schnell mal ein Arduino-Shield basteln kann.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/2015/01/Steckpl1.jpg\"\u003e\u003cimg alt=\"Steckpl1\" loading=\"lazy\" src=\"/images/2015/01/Steckpl1.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIm Grund ist der Aufbau sehr einfach. Die beiden LEDs sorgen dafür, dass das Board genügend Abstand zum Arduino hat und nicht so hin und her wackelt. Zusätzliche Stabilität verleiht der Stecker in der Mitte des Boards. Er wird einfach auf die beiden äußeren Kontakte des ISP-Steckers gesteckt. Damit liegt die Platine solide auf und verrutsch nicht. Man könnte auch an dem einen Pin des ISP-Steckers die 5-V-Versorgungsspannung der Controller abgreifen, hierbei ist aber Vorsicht geboten. Die beiden Drähte legen die Versorgungsleitungen +5V und GND auf die beiden äußeren Leitungsbahnen, sodass der Zugriff dauerhaft erleichtert wird.\u003c/p\u003e","title":"Die neue Steckboardplatine als Arduino Shield"},{"content":"Das Problem: Selbstständige bekommen unterschiedliche Aufgaben auf den Tisch, die meist auch unterschiedlich entlohnt werden. Bei manchen Jobs wird man pro Stunde bezahlt, bei anderen gibt es einen Festpreis und wieder andere werden durch Gewinnbeteiligung vergütet. Dabei den Überblick zu behalten ist schwer. Deswegen muss ein kleines Tool her, mit dem man ohne große Umstände immer protokollieren kann, woran man gerade arbeitet und das später die Auswertung erleichtert.\nDas daraus entstandene Programm ist zu Teilen sehr speziell. Man kann es aber auch beispielsweise dazu verwenden, die Zeit für bestimmte Hobby-Projekte zu protokollieren. Alternativ kann man sich auch einfach nur den Quelltext anschauen und Teile für eigene Projekte übernehmen. Programmiert habe ich dieses Tool in Vb.Net 2012. Die Express-Edition gibt es wieder kostenlos unter folgendem Link:http://www.microsoft.com/visualstudio/deu/downloads\nIch möchte darauf hinweisen, dass das Programm sich noch in der Testphase befindet. Es gibt noch einige Fehler und der Quelltext selbst ist auch nicht gerade vorbildlich programmiert. Zudem gibt es noch einige Ideen für weitere Funktionen, dich ich erst später realisieren werde. Aber jeder, der das Programm oder Teile davon nutzen möchte, kann sich hier die Exe oder den Quelltext downloaden.\nFunktionen des Programms: Erstellen einer Aufgabe und starten einer Aufgabe Das Programm ist beim Start nur ein schmaler grauer Streifen am linken Bildschirmrand. Schiebt man den Mauszeiger nach links erscheint ein weitaus größerer Streifen mit einigen Buttons. Wenn Sie das Programm zum ersten Mal starten, werden Sie nur am unteren Rand Buttons sehen. Sie können mit Klick auf „Neue Aufgabe“ neue Aufgaben erstellen. Zwei Inputboxen fordern Sie dann auf, zuerst einen Aufgaben-Namen und dann einen Auftragsgeber einzugeben. Wenn Sie beides getan haben, erscheint oben im Streifen ein neuer Button, der mit dem Auftragsnamen beschriftet ist. Klicken Sie auf den Button um den Beginn der Aufgabe zu protokollieren. Das Programm hat nun eine neue Datei erstellt, in der sämtliche Tätigkeiten protokolliert werden. Zudem erscheint Ihre aktuelle Aufgabe in einem kleinen Label über dem Button „Auswertung“.\nMöchten Sie eine Pause machen gibt es bereits einen entsprechenden Button unten. Mit Klick auf „Ende“ wird zum einen das Ende Ihrer Arbeit protokolliert und außerdem das Programm beendet. Sie müsse aber nicht vor jedem Herunterfahren des Rechners erst den Ende-Button klicken. Jedes Herunterfahren während das Programm noch läuft wird als Ende der Arbeitszeit protokolliert.\nManuelle Änderungen am Protokoll Sollten Sie einmal Änderungen an Ihrem Protokoll vornehmen wollen, können Sie die Datei „Taetigkeiten.txt“ in Ihrem Programm-Ordner mit einem einfachen Texteditor öffnen. Diese Datei hat eine einfache Struktur: zuerst kommt die Aufgabe und in der darauffolgenden Zeile steht das zugehörige Datum und die Uhrzeit. Änderungen können manuell vorgenommen werden, man sollte aber stets darauf achten, die Struktur einzuhalten und beim Datum und der Zeit immer chronologisch vorzugehen. Das bedeutet nach einer Tätigkeit am 12.09.2013 darf keine Tätigkeit vom 11.09.2013 stehen.\nOptionen Aufgaben Unter dem Button“ Optionen Aufgaben“ können Sie erweiterte Einstellungen zu Ihren eingespeicherten Aufgaben vornehmen. An dieser Stelle können Sie z.B. einen neuen Arbeitgeber eintragen oder die jeweilige Entlohnung angeben. Dabei sollten Sie darauf achten, entweder einen Stundenlohn oder ein Honorar einzutragen. Das Programm wertet nämlich entweder den Gesamtverdienst anhand des Stundenlohns oder den Stundenlohn anhand des Honorars aus. Mit dem Button „Löschen“ wird die Aufgabe aus dem Speicher gelöscht. Vergessen Sie aber bei keiner Änderung „Speichern“ zu drücken, damit sie auch beim nächsten Programmstart übernommen wird.\nAuswertung Die Auswertung sollten Sie nur starten, wenn Sie bereits Tätigkeiten protokolliert haben. Andernfalls kann es zum Programmabsturz kommen. Im Fenster zur Auswertung können Sie sich die Arbeitsdauer und, falls angegeben, den Stundenlohn oder den Verdienst anzeigen lassen.\nSie können im Drop-Down-Menü „Aufgabe“ eine bestimmte Arbeit auswählen, oder Sie wählen das Sternchen aus, um alle Aufgaben in die Auswertung einzubeziehen. Dieselbe Auswahlmöglichkeit haben Sie beim Arbeitgeber. Sollten Sie hier einen bestimmten Arbeitgeber ausgewählt haben, werden auch nur die dazugehörigen Aufgaben ausgewertet. Ähnlich funktioniert dies auch bei den Monaten. Sollten Sie dort eine 0 stehen haben, werden alle Monate berücksichtigt. Sollten Sie aber beispielsweise die 9 auswählen, wird nur der September ausgewertet.\nNach dem Klick auf „Anzeigen“ erscheint die Auswertung im unteren Fenster. Neben den bereits erwähnten Berechnungen zum Honorar/Stundenlohn finden Sie hier auch die Information, wann zum ersten Mal diese Aufgabe protokolliert wurde. Steht dort 00:00:00 wurde noch keine Tätigkeit protokolliert. Weiter unten in der Auswertung finden Sie zudem Angaben zu gesamten Arbeitsstunden und gesamtem Honorar.\nGeplante Funktionen Das Projekt befindet sich, wie bereits erwähnt, noch in der Entwicklungsphase. Es gibt mit Sicherheit noch Fehler, die ich erst mit der Zeit ausmerzen werde. Außerdem gibt es noch ein paar Ideen für die Zukunft:\nZusätzliche Stunden: unter „Optionen Aufgaben“ soll es die Möglichkeit geben, zusätzliche Stunden einzugeben, die mit in die Auswertung einfließen. Das ist hilfreich, wenn man z.B. an einem anderen Rechner gearbeitet hat oder wenn man zum Jahresende die alten Protokolle löscht, da diese zu lang wurden, ein Projekt aber dennoch weiter läuft Einzelne Tage auswerten: Es soll die Möglichkeit gebe, einen einzelnen Tag auswerten zu lassen, damit man sehen kann, was man an diesem Tag alles gemacht hat Bekannte Fehler Ich habe festgestellt, dass die Darstellung von Rechner zu Rechner sehr unterschiedlich ist. (evtl. behoben im Update) Beim ersten Start kommt oft eine Fehlermeldung, dass die Aufgaben-Textdatei nicht gefunden wurde. Man kann aber auf „Continue“ klicken um das Problem fürs erste zu umgehen. Wenn man dann seine ersten Aufgaben eingetragen hat, sollte die Fehlermeldung nicht mehr erscheinen. (evtl. behoben im Update) Beim Löschen von Aufgaben kann es zu Fehlern kommen. Am besten das Programm komplett neustarten. Downloads Exe-Datei: Auswertung1\nQuelltext: WindowsApplication1\nUpdate 1 Bei diesem Update gibt es folgende Änderungen:\nDie Darstellung in Abhängigkeit der Auflösung wurde verbessert (evtl. nur unter Win7)\nEs lassen sich zusätzliche Stunden eintragen (unter „Optionen Aufgaben“)\nMan kann Teilstunden eintragen (z.B. 2 1/2h = 2,5 ) Es lassen sich auch Stunden abziehen indem man ein Minus vor die Stunden schreibt\nEs wird eine neue Textdatei aufgemacht sodass die aktuellen Protokolle nicht beschädigt werden\nDer Fehler der fehlenden Textdateien beim ersten Start wird abgefangen und stattdessen eine Messagebox ausgegeben\nDer Ende-Button beendet nur noch das Programm, trägt aber keine Ende-Zeit ein!!!\nTipp: Das Programm kann automatisch beim Windowsstart starten, indem man eine Verknüpfung der Exe in den Order „Start\u0026gt;Alle Programme\u0026gt;Autostart“ verschiebt\nExe: Auswertung1v1\nQuelltext: WindowsApplication1 v1\nUpdate 2 In diesem Update wurde vor allem die Handhabung verbessert. Das Programm befindet sich nun auf der rechten Seite, da ich vermute, dass man auf dieser Seite weniger häufig zufällig mit der Maus landet. Außerdem erscheint das Fester nur, wenn man 600ms Sekunden auf der Fläche verweilt. Dadurch werden schnelle Mausbewegungen über den Bildschirm ignoriert und überflüssiges Erscheinen der Fläche minimiert. Der obere rechte Punkt, gemeint ist die Stelle, wo sich bei den meisten Programmen die schließen Schaltfläche befindet, wird ebenfalls ignoriert. Man sollte um das Programm zu öffnen also eher mittig zielen. Es gab meist noch Probleme, wenn das Programm wieder verschwinden sollte. Diese tauchten meist dann auf, wenn man auf der Höhe eines Buttons die Fläche des Programms verlassen hat. Dieses Problem sollte nun auch gelöst sein.\nExe: Auswertung1v2\nQuelltext: WindowsApplication1v2\nUpdate 3 Kleine Änderung: Das Programm ist nun wieder auf der linken Seite. Dafür muss man nun etwas mittiger zielen damit sich das Programm öffnet.\nExe: Auswertung1v3\nQuelletxt: WindowsApplication1v3\n","permalink":"https://fkainka.de/zeiterfassung-fuer-hobby-arbeit/","summary":"\u003cp\u003eDas Problem: Selbstständige bekommen unterschiedliche Aufgaben auf den Tisch, die meist auch unterschiedlich entlohnt werden. Bei manchen Jobs wird man pro Stunde bezahlt, bei anderen gibt es einen Festpreis und wieder andere werden durch Gewinnbeteiligung vergütet. Dabei den Überblick zu \u003cimg alt=\"Protokollant\" loading=\"lazy\" src=\"/images/2015/01/Protokollant.jpeg\"\u003ebehalten ist schwer. Deswegen muss ein kleines Tool her, mit dem man ohne große Umstände immer protokollieren kann, woran man gerade arbeitet und das später die Auswertung erleichtert.\u003c/p\u003e\n\u003cp\u003eDas daraus entstandene Programm ist zu Teilen sehr speziell. Man kann es aber auch beispielsweise dazu verwenden, die Zeit für bestimmte Hobby-Projekte zu protokollieren. Alternativ kann man sich auch einfach nur den Quelltext anschauen und Teile für eigene Projekte übernehmen. Programmiert habe ich dieses Tool in Vb.Net 2012. Die Express-Edition gibt es wieder kostenlos unter folgendem Link:\u003ca href=\"http://www.microsoft.com/visualstudio/deu/downloads\"\u003ehttp://www.microsoft.com/visualstudio/deu/downloads\u003c/a\u003e\u003c/p\u003e","title":"Zeiterfassung für Hobby \u0026 Arbeit"},{"content":"von Christian Immler Jeder hat vermutlich schon vom Raspberry Pi gehört und kennt Projekte, die mit diesem kleinen Allround-Talent realisiert wurden. Und vermutlich hatte jeder schon einmal eine Idee für einen sinnvollen Einsatz des kleinen PCs. Doch für viele war das Betriebssystem Linux die Hürde. Mit dem Buch „Linux mit Raspberry Pi“ von Christian Immler kann man diese Hürde nun meistern.\nDas Buch erklärt zu Beginn präzise, wie man erfolgreich Linux auf eine SD Karte installiert und startet. Dabei bezieht sich der Autor vor allem auf die Wheezy-Distribution. Anhand dieser Distribution werden im Laufe des Buches sowohl die absoluten Grundlagen erklärt (Konsolen Befehle, Ordner Strukturen etc.) als auch verschiedene spannende Programme und Projekte vorgestellt. So lernt man schnell und auf anschauliche Weise wie man beispielsweise die GPIO-Ports des Mini-Computers ansteuert, einen eigenen Server erstellt, verschiedene Spiele installiert oder sogar in Python selbst Spiele programmiert. Auch Themen wie alternative Betriebssysteme oder das Installieren und Konfigurieren des Mediacenters XBMC werden in dem Buch behandelt. Durch die Breite an Themen findet wirklich jeder etwas Interessantes und Nützliches.\nDie Darstellung des Buches ist besonders gelungen. Viele anschauliche Bilder unterstützen die gut strukturierten Schritt-für-Schritt-Anleitungen. Zudem geben kleine Infoboxen zwischendurch interessante und nützliche Zusatzinformationen, ohne sich dabei aufzudrängen.\nInsgesamt ist das Buch ideal für jeden, der einen Raspberry besitzt oder kaufen möchte, sich aber mit Linux noch nicht so gut auskennt.\nHier geht\u0026rsquo;s direkt zum Buch\n","permalink":"https://fkainka.de/buch-linux-mit-raspberry-pi/","summary":"\u003ch3 id=\"von-christian-immler\"\u003evon Christian Immler\u003c/h3\u003e\n\u003cp\u003eJeder hat vermutlich schon vom Raspberry Pi gehört und kennt  Projekte, die mit diesem kleinen Allround-Talent realisiert wurden. Und vermutlich hatte jeder schon einmal eine Idee für einen sinnvollen Einsatz des kleinen PCs. Doch für viele war das Betriebssystem Linux die Hürde. Mit dem Buch „Linux mit Raspberry Pi“ von Christian Immler kann man diese Hürde nun meistern.\u003c/p\u003e\n\u003cp\u003eDas Buch erklärt zu Beginn präzise, wie man erfolgreich Linux auf eine SD Karte installiert und startet. Dabei bezieht sich der Autor vor allem auf die Wheezy-Distribution. Anhand dieser Distribution werden im Laufe des Buches sowohl die absoluten Grundlagen erklärt (Konsolen Befehle, Ordner Strukturen etc.) als auch verschiedene spannende Programme und Projekte vorgestellt. So lernt man schnell und auf anschauliche Weise wie man beispielsweise die GPIO-Ports des Mini-Computers ansteuert, einen eigenen Server erstellt, verschiedene Spiele installiert oder sogar in Python selbst Spiele programmiert. Auch Themen wie alternative Betriebssysteme oder das Installieren und Konfigurieren des Mediacenters XBMC werden in dem Buch behandelt. Durch die Breite an Themen findet wirklich jeder etwas Interessantes und Nützliches.\u003c/p\u003e","title":"Buch: Linux mit Raspberry Pi"},{"content":"von E.F. Engelhardt Täglich wiederholende Vorgänge zu automatisieren ist eine Selbstverständlichkeit in unserer heutigen Zeit. Intelligente Systeme nehmen uns Arbeit ab und erleichtern zudem das Energiesparen. Viele Komplettlösungen, wie z.B. RWE SmartHome, sind schon seit längeren im Umlauf. Die Hardware ist aber meist nur intern kompatibel und zudem teuer. Wie man sich zuhause dennoch eine kostengünstige Lösung einrichten kann, beschreibt das Buch „Hausautomation mit Raspberry Pi“ von E.F. Engelhardt\nDer Autor beschreibt auf anschauliche Weise, wie man den Raspberry Pi als intelligente Schaltzentrale für verschiedenste Vorgänge einsetzt. Dabei wird vor allem das Open-Source Programm FHEM benutzt, das eine Menge Funktionen bereits integriert hat. Zudem erfährt man viel über verschiedene Funkmodule, Funksteckdosen und andere Hardware und wie man diese in sein System einbettet. So ist es jedermann möglich sich seine Hardware nach persönlichen Wünschen selbst zusammenzustellen. Kleine Neben-Projekte, wie z.B. wie man mit Apples Siri sprachgesteuerte Befehle an seine Schaltzentrale übermittelt oder wie man mit dem Raspberry seinen eigenen Cloud-Service erstellt, geben zudem Ausblicke auf weitere Möglichkeiten.\nDas Buch richtet sich besonders an technikaffine Leser mit gewissen Vorkenntnissen, was vor allem an der Komplexität des Themas liegt. Dennoch sind alle Konsolenkommandos aufgeführt und die nötigen Schritte ausführlich erklärt, sodass man sich im Linux-Dschungel gut zu Recht findet. Alles in allem sehr empfehlenswert für alle, die Interesse an einer Do-It-Yourself Lösung für Zuhause haben.\n","permalink":"https://fkainka.de/buch-hausautomation-mit-raspberry-pi/","summary":"\u003ch3 id=\"von-ef-engelhardt\"\u003evon E.F. Engelhardt\u003c/h3\u003e\n\u003cp\u003eTäglich wiederholende Vorgänge zu automatisieren ist eine Selbstverständlichkeit in unserer heutigen Zeit. Intelligente Systeme nehmen uns Arbeit ab und erleichtern zudem das Energiesparen. Viele Komplettlösungen, wie z.B. RWE SmartHome, sind schon seit längeren im Umlauf. Die Hardware ist aber meist nur intern kompatibel und zudem teuer. Wie man sich zuhause dennoch eine kostengünstige Lösung einrichten kann, beschreibt das Buch „Hausautomation mit Raspberry Pi“ von E.F. Engelhardt\u003c/p\u003e\n\u003cp\u003eDer Autor beschreibt auf anschauliche Weise, wie man den Raspberry Pi als intelligente Schaltzentrale für verschiedenste Vorgänge einsetzt. Dabei wird vor allem das Open-Source Programm FHEM benutzt, das eine Menge Funktionen bereits integriert hat. Zudem erfährt man viel über verschiedene  Funkmodule, Funksteckdosen und andere Hardware und wie man diese in sein System einbettet. So ist es jedermann möglich sich seine Hardware nach persönlichen Wünschen selbst zusammenzustellen. Kleine Neben-Projekte, wie z.B. wie man mit Apples Siri sprachgesteuerte Befehle an seine Schaltzentrale übermittelt oder wie man mit dem Raspberry seinen eigenen Cloud-Service erstellt, geben zudem Ausblicke auf weitere Möglichkeiten.\u003c/p\u003e","title":"Buch: Hausautomation mit Raspberry Pi"},{"content":"Eine Solaranlage an meinem Fenster sorgt dafür, dass ein Bleiakku immer geladen wird. Allerdings fehlte mir eine Übersicht über den aktuellen Ladestrom. Jedes Mal ein Messgerät in Reihe zu schalten ist mir zu aufwändig, also habe ich nach einer anderen Lösung gesucht.\nDer einfachste Weg den aktuellen Strom zu ermitteln ist in der Regel die Spannung an einen bekannten Widerstand zu messen und daraus den Strom zu berechnen. Ein solcher Widerstand sollte wärmeresistent und recht klein sein, um Verluste gering zu halten. Dafür gibt es spezielle Widerstände, die für Strommessungen entwickelt wurden.\nDas Problem an diesem Widerstand: Er ist für größere Ströme ausgelegt und deswegen bei meinen maximal 1 Ampere ungeeignet (1 A * 0.01 Ohm = 0.01 V).\nEine zweite Möglichkeit ist, mehrere Widerstände parallel zu schalten. Dadurch sinkt nicht nur der Gesamtwiderstand, sondern man verteilt die Wärmeentwicklung ebenfalls auf mehrere Zweige.\nIch habe acht 4,3 Ohm Widerstände benutzt. Der Gesamtwiderstand beträgt damit 0.5375 Ohm.\nBeim ersten Versucht habe ich die Spannung mit einem Arduino gemessen und übers Terminal bereits umgerechnet ausgeben lassen. Zu beachten ist, dass auch eine gemeinsame Masse benutzt werden muss, damit kein Blödsinn gemessen wird.\nIch wollte jedoch nicht die ganze Zeit den PC laufen lassen, deswegen habe ich einfach einen kleinen analogen Spannungsmesser aus einem Lernpacket verwendet. Die Skalierung ist zwar falsch, aber ich konnte durch Experimentieren rausbekommen, dass ein Vollausschlag ungefähr einem Strom von 0.8 Ampere entspricht. In der Regel ist der Zeiger ungefähr in der Mitte, was einem Strom von 0.4 Ampere entspricht.\nMithilfe dieser kleinen Schaltung kann ich mich nun jederzeit über den Ladestrom informieren. Kleines Plus: Wenn einmal die Sonne voll scheint, der Ladestrom aber sehr gering ist, weiß ich, dass der Akku voll ist.\n","permalink":"https://fkainka.de/strommessen-der-solaranlage/","summary":"\u003cp\u003eEine Solaranlage an meinem Fenster sorgt dafür, dass ein Bleiakku immer geladen wird. Allerdings fehlte mir eine Übersicht über den aktuellen Ladestrom. Jedes Mal ein Messgerät in Reihe zu schalten ist mir zu aufwändig, also habe ich nach einer anderen Lösung gesucht.\u003c/p\u003e\n\u003cp\u003eDer einfachste Weg den aktuellen Strom zu ermitteln ist in der Regel die Spannung an einen bekannten Widerstand zu messen und daraus den Strom zu berechnen. Ein solcher Widerstand sollte wärmeresistent und recht klein sein, um Verluste gering zu halten. Dafür gibt es spezielle Widerstände, die für Strommessungen entwickelt wurden.\u003c/p\u003e","title":"Strommessen an der Solaranlage"},{"content":"Als Fan der Automatisierungstechnik war es nur eine Frage der Zeit, bis meine Küchenbeleuchtung dem Automatisierungswahn zum Opfer fiel. Das Ziel war, die Küchenbeleuchtung per Bewegungsmelder aktiveren zu können. Um die Sache nicht zu einfach zu machen hatte ich folgende spezielle Forderungen:\nDas Licht soll langsam (innerhalb ca. einer Sekunde) aufs Maximum fahren, um nicht zu blenden. Das Licht soll, nach einer gewissen Leuchtdauer, langsam wieder ausgehen (innerhalb von ca. 10 Sekunden). Dadurch ist der Effekt schöner und man kann schnell noch nachtriggern, bevor man völlig im Dunkeln steht. Natürlich kann man sich das mal eben auf einem Arduino oder einem anderen Mikrocontroller zusammenbasteln, aber ich habe mich, zumindest vorerst, für den analogen Weg entschieden, da ein Controller doch etwas überdimensioniert wäre.\nMit den Bauteile, die man generell so rumfliegen hat, habe ich jetzt einen ersten Versuch auf ein Steckboard gesteckt:\nSchaltplan und Funktionsweise: x\nWie man sieht wurde ein Feldeffekttransistor benutzt (T5). Der Schalter S1 soll später durch den Bewegungsmelder ersetzt werden. Das Ganze läuft mit 12 V, damit ich meine LED-Leiste damit direkt ansteuern kann.\nDas Verhältnis von R3 und C5 bestimmt die Einschaltzeit. In der gewählten Konstellation beträgt sie etwa eine Sekunde. Wird C5 erhöht (oder R3 kleiner), verlängert sich die Einschaltzeit.\nR2 und C6 bestimmen dagegen die Dauer der Schaltzeit, bzw. nach welcher Zeit das Dimmen beginnt.\nR1 begrenzt den Strom, um die LEDs im ersten Versuch nicht zu überlasten (es wurde zuerst an einem Power-LED-Modul probiert)\nDas Ganze funktioniert soweit sehr gut. Der nächste Schritt ist also ein Bewegungsmelder-Modul zu kaufen.\nDas Modul Bei Conrad habe ich ein passendes Bewegungsmelder-Modul gefunden. Dieses Modul erkennt mit seinem Sensor Veränderungen im Infrarot-Feld. Diese Veränderung kann durch ein Lebewesen, aber auch durch warmen Dampf oder andere Wärmequellen verursacht werden.\nDer Vorteil an diesem Modul: Es kann direkt mit 12 V betrieben werden. Der Nachteil: der Ausgangspegel beträgt nicht 12 V, sodass ich das Ausgangssignal erst verstärken muss.\nDie neue Schaltung Die Hauptveränderung ist der Bewegungsmelder und die Verstärkerschaltung.\nDas neue System funktioniert sehr gut, wenn ich die Küche betrete. Das einzige Problem ist, dass sich das Licht langsam ausschaltet, wenn ich mich gerade sehr ausschweifende Bewegungen mache. Ich vermute, dass ich ein noch intelligenteres System benötige. Der auf- und abblende Effekt ist aber sehr schön anzuschauen.\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ ","permalink":"https://fkainka.de/bewegungsmelder-fuer-die-kueche/","summary":"\u003cp\u003eAls Fan der Automatisierungstechnik war es nur eine Frage der Zeit, bis meine Küchenbeleuchtung dem Automatisierungswahn zum Opfer fiel. Das Ziel war, die Küchenbeleuchtung per Bewegungsmelder aktiveren zu können. Um die Sache nicht zu einfach zu machen hatte ich folgende spezielle Forderungen:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDas Licht soll langsam (innerhalb ca. einer Sekunde) aufs Maximum fahren, um nicht zu blenden.\u003c/li\u003e\n\u003cli\u003eDas Licht soll, nach einer gewissen Leuchtdauer, langsam wieder ausgehen (innerhalb von ca. 10 Sekunden). Dadurch ist der Effekt schöner und man kann schnell noch nachtriggern, bevor man völlig im Dunkeln steht.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eNatürlich kann man sich das mal eben auf einem Arduino oder einem anderen Mikrocontroller zusammenbasteln, aber ich habe mich, zumindest vorerst, für den analogen Weg entschieden, da ein Controller doch etwas überdimensioniert wäre.\u003c/p\u003e","title":"Bewegungsmelder für die  Küche"},{"content":"Beim Lesen ist Licht natürlich besonders wichtig. Deswegen durfte in meiner neuen Leseecke eine meiner Power-LEDs nicht fehlen. Was aber fehlte war ein vernünftiger Schalter. Zum Glück hatte ich noch einen Touch-Dimmer von Modul-Bus rumliegen.\nAus dem ModulBus Handbuch\nDer Vorteil: Ich kann die LED nun nicht nur ausschalten, sondern auch die Helligkeit regulieren. Zur Steuerung dienen zwei berührungsempfindliche Flächen. Das System ermöglicht es dadurch, die Helligkeit durch Druck auf eine Fläche oder durch Slide-Bewegungen zwischen den Flächen zu verändern. Das untere Video zeigt das System im Einsatz.\nBauanleitung und Quelltext: http://www.elektronik-labor.de/Projekte/Slider2.html\nDie Platine kann direkt mit 12V betrieben werden, was ideal zu meinem Spannungsnetz passt. Allgemein kann das Modul, dank internem Spannungsregler, mit 9 V bis 24 V betrieben werden. Die Belastbarkeit liegt bei 2A, was für meine LED locker reicht. Mehr Informationen finden Sie auf http://www.ak-modul-bus.de/stat/touch_dimmer.html\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ ","permalink":"https://fkainka.de/touch-dimmer-modul/","summary":"\u003cp\u003eBeim Lesen ist Licht natürlich besonders wichtig. Deswegen durfte in meiner neuen Leseecke eine meiner Power-LEDs nicht fehlen. Was aber fehlte war ein vernünftiger Schalter. Zum Glück hatte ich noch einen Touch-Dimmer von Modul-Bus rumliegen.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/Touch11.jpg\"\u003e\u003cimg alt=\"Touch1\" loading=\"lazy\" src=\"http://wp.fkainka.de/wp-content/uploads/2015/01/Touch11.jpg\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003e\u003cstrong\u003eAus dem ModulBus Handbuch\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eDer Vorteil: Ich kann die LED nun nicht nur ausschalten, sondern auch die Helligkeit regulieren. Zur Steuerung dienen zwei berührungsempfindliche Flächen. Das System ermöglicht es dadurch, die Helligkeit durch Druck auf eine Fläche oder durch Slide-Bewegungen zwischen den Flächen zu verändern. Das untere Video zeigt das System im Einsatz.\u003c/p\u003e","title":"Touch-Dimmer Modul"},{"content":"Bei der ersten Version des Blitzwarners habe ich einen Arduino-Uno benutzt – das Programm und das Shield sollten aber auf jedem Board funktionieren.\nDieses Shield ist gleichzeitig Empfänger und Anzeige. Sollte sich das Gewitter noch in großer Entfernung befinden, blinkt die weiße LED selten, da nur nicht alle Entladungen empfangen werden. Je näher das Gewitter kommt, desto häufiger blinkt auch die weiße LED, bis schließlich die erste Warnstufe erreicht ist, die durch die grüne LED angezeigt wird. Sollten sich die gemessenen Blitze noch weiter häufen, zeigt die rote LED die erhöhte Warnstufe an.\nC4=100nF; C5=330pF; C6=100nF; C7=22µF;\nL1=250µH; L3=50µH;\nLED: Pin13= Weiß; Pin2= Grün, Pin3 = Rot;\nR1=100kΩ; R2=680 Ω; R3=470 Ω; R4=220 Ω; R5=220 Ω; R6=220 Ω;\nDer Mittelwellenempfänger TA7642 arbeitet mit einer Ferritantenne, die fest auf 500 kHz abgestimmt ist. Das IC benötigt eine Betriebsspannung von 1,5 V, die hier mit zwei Si-Dioden stabilisiert ist. Die Schaltung und das Programm sind angelehnt an Schaltungen und Software aus dem Elektronik-Labor. Eine aktuelle Blitzwarnung wird über die LEDs ausgegeben.\nhttp://www.elektronik-labor.de/Projekte/Blitzwarner1.html\nEs gibt aber noch eine weitere Möglichkeit Blitze auszuwerten. Wenn das Board mit dem PC verbunden ist und ein Terminal geöffnet ist (z.B. der in der Arduino Software integrierte „SerialMonitor“), bekommt man immer bei einem Blitz die Meldung „Blitz!“ und eine Reihe von Messewerten angezeigt.\nEin Blitz wurde daran erkannt, dass mindestens ein Messewert stark von den anderen abweicht (Auf dem Bild markiert). Der Grad der Abweichung sagt etwas darüber aus, wie stark der Blitz empfangen wurde. Manche Blitze sind noch sehr weit weg aber besonders stark, manche Blitze sehen wir besonders deutlich aber sie sind nur schwach und manche Blitze finden in den Wolken statt und werden nur gemessen, können aber nicht gesehen werden. Dadurch werden gelegentlich Blitze Empfangen die wir nicht als solche wahrnehmen.\nDas Programm kann noch mehr als nur aktuelle Ereignisse anzeigen. Es verfügt zusätzlich über einen Daten-Logger. Dadurch können über einen längeren Zeitraum Werte gesammelt werden, die man dann später aus dem EEPROM auslesen kann. Dafür wurde die Arduino-Library EEPROM benutzt. Über den Terminalbefehl 0 kann man den ersten Datenbereich auslesen. Insgesamt gibt es vier Datenbereiche, die sich alle über die jeweilige Zahl (0-3) auslesen lassen. Mit dem Befehl 100 kann man die Daten aus dem EEPROM wieder löschen. Es gibt im Elektronik-Labor ein Programm welches die Daten aus dem EEPROM grafisch darstellen kann.\nGerade jetzt im Sommer häufen sich die Gewitter und wir konnten schon einige Messungen machen. Dabei ist mir bei einigen Versuchen aufgefallen, dass mein PC-Monitor den Empfänger ziemlich stört. Ich habe deswegen den Empfänger entweder an die Seite gelegt oder den Monitor ganz ausgeschaltet. Dadurch konnte ich deutlich mehr Blitze messen (siehe Videos).\nDOWNLAOD: BlitzloggerF3\nDas Listing #include byte A, Trigger, Sta; word U, D; word Daten[130]; byte B,J, I; word Eeadr, Level, N; word Ticks; int Out1 = 3; int Out2 = 2; void setup(){ pinMode(Out1, OUTPUT); pinMode(Out2, OUTPUT); Serial.begin(9600); Serial.println (\u0026#34;Logger\u0026#34;); U = analogRead(A0); pinMode(13, OUTPUT); Eeadr = 0; A = 1; Sta = 0; Trigger= 0 ; Level = 0; } void loop(){ D = analogRead(A0); Daten[A] = D; U = U *15; U = U + D; U = U /16; if (Trigger == 1){ if (Sta == A){ Serial.println(\u0026#34;Blitz!\u0026#34;); for (N = 1; N 128){ A = 1; } D = Daten[A]; D = D /2; D = D \u0026amp; 255; B = D; Serial.println (B); if (Eeadr 6000) { Level = 6000; } } A = A + 1; if(A \u0026gt; 128){ A = 1; } } else{ D = D + 15; if (D 128){ Sta = Sta - 128; } digitalWrite(13, HIGH); } A = A +1; if (A \u0026gt; 128){ A = 1; } if (Serial.available() \u0026gt; 0) { J = Serial.read(); if (J == 100){ B = 0; for(N = 0; NSerial.write(\u0026#34;Daten Gelöscht\u0026#34;); } else{ Eeadr = J *128; for (N = 1; NSerial.write (B); Eeadr ++; } Eeadr = 0; } } } Ticks++; if (Ticks \u0026gt;= 22000) { Ticks = 0; if (Level \u0026gt; 0) { Level--; if (Level \u0026gt;2000){ Level = Level -9; } } if (Level \u0026gt; 2000){ digitalWrite(Out2, HIGH); } else { digitalWrite(Out2, LOW); } if (Level \u0026gt; 1000){ digitalWrite(Out1, HIGH); } else { digitalWrite(Out1, LOW); } } Video\nExterner Inhalt von youtube-nocookie.com\nBeim Laden werden Daten wie Ihre IP-Adresse an youtube-nocookie.com übertragen. Datenschutz Inhalt laden direkt öffnen ↗ ","permalink":"https://fkainka.de/blitzduino-blitzwarner/","summary":"\u003cp\u003eBei der ersten Version des Blitzwarners habe ich einen Arduino-Uno benutzt – das Programm und das Shield sollten aber auf jedem Board funktionieren.\u003c/p\u003e\n\u003cp\u003eDieses Shield ist gleichzeitig Empfänger und Anzeige. Sollte sich das Gewitter noch in großer Entfernung befinden, blinkt die weiße LED selten, da nur nicht alle Entladungen empfangen werden. Je näher das Gewitter kommt, desto häufiger blinkt auch die weiße LED, bis schließlich die erste Warnstufe erreicht ist, die durch die grüne LED angezeigt wird. Sollten sich die gemessenen Blitze noch weiter häufen, zeigt die rote LED die erhöhte Warnstufe an.\u003c/p\u003e","title":"Blitzduino - Blitzwarner"},{"content":"Bei Ebay habe ich mir mal wieder kleine Spielerreinen aus China bestellt. Dieses Mal war ein RFID Lesegerät inklusive 10 Chips an der Reihe. Kostenpunkt für das Ganze : 13€ inklusive Versand.\nDas einzige Problem: Die Gebrauchsanweisung war auf Chinesisch. Auf der Ebay-Seite waren zwar drei verschiedene Zahlencodes angegeben, allerdings nicht, wie man diese einzugeben hat. Zudem haben sich die Codes später als falsch rausgestellt.\nDoch Google hat eine nette kleine Übersetzungs-App, mit der man sogar Texte fotografieren und dann übersetzen lassen kann. Das hat tatsächlich auch relativ gut mit dem vor mir liegenden Chinesischen-Anleitungszettel funktioniert, sodass ich die Wichtigsten Befehle aus dem Wirrwarr rausinterpretieren konnte. Hier eine Zusammenfassung für alle, die auf dasselbe Problem gestoßen sind.\nGrundsätzlich wir ein Kommando immer mit\n*, Passwort, #\ngestartet. Das Passwort ist im Uhrzustand 9999 aber lässt sich selbstverständlich ändern. Im Folgenden kürze ich die Passworteingabe durch PW ab.\nPasswort ändern: *, PW, #, 0, neues PW, #, neues PW wiederholen, #, *\nDas Passwort darf 4-6 Stellen haben.\nNeuen RFID-Chip anmelden: *, PW, #, 1, (Karte dranhalten bis es piep), Kartenindex eingeben, #, *\nDer Kartenindex hat drei Stellen und könnte bei der ersten Karte z.B. 001 lauten. Der Kartenindex ist dazu da die Karte aus dem System löschen zu können, selbst wenn die Karte verschwunden ist.\nLöschen von Karten aus dem System: Es gibt drei Möglichkeiten Karten zu löschen:\n**, PW, #, 20000, #, **Löscht sämtliche Karten *, PW, #, 2, (Karte dranhalten), #,* Löscht diese Karte *, PW, #, 2, (Kartenindex eingeben), #,* Löscht diese Karte Modus zum Türöffnen: Es gibt drei verschiedene Einstellungen, wann der Zugang gestattet wird\n*, PW, #, 300, #, * Es wird nur die Karte benötigt *, PW, #, 301, #, * Es wird die Karte und ein Passwort benötigt (anderes als Programmierpasswort, siehe Türpasswort) *, PW, #, 302, #, * Es kann mit Karte oder Passwort geöffnet werden (Standard) Zeit wie lange Relais schaltet/Tür offen ist:*, PW, #, 4, XX, #, *\nXX steht hier für eine beliebige Anzahl von Sekunden zwischen 0-99. 6 Sekunden sind Standard.\nTürpasswort: *, PW, 5, neues PW, #, neues PW wiederholen, #, *\nAuch dieses Passwort darf 4-6 Stellen haben.\nReset: Sollten Sie mal das Programmierpasswort vergessen haben, können Sie einen totalen Reset ausführen. Natürlich sind dann auch sämtliche programmierten Karten gelöscht. Um einen Reset ausführen zu können müssen Sie das Gerät erst vom Strom trennen und dann auf der Rückseite den Jumper ON/OFF auf ON-Stecken. Anschließen können Sie den Strom wieder anschließen. Wenn Sie ein dreifaches Piepen hören ist alles auf Werkzustand zurückgesetzt. Sie können den Jumper dann wieder auf die Off-Stellung stecken.\nNatürlich machen gerade so einfach Überbrückungsmaßnahmen das System nicht gerade sicher. Ein lustiger Zeitvertreib ist es aber allemal. Außerdem lassen sich die Mikrocontroller leicht entfernen, da Sie mit einer Steckvorrichtung befestigt sind. Vielleicht kann man irgendwann einmal sein eigenes Programm in dieses System integrieren.\n","permalink":"https://fkainka.de/rfid-zutrittskontrolle/","summary":"\u003cp\u003eBei Ebay habe ich mir mal wieder kleine Spielerreinen aus China bestellt. Dieses Mal war ein RFID Lesegerät inklusive 10 Chips an der Reihe. Kostenpunkt für das Ganze : 13€ inklusive Versand.\u003cbr\u003e\n\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/RFID1.jpg\"\u003e\u003cimg alt=\"OLYMPUS DIGITAL CAMERA\" loading=\"lazy\" src=\"http://wp.fkainka.de/wp-content/uploads/2015/01/RFID1.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDas einzige Problem: Die Gebrauchsanweisung war auf Chinesisch. Auf der Ebay-Seite waren zwar drei verschiedene Zahlencodes angegeben, allerdings nicht, wie man diese einzugeben hat. Zudem haben sich die Codes später als falsch rausgestellt.\u003c/p\u003e\n\u003cp\u003eDoch Google hat eine nette kleine Übersetzungs-App, mit der man sogar Texte fotografieren und dann übersetzen lassen kann. Das hat tatsächlich auch relativ gut mit dem vor mir liegenden Chinesischen-Anleitungszettel funktioniert, sodass ich die Wichtigsten Befehle aus dem Wirrwarr rausinterpretieren konnte. Hier eine Zusammenfassung für alle, die auf dasselbe Problem gestoßen sind.\u003c/p\u003e","title":"RFID Zutrittskontrolle"},{"content":"Bei meinen Recherchen im Internet bin ich fast zufällig über einen Simulator des GMC-4 Spielecomputers gestoßen. Das kleine Tool wurde anscheinend von Dan-san aus Japan programmiert. Deswegen ist es nicht leicht das Programm auf der Seite zu finden. Aber auf diesem Bild finden Sie den entscheidenden Link markiert.\nLink: http://dansan.air-nifty.com/blog/gmc4-simulator.html\nGenau wie beim Original kann man sein Programm über die virtuelle Tastatur eintippen. Zusätzlich bekommt man aber noch Memory und Registerdaten auf der linken Seite angezeigt. Damit man auch zur Laufzeit die Ergebnisse bekommt muss man nur ein Häkchen im Kästchen unter den Anzeigen setzen. Dadurch kann man sein Programm vor Gebrauch testen und Fehler leichter finden.\nAußerdem interessant ist, dass man die Möglichkeit hat seine Programme zu speichern und somit auch komplexere Projekte stückweise zu programmieren. Eine Reihe von Beispielprogrammen ist in der Zip-Datei sogar schon enthalten, sodass man direkt Material zum rumprobieren hat.\nAlles in allem eine Interessantes Tool um die Möglichkeiten des GMC-4 Spielecomputers zu erweitern.\n","permalink":"https://fkainka.de/gmc-4-simulator/","summary":"\u003cp\u003eBei meinen Recherchen im Internet bin ich fast zufällig über einen Simulator des GMC-4 Spielecomputers gestoßen. Das kleine Tool wurde anscheinend von Dan-san aus Japan programmiert. Deswegen ist es nicht leicht das Programm auf der Seite zu finden. Aber auf diesem Bild finden Sie den entscheidenden Link markiert.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/2015/01/Simul0.jpg\"\u003e\u003cimg alt=\"Simul0\" loading=\"lazy\" src=\"/images/2015/01/Simul0.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLink:      \u003ca href=\"http://dansan.air-nifty.com/blog/gmc4-simulator.html\"\u003ehttp://dansan.air-nifty.com/blog/gmc4-simulator.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGenau wie beim Original kann man sein Programm über die virtuelle Tastatur eintippen. Zusätzlich bekommt man aber noch Memory und Registerdaten auf der linken Seite angezeigt. Damit man auch zur Laufzeit die Ergebnisse bekommt muss man nur ein Häkchen im Kästchen unter den Anzeigen setzen. Dadurch kann man sein Programm vor Gebrauch testen und Fehler leichter finden.\u003c/p\u003e","title":"GMC-4 Simulator"},{"content":"Jeder weiß, dass 230V tödlich sein können, wenn man \u0026ldquo;hineinfasst\u0026rdquo;. Weniger bewusst ist den meisten, dass es eine weitere Gefahr gibt: Brände durch Überhitzung elektrischer Verbraucher.\nFabian hat zwar ein gut geeignetes Netzteil gewählt (Schutzklasse 2, Strombegrenzung, elektronische Sicherung gegen Kurzschluss), aber dennoch zu wenig für den Fall getan, dass sich bei Versagen eines Verbrauchers zu hohe Ströme einstellen, die zu einer Überhitzung und schlimmstenfalls zu einem Brand führen.\nBei einer elektrischen Anlage, die ausgedehnt, schlecht zugänglich (Dachgebälk), durch Staub gefährdet ist und viele Jahre ohne Inspektion betrieben wird, sollte man unbedingt mehr tun.\nFehlerfall \u0026ldquo;Netzspannung am Ausgang\u0026rdquo; Ein Netzteil der Schutzklasse 2, wie es Fabian gewählt hat, ist in dieser Hinsicht unproblematisch. Netzteile der Schutzklasse 1 sollte man für einen solchen Einsatz nicht verwenden, weil nicht ausgeschlossen ist, dass im Fehlerfall am Niederspannungsausgang 230V anliegen (Netzteile der Schutzklasse 1 sind meist für Hutschienenmontage in einem Schaltschrank vorgesehen, aber es gibt auch welche im Tischgehäuse).\nFehlerfall Kurzschluss; Problem: Aus dem Datenblatt ist nicht erkennbar, bei welcher Unterspannung das von Fabian gewählte Netzteil komplett abschaltet, statt einfach nur den Strom zu begrenzen. Jedoch steht im Datenblatt, dass die Leitungslänge auf der Niederspannungsseite bei einem Leiterquerschnitt von 0,75mm² max. 2m (!) betragen darf\nDie Strombegrenzung hat ihre Tücken:\nKupfer hat einen spezif. Widerstand von 0,017 Ohm*mm²/m. Widerstandsberechnung für 25m zweiadriges Kabel 0,75 mm²:\nR = 0,0178 * 50 / 0,75 = 1,19 Ohm\n25m zweiadriges Kabel 0,75 mm² kann man also am Ende kurzschießen, dann fließen bei 12V 10 A, und das Netzteil wird munter weiter einspeisen. 120W werden im Kabel in Wärme umgesetzt (siehe Fig.1 und Fig.2).\n120W klingt nicht dramatisch, aber an einer 100W-Glühlampe kann man sich prima die Finger verbrennen. Ein gestrecktes (also nicht aufgerolltes) Kabel mit 0,75 mm² wird wohl nur ordentlich warm werden.\nWenn aber einzelne Verbraucher über noch dünnere Leitungen angeschlossen sind, kommen 1,2 Ohm bei kürzeren Leitungslängen zusammen, und der größte Teil der 120 W Verlustwärme entsteht auf einer kurzen Teilstrecke. Beispiel: typische Anschlusskabel mit 5,5mm-Hohlstecker für 12V-Verbraucher haben nur einen Querschnitt von 0,14 mm². Dann fließen 10A Kurzschlussstrom bei nur noch 5m Länge. Da wird es dann so langsam heikel.\nDaneben kann es lokale Überhitzung an Übergangswiderständen geben. Die von Fabian verwendeten Modelleisenbahnstecker sind mit Sicherheit nicht für so hohe Ströme ausgelegt. Außerdem federn sie nicht gut, so dass die Gefahr besteht, dass sich zusätzlich Übergangswiderstände bilden, wenn die Stecker jahrelang irgendwo im Gebälk vor sich \u0026ldquo;hingammeln\u0026rdquo;.\nAuch bei \u0026ldquo;Lüsterklemmen\u0026rdquo; gibt es ein Problem: die Schrauben können sich in das weiche Kupfer einarbeiten und den Drahtquerschnitt schwächen. Verzinnte Drahtenden sind noch schlimmer, weil das Zinn unter dem Druck zu wandern beginnt.\n\u0026ldquo;Lüsterklemmen\u0026rdquo; sollte man aus diesen Gründen nur zusammen mit Aderendhülsen verwenden. Aderendhülsen sind recht preiswert und man muss sie nicht unbedingt mit einer Spezialzange aufquetschen; mit etwas Sorgfalt gelingt auch mit einer Flachzange eine innige Verbindung mit dem Draht.\nFehlerfall Kurzschluss; Lösung: Die interne elektronische Sicherung des Netzteils soll das Netzteil schützen. Sie schützt aber nicht das angeschlossene Niederspannungsnetz. Das ist auch im großen Masstab so: unsere Hausinstallation wird nicht durch den Überstromschalter im Kraftwerk geschützt (dem ist ein Kurzschluss bei uns daheim herzlich egal), sondern durch gestaffelte Sicherungen, die sich am Leiterquerschnitt orientieren.\nErst kommt die Haussicherung (63A), dann der einzelne Stromkreis (16A), und schließlich eine Feinsicherung (z.B. 500 mA) im Notebook- Netzteil.\nSo sollte man es auch bei einem 12V- oder 24V-Netz machen:\nHinter dem Netzteil erst mal eine 12V- Stromverteilung, in der jeder Abgang eine Feinsicherung erhält, deren Belastbarkeit zum Verbraucher passen muss (z.B. jeweils 1 A für die LED- Leuchten und den USB-Hub). Und zu jedem Verbraucher eine Leitung mit einem Querschnitt, der bei Kurzschluss für ein sicheres Ansprechen der Sicherung reicht. In Fig.3 ist das beispielhaft dargestellt: niederohmige Verbraucher erhalten eine stärkere Sicherung und eine dickere Zuleitung, hochohmigere Verbraucher sind mit einer schwächeren Sicherung abgesichert. Bei ihnen reicht dann eine dünnere Zuleitung.\nDas Material für die Stromverteiler findet man z.B. im Kfz-Zubehör: aus 6,3mm-Flachsteckverbindern, Kabelschuhen und zwei solide Messingstreifen, in die man mehrere Löcher bohrt, kann man so etwas bauen. Auch Sicherungshalter, die sich fliegend in die Kabelverbindungen einschleifen lassen, wird man dort finden.\nDas wäre dann eine Sternverteilung. Grundsätzlich kann man auch ein Bussystem bauen: eine \u0026ldquo;fette\u0026rdquo; Stammleitung mit großem Querschnitt und kurzen, niedrig abgesicherten Stichleitungen zu den Verbrauchern. Problem sind dann die Klemmen, mit denen man die Stichleitungen mit der Busleitung verbindet. Ich finde die Sternverteilung einfacher, weil die Stromschiene beim Netzteil räumlich konzentriert ist und mehrere dünne Doppeladern leichter zu verlegen sind als eine Stammleitung mit großem Querschnitt.\n","permalink":"https://fkainka.de/tipps-zur-elektrischen-sicherheit-von-ralf-beesner/","summary":"\u003cp\u003eJeder weiß, dass 230V tödlich sein können, wenn man \u0026ldquo;hineinfasst\u0026rdquo;. Weniger bewusst ist den meisten, dass es eine weitere Gefahr gibt: Brände durch Überhitzung elektrischer Verbraucher.\u003c/p\u003e\n\u003cp\u003eFabian hat zwar ein gut geeignetes Netzteil gewählt (Schutzklasse 2, Strombegrenzung, elektronische Sicherung gegen Kurzschluss), aber dennoch zu wenig für den Fall getan, dass sich bei Versagen eines Verbrauchers zu hohe Ströme einstellen, die zu einer Überhitzung und schlimmstenfalls zu einem Brand führen.\u003c/p\u003e\n\u003cp\u003eBei einer elektrischen Anlage, die ausgedehnt, schlecht zugänglich (Dachgebälk), durch Staub gefährdet ist und viele Jahre ohne Inspektion betrieben wird, sollte man unbedingt mehr tun.\u003c/p\u003e","title":"Tipps zur elektrischen Sicherheit von Ralf Beesner"},{"content":"Wie schon öfter erwähnt besteht die Beleuchtung meiner Dachbude ausschließlich aus RGB-LED-Bändern. Ich dachte immer, dass das ausreichen würde und ich nur lokal mit ein paar zusätzlichen, kleinen warmweiß-LEDs nachhelfen müsste, allerdings haben die neusten Lux-Messungen ergeben, dass alles viel zu dunkel ist. Vor allem der Arbeitsbereich muss deutlich heller werden. Aber auch Küche und Leseecke könnten deutlich mehr Licht vertragen.\nDeswegen habe ich mir einen Satz 10 Watt LEDs bestellt. Diese LEDs sollen bis zu 800 lm erreichen. Einziger Nachteil: sie benötigen eine Kühlung.\nTechnische Daten der LEDs:\nFarbe: Warm-Weiß\nFarbtemperatur: 3000-3200 K\nLichtstrom: 800 lm\nLeistung: 10 W\nMax. Strom: 1000 mA\nSpannung: 9-12 V\nMaße: 2.9x2x0.3 cm\nZum Glück hatte ich noch einen ganzen Satz CPU-Lüfter mit Kühlblech rumfliegen. Mit ein bisschen Küchen-Silikon habe ich die LEDs auf den Blechen befestigt. Laut Beschriftung der Tube ist das Silikon bis zu 150°C hitzeresistent. Eine Temperatur, bei der die LEDs sicher schon kaputt wären.\nEin weiteres Problem bestand darin, dass die LEDs keinen Vorwiderstand hatten. Beim Anschluss an mein 12-V-Netz haben die LEDs locker 1,6 A schlucken wollen, laut Hersteller sind aber maximal 1 A erlaubt. Widerstände um 1 Ohm hat man aber leider selten rumfliegen. Zum Glück hatte mein Vater aber noch einen Satz 4-W-Glühlampen. Diese in Reihe geschaltet begrenzen den Strom auf ziemlich genau auf 800 mA.\nDie Power LEDs sind trotzdem noch hell genug, dass eine Lampe reicht um einen kompletten Arbeitsbereich mit ausreichend Licht zu versorgen. Endlich kann man die Farben der Widerstände auch bei Nacht richtig erkennen.\n","permalink":"https://fkainka.de/10-w-powerleds/","summary":"\u003cp\u003eWie schon öfter erwähnt besteht die Beleuchtung meiner Dachbude ausschließlich aus RGB-LED-Bändern. Ich dachte immer, dass das ausreichen würde und ich nur lokal mit ein paar zusätzlichen, kleinen warmweiß-LEDs nachhelfen müsste, allerdings haben die neusten Lux-Messungen ergeben, dass alles viel zu dunkel ist. Vor allem der Arbeitsbereich muss deutlich heller werden. Aber auch Küche und Leseecke könnten deutlich mehr Licht vertragen.\u003c/p\u003e\n\u003cp\u003eDeswegen habe ich mir einen Satz 10 Watt LEDs bestellt. Diese LEDs sollen bis zu 800 lm erreichen. Einziger Nachteil: sie benötigen eine Kühlung.\u003c/p\u003e","title":"10-W-PowerLEDs"},{"content":"Als ich mir meine Verbraucher angeschaut habe, ist mir aufgefallen, dass ich sehr viele Geräte habe die mit einem 12-V-Netzteil betrieben werden. Vor allem fielen mir meine RGB-LED-Lichterbänder auf, die für die Beleuchtung meiner Dachbude zuständig sind. Wenn man sich das so betrachtet, hat jedes dieser Netzteile eine ganz schöne Wärmeentwicklung also auch einiges an Verlusten. Die logische Konsequenz: Das muss auch besser gehen.\nDie Grundvoraussetzungen waren schon gegeben: Ich hatte bereits früher eine Steckdose so eingerichtet, dass ich sie mit dem Hauptlichtschalter ein- und ausschalten konnte. Jetzt brauchte ich nur noch ein leistungsstarkes Netzteil daran anzuschließen und ein möglichst unauffälliges Kabelnetz zu installieren. Dabei kamen mir meine Dachbodenbalken sehr gelegen.\nMaterialiste**:**\nNetzteil, 12 V, max: 12 A/150 W Reichelt Ca. 70€ Kabel, zweiadrig, 0,75mm² Conrad Ca. 17€ Mini Bannanestecker “ á 19cent Buchse mini Bannenstecker “ á 79cent Stecker (wie Netzteil) “ á 66cent Stecker fürs 230V “ 1,60€ Lüsterklemmen Vorhanden Sperrholzreste “ Schalter mit Zugband “ (bei Bauhaus gesehen) vStrom133 Der Aufbau Das Netzteil wurde ohne Stecker geliefert. Im Grunde kein Problem da ich sowieso Lüsterklemmen benutze. Aber dann habe ich doch einen gebräuchlichen Stecker montiert. Grund dafür war, dass ich die Leistung mit einem dieser Stromverbrauchs-Messgeräte bestimmen konnte, die man einfach zwischen Steckdose und Verbraucher anschließt. Am Netzteilende kam ein einfaches, zweipoliges Kabel raus, das ich in einem von mehreren Steckverbindungsbrettern anschließen konnte.\nDiese Bretter sollten vor allem den Zweck erfüllen, ohne große Verluste und möglichst modular Verbraucher anschließen zu können. Die Hauptader wird dabei einfach durchgereicht und wird damit nicht unterbrochen. Die kleinen Bananenstecker enthalten selber noch eine Anschluss-Möglichkeit für weitere Stecker. Also ist es möglich weitere Verbraucher anzuschließen, auch wenn alle Dosen auf dem Brett belegt sind.\nAbzweigungen der Hauptader können zudem noch durch einen an die Balken montieren Schalter mit Zugleine vom Netz getrennt werden. So kann ich beispielsweise die Küche immer ausschalten, wenn gerade kein Licht benötigt wird. In kommenden Projekten kann man dies natürlich noch automatisieren.\nZu den Verbrauchern zählen in erster Linie die LED-Streifen mit ihren Controllern. Davon leuchten fünf Stück meine ganze Bude aus. Ein zusätzliches, kleines Bettlicht (bestehend aus einer kleinen RGB-Leiste, bei der ich einfach die Farben rot und grün zu einem gemütlichen gelb-orange zusammengelötet habe) ist mit einem Schalter direkt am Netz angeschlossen. Ebenfalls in Bettnähe befindet sich ein umgebauter USB-Hub, der jetzt nur noch ein USB-Ladegerät ist an dem ich mein Handy über Nacht laden kann. In der „Entertainment-Ecke“ ist noch eine externe Festplatte am Netz angeschlossen. Dadurch kann ich mir sicher sein, dass die Platte nicht läuft, wenn ich nicht zuhause bin.\nDie derzeitige Konfiguration hat einen Maximalverbrauch von ca. 66 W. Damit ist das Netzteil rund zur Hälfte ausgelastet (laut Hersteller max. 150W) und wird nicht mal fühlbar warm. Der Grenzbereich wird natürlich später noch ausgetestet. Interessanter Fakt: Wenn man den Strom einschaltet, dauert es etwa eine Sekunde bis alles leuchtet. Wenn man das Netzteil ausschaltet, dauert es auch ca. eine Sekunde bis das Licht erloschen ist. Dieser nette Nebeneffekt wird wohl durch einen fetten Elko im Netzteil hervorgerufen, der vermutlich zur Stabilisierung des Netzes gedacht ist.\nAls nächstes ist geplant, noch weitere Verbraucher an das Netz anzuschließen. Da wären noch ein paar USB-Hubs, einige Leselampen, ein paar Ladegeräte und ein Raspberry-Pi mit überflüssigen Netzteilen. Mit einem einfachen Spannungswandler kann man außerdem aus dem 12-V-Netz ein lokales 5-V-Netz machen (siehe Handyladegerät). Und der größte Vorteil: Wenn der Hauptschalter betätigt wird, ist alles aus.\nWichtige Verbesserungen! Ich habe gleich von zwei Lesern Rückmeldungen zu meinem 12-V-Netz bekommen. Dabei ging es vor allem um die Sicherheit, die ich dank den Tipps von Hans-Jürgen Ollech und Ralf verbessern werde. Hier eine kurze Liste der geplanten Verbesserungen:\n- Hauptleitungsdicke von 0.75 mm² auf 1,5 mm² vergrößern - Einzelne Stränge und Verbraucher mit exakt berechneten Schmelz-Sicherungen versehen - Drahtendstücke in Lüsterklemmen mit Adernendhülsen versehen - Die Mini-Bannanstecker durch ein kotaktsicheres System oder Lüsterklemmen ersetzen Gründe für die Verbessrungen Folgende Probleme können bei meinem derzeitigen Netz auftreten:\nWenn der Kontakt zwischen Leitern nicht ideal ist, sorgt der Widerstand für eine Erwärmung, die im Extremfall einen Brand auslösen kann.\nAußerdem kann ein Kurzschluss dafür sorgen, dass der Strom durch eine Leitung zu groß wird und die Leitung eine kritische Temperatur erreicht. Aus diesem Grund werden Zuleitungen mit Sicherungen versehen, die durchbrennen, wenn der vorher berechnete Strom überschritten wird. Das Netzteil selber hat zwar auch eine Sicherung, aber die schlägt recht spät zu, da ich mich für eine leistungsfähigere Variante entschieden habe.\nEin dickeres Hauptkabel mindert zudem den Widerstand weiter und wird dadurch auch im Kurzschlussfall nicht zu warm.\nIch hoffe, dass ich die Verbesserungen möglichst bald durchführen kann und alles wieder sicher ist. Solange steht der Verkabelung unter besonderer Aufsicht.\nZusätzliche Infos: Tips zur elektrischen Sicherheit von Ralf Beesner\n","permalink":"https://fkainka.de/das-eigene-stromnetz/","summary":"\u003cp\u003eAls ich mir meine Verbraucher angeschaut habe, ist mir aufgefallen, dass ich sehr viele Geräte habe die mit einem 12-V-Netzteil betrieben werden. Vor allem fielen mir meine RGB-LED-Lichterbänder auf, die für die Beleuchtung meiner Dachbude zuständig sind. Wenn man sich das so betrachtet, hat jedes dieser Netzteile eine ganz schöne Wärmeentwicklung also auch einiges an Verlusten. Die logische Konsequenz: Das muss auch besser gehen.\u003c/p\u003e\n\u003cp\u003eDie Grundvoraussetzungen waren schon gegeben: Ich hatte bereits früher eine Steckdose so eingerichtet, dass ich sie mit dem Hauptlichtschalter ein- und ausschalten konnte. Jetzt brauchte ich nur noch ein leistungsstarkes Netzteil daran anzuschließen und ein möglichst unauffälliges Kabelnetz zu installieren. Dabei kamen mir meine Dachbodenbalken sehr gelegen.\u003c/p\u003e","title":"Das eigene Stromnetz"},{"content":"Frage: Welcher Controller wurde verbaut?\nAntwort:\nDer GMC-4 ist ein Nachbau eines typischen 4-Bit-Spielecomputers aus den 1980er Jahren. Heute allerdings findet man als kleinste Systeme nur noch 8-Bit-Controller. Es war daher erforderlich, ein 4-Bit-System auf einem modernen 8-Bit-Controller zu emulieren. Die Wahl fiel auf den EM61001 der Firma ELAN Microelectronics aus Taiwan. Dieser Controller ist für Audio-Anwendungen optimiert, was einige der besonderen Sound-Fähigkeiten des GMC-4 ermöglichte. Anders als in den 1980er Jahren sind alle erforderlichen Baugruppen wie CPU, Speicher, Zähler, Peripheriebausteine usw. auf einem Chip integriert. Alles was Sie sehen ist ein kleiner schwarzer Klecks, der den eigentlichen Mikrocontroller umhüllt.\nFrage: Kann man die Firmware des Controller verändern?\nAntwort:\nDie Firmware mit einem Interpreter befindet sich im ROM des Controllers und kann vom Anwender nicht verändert werden. Programme, die vom Anwender eingetippt werden, landen im RAM des Controllers und werden vom Interpreter Ausgeführt. Die einzige Programmierschnittstelle ist daher die Tastatur des Geräts.\n","permalink":"https://fkainka.de/gmc-4-faq-haeufig-gestellte-fragen/","summary":"\u003cp\u003eFrage:                 Welcher Controller wurde verbaut?\u003c/p\u003e\n\u003cp\u003eAntwort:\u003c/p\u003e\n\u003cp\u003eDer GMC-4 ist ein Nachbau eines typischen 4-Bit-Spielecomputers aus den 1980er Jahren. Heute allerdings findet man als kleinste Systeme nur noch 8-Bit-Controller. Es war daher erforderlich, ein 4-Bit-System auf einem modernen 8-Bit-Controller zu emulieren. Die Wahl fiel auf den EM61001 der Firma ELAN Microelectronics aus Taiwan. Dieser Controller ist für Audio-Anwendungen optimiert, was einige der besonderen Sound-Fähigkeiten des GMC-4 ermöglichte. Anders als in den 1980er Jahren sind alle erforderlichen Baugruppen wie CPU, Speicher, Zähler, Peripheriebausteine usw. auf einem Chip integriert. Alles was Sie sehen ist ein kleiner schwarzer Klecks, der den eigentlichen  Mikrocontroller umhüllt.\u003c/p\u003e","title":"GMC-4: FAQ - Häufig gestellte Fragen"},{"content":"Mein Problem war folgendes: der Ps3-Controller reagierte nicht mehr so wie erwartet. Immer wenn ich z.B. die R3-Taste gedrückt habe, wurde gleichzeitig die R2-Taste oder eine der Pfeiltasten betätigt. Das ging mir irgendwann so auf die Nerven, dass ich den Controller einfach mal geöffnet habe.\nWenn man die auf dem oberen Bild markierten Schrauben löst, kann man den Controller öffnen.\nEin einfacher Kreuzschraubenzieher passte optimal.\nDas Innenleben. Mann sieht den grauen Akku in der Mitte, die beiden Vibrationsmotoren rechts und links oben und die Schultertasten links und rechts unten.\nWenn man den Akku löst sieht man den Mikrocontroller. Die linke Akkuhalterung habe ich vorübergehen abgemacht. Die Schraube (hier gelb Umrandet) muss man noch lösen, um die Platine lösen zu können.\nAuf diesem Bild kann man die analogen Steuersticks erkenne. Außerdem die Mini-USB-Schnittstelle und die Kontaktfläche für die LEDs. Der graue Kaste ist vermutlich das Bluetooth-Modul.\nNahaufnahme eines analog Sticks und etwas, das wie ein Quarz aussieht.\nIch den Controller hier etwas gereinigt. Bei Auseinanderbauen ist etwas kleines herausgefallen. Ich vermute das es sich dabei um das Teil handelte, welches die Störungen an den Kontaktflächen verursacht hat.\nDas wieder Zusammenbauen ist natürlich immer der schwierigste Teil. Die Schultertasten waren dabei besonders kompliziert. Auf dem Foto oben sieht man die Leiterbahnen. Diese müssen zwischen einem Plastikstück und einer Gummifläche gesteckt werden.\nIch habe die Leiterbahnen in das Plastikstück und gleichzeitig das Plastikstück in die Halterungen am Plastikgehäuse geführt. Das Ergebnis sah dann wie oben aus.\nDas Gummiteil mit den Kontaktflächen war dagegen leicht wieder aufzusetzen.\nDie Schultertaste eins konnte ich einfach wieder einschieben.\nDie zweite Schultertaste war dagegen etwas haariger. Mann muss darauf achten, dass die Feder richtig angesetzt ist wenn man die Taste wieder in die Halterung einklinkt. Mit leichtem Druck kann man feststellen, ob es sich wie gewohnt anfühlt. Sonst nochmal raus klicken und die Federstellung anpassen.\nUm den Controller wieder in den Urzustand zu versetzen muss man nun nur noch die Schraube auf der Platine wieder anziehen, den Akku wieder anschließen und das Plastikgehäuse vorsichtig wieder schließen. Ich hatte ein paar Schwierigkeiten mit den unteren Schultertasten und dem Akku, der sich, trotz Halterung, immer wieder ein bisschen verschoben hat. Aber nach ein bisschen Fummelei hat alles klick gemacht und ich konnte die restlichen Schrauben wieder zuziehen. Obwohl ich den Störfaktor nicht genau identifizieren konnte, funktioniert der Controller wieder einwandfrei. Der Sonntag ist damit gerettet.\n","permalink":"https://fkainka.de/ps3-controller-reparieren/","summary":"\u003cp\u003eMein Problem war folgendes: der Ps3-Controller reagierte nicht mehr so wie erwartet. Immer wenn ich z.B. die R3-Taste gedrückt habe, wurde gleichzeitig die R2-Taste oder eine der Pfeiltasten betätigt. Das ging mir irgendwann so auf die Nerven, dass ich den Controller einfach mal geöffnet habe.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/2015/01/vps2.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eWenn man die auf dem oberen Bild markierten Schrauben löst, kann man den Controller öffnen.\u003c/p\u003e\n\u003cp\u003eEin einfacher Kreuzschraubenzieher passte optimal.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/2015/01/ps3.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/images/2015/01/vps3.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDas Innenleben. Mann sieht den grauen Akku in der Mitte, die beiden Vibrationsmotoren rechts und links oben und die Schultertasten links und rechts unten.\u003c/p\u003e","title":"PS3 Controller Reparieren"},{"content":"Am besten lernt man eine Programmiersprache immer anhand von Beispielen, die man anschließend selbst nachprogrammiert. Deswegen werde ich hier einige Programme veröffentlichen und teilweise auch erklären. Da sich einige Programme sehr ähneln, habe ich sie in Pakete zusammengepackt und erkläre nur das erste im Detail. Bei den restlichen werden nur die Besonderheiten kurz erläutert.\nAlle Simulationsprogramme als Exe-Dateien\nBeispielset I NPN-Transistor\nReihenschaltung\nInnenwiderstand\nNichtinventierender Verstärker\nInventierender Verstärker\nSchmitt-Trigger\nBeispielset II Gegenkopplung\nArbeitspunkt Emitterschaltung\nNetzteil\nHochpassfilter\nTiefpassfilter\nBeispielset III Elektronen im Stromkreis\nDiodekennlinie\nWiderstände\n","permalink":"https://fkainka.de/vb-net-beispielprogramme-aus-grundlagen-der-elektronik/","summary":"\u003cp\u003eAm besten lernt man eine Programmiersprache immer anhand von Beispielen, die man anschließend selbst nachprogrammiert. Deswegen werde ich hier einige Programme veröffentlichen und teilweise auch erklären. Da sich einige Programme sehr ähneln, habe ich sie in Pakete zusammengepackt und erkläre nur das erste im Detail. Bei den restlichen werden nur die Besonderheiten kurz erläutert.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/Simulationsprogramme-1.zip\"\u003eAlle Simulationsprogramme als Exe-Dateien\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"beispielset-i\"\u003eBeispielset I\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/vb-net-beispiel-npn-transistor/\" title=\"NPN-Transistor – VB.Net Beispiel\"\u003eNPN-Transistor\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/reihenschaltung-vb-net-beispiel/\" title=\"Reihenschaltung -VB.Net Beispiel\"\u003eReihenschaltung\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/innenwiderstand-vb-net-beispiel/\" title=\"Innenwiderstand – VB.Net Beispiel\"\u003eInnenwiderstand\u003c/a\u003e\u003c/p\u003e","title":"VB.Net: Beispielprogramme aus Grundlagen der Elektronik"},{"content":"Hier stehen kleine Tipps und Tricks, über die ich so nebenbei gestoßen bin.\nIch hoffe das ich damit dem einen oder andren den Alltag ein bisschen einfacher machen kann.\nDeutsche Tastatur - Englische Tastatur umschalten Sicher ist es Ihnen auch schon mal passiert, dass Sie beim Schreiben plötzlich kein ö,ä,ü, benutzen konnten, oder das z und das y vertauscht waren. Das liegt meist daran, dass Sie die Tastatur auf englisch eingestellt habe. Das kann schnell passieren, denn die Tastenkombination für das Umschalten lautet:\nALT + Shift\nZum Glück kann man mit dieser Kombination auch schnell wieder auf das deutsche Layout umstellen.\nWin7 Ordner auf Taskleiste Oft ist es wichtig an Dateien in einem Ordner besonders schnell dran zu kommen. Seien es verschiedenen Programmier-Projekte oder in meinem Fall eine Sammlung von Word-Dateien. In Win7 geht das indem man auf mit rechtsklick auf die Taskleiste klickt und unter Symbolleiste – Neue Symbolleiste auswählt. Dann kann man einen Ordner wählen, welcher dann unten rechts neben Uhr und Co angezeigt wird.\nWindows: Die wichtigsten Tastenkombinationen Tastenkombinationen können eine Menge Zeit sparen. Deswegen hier eine Liste der wichtigsten Shortcuts speziell für Windows7 (kann auch in anderen Versionen funktionieren):\nDesktop Anzeigen Windowstaste + D Dateiexplorer öffnen Windowstaste + E Ausführen öffnen Windowstaste + R Zwischen Fenstern wechseln mit Visuellen Effekt Windowstaste + Tab Zwischen Fenstern wechseln Alt + Tab Markiertes Element umbenennen F2 Fenster aktualisieren (z.B. Browser) F5 Kopieren Strg + C Ausschneiden Strg + X Einfügen Strg + V Alles markieren Strg + A Suchen Strg + F Rückgängig machen Strg + Z Speichern (in Programmen) Strg + S Windows: Automatischer Shutdown Wenn man über den Rechner noch ein Hörspiel zum Einschlafen hören will sollte sich der Rechner nach einer Zeit von alleine Runterfahren oder in den Standby-Modus gehen. Abhilfe schaffen da eine Zeile in Ausführen oder eine vorbereitete Batch-Datei:\nRunterfahren nach 60 Minuten (angegeben in Sekunden), erzwungen (keine Nachfrage wie bei ungespeicherten Dokumenten):\nWin7: shutdown /s /t 3600 /f\nWinXP: shutdown -s -t 3600 -f\n(Allgemein werden die Parameter in Win7 mit / angefügt und in XP mit -)\nParameterliste:\n/s Runterfahren (Shutdown) /r Neustart (Restart) /a Abbruch (Abort) /h Standby /t XZY Timer XYZ Sekunden /f Erzwingen (Force) Windows: Dienste zu Systemstart konfigurieren Mit Start-Ausführen (Tastenkombination Wintaste + R) öffnet sich ein der Ausführen-Dialog. Wenn Sie hier msconfig eingeben, kommen Sie in ein verstecktes Windows-Menü, in dem Sie unter den entsprechenden Reitern Programme zum Systemstart und andere Dienste ausschalten können. Damit können Sie die allgemeine Geschwindigkeit und das Hochfahren eines Rechners enorm beschleunigen. Allerdings können Fehler auftreten, wenn Sie die falschen Dienste deaktivieren. Wenn Sie sich nicht sicher sind hilft eine kleine Google-Recherche.\nWindows: Lokale Ip-Adresse herausfinden Wenn Sie Start-Ausführen (Tastenkombination Wintaste + R) klicken, öffnet sich ein der Ausführen-Dialog. Dort müssen Sie cmd eintippen um die Kommando-Steuerung zu öffnen. Hier tippen Sie ipconfig ein und schon erscheint eine Liste von Verbindungen. Dort finden Sie auch die lokale Netzwerkadresse Ihres Rechners. Vorsicht: Wenn Sie beispielweise eine LAN-Karte und einen WLAN-Stick haben, müssen Sie erst gucken welche der angezeigten Verbindungen die Richtige ist.\nWindows: Mac-Adresse herausfinden Wenn Sie Start-Ausführen (Tastenkombination Wintaste + R) klicken, öffnet sich ein der Ausführen-Dialog. Dort müssen Sie cmd eintippen um die Kommando-Steuerung zu öffnen. Hier tippen Sie ipconfig /all ein und schon erscheint eine Liste von Verbindungen. Dort finden Sie unter Physikalische Adresse die Mac-Adresse Ihrer Netzwerkkarte. Vorsicht: Wenn Sie beispielweise eine LAN-Karte und einen WLAN-Stick haben, müssen Sie erst gucken welche der angezeigten Verbindungen die Richtige ist.\nGlobale Ip-Adresse herausfinden Ihre globale IP (fürs „WorldWideWeb“ sichtbar) können Sie am einfachsten unter dieser Adresse herausfinden: http://www.myglobalip.com/\nVB.Net: Die wichtigsten Tastenkombinationen Tastenkombinationen können eine Menge Zeit sparen. Deswegen hier eine Liste der wichtigsten Shortcuts speziell für VB.Net 2010 (kann auch in anderen Versionen funktionieren):\nDebugging starten F5 Debugging beenden Strg+Alt+Pause Quelltext anzeigen F7 Designeditor anzeigen Shift + F7 Markieren Bereich Auskommentieren Strg+K+C ","permalink":"https://fkainka.de/die-kleinen-dinge-tipps-und-tricks/","summary":"\u003cp\u003eHier stehen kleine Tipps und Tricks, über die ich so nebenbei gestoßen bin.\u003c/p\u003e\n\u003cp\u003eIch hoffe das ich damit dem einen oder andren den Alltag ein bisschen einfacher machen kann.\u003c/p\u003e\n\u003ch3 id=\"deutsche-tastatur---englische-tastatur-umschalten\"\u003eDeutsche Tastatur - Englische Tastatur umschalten\u003c/h3\u003e\n\u003cp\u003eSicher ist es Ihnen auch schon mal passiert, dass Sie beim Schreiben plötzlich kein ö,ä,ü, benutzen konnten, oder das z und das y vertauscht waren. Das liegt meist daran, dass Sie die Tastatur auf englisch eingestellt habe. Das kann schnell passieren, denn die Tastenkombination für das Umschalten lautet:\u003c/p\u003e","title":"Die kleinen Dinge - Tipps und Tricks"},{"content":"Widerstände spielen in jeder Schaltung eine große Rolle. Sie ermöglichen es uns u.A. den Strom genau zu steuern und verhindern somit das Durchbrennen von LEDs und anderen Bauteilen. In diesem Programm dreht es sich speziell um die Widerstände der meist benutzen E24-Reihe. In dieser Reihe gibt es eine diskrete Anzahl von Widerstandswerten. Diese Werte kann man anhand der Farbringe ablesen. Die ersten beiden Ringe stehen für eine zweistellige Zahl, die noch mit einer Zahl 10x multipliziert wird. Der letzte Ring (meist golden) gibt die Genauigkeit dieser Angaben an (in diesem Fall 5%). Angenommen Sie suchen also einen 100-Ohm-Widerstand, müssen Sie nach den Farbringen braun (1), schwarz(0), braun (= 101 = 10) Ausschau halten. Die genauen Farbcodes finden Sie u.A. hier: http://www.elektronik-kompendium.de/sites/bau/1109051.htm\nDieses Programm beschäftigt sich mit den Widerstandsfarben. Sie können einen bestimmten Widerstandswert wählen und das Programm verändert den Farbcode des abgebildeten Widerstands. Zusätzlich können Sie auch noch eine Spannung einstellen. Das Programm rechnet dann den Strom und die Leistung am Widerstand aus. Wird der Strom zu groß, erscheint eine Warnmeldung: zu heiß. Erhöhen Sie die Spannung weiter, übersteigt der Strom einen Wert, der den Widerstand zerstört und eine weitere Warnmeldung erscheint. Sie können dann aber trotzdem noch den Widerstandswert auf einem unkritischen Wert erhöhen.\nIn dem Programm selber sind einige Elemente, die wir in anderen Programmen noch nicht hatten. Deswegen werde ich den Quelltext wieder Schritt für Schritt auseinander nehmen.\nQuelltextauszug I: Arrays In diesem Programm tauchen zum ersten Mal Arrays auf. Arrays könnte man als einen ganzen Haufen von Variablen bezeichnen, die sich bei gleichem Namen nur in einem Index unterscheiden. Wir sehen hier zum Beispiel das Array Werte. Die Zahl dahinter beschreibt, wie viele verschiedene Datenplätze freigehalten werden sollen. Später unter Form1_Load sieht man auch wie man einen Wert in das Array schreibt. Man benutzt einfach den Namen mit einem Index in den Klammern. Im Grunde funktioniert das wie bei einer gewöhnliche Variablen. Die Vorteile liegen jetzt aber unter anderem darin, dass man z.B. in einer For-Schleife den Index berechnen und dann den entsprechenden Wert aus dem Array lesen kann.\nDas zweite Array mit dem Namen Farben zeigt, dass der Index schon bei Null beginnt und dass ein Array beliebige Datentypen (hier Color) beinhalten kann.\nDim Werte(24)\nDim Farben(9) As Color\nPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\n\u0026lsquo;Widerstandswerte der E27-Reihe\nWerte(1) = 10\nWerte(2) = 11\nFarben(0) = Color.FromArgb(0, 0, 0)\nFarben(1) = Color.Brown\nEnd Sub\nQuelltextauszug II: Logarithmischer Schieber Logarithmische Funktionen zeichnen sich dadurch aus, dass die Werte nicht in Form einer geraden Linie, sondern in Form einer immer steiler werdenden Kurve steigen. Dies ist an dieser Stelle besonders geeignet, da sich die Widerstandswerte im Bereich von 10 Ohm bis zu 10 Mega Ohm befinden. Ein linearer Schieber würde also sehr lang oder extrem ungenau sein. Dieses Beispiel zeigt deswegen, wie ein linearer Schieber in logarithmische Werte umgerechnet werden kann:\n\u0026lsquo;Größenordnung bestimmen aus logarithmischen Schieber\nvIn = sR.Value\nZiffern = vIn Mod 24\nExpo = vIn \\ 24\nGro = 0.1\nFor n = 1 To (Expo + 1)\nGro = Gro * 10\nNext n\nQuelltextauszug III: Berechnung der Werte An dieser Stelle verweise ich nur kurz auf die Berechnung von Strom, Spannung und Leistung nach bekannten Gesetzen:\nU = (hU.Value) / 10\nlV.Text = \u0026ldquo;Spannung = \u0026quot; + Str$(U) + \u0026quot; V\u0026rdquo;\nI = U / widerstand * 1000\nI = Int(I * 1000) / 1000\nlA.Text = \u0026ldquo;Strom = \u0026quot; + Str$(Math.Round(I, 3)) + \u0026quot; mA\u0026rdquo;\nP = U * I\nP = Int(P * 1000) / 1000\nlP.Text = \u0026ldquo;Leistung = \u0026quot; + Str$(Math.Round(P, 3)) + \u0026quot; mW\u0026rdquo;\nQuelltextauszug IV: Das Blinken der Warnungen Sie werden bemerkt haben, dass die Warnungen auf dem Widerstand durch ihr Blinken besonders auf sich aufmerksam machen. Der Quelltext dahinter ist recht simpel. Ein Timer mit einem Intervall von 500 ms schaltet das entsprechende Label im Schadensfall abwechselnd auf sichtbar (Visible = True) und unsichtbar (Visible = False). Ob und wenn ja welches Label zu blinken beginnt entscheidet die Zustandsvariable vzuhei. Sie nimmt den Wert 1 an, wenn der Widestand zu heiß wird, den Wert 2, wenn der Widerstand kaputt ist und den Wert 3 im Normalfall.\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\n\u0026lsquo;Blinken von \u0026ldquo;Zu Heiß\u0026rdquo;\nSelect Case vzuhei\nCase 1\nlzh.Visible = Not lzh.Visible \u0026lsquo;True :\nldurch.Visible = False\nCase 2\nldurch.Visible = Not ldurch.Visible \u0026lsquo;True :\nlzh.Visible = False\nCase Else\nlzh.Visible = False\nldurch.Visible = False\nEnd Select\nGesamter Quelltext Public Class frmWiderstand\n\u0026lsquo;Arrays mit Werten und Farben\nDim Werte(24)\nDim Farben(9) As Color\n\u0026lsquo;Zustand zu Heiß\nDim vzuhei As Byte\nPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\n\u0026lsquo;Widerstandswerte der E27-Reihe\nWerte(1) = 10\nWerte(2) = 11\nWerte(3) = 12\nWerte(4) = 13\nWerte(5) = 15\nWerte(6) = 16\nWerte(7) = 18\nWerte(8) = 20\nWerte(9) = 22\nWerte(10) = 24\nWerte(11) = 27\nWerte(12) = 30\nWerte(13) = 33\nWerte(14) = 36\nWerte(15) = 39\nWerte(16) = 43\nWerte(17) = 47\nWerte(18) = 51\nWerte(19) = 56\nWerte(20) = 62\nWerte(21) = 68\nWerte(22) = 75\nWerte(23) = 82\nWerte(24) = 91\n\u0026lsquo;Farbcodes der Farbringe\nFarben(0) = Color.FromArgb(0, 0, 0)\nFarben(1) = Color.Brown\nFarben(2) = Color.Red\nFarben(3) = Color.OrangeRed\nFarben(4) = Color.Yellow\nFarben(5) = Color.Green\nFarben(6) = Color.Blue\nFarben(7) = Color.Purple\nFarben(8) = Color.Gray\nFarben(9) = Color.White\nberechnen()\nEnd Sub\nPrivate Sub hU_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles hU.Scroll\nberechnen()\nEnd Sub\nPrivate Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles sR.Scroll\nberechnen()\nEnd Sub\nPrivate Sub berechnen()\n\u0026lsquo;Berechnungen\nDim Ziffern, Expo, Gro, vIn, R, ring1, ring2, ring3, widerstand\nDim U, I, P\n\u0026lsquo;Größenordnung bestimmen aus logarithmischen Schieber\nvIn = sR.Value\nZiffern = vIn Mod 24\nExpo = vIn \\ 24\nGro = 0.1\nFor n = 1 To (Expo + 1)\nGro = Gro * 10\nNext n\n\u0026lsquo;Widerstand bestimmen und beschriften\nR = Werte(Ziffern + 1) * Gro\nIf R \u0026lt; 1000 Then lR.Text = Str$(R) + \u0026quot; Ohm\u0026quot;\nIf R \u0026gt;= 1000 Then lR.Text = Str$(R / 1000) + \u0026quot; KiloOhm\u0026quot;\nIf R \u0026gt;= 1000000 Then lR.Text = Str$(R / 1000000) + \u0026quot; MegaOhm\u0026quot;\n\u0026lsquo;Texte\nlR2.Text = Str$(Ziffern) + \u0026quot; \u0026quot; + Str$(Expo)\nring1 = (Werte(Ziffern + 1)) \\ 10\nlR1.Text = Str$(ring1)\n\u0026lsquo;Farbring eins festlegen\nR1.BackColor = Farben(ring1)\nring2 = (Werte(Ziffern + 1)) Mod 10\nlR2.Text = Str$(ring2)\nR2.BackColor = Farben(ring2)\nring3 = Expo\nlR3.Text = \u0026ldquo;\u0026rdquo;\nIf Expo \u0026gt; 0 Then\nFor n = 1 To Expo\nlR3.Text = lR3.Text + \u0026ldquo;0\u0026rdquo;\nNext n\nEnd If\nR3.BackColor = Farben(ring3)\nlR4.Text = \u0026ldquo;±5%\u0026rdquo;\nwiderstand = R\nU = (hU.Value) / 10\nlV.Text = \u0026ldquo;Spannung = \u0026quot; + Str$(U) + \u0026quot; V\u0026rdquo;\nI = U / widerstand * 1000\nI = Int(I * 1000) / 1000\nlA.Text = \u0026ldquo;Strom = \u0026quot; + Str$(Math.Round(I, 3)) + \u0026quot; mA\u0026rdquo;\nP = U * I\nP = Int(P * 1000) / 1000\nlP.Text = \u0026ldquo;Leistung = \u0026quot; + Str$(Math.Round(P, 3)) + \u0026quot; mW\u0026rdquo;\nIf P \u0026lt; 250 Then hr1.FillColor = Color.FromArgb(255, 181, 115) : vzuhei = 0\nIf P \u0026gt; 250 Then hr1.FillColor = Color.FromArgb(255, 100, 100) : vzuhei = 1\nIf P \u0026gt; 1000 Then hr1.FillColor = Color.FromArgb(255, 40, 40) : vzuhei = 2\n\u0026lsquo;Farben angleichen\nhr1.BorderColor = hr1.FillColor\nhr2.FillColor = hr1.FillColor\nhr2.BorderColor = hr1.FillColor\nhr3.FillColor = hr1.FillColor\nhr3.BorderColor = hr1.FillColor\nR2.FillColor = R2.BackColor\nR2.BorderColor = R2.BackColor\nR1.FillColor = R1.BackColor\nR1.BorderColor = R1.BackColor\nR3.FillColor = R3.BackColor\nR3.BorderColor = R3.BackColor\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\n\u0026lsquo;Blinken von \u0026ldquo;Zu Heiß\u0026rdquo;\nSelect Case vzuhei\nCase 1\nlzh.Visible = Not lzh.Visible \u0026lsquo;True :\nldurch.Visible = False\nCase 2\nldurch.Visible = Not ldurch.Visible \u0026lsquo;True :\nlzh.Visible = False\nCase Else\nlzh.Visible = False\nldurch.Visible = False\nEnd Select\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/widerstand-vb-net-beispiel/","summary":"\u003cp\u003eWiderstände spielen in jeder Schaltung eine große Rolle. Sie ermöglichen es uns u.A. den Strom genau zu steuern und verhindern somit das Durchbrennen von LEDs und anderen Bauteilen. In diesem Programm dreht es sich speziell um die Widerstände der meist benutzen E24-Reihe. In dieser Reihe gibt es eine diskrete Anzahl von Widerstandswerten. Diese Werte kann man anhand der Farbringe ablesen. Die ersten beiden Ringe stehen für eine zweistellige Zahl, die noch mit einer Zahl 10x multipliziert wird. Der letzte Ring (meist golden) gibt die Genauigkeit dieser Angaben an (in diesem Fall 5%). Angenommen Sie suchen also einen 100-Ohm-Widerstand, müssen Sie nach den Farbringen braun (1), schwarz(0), braun (= 101 = 10) Ausschau halten. Die genauen Farbcodes finden Sie u.A. hier: \u003ca href=\"http://www.elektronik-kompendium.de/sites/bau/1109051.htm\"\u003ehttp://www.elektronik-kompendium.de/sites/bau/1109051.htm\u003c/a\u003e\u003c/p\u003e","title":"Widerstand - VB.Net Beispiel"},{"content":"Dioden zeichnen sich durch ihre logarithmischen Strom/Spannungs-Kennlinie aus. Welche Form die U/I-Kurve aber genau annimmt; hängt von der Art der Diode und ihrer Temperatur ab. Das hier vorgestellte Programm simuliert dabei die vier geläufigsten Dioden bei Temperaturen zwischen 0° und 150°C. Sie können sich das Strom/Spannungs-Verhältnis bei gewählten Parametern angucken, oder Sie lassen sich gleich den ganzen Verlauf, also die Diodenkennlinie im Bereich von 0 bis 20 mA aufzeigen.\nDas Programm besteht größtenteils aus bekannten Elementen. Dreh und Angelpunkt ist die folgende Diodengleichung, die den Strom in Abhänigkeit von der Spannung und der Temperatur berechnet. I_s ist vom jeweiligen Diodentyp abhängig:\nI = I_s * Math.Exp(Ui / 0.03 / 300 * (Temp + 273))\nDie Berechnung findet komplett im Timer statt ebenso wie die Ausgabe. Es kommen auch zum ersten Mal Radiobuttons zum Einsatz. Diese Buttons schalten sich automatisch auf nicht ausgewählt, wenn ein anderer Button ausgewählt wurde. So kann man sicher gehen, dass nie zwei Zustände gleichzeitig ausgewählt sind.\nGesamter Quelltext Public Class Form1\nDim Ui As Double\nDim I_s\nDim Temp\nDim Sweep\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim stift As New Pen(Color.Black, 1)\nDim stiftl As New Pen(Color.Black, 1)\nDim U\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.Black, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesbtZeichnen.Click\nSweep = 1\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nDim df\nDim I, j\nDim valg\nIf Ui = 0 Then\nFor I = 0 To 10\nFor j = 0 To 10\npSet((20 + I * 40), (j * 20) + 10)\nNext j\nNext I\npSet(20, 210)\nEnd If\nIf Sweep = 1 Then Ui = Ui + 0.01\nIf Ui \u0026lt; 0 Then Ui = 0\nIf Ui \u0026gt; 2 Then Ui = 2\nvalg = Ui * 100\nI = I_s * Math.Exp(Ui / 0.03 / 300 * (Temp + 273))\nU = Ui\nIf I \u0026gt; 20 Then\nI = 20\nSweep = 0\nUi = Ui - 0.01\nEnd If\ndf = (210 - I * 10)\nLine(20 + U * 200, df)\nU = Int(U * 100) / 100\nLabel1.Text = Str$(U) + \u0026quot; V\u0026quot;\nI = Int(I * 100) / 100\nLabel2.Text = Str$(I) + \u0026quot; mA\u0026quot;\n\u0026lsquo;VScroll1.Value = VScroll1.Maximum - valg + VScroll1.Minimum\nEnd Sub\nPrivate Sub VScroll1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles VScroll1.Scroll\nDim val\nval = VScroll1.Maximum - VScroll1.Value + VScroll1.Minimum\nIf Ui \u0026lt; val / 100 Then Ui = Ui + 0.01\nIf Ui \u0026gt; (val / 100) Then Ui = val / 100\nEnd Sub\nPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nI_s = 0.0000000358\nUi = 0\nTemp = HScrollBar1.Value\nLabel8.Text = \u0026ldquo;Temp = \u0026quot; + Str(HScrollBar1.Value) + \u0026ldquo;°C\u0026rdquo;\nEnd Sub\nPrivate Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles RadioButton1.CheckedChanged\nI_s = 0.0001894\nUi = 0\npSet(100, 1100)\nEnd Sub\nPrivate Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles RadioButton2.CheckedChanged\nI_s = 0.0000000358\nUi = 0\npSet(100, 1100)\nEnd Sub\nPrivate Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles RadioButton3.CheckedChanged\nI_s = 2.439E-19\nUi = 0\npSet(100, 1100)\nEnd Sub\nPrivate Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles RadioButton4.CheckedChanged\nI_s = 4.622E-23\nUi = 0\npSet(100, 1100)\nEnd Sub\nPrivate Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll\nTemp = HScrollBar1.Value\nLabel8.Text = \u0026ldquo;Temp = \u0026quot; + Str(HScrollBar1.Value) + \u0026ldquo;°C\u0026rdquo;\nUi = 0\npSet(100, 1100)\nEnd Sub\nPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btneu.Click\nPictureBox1.Image = Nothing\nUi = 0\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/diodenkennlinie-vb-net-beispiel/","summary":"\u003cp\u003eDioden zeichnen sich durch ihre logarithmischen Strom/Spannungs-Kennlinie aus. Welche Form die U/I-Kurve aber genau annimmt; hängt von der Art der Diode und ihrer Temperatur ab. Das hier vorgestellte Programm simuliert dabei die vier geläufigsten Dioden bei Temperaturen zwischen 0° und 150°C. Sie können sich das Strom/Spannungs-Verhältnis bei gewählten Parametern angucken, oder Sie lassen sich gleich den ganzen Verlauf, also die Diodenkennlinie im Bereich von 0 bis 20 mA aufzeigen.\u003c/p\u003e\n\u003cp\u003eDas Programm besteht größtenteils aus bekannten Elementen. Dreh und Angelpunkt ist die folgende Diodengleichung, die den Strom in Abhänigkeit von der Spannung und der Temperatur berechnet. I_s ist vom jeweiligen Diodentyp abhängig:\u003c/p\u003e","title":"Diodenkennlinie - VB.Net Beispiel"},{"content":"Dieses Programm simuliert, wie sich Elektronen in einem Leiter verhalten. Man kann gut sehen, wie sich die Elektronen bei kleinem Strom nur langsam fortbewegen. Bei größeren Strömen werden die Elektronen aktiver und bewegen sich schneller durch den Leiter. Wenn kein Strom anliegt bewegen sich die Elektronen trotzdem ein wenig, aber ohne eine bestimmte Richtung zu bevorzugen. Dies nennt man Rauschen. Zu beachten ist, dass sich die Elektronen nie berühren, sondern immer leicht voneinander abstoßen.\nQuelltextauszug I: Die Klasse Elektronen Der Quelltext enthält eine große Neuerung. Es wird zum ersten Mal eine neue Klasse benutzt, die Klasse der Elektronen von der gleich mehrere Elemente erstellt werden:\nClass Elektron\n\u0026lsquo;Klasse der Elektronen\nDim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer\nPublic Teil As New PowerPacks.OvalShape\nDim PicBox As PictureBox\nPublic Sub Zeichnen(ByVal x As Integer, ByVal y As Integer, ByVal Pb As PictureBox)\n\u0026lsquo;Erstellen des visuellen Teils eines Elektrons mit Parent: eine Pic-Box\ncanvas.Parent = Pb\nTeil.Parent = canvas\nPicBox = Pb\n\u0026lsquo;Zufallsfunktion wenn beide Positionen nicht angegeben wurden\nIf x = 0 And y = 0 Then\nTeil.Left = xRnd()\nTeil.Top = YRnd()\nElse\nTeil.Left = x\nTeil.Top = y\nEnd If\n\u0026lsquo;Visuelle Eigenschaften der Elektronen\nTeil.Width = 17\nTeil.Height = 17\nTeil.FillColor = Color.DarkBlue\nTeil.FillStyle = PowerPacks.FillStyle.Solid\nTeil.FillGradientStyle = PowerPacks.FillGradientStyle.Central\nEnd Sub\nPublic Sub Move(ByVal fx, ByVal fy, ByVal vspeed)\n\u0026lsquo;Wenn über den Bildrand hinaus, von vorne anfangen\nIf Teil.Left \u0026gt; PicBox.Width - 20 Then\nTeil.Left = 0\nEnd If\n\u0026lsquo;Berechnung der neuen Position mit einbeziehung von Geschwindigkeit und Kräften\nMe.Teil.Left = Me.Teil.Left + fx + vspeed + 6 * Rnd() - 3\nMe.Teil.Top = Me.Teil.Top + fy + 6 * Rnd() - 3\nEnd Sub\nPrivate Function xRnd()\n\u0026lsquo;Zufallsfunktion für X-Werte\nReturn Rnd() * (PicBox.Width - 34)\nEnd Function\nPrivate Function YRnd()\n\u0026lsquo;Zufallsfunktion für Y-Werte\nReturn Rnd() * (PicBox.Height - 20)\nEnd Function\nEnd Class\nDies ist die Klasse. Sie enthält öffentliche Prozeduren wie Zeichnen und Move und interne Funktionen (xRnd, YRnd) die nicht von einer anderen Klasse aus aufgerufen werden können. Wenn die Prozedur zeichnen aufgerufen wird, werden die visuellen Teile des Elektrons erstellt. Wenn als Parameter noch X und Y Koordinaten angegeben wurden, wird das Elektron dort positioniert. Wenn beide Parameter Null sind, wird das Elektron zufällig auf der Picturebox platziert. Die Prozedur Move ist dafür da, das Elektron in Abhängigkeit von angegebenen x/y-Kräften und einer Geschwindigkeit, in eine gewünschte Richtung zu bewegen.\nDim neuElektron As New Elektron\nElektronen(20 + i + 1) = neuElektron\nDiese beiden oberen Zeilen zeigen, wie ein Elektron zuerst konstruiert wird und anschließend einem Index bekommt, indem es einer Array des Typs Elektron zugewiesen wird.\nQuelltextauszug II: Verhalten der Elektronen Sie werden sich sicher wundern, warum die Elektronen sich nicht über die Wand hinaus bewegen. Grund dafür ist, dass in der Wand ebenfalls nicht sichtbare Elektronen positioniert sind (Eine Potentialgrenze genau genau wie in der Realitätm, real allerdings durch das Fehlen der Atomrümpfe am Rand). Man kann dies ganz gut in diesem Programmteil sehen:\n\u0026lsquo;Die virtuellen Wandelektronen werden konstruiert, zufällig positioniert und angezeigt\nFor i = 0 To anzWand / 2\nDim neuElektron As New Elektron\nvx = (pb1.Width / 10) - 5\nvy = -18\nIf i = 0 Then\nneuElektron.Zeichnen(1, vy, pb1)\nElse\nneuElektron.Zeichnen(vx * i, vy, pb1)\nEnd If\nElektronen(20 + i + 1) = neuElektron\nNext\n\u0026lsquo;unten das Gleiche\nFor i = 0 To anzWand / 2\nDim neuElektron As New Elektron\nIf i \u0026gt; 10 Then vy = 115 Else vy = 0\nvx = (pb1.Width / 10) - 5\nvy = 133\nneuElektron.Zeichnen(vx * i, vy, pb1)\nElektronen(30 + i + 2) = neuElektron\nNext\nDer Grund warum sich die Elektronen nicht gegenseitig berühren liegt in diesem Teil des Quelltextes. Für jedes Elektron wird die abstoßende Kraft aller anderen Elektronen berechnet. Wenn mal eins zu nahe kommt, wird die Anstoßung überproportional groß:\nPrivate Sub Kraefte(ByVal i As Integer)\nDim dx, dy, s2, kf\nDim fx = 0\nDim fy = 0\n\u0026lsquo;gegenüber sämtliche Elektronen werden die Kräfte berechnet\nFor n = 1 To anzElem\nIf i \u0026lt;\u0026gt; n Then\ndx = Elektronen(n).Teil.Left - Elektronen(i).Teil.Left\ndy = Elektronen(n).Teil.Top - Elektronen(i).Teil.Top\n\u0026lsquo;Formel fürs Kräfte berechnen\ns2 = dx ^ 2 + dy ^ 2\nkf = 900 / s2 / Math.Sqrt(s2)\nfx = fx - dx * kf\nfy = fy - dy * kf\nEnd If\nNext n\nDiese Prozedur wird immer wieder aufgerufen und berechnet die Kräfte zwischen sämtlichen Elektronen nach dieser Formel:\ns2 = dx ^ 2 + dy ^ 2\nkf = 900 / s2 / Math.Sqrt(s2)\nfx = fx - dx * kf\nfy = fy - dy * kf\nDx und dy sind die Abstände der beiden Elektronen auf der x und auf der Y-Achse. Daraus wird die Kraft kf berechnet. Diese Kraft wird dann in den letzten beiden Zeilen in Kräfte in X und in Y-Richtung umgerechnet. Diese kann man dann an die Move-Prozedur weitergeben.\nDamit die Berechnung aller Elektronen nicht zu lange dauert und dadurch eine sehr ruckelige Darstellung entsteht, werden in dem Timeraufruf immer nur vier Elektronen auf einmal berechnet. Auf langsameren Rechnern könnte die Berechnung dennoch zu einer hackenden Darstellung führen.\nQuelltextauszug III: Parameter Sie können auch mit einfachen Mitteln das Programm um ein paar Elektronen erweitern. In den ersten Zeilen des Programms stehen dazu die passenden Parameter (anzElek: Elektronen Anzahl, anzWand = Wandelektronen Anzahl). Auch die Grundgeschwindigkeit der Elektronen (vspeed) lässt sich hier variieren.\nDim anzElek = 20 \u0026lsquo;Elektronen\nDim anzWand = 24 \u0026lsquo;virtuelle Wand-Elektronen\nDim anzElem = anzElek + anzWand \u0026lsquo;gesammte Anzahl\nDim vspeed = 2 \u0026lsquo;Startgeschwindigkeit der Elektronen\nDer gesamte Quelltext Public Class frmElektronen\nDim anzElek = 20 \u0026lsquo;Elektronen\nDim anzWand = 24 \u0026lsquo;virtuelle Wand-Elektronen\nDim anzElem = anzElek + anzWand \u0026lsquo;gesammte Anzahl\nDim vspeed = 2 \u0026lsquo;Startgeschwindigkeit der Elektronen\nDim vi \u0026lsquo;Index für Elektronenberechnungen im Timer\nDim Elektronen(anzElek + anzWand) As Elektron\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\n\u0026lsquo;Vier Elektronen werden in einem Timeraufruf berechnet\nFor i = 1 To 4\nvi = vi + 1\nKraefte(vi)\nIf vi = anzElek Then vi = 0\nNext\nEnd Sub\nPrivate Sub frmElektronen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nDim el1 As New Elektron\nDim vx, vy\n\u0026lsquo;Beim Programmstart werden die Elektronen konstruiert, zufällig positioniert und angezeigt\nFor i = 1 To anzElek\nDim neuElektron As New Elektron\nneuElektron.Zeichnen(0, 0, pb1)\nElektronen(i) = neuElektron\nNext\n\u0026lsquo;Die virtuellen Wandelektronen werden konstruiert, zufällig positioniert und angezeigt\nFor i = 0 To anzWand / 2\nDim neuElektron As New Elektron\nvx = (pb1.Width / 10) - 5\nvy = -18\nIf i = 0 Then\nneuElektron.Zeichnen(1, vy, pb1)\nElse\nneuElektron.Zeichnen(vx * i, vy, pb1)\nEnd If\nElektronen(20 + i + 1) = neuElektron\nNext\n\u0026lsquo;unten das Gleiche\nFor i = 0 To anzWand / 2\nDim neuElektron As New Elektron\nIf i \u0026gt; 10 Then vy = 115 Else vy = 0\nvx = (pb1.Width / 10) - 5\nvy = 133\nneuElektron.Zeichnen(vx * i, vy, pb1)\nElektronen(30 + i + 2) = neuElektron\nNext\nEnd Sub\nPrivate Sub Kraefte(ByVal i As Integer)\nDim dx, dy, s2, kf\nDim fx = 0\nDim fy = 0\n\u0026lsquo;gegenüber sämtliche Elektronen werden die Kräfte berechnet\nFor n = 1 To anzElem\nIf i \u0026lt;\u0026gt; n Then\ndx = Elektronen(n).Teil.Left - Elektronen(i).Teil.Left\ndy = Elektronen(n).Teil.Top - Elektronen(i).Teil.Top\n\u0026lsquo;Formel fürs Kräfte berechnen\ns2 = dx ^ 2 + dy ^ 2\nkf = 900 / s2 / Math.Sqrt(s2)\nfx = fx - dx * kf\nfy = fy - dy * kf\nEnd If\nNext n\n\u0026lsquo;Prozedure lässt das Elektron entsprechend den Kräften bewegen\nElektronen(i).Move(fx, fy, vspeed)\nEnd Sub\nPrivate Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll\n\u0026lsquo;Geschwindigkeit variieren\nvspeed = HScrollBar1.Value\nEnd Sub\nPrivate Sub pb1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pb1.Click\nEnd Sub\nEnd Class\nClass Elektron\n\u0026lsquo;Klasse der Elektronen\nDim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer\nPublic Teil As New PowerPacks.OvalShape\nDim PicBox As PictureBox\nPublic Sub Zeichnen(ByVal x As Integer, ByVal y As Integer, ByVal Pb As PictureBox)\n\u0026lsquo;Erstellen des visuellen Teils eines Elektrons mit Parent: eine Pic-Box\ncanvas.Parent = Pb\nTeil.Parent = canvas\nPicBox = Pb\n\u0026lsquo;Zufallsfunktion wenn beide Positionen nicht angegeben wurden\nIf x = 0 And y = 0 Then\nTeil.Left = xRnd()\nTeil.Top = YRnd()\nElse\nTeil.Left = x\nTeil.Top = y\nEnd If\n\u0026lsquo;Visuelle Eigenschaften der Elektronen\nTeil.Width = 17\nTeil.Height = 17\nTeil.FillColor = Color.DarkBlue\nTeil.FillStyle = PowerPacks.FillStyle.Solid\nTeil.FillGradientStyle = PowerPacks.FillGradientStyle.Central\nEnd Sub\nPublic Sub Move(ByVal fx, ByVal fy, ByVal vspeed)\n\u0026lsquo;Wenn über den Bildrand hinaus, von vorne anfangen\nIf Teil.Left \u0026gt; PicBox.Width - 20 Then\nTeil.Left = 0\nEnd If\n\u0026lsquo;Berechnung der neuen Position mit einbeziehung von Geschwindigkeit und Kräften\nMe.Teil.Left = Me.Teil.Left + fx + vspeed + 6 * Rnd() - 3\nMe.Teil.Top = Me.Teil.Top + fy + 6 * Rnd() - 3\nEnd Sub\nPrivate Function xRnd()\n\u0026lsquo;Zufallsfunktion für X-Werte\nReturn Rnd() * (PicBox.Width - 34)\nEnd Function\nPrivate Function YRnd()\n\u0026lsquo;Zufallsfunktion für Y-Werte\nReturn Rnd() * (PicBox.Height - 20)\nEnd Function\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/elektronen-vb-net-beispiel/","summary":"\u003cp\u003eDieses Programm simuliert, wie sich Elektronen in einem Leiter verhalten. Man kann gut sehen, wie sich die Elektronen bei kleinem Strom nur langsam fortbewegen. Bei größeren Strömen werden die Elektronen aktiver und bewegen sich schneller durch den Leiter. Wenn kein Strom anliegt bewegen sich die Elektronen trotzdem ein wenig, aber ohne eine bestimmte Richtung zu bevorzugen. Dies nennt man Rauschen. Zu beachten ist, dass sich die Elektronen nie berühren, sondern immer leicht voneinander abstoßen.\u003c/p\u003e","title":"Elektronen - VB.Net Beispiel"},{"content":"Die Simulation des Tiefpassfilters konnte mit geringen Änderungen aus dem Hochpassfilterprogramm entwickelt werden. Beide Programme unterscheiden sich nur in der Berechnung der Amplitude und Phasenverschiebung.\nz = Math.Sqrt(r * r + Xc * Xc)\nuC = (u0 * Xc) / z\n\u0026lsquo;Phasenverschiebung berechnen\nphasev = (-Math.Acos(uC / u0)) * 180 / Math.PI\n\u0026lsquo;Ur Zeichen\nZeichnenSin(freq, 3, uC, 0.5, phasev)\nDiesmal eilt die Phase am Ausgang nach. Man kann sehr anschaulich das Verhalten des Filters untersuchen. Interessant ist z.B. der Fall der Grenzfrequenz. Die Amplitude ist gerade auf 0,7 gefallen (-3 dB), die Phase ist um 45 Grad verschoben.\nQuelltext Public Class frmHochPass\nDim pixelx, pixely\nDim pixelxb, pixelyb\nDim vt, vtb\nDim ugrund, uv\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim P1b As Point\nDim pzb As Point\nDim P2b As Point\nDim stiftl As New Pen(Color.LightGreen, 1)\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub pSet2(ByVal x As Integer, ByVal y As Integer)\nP1b.X = x\nP1b.Y = y\npzb.X = 1\npzb.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1b, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line2(ByVal x As Integer, ByVal y As Integer)\nP2b.X = x\nP2b.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1b, P2b)\nP1b.X = x\nP1b.Y = y\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nDim freq, u0, uC, r, Xc, phasev, f, z\nDim c As Double\nfreq = (VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10\nu0 = 2\nZeichnenSinb(freq, 3, u0, 0.5, 0) \u0026lsquo;Eingangsspannung zeichnen\n\u0026lsquo;Widerstand R\nr = ((VScrollBarR.Maximum + VScrollBarR.Minimum) - VScrollBarR.Value) * 1000\nc = ((VScrollBarC.Maximum + VScrollBarC.Minimum) - VScrollBarC.Value) * (10 ^ -8)\nf = freq * 1000\n\u0026lsquo;Widerstand Rc\nXc = 1 / (f * 2 * Math.PI * c)\n\u0026lsquo;Ur berechnen\nz = Math.Sqrt(r * r + Xc * Xc)\nuC = (u0 * Xc) / z\n\u0026lsquo;Phasenverschiebung berechnen\nphasev = (-Math.Acos(uC / u0)) * 180 / Math.PI\n\u0026lsquo;Ur Zeichen\nZeichnenSin(freq, 3, uC, 0.5, phasev)\nEnd Sub\nPrivate Sub ZeichnenSin(ByVal f As Double, ByVal u0 As Integer, ByVal umax As Double, ByVal dime As Double,ByVal phase As Double)\nDim xvt, i, ut\n\u0026lsquo;Gitter zeichnen\nIf pixelx = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixely)\nEnd If\n\u0026lsquo;X Koordinaten +1, mit Reset\npixelx = pixelx + 2\nIf pixelx \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelx = 0\nEnd If\n\u0026lsquo;Zeit des Sinus\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvt = vt + (7.2 * f)\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * ((vt + phase) / 180.0)\n\u0026lsquo;Ut kurz vor Ausgabe. UV muss berechnet werden\nut = u0 + (Math.Sin(xvt)) * umax\npixely = 115 - ut * (10 / dime) \u0026lsquo;*20 denn 1v = 2 Kästchen\nIf pixely \u0026gt; 115 Then pixely = 115\nIf pixely \u0026lt; 5 Then pixely = 5\nLine(pixelx, pixely)\nEnd Sub\nPrivate Sub ZeichnenSinb(ByVal f As Double, ByVal u0 As Integer, ByVal umax As Double, ByVal dime As Double,ByVal phase As Double)\nDim xvtb, ut\n\u0026lsquo;X Koordinaten +2\npixelxb = pixelxb + 2\nIf pixelxb \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelxb = 0\nEnd If\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvtb = vtb + (7.2 * f)\nIf vtb \u0026gt;= 361 Then vtb = 0\nxvtb = Math.PI * ((vtb + phase) / 180.0)\nut = u0 + (Math.Sin(xvtb)) * umax\npixelyb = 115 - ut * (10 / dime) \u0026lsquo;*20 denn 1v = 2 Kästchen\nIf pixelyb \u0026gt; 115 Then pixelyb = 115\nIf pixelyb \u0026lt; 5 Then pixelyb = 5\nLine2(pixelxb, pixelyb)\nEnd Sub\nPrivate Sub VScrollBarF_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarF.Scroll\nlbF.Text = \u0026ldquo;f = \u0026quot; + Str((VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10) + \u0026quot; kHz\u0026rdquo;\nEnd Sub\nPrivate Sub VScrollBarC_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarC.Scroll\nlbC.Text = \u0026ldquo;C = \u0026quot; + Str((VScrollBarC.Maximum + VScrollBarC.Minimum - VScrollBarC.Value) / 100) + \u0026quot; µF \u0026ldquo;\nEnd Sub\nPrivate Sub VScrollBarR_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarR.Scroll\nlbR.Text = \u0026ldquo;R = \u0026quot; + Str(VScrollBarR.Maximum + VScrollBarR.Minimum - VScrollBarR.Value) + \u0026quot; kOhm\u0026rdquo;\nEnd Sub\nPrivate Sub frmHochPass_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/tiefpassfilter-vb-net-beispiel/","summary":"\u003cp\u003eDie Simulation des Tiefpassfilters konnte mit geringen Änderungen aus dem Hochpassfilterprogramm entwickelt werden. Beide Programme unterscheiden sich nur in der Berechnung der Amplitude und Phasenverschiebung.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ez = Math.Sqrt(r * r + Xc * Xc)\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003euC = (u0 * Xc) / z\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003e\u0026lsquo;Phasenverschiebung berechnen\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003ephasev = (-Math.Acos(uC / u0)) * 180 / Math.PI\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003e\u0026lsquo;Ur Zeichen\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eZeichnenSin(freq, 3, uC, 0.5, phasev)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eDiesmal eilt die Phase am Ausgang nach. Man kann sehr anschaulich das Verhalten des Filters untersuchen. Interessant ist z.B. der Fall der Grenzfrequenz. Die Amplitude ist gerade auf 0,7 gefallen (-3 dB), die Phase ist um 45 Grad verschoben.\u003c/p\u003e","title":"Tiefpassfilter - VB.Net Beispiel"},{"content":"Das Programm stellt ein Zweikanal-Oszilloskop dar. Ein Sinusgenerator mit einstellbarer Frequenz und konstanter Amplitude liegt am Eingang des Tiefpassfilters und an einem Kanal des Oszilloskops. Die Sub ZeichnenSinb plottet den Sinus im Ausgabefenster\nfreq = (VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10\nu0 = 2\nZeichnenSinb(freq, 3, u0, 0.5, 0) \u0026lsquo;Eingangsspannung zeichnen\nDer andere Kanal liegt am Ausgang des Filters. Die folgenden Rechnungen ermitteln die Ausgangsamplitude und die Phasenverschiebung. Die Ausgangsspannung wird entsprechend dieser Ergebnisse in einem zweiten Sinusgenerator gebildet.\n\u0026lsquo;Widerstand Rc\nXc = 1 / (f * 2 * Math.PI * c)\n\u0026lsquo;Ur berechnen\nz = Math.Sqrt(r * r + Xc * Xc)\nur = (u0 * r) / z\n\u0026lsquo;Phasenverschiebung berechnen\nphasev = (Math.Acos(ur / u0)) * 180 / Math.PI\n\u0026lsquo;Ur zeichnen\nZeichnenSin(freq, 3, ur, 0.5, phasev)\nEine weitere Besonderheit dieses Programm ist, dass zwei Spannungsverläufe gleichzeitig angezeigt werden, nämlich die Eingangsspannung und die Spannung am Widerstand R. Möglich wurde dies, indem ich die Prozedur SinZeichnen kopiert und die benutzten Variablen variiert habe (zeichnenSinb). Im Timer kann so nacheinander die eine oder die andere Prozedur aufgerufen werden, ohne dass sich die Werte gegenseitig beeinflussen.\nQuelltext Public Class frmHochPass\nDim pixelx, pixely\nDim pixelxb, pixelyb\nDim vt, vtb\nDim ugrund, uv\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim P1b As Point\nDim pzb As Point\nDim P2b As Point\nDim stiftl As New Pen(Color.LightGreen, 1)\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub pSet2(ByVal x As Integer, ByVal y As Integer)\nP1b.X = x\nP1b.Y = y\npzb.X = 1\npzb.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1b, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line2(ByVal x As Integer, ByVal y As Integer)\nP2b.X = x\nP2b.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1b, P2b)\nP1b.X = x\nP1b.Y = y\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nDim freq, u0, ur, r, Xc, phasev, f, z\nDim c As Double\nfreq = (VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10\nu0 = 2\nZeichnenSinb(freq, 3, u0, 0.5, 0) \u0026lsquo;Eingangsspannung zeichnen\n\u0026lsquo;Widerstand R\nr = ((VScrollBarR.Maximum + VScrollBarR.Minimum) - VScrollBarR.Value) * 1000\nc = ((VScrollBarC.Maximum + VScrollBarC.Minimum) - VScrollBarC.Value) * (10 ^ -8)\nf = freq * 1000\n\u0026lsquo;Widerstand Rc\nXc = 1 / (f * 2 * Math.PI * c)\n\u0026lsquo;Ur berechnen\nz = Math.Sqrt(r * r + Xc * Xc)\nur = (u0 * r) / z\n\u0026lsquo;Phasenverschiebung berechnen\nphasev = (Math.Acos(ur / u0)) * 180 / Math.PI\n\u0026lsquo;Ur zeichen\nZeichnenSin(freq, 3, ur, 0.5, phasev)\nEnd Sub\nPrivate Sub ZeichnenSin(ByVal f As Double, ByVal u0 As Integer, ByVal umax As Double, ByVal dime As Double,ByVal phase As Double)\nDim xvt, i, ut\n\u0026lsquo;Grundspannung\nIf pixelx = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixely)\nEnd If\n\u0026lsquo;X Koordinaten +1, mit Reset\npixelx = pixelx + 2\nIf pixelx \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelx = 0\nEnd If\n\u0026lsquo;Zeit des Sinus\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvt = vt + (7.2 * f)\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * ((vt + phase) / 180.0)\n\u0026lsquo;Ut kurz vor der Ausgabe. UV muss berechnet werden\nut = u0 + (Math.Sin(xvt)) * umax\npixely = 115 - ut * (10 / dime) \u0026lsquo;*20 denn 1v = 2 Kästchen\nIf pixely \u0026gt; 115 Then pixely = 115\nIf pixely \u0026lt; 5 Then pixely = 5\nLine(pixelx, pixely)\nEnd Sub\nPrivate Sub ZeichnenSinb(ByVal f As Double, ByVal u0 As Integer, ByVal umax As Double, ByVal dime As Double,ByVal phase As Double)\nDim xvtb, i, ut\npixelxb = pixelxb + 2\nIf pixelxb \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelxb = 0\nEnd If\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvtb = vtb + (7.2 * f)\nIf vtb \u0026gt;= 361 Then vtb = 0\nxvtb = Math.PI * ((vtb + phase) / 180.0)\nut = u0 + (Math.Sin(xvtb)) * umax\npixelyb = 115 - ut * (10 / dime) \u0026lsquo;*20 denn 1v = 2 kästchen\nIf pixelyb \u0026gt; 115 Then pixelyb = 115\nIf pixelyb \u0026lt; 5 Then pixelyb = 5\nLine2(pixelxb, pixelyb)\nEnd Sub\nPrivate Sub VScrollBarF_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarF.Scroll\nlbF.Text = \u0026ldquo;f = \u0026quot; + Str((VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10) + \u0026quot; kHz\u0026rdquo;\nEnd Sub\nPrivate Sub VScrollBarC_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarC.Scroll\nlbC.Text = \u0026ldquo;C = \u0026quot; + Str((VScrollBarC.Maximum + VScrollBarC.Minimum - VScrollBarC.Value) / 100) + \u0026quot; µF \u0026ldquo;\nEnd Sub\nPrivate Sub VScrollBarR_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarR.Scroll\nlbR.Text = \u0026ldquo;R = \u0026quot; + Str(VScrollBarR.Maximum + VScrollBarR.Minimum - VScrollBarR.Value) + \u0026quot; kOhm\u0026rdquo;\nEnd Sub\nPrivate Sub frmHochPass_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/hochpassfilter-vb-net-beispiel/","summary":"\u003cp\u003eDas Programm stellt ein Zweikanal-Oszilloskop dar. Ein Sinusgenerator mit einstellbarer Frequenz und konstanter Amplitude liegt am Eingang des Tiefpassfilters und an einem Kanal des Oszilloskops. Die Sub \u003cem\u003eZeichnenSinb\u003c/em\u003e  plottet den Sinus im Ausgabefenster\u003c/p\u003e\n\u003cp\u003e\u003cem\u003efreq = (VScrollBarF.Maximum + VScrollBarF.Minimum - VScrollBarF.Value) / 10\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eu0 = 2\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eZeichnenSinb(freq, 3, u0, 0.5, 0) \u0026lsquo;Eingangsspannung zeichnen\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eDer andere Kanal liegt am Ausgang des Filters. Die folgenden Rechnungen ermitteln die Ausgangsamplitude und die Phasenverschiebung. Die Ausgangsspannung wird entsprechend dieser Ergebnisse in einem zweiten Sinusgenerator gebildet.\u003c/p\u003e","title":"Hochpassfilter - VB.Net Beispiel"},{"content":"Das Programm simuliert die Restwelligkeit eines 12V-Netzteils mit Vierweggleichrichter und Siebelko. Sowohl der Lastwiderstand als auch die Kapazität des Elkos lassen sich einstellen. Auf dem simulierten Oszilloskopschirm (der Picturebox) kann man den Spannungsverlauf sehen.\nDie Berechnungen sind hier verhältnismäßig simpel. Ut ist die gleichgerichtete Eingangswechselspannung, wobei die Sinusfunktion die Wechselspannung am Trafo berechnet und die Absolutwertbestimmung (Abs) den Vierweggleichrichter simuliert.\nvt = vt + 360 / 80\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * vt / 180.0\nut = Math.Abs(17 * (Math.Sin(xvt)))\nDie Spannung am Landekondensator wird hier in kleinen Zeitschritten berechnet. Der Ladestrom i hängt von der momentanen Spannung uc ab. In einem Zeitraum dt nimmt die Spannung um einen kleinen Betrag ab, der von der Kapazität und vom Entladestrom abhängt. So ergibt sich eine allmählich abfallende Spannung. Nur wenn die Spannung am Ausgang des Vierweggleichrichters höher ist als die aktuelle Spannung uc, wird diese übernommen. Dahinter steckt natürlich eine Idealisierung, weil in der Realität auch der Trafo zusammen mit dem Gleichrichter einen gewissen Innenwiderstand haben und die Spannung etwas langsamer ansteigen würde.\ni = uc / R\ndt = 250\nuc = uc - ((i * dt) / C)\nIf uc \u0026lt; ut Then uc = ut\nQuelltext Public Class frmNetz\nDim vt, ut\nDim uc, R, C\nDim pixelX, pixelY\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim stiftl As New Pen(Color.LightGreen, 1)\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nDim xvt, i, dt\nIf pixelX = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixelY)\nEnd If\npixelX = pixelX + 1\nIf pixelX \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelX = 0\nEnd If\nvt = vt + 360 / 80\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * vt / 180.0\nut = Math.Abs(17 * (Math.Sin(xvt)))\ni = uc / R\ndt = 250\nuc = uc - ((i * dt) / C)\nIf uc \u0026lt; ut Then uc = ut\npixelY = 115 - uc * 5\nLine(pixelX, pixelY)\nEnd Sub\nPrivate Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll\nC = VScrollBar1.Maximum - VScrollBar1.Value + VScrollBar1.Minimum\nlbC.Text = \u0026ldquo;C = \u0026quot; + Str(C) + \u0026ldquo;µF\u0026rdquo;\nEnd Sub\nPrivate Sub frmNetz_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nR = VScrollBar2.Maximum - VScrollBar2.Value + VScrollBar2.Minimum\nlbR.Text = \u0026ldquo;R = \u0026quot; + Str(R) + \u0026ldquo;Ohm\u0026rdquo;\nC = VScrollBar1.Maximum - VScrollBar1.Value + VScrollBar1.Minimum\nlbC.Text = \u0026ldquo;C = \u0026quot; + Str(C) + \u0026ldquo;µF\u0026rdquo;\npixelY = 115\nEnd Sub\nPrivate Sub VScrollBar2_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBar2.Scroll\nR = VScrollBar2.Maximum - VScrollBar2.Value + VScrollBar2.Minimum\nlbR.Text = \u0026ldquo;R = \u0026quot; + Str(R) + \u0026ldquo;Ohm\u0026rdquo;\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/netzteil-vb-net-beispiel/","summary":"\u003cp\u003eDas Programm simuliert die Restwelligkeit eines 12V-Netzteils mit Vierweggleichrichter und Siebelko. Sowohl der Lastwiderstand als auch die Kapazität des Elkos lassen sich einstellen. Auf dem simulierten Oszilloskopschirm (der Picturebox) kann man den Spannungsverlauf sehen.\u003c/p\u003e\n\u003cp\u003eDie Berechnungen sind hier verhältnismäßig simpel. Ut ist die gleichgerichtete Eingangswechselspannung, wobei die Sinusfunktion die Wechselspannung am Trafo berechnet und die Absolutwertbestimmung (Abs) den Vierweggleichrichter simuliert.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003evt = vt + 360 / 80\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eIf vt \u0026gt;= 361 Then vt = 0\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003exvt = Math.PI * vt / 180.0\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eut = Math.Abs(17 * (Math.Sin(xvt)))\u003c/em\u003e\u003c/p\u003e","title":"Netzteil - VB.Net Beispiel"},{"content":"Für jeden Transistorverstärker gibt es einen optimalen Kollektorstrom, den man auch als Arbeitspunkt bezeichnet. Bei diesem Signalverstärker in Emitterschaltung sollte man den Basiswiderstand rb passend zur Stromverstärkung V möglichst so einstellen, dass die Kollektorspannung uce ohne Aussteuerung (ut=0) in der Mitte bei 2,5 V liegt. Das ergibt dann den idealen Arbeitspunkt, bei dem die größte verzerrungsfreie Aussteuerung möglich ist.\nib = 4.4 / rb + ut / 1000\nic = ib * v\nuce = 5 - ic * 1000\nDie Berechnung geht vereinfachend davon aus, dass die Basisspannung immer 0,6 V beträgt. Am Basiswiderstand liegt die Spannung 4,4 V. Als weitere Vereinfachung wurde angenommen, dass der differenzielle Eingangswiderstand an der Basis gegenüber der Vorwiderstand von 1 kΩ vernachlässigt werden kann. Der Wechselstromanteil des Basisstroms beträgt dann einfach ut / 1000 Ω.\nQuelltext Public Class frmArbeitspunkt\nDim pixelx, pixely\nDim vt\nDim ugrund, uv\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim stiftl As New Pen(Color.LightGreen, 1)\nDim ui, rb, v\nPrivate Sub VScrollBarU_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarU.Scroll\nui = (VScrollBarU.Maximum - VScrollBarU.Value + VScrollBarU.Minimum) * 10 ^ (-3)\nlbui.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 10 ^ 3) + \u0026ldquo;mVss\u0026rdquo;\nEnd Sub\nPrivate Sub VScrollBarR_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarR.Scroll\nrb = (VScrollBarR.Maximum - VScrollBarR.Value + VScrollBarR.Minimum) * 10 ^ 3\nlbRb.Text = \u0026ldquo;Rb_ges = \u0026quot; + Str(rb * 10 ^ -3) + \u0026ldquo;k\u0026rdquo;\nEnd Sub\nPrivate Sub HScrollBarV_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles HScrollBarV.Scroll\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nPrivate Sub frmArbeitspunkt_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nui = (VScrollBarU.Maximum - VScrollBarU.Value + VScrollBarU.Minimum) * 10 ^ (-3)\nlbui.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 10 ^ 3) + \u0026ldquo;mVss\u0026rdquo;\nrb = (VScrollBarR.Maximum - VScrollBarR.Value + VScrollBarR.Minimum) * 10 ^ 3\nlbRb.Text = \u0026ldquo;Rb_ges = \u0026quot; + Str(rb / 1000) + \u0026ldquo;k\u0026rdquo;\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nZeichnenSin(1, 0, 1, 0.5)\nEnd Sub\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub ZeichnenSin(ByVal f As Integer, ByVal u0 As Integer, ByVal umax As Integer, ByVal dime As Double)\nDim xvt, i, ut\nDim ib, ic, uce\n\u0026lsquo;Gitter zeichnen\nIf pixelx = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixely)\nEnd If\n\u0026lsquo;X Koordinaten +1, mit Reset\npixelx = pixelx + 1\nIf pixelx \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelx = 0\nEnd If\n\u0026lsquo;Zeit des Sinus\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvt = vt + (7.2 * f)\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * vt / 180.0\n\u0026lsquo;Ut kurz vor Ausgabe. UV muss berechnet werden\nut = u0 + (Math.Sin(xvt)) * ui\n\u0026lsquo;Berechnung von Uc\nib = 4.4 / rb + ut / 1000\nic = ib * v\nuce = 5 - ic * 1000\n\u0026lsquo;Grenzbereiche\nIf uce \u0026gt; 5 Then uce = 5\nIf uce \u0026lt; 0.1 Then uce = 0.1\n\u0026lsquo;Ausgabe\npixely = 115 - uce * (10 / dime) \u0026lsquo;*20 denn 1 V = 2 Kästchen\nIf pixely \u0026gt; 115 Then pixely = 115\nIf pixely \u0026lt; 5 Then pixely = 5\nLine(pixelx, pixely)\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/arbeitspunkt-emitterschaltung-vb-net-beispiele/","summary":"\u003cp\u003eFür jeden Transistorverstärker gibt es einen optimalen Kollektorstrom, den man auch als Arbeitspunkt bezeichnet. Bei diesem Signalverstärker in Emitterschaltung sollte man den Basiswiderstand rb passend zur Stromverstärkung V möglichst so einstellen, dass die Kollektorspannung uce ohne Aussteuerung (ut=0) in der Mitte bei 2,5 V liegt. Das ergibt dann den idealen Arbeitspunkt, bei dem die größte verzerrungsfreie Aussteuerung möglich ist.\u003cbr\u003e\n\u003cem\u003eib = 4.4 / rb + ut / 1000\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eic = ib * v\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003euce = 5 - ic * 1000\u003c/em\u003e\u003c/p\u003e","title":"Arbeitspunkt Emitterschaltung - VB.Net Beispiele"},{"content":"In diesem Programm wird eine Emitterschaltung mit Gegenkopplung simuliert. Die Änderung zu einem normalen Transistorverstärker ist, dass hier die Basis über einen Widerstand mit dem Kollektor verbunden ist. Damit wird einer Vergrößerung des Kollektorstroms entgegengewirkt. Das Resultat ist eine verkleinerte Verstärkung aber auch eine geringere Verzerrung.\nIn dem Programm treten viele Neuerungen auf einmal auf. Es wird hier zum ersten Mal mit einer gezeichneten Ausgabe auf einer Picturebox gearbeitet. Wenn Sie sich bereits mit älteren VB-Versionen auskennen, werden Sie hier einige Änderungen feststellen. Allerdings habe ich versucht, altbekannte Prozeduren nachzuprogrammieren. Das sollte die Umstellung erleichtern.\nZusätzlich zur der zeichnerischen Ausgabe wird hier auch noch mit Sinusfunktionen gearbeitet. Auch hier habe ich wieder eine allgemein gültige Funktion geschrieben, die ich in mehreren Programmen verwenden werde. Diese Funktionen erkläre ich wieder an diesem Beispiel ausführlich und konzentriere mich in späteren Beispielen nur noch auf die Besonderheiten.\nAber nun zum Wesentlichen.\nQuelltextauszug 1: Zeichnen Allgemein lässt sich sagen, dass eine Picturebox dafür da ist, ein Bild auf einem Formular anzuzeigen. Allerdings kann eine Picturebox noch mehr. Man kann nämlich auch auf ihr zeichnen. Das ging in VB 6 noch so, dass man mit Pset(x,y) einen Punkt in die Box gesetzt hat. Von diesem Punkt aus konnte man dann anschließend mit line(x,y) eine Linie irgendwo hinziehen. Das Ende der Linie war gleichzeitig der neue Startpunkt für weitere Zeichnungen. So konnte man sich ohne großen Aufwand zeichnerisch über die Picturebox bewegen.\nIn VB.Net ist die Sache nicht ganz so einfach. So ist es nicht mehr möglich einen einfachen Punkt in die Box zu zeichnen. Außerdem kann man nicht mehr so leicht bis zum nächsten Punkt zeichnen. Das Zeichnen in VB.Net funktioniert nun so:\nPictureBox1.CreateGraphics.DrawLine(stift, P1, P2)\nMit dieser Prozedur wird eine Linie auf die PictureBox1 gemalt. P1 und P2 sind zwei vorher definierte Punkte, der Start- und der Endpunkt. Diese werden wie Folgt definiert:\nDim P1 As Point\nDim P2 As Point\nP1.X = x\nP1.Y = y\nP2.X = x\nP2.Y = y\nFür x und y setzen Sie einfache Koordinaten im Pixelformat. In dem Prozeduraufruf findet sich auch noch die Variable stift. Hierbei handelt es sich ebenfalls um eine vorher definierte Variable vom Typ Pen. Es handelt sich hierbei tatsächlich um eine Art Stift der über die Farbe und die Dicke (in Pixeln) definiert wird:\nDim stiftl As New Pen(Color.LightGreen, 1)\nWir wissen also nun wie wir eine Linie zeichnen können, aber was ist mit einem Punkt? Ich habe keine adäquate Funktion für einen Punkt gefunden. Stattdessen habe ich ein Rechteck als Punkt benutzt. Der Nachteil: ein Rechteck hat eine Mindestgröße von zwei mal zwei Pixeln. Bei einer größeren Auflösung ist dies aber nicht zu sehen. Ein Rechteck definiert man so:\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect)\nDie Variable rect ist vom Typ rectangle. Ein Rectangle (Rechteck) wird wiederum über einen Startpunkt (p1) und seiner Größe (size) definiert:\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDie Größe wird wiederum über einen Punkt definiert, hier mit den Koordinaten (1,1), der kleinstmöglichen Größe. Die Größe ist später als relativ zum Startpunkt anzusehen.\nDamit ich das Programm leichter von VB3.0 in VB.Net transferieren konnte, habe ich mir die beiden alten Prozeduren zum Zeichnen nachprogrammiert. Ich habe sie pset und line genannt. Hier der Quelltext:\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) End Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPunkt P1 ist global definiert. Das bedeutete, dass alle Prozeduren darauf zugreifen können. P1 ist auch immer mein Startpunkt und wird immer neu gesetzt. Dadurch kann ich, wie im alten VB3.0, immer eine Linie relativ vom letzten Punkt ziehen. Wie man sieht muss ich der Prozedur Line nur die Endkoordinaten übergeben. Das bedeutet aber auch, dass wir bei Programmstart zuerst einen Startpunkt setzen müssen.\nQuelltextauszug 2: Zeichnen II und Sinusfunktion Die Prozedur ZeichnenSin ist relativ komplex. Hier wird die komplette Ausgabe behandelt. Zu Beginn wird das Gitter auf die Picturebox gezeichnet:\nIf pixelx = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixely)\nEnd If\nDie beiden For-Schleifen laufen alle möglichen X und Y-Punkte Werte durch. Die Punkte werden dann jeweils mit 10 Pixeln Abstand gezeichnet. Am Ende wird wieder ein Startpunkt gesetzt. Dieser ganze Teil des Programm wird immer nur ausgeführt, wenn pixelx = 0 ist. Dies kommt vor, wenn das Programm zum ersten Mal startet oder das Ende der PB erreicht wurde und ein Reset ausgelöst wurde, wie wir im folgenden Teil sehen:\npixelx = pixelx + 1\nIf pixelx \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelx = 0\nEnd If\nDer pixelx-Wert ist ein allgemeiner Positionspointer. Er wird bei jedem Aufruf um einen Pixel erhöht. Wenn er den Wert 150 annimmt, ist das Ende der Box erreicht. Der Inhalt der Picturebox wird komplett gelöscht und der Pointer wieder auf 0 gesetzt. Das bedeutet auch, dass im nächsten Funktionsaufruf das komplette Raster neu gezeichnet wird.\nWir beschäftigen uns nun mit der Sinusfunktion. In der Elektrotechnik ist folgende Sinusfunktion geläufig:\nU(t) = u0 + û * sin(wt)\nHier ist u0 die Grundspannung. Û der Scheitelwert also die maximale Aussteuerung. W (eigentlich Omega) steht hier für die Kreisfrequenz (Berechnung: 2+pi+frequenz). Und t ist die Zeitkonstante. Wenn man t jetzt permanent erhöht, wird sin(…) permanent Werte zwischen 0 und 1 annehmen. Durch die Multiplikation mit dem Scheitelwert entstehen dadurch Werte zwischen 0 und dem Scheitelwert. Wenn u0 größer als null ist, verschiebt sich das Ganze auf der Y-Achse um diesen U0-Wert.\nGenau dies erreiche ich im Programm mit diesen Zeilen:\nvt = vt + (7.2 * f)\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * vt / 180.0\nut = u0 + (Math.Sin(xvt)) * ui\nUt entspricht also meiner Eingangsspannung in Abhängigkeit von der Zeit. Jetzt müssen nur noch die anderen Spannungen und die Ströme berechnet werden.\nUce ist die Spannung Kollektor-Emitter. Uce0 der entsprechende Startwert. Ib ist der Basisstrom, ic der Kollektorstrom, v die Verstärkung, rb der Basiswiderstand. Ich benutze hier wieder eine For-Schleif, um den komplexen Einschwingvorgang zu simulieren (vgl. NPN). Nach etwa 10 Berechnungen gleicht der Wert näherungsweise dem tatsächlich messbaren Wert. Vereinfacht wurde hier Ube als konstant 0.6 V angenommen.\nuce = 2.5\nuce0 = 2.5\nFor i = 1 To 10\nuce0 = (uce0 + uce) / 2\nib = (uce0 - 0.6) / rb + ut / 1000\nic = ib * v\nuce = 5 - ic * 1000\nIf uce \u0026gt; 5 Then uce = 5\nIf uce \u0026lt; 0.1 Then uce = 0.1\nNext i\nWas nun nur noch fehlt ist die Ausgabe:\npixely = 115 - uce * (10 / dime) \u0026lsquo;*20 denn 1v = 2 kästchen\nIf pixely \u0026gt; 115 Then pixely = 115\nIf pixely \u0026lt; 5 Then pixely = 5\nLine(pixelx, pixely)\nDer y-Wert entspricht der Aussteuerung, der x-Wert der Zeit, die konstant durchläuft. Die Amplitude ist auf die Größe der Picturebox begrenzt. Wird ein bestimmter Wert überschritten oder unterschritten wird einfach ein maximal/minmal Wert gezeichnet. Line zeichnet dann schließlich bis zu den berechneten Koordinaten eine Linie.\nQuelltextauszug 3: Der Rest Die ganze Sinus-Prozedur wird nun alle 2o ms von einem Timer aufgerufen. Dadurch gibt es weniger Ruckler während der Zeichnung. Die Parameter bestimmen Zeichenfrequenz, u0, Û und die Rastergröße.\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nZeichnenSin(1, 0, 1, 0.5)\nEnd Sub\nAnsonsten besteht der Quelltext hauptsächlich aus der Erfassung der aktuellen Werte. Wie man sieht wurde der Scrollbar UI auch hier wieder umgedreht. Außerdem ist die Ausgabe des eingestellten Wertes an eine Textbox in der Prozedur zum Scroll-Event behandelt.\nPrivate Sub VScrollBarUi_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarUi.Scroll\nui = (VScrollBarUi.Maximum - VScrollBarUi.Value + VScrollBarUi.Minimum) / 1000\nlbUi.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 1000) + \u0026ldquo;mV\u0026rdquo;\nEnd Sub\nPrivate Sub HScrollBarV_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles HScrollBarV.Scroll\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nZu Programmstart werden ein paar Startwerde definiert und aktuelle Einstellungen eingelesen.\nPrivate Sub frmGegenkopplung_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nuss = 0.01\nv = 100\nui = (VScrollBarUi.Maximum - VScrollBarUi.Value + VScrollBarUi.Minimum) / 1000\nlbUi.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 1000) + \u0026ldquo;mV\u0026rdquo;\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nKompletter Quelltext Public Class frmGegenkopplung\nDim pixelx, pixely\nDim vt, ut\nDim uss, v, ui\nDim ugrund, uv\nDim P1 As Point\nDim pz As Point\nDim P2 As Point\nDim stiftl As New Pen(Color.LightGreen, 1)\nPrivate Sub pSet(ByVal x As Integer, ByVal y As Integer)\nP1.X = x\nP1.Y = y\npz.X = 1\npz.Y = 1\nDim vsize As New Size(pz)\nDim rect As New Rectangle(P1, vsize)\nPictureBox1.CreateGraphics.DrawRectangle(Pens.LightGreen, rect) \u0026lsquo;, P1) \u0026lsquo;, P1)\nEnd Sub\nPrivate Sub Line(ByVal x As Integer, ByVal y As Integer)\nP2.X = x\nP2.Y = y\nPictureBox1.CreateGraphics.DrawLine(stiftl, P1, P2)\nP1.X = x\nP1.Y = y\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nZeichnenSin(1, 0, 1, 0.5)\nEnd Sub\nPrivate Sub VScrollBarUi_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles VScrollBarUi.Scroll\nui = (VScrollBarUi.Maximum - VScrollBarUi.Value + VScrollBarUi.Minimum) / 1000\nlbUi.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 1000) + \u0026ldquo;mV\u0026rdquo;\nEnd Sub\nPrivate Sub HScrollBarV_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles HScrollBarV.Scroll\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nPrivate Sub frmGegenkopplung_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nuss = 0.01\nv = 100\nui = (VScrollBarUi.Maximum - VScrollBarUi.Value + VScrollBarUi.Minimum) / 1000\nlbUi.Text = \u0026ldquo;Ui = \u0026quot; + Str(ui * 1000) + \u0026ldquo;mV\u0026rdquo;\nv = HScrollBarV.Value\nlbV.Text = \u0026ldquo;V = \u0026quot; + Str(v)\nEnd Sub\nPrivate Sub ZeichnenSin(ByVal f As Integer, ByVal u0 As Integer, ByVal umax As Integer, ByVal dime As Double)\nDim xvt, i, ut\nDim ib, ic, uce, uce0\n\u0026lsquo;Grundspannung\nDim rb = 270000\n\u0026rsquo; v = 500\nIf pixelx = 0 Then\nFor i = 0 To 14\nFor j = 0 To 11\npSet(5 + (i * 10), (j * 10) + 5)\nNext j\nNext i\npSet(0, pixely)\nEnd If\n\u0026lsquo;X Koordinaten +1 mit Reset\npixelx = pixelx + 1\nIf pixelx \u0026gt;= 150 Then\nPictureBox1.Image = Nothing\npixelx = 0\nEnd If\n\u0026lsquo;Zeit des Sinus\n\u0026lsquo;Herzangabe Frequenz bei Timer = 20ms\nvt = vt + (7.2 * f)\nIf vt \u0026gt;= 361 Then vt = 0\nxvt = Math.PI * vt / 180.0\n\u0026lsquo;Ut kurz vor Ausgabe. UV muss berechnet werden\nut = u0 + (Math.Sin(xvt)) * ui\nuce = 2.5\nuce0 = 2.5\nFor i = 1 To 10\nuce0 = (uce0 + uce) / 2\nib = (uce0 - 0.6) / rb + ut / 1000\nic = ib * v\nuce = 5 - ic * 1000\nIf uce \u0026gt; 5 Then uce = 5\nIf uce \u0026lt; 0.1 Then uce = 0.1\nNext i\npixely = 115 - uce * (10 / dime) \u0026lsquo;*20 denn 1v = 2 kästchen\nIf pixely \u0026gt; 115 Then pixely = 115\nIf pixely \u0026lt; 5 Then pixely = 5\nLine(pixelx, pixely)\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/gegenkopplung-vb-net-beispiel/","summary":"\u003cp\u003eIn diesem Programm wird eine Emitterschaltung mit Gegenkopplung simuliert. Die Änderung zu einem normalen Transistorverstärker ist, dass hier die Basis über einen Widerstand mit dem Kollektor verbunden ist. Damit wird einer Vergrößerung des Kollektorstroms entgegengewirkt. Das Resultat ist eine verkleinerte Verstärkung aber auch eine geringere Verzerrung.\u003c/p\u003e\n\u003cp\u003eIn dem Programm treten viele Neuerungen auf einmal auf. Es wird hier zum ersten Mal mit einer gezeichneten Ausgabe auf einer Picturebox gearbeitet. Wenn Sie sich bereits mit älteren VB-Versionen auskennen, werden Sie hier einige Änderungen feststellen. Allerdings habe ich versucht, altbekannte Prozeduren nachzuprogrammieren. Das sollte die Umstellung erleichtern.\u003c/p\u003e","title":"Gegenkopplung - VB.Net Beispiel"},{"content":"Bei dem Schmitt-Trigger-Programm tritt wieder etwas Besonderes auf. Hier haben wir das erste Mal Select Case statt einer IF-Abfrage benutzt. Das liegt daran, dass die Berechnung der Werte davon abhängen, welcher Zustand vorher gültig war. Visuell wird das in einer Hysteresekurve dargestellt.\nQuelltext Public Class frmST\nDim Re, Ui As Double\nDim fall\nDim uc1, ue, ub2, u1, ua As Double\nDim i1, i2\nPrivate Sub frmST_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nfall = 1\nberechnen()\nEnd Sub\nPrivate Sub berechnen()\nRe = sR1.Maximum - sR1.Value + sR1.Minimum\nUi = (sUi.Maximum - sUi.Value + sUi.Minimum) / 10\nSelect Case fall\nCase 1\nue = Ui - 0.6\ni1 = ue / Re\nuc1 = 4.7 - 3800 * i1\nIf uc1 \u0026lt; (ue + 0.1) Then uc1 = ue + 0.1\nub2 = uc1 / 2\nua = 6\nIf (ue + 0.6) \u0026lt;= ub2 Then fall = 2\nCase 2\ni1 = 0\ni2 = (6 - 0.1) / (1000 + Re)\nue = Re * i2\nua = 6 - i2 * 1000\nub2 = ue + 0.6\nuc1 = ub2 + ((6 - ub2) * 10000) / 14700\nIf Ui \u0026gt;= (ue + 0.6) Then fall = 1\nEnd Select\nlUe.Text = Str(Math.Round(ue, 2)) + \u0026quot; V \u0026quot;\nlUb2.Text = Str(Math.Round(ub2, 2)) + \u0026quot; V \u0026quot;\nlUc1.Text = Str(Math.Round(uc1, 2)) + \u0026quot; V \u0026quot;\nlR1.Text = Str(Math.Round(Re, 2)) + \u0026quot; Ohm \u0026quot;\nlUi.Text = Str(Math.Round(Ui, 2)) + \u0026quot; V \u0026quot;\nlUa.Text = Str(Math.Round(ua, 2)) + \u0026quot; V \u0026quot;\nEnd Sub\nPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick\nberechnen()\nEnd Sub\nEnd Class\nErgänzende Erlärung Das Programm unterscheidet streng zwischen zwei Fällen. Im ersten Fall ist der Ausgangstransistor gesperrt, und die Ausgangsspannung hoch. Alle Ströme und Spannungen hängen nur vom linken Transistor ab. Außerdem wird überwacht, ob der Ausgangstransistor eine Basis-Emitterspannung von mindestens 0,6 V erhält, denn dann kippt der Zustand um, sodass Fall 2 gültig wird.\nue = Ui - 0.6\ni1 = ue / Re\nuc1 = 4.7 - 3800 * i1\nIf uc1 \u0026lt; (ue + 0.1) Then uc1 = ue + 0.1\nub2 = uc1 / 2\nua = 6\nIf (ue + 0.6) \u0026lt;= ub2 Then fall = 2\nIm zweiten Fall ist es umgekehrt. Nun ist der linke Transistor gesperrt. Alle Ströme und Spannungen hängen von der Einstellung des Emitterwiderstands ab. Auch hier muss wieder überwacht werden, ob die Schaltung in den Fall1 zurückkehren soll, wenn nämlich der linke Transistor eine ausreichend hohe Basisspannung bekommt.\ni1 = 0\ni2 = (6 - 0.1) / (1000 + Re)\nue = Re * i2\nua = 6 - i2 * 1000\nub2 = ue + 0.6\nuc1 = ub2 + ((6 - ub2) * 10000) / 14700\nIf Ui \u0026gt;= (ue + 0.6) Then fall = 1\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/schmitt-trigger-vb-net-beispiel/","summary":"\u003cp\u003eBei dem Schmitt-Trigger-Programm tritt wieder etwas Besonderes auf. Hier haben wir das erste Mal \u003cem\u003eSelect Case\u003c/em\u003e statt einer IF-Abfrage benutzt. Das liegt daran, dass die Berechnung der Werte davon abhängen, welcher Zustand vorher gültig war. Visuell wird das in einer Hysteresekurve dargestellt.\u003c/p\u003e\n\u003cdetails class=\"spoiler\"\u003e\n  \u003csummary\u003eQuelltext\u003c/summary\u003e\n  \u003cp\u003ePublic Class frmST\u003cbr\u003e\nDim Re, Ui As Double\u003cbr\u003e\nDim fall\u003cbr\u003e\nDim uc1, ue, ub2, u1, ua As Double\u003cbr\u003e\nDim i1, i2\u003c/p\u003e\n\u003cp\u003ePrivate Sub frmST_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\u003cbr\u003e\nfall = 1\u003cbr\u003e\nberechnen()\u003cbr\u003e\nEnd Sub\u003c/p\u003e","title":"Schmitt-Trigger - VB.Net Beispiel"},{"content":"Das Programm Inventierender Verstärker funktioniert ähnlich wie das vorangegangen Programm Nichtinvertierender Verstärker.\nDas Programm unterscheidet sich vom Vorgänger fast nur durch eine etwas andere Rechenregel (vgl. ELEXS)\nRv = R1 / (R1 + R2)\nV = -(R2 / R1)\nUv = Rx * V\nQuelltext Public Class frmIV\nDim R1, R2, Rx\nDim V\nDim Uo, Uplus, Uminus\nDim Uv, Rv\nPrivate Sub sR2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sR2.Scroll\nberechnen()\nEnd Sub\nPrivate Sub berechnen()\nR1 = sR1.Value\nR2 = sR2.Value\nRx = (sRx.Maximum - sRx.Value + sRx.Minimum) / 10\nlR1.Text = \u0026ldquo;R1 = \u0026quot; + Str(R1) + \u0026quot; k\u0026rdquo;\nlR2.Text = \u0026ldquo;R2 = \u0026quot; + Str(R2) + \u0026quot; k\u0026rdquo;\nlUi.Text = \u0026ldquo;Ui = \u0026quot; + Str(Rx) + \u0026quot; V\u0026rdquo;\nRv = R1 / (R1 + R2)\nV = -(R2 / R1)\nUv = Rx * V\nIf Uv \u0026gt; 9.5 Then\nUo = 9.5\nUminus = (Uv - Uo) * -Rv\nElseIf Uv \u0026lt; -9.5 Then\nUo = -9.5\nUminus = (Uv - Uo) * -Rv\nElse\nUo = Uv\nUplus = 0\nUminus = 0\nEnd If\nUminus = Math.Round(Uminus, 2)\nlUo.Text = \u0026ldquo;Uo = \u0026quot; + Str(Uo) + \u0026quot; V\u0026rdquo;\nlUplus.Text = \u0026ldquo;U+ = \u0026quot; + Str(Uplus) + \u0026quot; V\u0026rdquo;\nlUminus.Text = \u0026ldquo;U- = \u0026quot; + Str(Uminus) + \u0026quot; V\u0026rdquo;\nEnd Sub\nPrivate Sub sRx_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sRx.Scroll\nberechnen()\nEnd Sub\nPrivate Sub sR1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sR1.Scroll\nberechnen()\nEnd Sub\nPrivate Sub frmIV_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nberechnen()\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/invertierender-verstaerker-vb-net-beispiel/","summary":"\u003cp\u003eDas Programm Inventierender Verstärker funktioniert ähnlich wie das vorangegangen Programm Nichtinvertierender Verstärker.\u003c/p\u003e\n\u003cp\u003eDas Programm unterscheidet sich vom Vorgänger fast nur durch eine etwas andere Rechenregel (vgl. \u003ca href=\"http://elexs.de/kap7_3.htm\"\u003eELEXS\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRv = R1 / (R1 + R2)\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eV = -(R2 / R1)\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eUv = Rx * V\u003c/em\u003e\u003c/p\u003e\n\u003cdetails class=\"spoiler\"\u003e\n  \u003csummary\u003eQuelltext\u003c/summary\u003e\n  \u003cp\u003e\u003cem\u003ePublic\u003c/em\u003e \u003cem\u003eClass frmIV\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDim\u003c/em\u003e \u003cem\u003eR1, R2, Rx\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eDim V\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eDim Uo, Uplus, Uminus\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eDim\u003c/em\u003e \u003cem\u003eUv, Rv\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePrivate Sub sR2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sR2.Scroll\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eberechnen()\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eEnd Sub\u003c/em\u003e\u003c/p\u003e","title":"Invertierender Verstärker -VB.Net Beispiel"},{"content":"Dieses Programm simuliert eine Schaltung mit einem nichtinvertierenden Operations-Verstärker.\nDie eigentliche Berechnung im Programm ist ganz einfach und bestimmt die Verstärkung und die Ausgangsspannung aus dem Verhältnis von Widerständen (vgl. ELEXS).\nRv = R2 / (R1 + R2)\nV = (R1 + R2) / R2\nUv = Ui * V\nDie Rechnung kann theoretisch auch Ausgangspannungen außerhalb des Bereichs der Betriebsspannung ergeben. Deshalb wird hier in einem zweiten Schritt die tatsächliche Spannung nach oben und unten bis auf 0,5 V an der Betriebsspannung begrenzt. Wenn dieser Übersteuerungsfall eintritt weicht die Spannung am invertierenden Eingang des OPV von der am nichtinvertierenden ab und muss eigens aus dem Spannungsteilungsverhältnis berechnet werden.\nIf Uv \u0026gt; 9.5 Then\nUo = 9.5\nUminus = Uo * Rv\nElseIf Uv \u0026lt; -9.5 Then\nUo = -9.5\nUminus = Uo * Rv\nElse\nUo = Uv\nUminus = Ui\nEnd If\nQuelltext Public Class frmNIV\nDim Ui, R1, R2\nDim V, Uo\nDim Uv, Uminus, Rv\nPrivate Sub sRx_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sRx.Scroll\nberechnen()\nEnd Sub\nPrivate Sub berechnen()\nUi = -1 * (sRx.Value / 10)\nR1 = 20 - sR2.Value\nR2 = 20 - sR1.Value\nlR1.Text = \u0026ldquo;R1 = \u0026quot; + Str(R1) + \u0026quot; k\u0026rdquo;\nlR2.Text = \u0026ldquo;R2 = \u0026quot; + Str(R2) + \u0026quot; k\u0026rdquo;\nlUplus.Text = \u0026ldquo;U+ = \u0026quot; + Str(Ui) + \u0026quot; V\u0026rdquo;\nRv = R2 / (R1 + R2)\nV = (R1 + R2) / R2\nUv = Ui * V\nIf Uv \u0026gt; 9.5 Then\nUo = 9.5\nUminus = Uo * Rv\nElseIf Uv \u0026lt; -9.5 Then\nUo = -9.5\nUminus = Uo * Rv\nElse\nUo = Uv\nUminus = Ui\nEnd If\nUminus = Math.Round(Uminus, 2)\nlUo.Text = \u0026ldquo;Uo = \u0026quot; + Str(Uo) + \u0026quot; V\u0026rdquo;\nlUminus.Text = \u0026ldquo;U- = \u0026quot; + Str(Uminus) + \u0026quot; V\u0026rdquo;\nEnd Sub\nPrivate Sub frmNIV_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nberechnen()\nEnd Sub\nPrivate Sub sR2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sR2.Scroll\nberechnen()\nEnd Sub\nPrivate Sub sR1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sR1.Scroll\nberechnen()\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/nichtinvertierender-verstaerker-vb-net-beispiel/","summary":"\u003cp\u003eDieses Programm simuliert eine Schaltung mit einem nichtinvertierenden Operations-Verstärker.\u003c/p\u003e\n\u003cp\u003eDie eigentliche Berechnung im Programm ist ganz einfach und bestimmt die Verstärkung und die Ausgangsspannung aus dem Verhältnis von Widerständen (vgl. \u003ca href=\"http://elexs.de/kap7_2.htm\"\u003eELEXS\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRv = R2 / (R1 + R2)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eV = (R1 + R2) / R2\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eUv = Ui * V\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eDie Rechnung kann theoretisch auch Ausgangspannungen außerhalb des Bereichs der Betriebsspannung ergeben. Deshalb wird hier in einem zweiten Schritt die tatsächliche Spannung nach oben und unten bis auf 0,5 V an der Betriebsspannung begrenzt. Wenn dieser Übersteuerungsfall eintritt weicht die Spannung am invertierenden Eingang des OPV von der am nichtinvertierenden ab und muss eigens aus dem Spannungsteilungsverhältnis berechnet werden.\u003c/p\u003e","title":"Nichtinvertierender Verstärker - VB.Net Beispiel"},{"content":"Mit dem Programm Innenwiderstand kann man beobachten, wie sich Strom und Spannung in Schaltungen verhalten, wenn man den Innenwiderstand einer Stromquelle, die Spannung der Stromquelle oder die Last verändert.\nDie Berechnung ähnelt der bei der Reihenschaltung, weil der innere und der äußere Widerstand einen Spannungsteiler bilden. Mehr dazu findet man in ELEXS.\nrges = Ri + Ra\nIa = Ui / rges\nUa = Ra * Ia\nQuelltext Public Class frmInnen\nDim Ui, Ri, Ia, Ra, Ua\nPrivate Sub berechnen()\nDim rges\nUi = (sbSpannung.Maximum - sbSpannung.Value + sbSpannung.Minimum) / 10\nRi = (sbInnen.Maximum - sbInnen.Value + sbInnen.Minimum) / 10\nRa = (sbOhm.Maximum - sbOhm.Value + sbOhm.Minimum) / 10\nIa = \u0026ldquo;1\u0026rdquo;\nUa = \u0026ldquo;1\u0026rdquo;\nrges = Ri + Ra\nIa = Ui / rges\nUa = Ra * Ia\nlbSpI.Text = Str(Math.Round(Ui, 2)) + \u0026quot; V \u0026ldquo;\nlbRQ.Text = Str(Math.Round(Ri, 2)) + \u0026quot; Ohm\u0026rdquo;\nlbRA.Text = Str(Math.Round(Ra, 2)) + \u0026quot; Ohm\u0026quot;\nlbIA.Text = Str(Math.Round(Ia, 2)) + \u0026quot; A \u0026ldquo;\nlbSpA.Text = Str(Math.Round(Ua, 2)) + \u0026quot; V \u0026ldquo;\nEnd Sub\nPrivate Sub sbInnen_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbInnen.Scroll\nberechnen()\nEnd Sub\nPrivate Sub frmInnen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nberechnen()\nEnd Sub\nPrivate Sub sbSpannung_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles sbSpannung.Scroll\nberechnen()\nEnd Sub\nPrivate Sub sbOhm_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbOhm.Scroll\nberechnen()\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/innenwiderstand-vb-net-beispiel/","summary":"\u003cp\u003eMit dem Programm Innenwiderstand kann man beobachten, wie sich Strom und Spannung in Schaltungen verhalten, wenn man den Innenwiderstand einer Stromquelle, die Spannung der Stromquelle oder die Last verändert.\u003c/p\u003e\n\u003cp\u003eDie Berechnung ähnelt der bei der Reihenschaltung, weil der innere und der äußere Widerstand einen Spannungsteiler bilden. Mehr dazu findet man in \u003ca href=\"http://elexs.de/kap2_6.htm\"\u003eELEXS\u003c/a\u003e\u003ca href=\"http://elexs.de/kap2_6.htm\"\u003e.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003erges = Ri + Ra\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eIa = Ui / rges\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eUa = Ra * Ia\u003c/em\u003e\u003c/p\u003e\n\u003cdetails class=\"spoiler\"\u003e\n  \u003csummary\u003eQuelltext\u003c/summary\u003e\n  \u003cp\u003e\u003cem\u003ePublic\u003c/em\u003e \u003cem\u003eClass frmInnen\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eDim Ui, Ri, Ia, Ra, Ua\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003ePrivate\u003c/em\u003e \u003cem\u003eSub berechnen()\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eDim rges\u003c/em\u003e\u003c/p\u003e","title":"Innenwiderstand - VB.Net Beispiel"},{"content":"Dieses Programm berechnet Ströme und Spannungen in einer Reihenschaltung. Sowohl die beiden Widerstände als auch die Eingangsspannung sind dabei veränderbar.\nIn diesem Programm wird die Funktion Math.Round benutzt. Mit ihr kann man Zahlen auf eine bestimmte Anzahl von Nachkommastellen runden. Auf wie viele Stellen gerundet werden soll, gibt der zweite Parameter an, z.B.: Math.Round(2.2345, 3).\nDie eigentliche Berechnung (vgl. physikalische Hintergründe in ELEXS) steht in den folgenden drei Zeilen:\nI = Math.Round(U / ((R1 + R2)), 3)\nUr1 = R1 * I\nUr2 = U - Ur1\nAlles andere beschäftigt sich mit der Eingabe und Ausgabe von Werten.\nQuelltext Public Class fReihe\nDim I, U, R1, R2, Ur1, Ur2\nPrivate Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e AsSystem.Windows.Forms.ScrollEventArgs) Handles vbSp.Scroll\nBerech()\nEnd Sub\nPrivate Sub vbR1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles vbR1.Scroll\nBerech()\nEnd Sub\nPrivate Sub vbR2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles vbR2.Scroll\nBerech()\nEnd Sub\nPrivate Sub fReihe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\nBerech()\nEnd Sub\nPrivate Sub Berech()\nU = vbSp.Maximum - vbSp.Value + vbSp.Minimum\nR1 = vbR1.Maximum - vbR1.Value + vbR1.Minimum\nR2 = vbR2.Maximum - vbR2.Value + vbR2.Minimum\nI = Math.Round(U / ((R1 + R2)), 3)\nUr1 = R1 * I\nUr2 = U - Ur1\nlbSp1.Text = Str(Math.Round(Ur1 / 10, 3)) + \u0026quot; V\u0026quot;\nlbSp2.Text = Str(Math.Round(Ur2 / 10, 3)) + \u0026quot; V\u0026quot;\nlbSt.Text = Str(I) + \u0026quot; mA\u0026quot;\nlbSpA.Text = Str(U / 10) + \u0026quot; V\u0026quot;\nlbR1.Text = Str(R1 / 10) + \u0026quot; k\u0026quot;\nlbR2.Text = Str(R2 / 10) + \u0026quot; k\u0026quot;\nEnd Sub\nEnd Class\nDownload Projektdatei Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug.\n","permalink":"https://fkainka.de/reihenschaltung-vb-net-beispiel/","summary":"\u003cp\u003eDieses Programm berechnet Ströme und Spannungen in einer Reihenschaltung. Sowohl die beiden Widerstände als auch die Eingangsspannung sind dabei veränderbar.\u003c/p\u003e\n\u003cp\u003eIn diesem Programm wird die Funktion \u003cem\u003eMath.Round\u003c/em\u003e benutzt. Mit ihr kann man Zahlen auf eine bestimmte Anzahl von Nachkommastellen runden. Auf wie viele Stellen gerundet werden soll, gibt der zweite Parameter an, z.B.: \u003cem\u003eMath.Round(2.2345, 3)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eDie eigentliche Berechnung (vgl. physikalische Hintergründe in \u003ca href=\"http://elexs.de/kap2_4.htm\"\u003eELEXS\u003c/a\u003e) steht in den folgenden drei Zeilen:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eI = Math.Round(U / ((R1 + R2)), 3)\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eUr1 = R1 * I\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eUr2 = U - Ur1\u003c/em\u003e\u003cbr\u003e\nAlles andere beschäftigt sich mit der Eingabe und Ausgabe von Werten.\u003c/p\u003e","title":"Reihenschaltung -VB.Net Beispiel"},{"content":"Bei diesem Programm geht es darum, eine einfache NPN-Transistor-Schaltung zu simulieren. Mit verschiedenen Schiebern kann man einen veränderlichen Widerstand und damit die Eingangsspannung verstellen. Interessante Größen werden dann berechnet und an entsprechenden Labels ausgegeben.\nHauptsächlich können Sie an diesem Beispiel sehen, wie man eine Sub aufruft und wie man kleinere Rechnungen ausführt.\nDie visuelle Oberfläche ist größtenteils durch ein vorgegebenes Hintergrundbild definiert. Somit spart man sich das komplizierte Zeichnen im Desingeditor. Anschließend sind an den passenden Stellen Label und Schieber hinzugefügt worden.\nDamit das Hintergrundbild nicht verrutscht, habe ich dafür gesorgt, dass man das Programmfenster nicht vergrößern oder verkleinern kann. Das kann man erreichen, indem man die Eigenschaften minimale und die maximale Größe (MaxmiumSize, MinimumSize) auf die aktuelle Größe (Size) des Fensters einstellt. Damit man den Benutzer nicht verwirrt, kann man den Maximieren-Button im Eigenschaftsfenster des Design-Mangers auf unsichtbar stellen (MaximizeBox: False).\nEin weiteres Problem dieses Projekts war, dass die Schieber subjektiv wahrgenommen umgekehrt waren. Das heißt, der Wert wird größer, wenn man den Schieber nach unten bewegt. Intuitiver ist es aber anders herum. Leider gibt es dafür keine Eigenschaft. Deswegen muss man sich mit ein bisschen Code behelfen. In diesem Beispiel heißt der Schieber sbR. Die Formel die den Schieber allgemein umdreht lautet: sbR.Maximum - sbR.Value.Wenn man nun aber auch einen Minimum Wert hat, muss man diesen noch dazu addieren*:*sbR.Maximum - sbR.Value + sbR.Minimum. Jetzt muss man nur noch die Voreinstellung des Schiebers neu berechnen und fertig.\nQuelltextauszug 1: Public Class frmMain\nDim V, Ui, Ube, Ib, Ic, Uce\nDieser Teil des Quelltextes ist der unwichtigere Teil, aber er muss gemacht werden. Zu Beginn steht wie üblich die Klasse, die wie das Hauptformular heißt, in diesem Fall also frmMain (frm ist meine Bezeichnung für Formular). Anschließend werden ein paar Variablen mit dim dimensioniert. Ich habe die Variablentypen nicht angegeben, was nicht gerade ein sauberer Stil ist, aber VB.Net lässt dies zu.\nDa die Variablen an dieser Stelle dimensioniert wurden, und nicht z.B. am Anfang einer Prozedur, gelten sie innerhalb der Klasse als global, d.h. alle Prozeduren innerhalb dieser Klasse dürfen darauf zugreifen. Wenn eine Variable innerhalb einer Prozedur dimensioniert würde, könnte nur diese Prozedur auf die Variable zugreifen. Der Vorteil läge aber darin, dass man in einer anderen Prozedur denselben Variablennamen benutzen dürfte, ohne auf einen Konflikt zu stoßen.\nPrivate Sub sbR_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbR.Scroll\nberechnen()\nEnd Sub\nPrivate Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nberechnen()\nEnd Sub\nAls nächstes sehen wir zwei Prozeduren, die bei einem bestimmten Event ausgeführt werden. Das eine Event ist frmMain_Load, was bei Programmstart ausgeführt wird, das andere ist sbR_Scroll und tritt in Kraft, wenn der Schieber sbR benutzt wird. Beide Prozeduren rufen die Sub berechnen auf, den wichtigsten Teil des Programms.\nQuelltextauszug 2: Berechnen Dieser Teil des Quelltextes ist der spannendste, denn er beinhaltet die komplette Berechnung und die Ausgabe.\nPrivate Sub berechnen()\nV = 180\nHier beginnt die Prozedur. Wir sehen den Namen und dass keine Parameter benötigt werden, die sonst zwischen den Klammern stehen würden. Außerdem wird der Variable V (für Verstärkung) ein Startwert zugewiesen.\nUi = (sbR.Maximum - sbR.Value + sbR.Minimum) / 100 * 5\nUbe = 0.43\nIb = 0\nIf Ui \u0026gt; Ube Then Ib = (Ui - Ube) / 100\nAn dieser Stelle werden ebenfalls einigen Variablen Werte zugewiesen, und zwar Ube (Spannung Basis-Emiter), Ib (Basis-Strom) und Ui (Eingangsspannung), welcher einstellbar ist. Ui wird zusätzlich noch umgerechnet in Volt.\nFor n = 1 To 4\nIf Ib \u0026gt; 0 Then Ube = 0.6 + Math.Log(Ib / 0.1) * 0.02886\nIf Ui \u0026gt; Ube Then Ib = (Ui - Ube) / 100\nNext n\nEinige werden sich sicher wundern, warum hier in einer For-Schleife dieselbe Rechnung vier Mal ausgeführt wird. Das liegt daran, dass sich die Schaltung durch Wechselwirkungen erst langsam auf einen Endwert einpendelt. Ein veränderter Strom führt zu einer neuen Basisspannung, die wiederum zu einem neuen Strom führt. Das macht die direkte Berechnung des Endwertes kompliziert, weswegen hier an dieser Stelle der Einpendelvorgang simuliert wird.\nAußerdem kann man sehen wie man mathematische Unterfunktionen aufruft, hier nämlich mit Math.Log. Wollen Sie mit der konstanten Pi Rechnen, können Sie das mit Math.Pi tun.\nIf Ib = 0 Then Ube = Ui\nUbe = Int(Ube * 100) / 100\nIb = Int(Ib * 1000) / 1000\nIc = Ib * V\nIf Ic \u0026gt; 4.85 Then Ic = (Ic - 4.85) / 100 + 4.85\nUce = 5 - 1 * Ic\nUce = Int(Uce * 100) / 100\nIc = Int(Ic * 100) / 100\nHier findet die weitere Berechnung der einzelnen Werte statt. Genaueres zu den physikalischen Grundlagen finden Sie weiter unten. An manchen Stellen steht Int(…) vor einer Berechnung. Da ich die Variablen zu Beginn des Programms nicht richtig deklariert habe, muss ich dem Programm nun mitteilen, dass es sich hier um ein Integer handelt.\nlbIb.Text = \u0026ldquo;Ib=\u0026rdquo; + Str$(Ib) + \u0026quot; mA\u0026quot;\nlbUbe.Text = \u0026ldquo;Ube=\u0026rdquo; + Str$(Ube) + \u0026quot; V\u0026quot;\nlbIc.Text = \u0026ldquo;Ic=\u0026rdquo; + Str$(Ic) + \u0026quot; mA\u0026quot;\nlbUce.Text = \u0026ldquo;Uce=\u0026rdquo; + Str$(Uce) + \u0026quot; V\u0026quot;\nEnd Sub\nDie Ausgabe darf natürlich nicht vergessen werden. An dieser Stelle werden deswegen den passenden Labels Werte zugewiesen. Dabei ist der Text aufgeteilt. Die Beschriftungen werden in Anführungszeichen geschrieben. Damit das Programm weiß, dass der Wert nun als String behandelt werden soll, muss man Str(…) davor schreiben. Insgesamt werden die Teile mit + oder \u0026amp; zu einem Gesamttext zusammengeführt und am Label ausgegeben*. End Sub* definiert das Ende der Routine.\nDer gesamte Quelltext Public Class frmMain\nDim V, Ui, Ube, Ib, Ic, Uce\nPrivate Sub sbR_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbR.Scroll\nberechnen()\nEnd Sub\nPrivate Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load\nberechnen()\nEnd Sub\nPrivate Sub berechnen()\nV = 180\nUi = (sbR.Maximum - sbR.Value + sbR.Minimum) / 100 * 5\nUbe = 0.43\nIb = 0\nIf Ui \u0026gt; Ube Then Ib = (Ui - Ube) / 100\nFor n = 1 To 4\nIf Ib \u0026gt; 0 Then Ube = 0.6 + Math.Log(Ib / 0.1) * 0.02886\nIf Ui \u0026gt; Ube Then Ib = (Ui - Ube) / 100\nNext n\nIf Ib = 0 Then Ube = Ui\nUbe = Int(Ube * 100) / 100\nIb = Int(Ib * 1000) / 1000\nIc = Ib * V\nIf Ic \u0026gt; 4.85 Then Ic = (Ic - 4.85) / 100 + 4.85\nUce = 5 - 1 * Ic\nUce = Int(Uce * 100) / 100\nIc = Int(Ic * 100) / 100\nlbIb.Text = \u0026ldquo;Ib=\u0026rdquo; + Str$(Ib) + \u0026quot; mA\u0026quot;\nlbUbe.Text = \u0026ldquo;Ube=\u0026rdquo; + Str$(Ube) + \u0026quot; V\u0026quot;\nlbIc.Text = \u0026ldquo;Ic=\u0026rdquo; + Str$(Ic) + \u0026quot; mA\u0026quot;\nlbUce.Text = \u0026ldquo;Uce=\u0026rdquo; + Str$(Uce) + \u0026quot; V\u0026quot;\nEnd Sub\nEnd Class\nDownload Projektdatei NPN Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \\bin\\Debug. ","permalink":"https://fkainka.de/vb-net-beispiel-npn-transistor/","summary":"\u003cp\u003eBei diesem Programm geht es darum, eine einfache NPN-Transistor-Schaltung zu simulieren. Mit verschiedenen Schiebern kann man einen veränderlichen Widerstand und damit die Eingangsspannung verstellen. Interessante Größen werden dann berechnet und an entsprechenden Labels ausgegeben.\u003c/p\u003e\n\u003cp\u003eHauptsächlich können Sie an diesem Beispiel sehen, wie man eine Sub aufruft und wie man kleinere Rechnungen ausführt.\u003c/p\u003e\n\u003cp\u003eDie visuelle Oberfläche ist größtenteils durch ein vorgegebenes Hintergrundbild definiert. Somit spart man sich das komplizierte Zeichnen im Desingeditor. Anschließend sind an den passenden Stellen Label und Schieber hinzugefügt worden.\u003c/p\u003e","title":"NPN-Transistor - VB.Net Beispiel"},{"content":"In diesem Text werde ich auf die Besonderheiten und die Schreibweisen (Syntax) von VB.Net eingehen. Wenn Sie noch nie Programmiert haben empfehle ich vorher die Artikel über die Grundlagen der Programmierung zu lesen. Falls Sie schon andere Programmiersprachen benutzt haben interessiert Sie vielleicht nur, wie die man einzelne Elemente in VB.Net umsetzt. Deswegen werde ich hier in kurzer, übersichtlicher Form die Syntax dieser Programmiersprache erläutern. Auf diese Weise können Sie immer schnell nachschlagen, wenn Sie sich gerade nicht mehr sicher sind, wie man beispielsweise eine Schleife in VB.Net realisiert.\nVB.Net ist eine relativ einfache Programmiersprache. Es ist nicht nötig nach jeder Zeile ein Semikolon zu schreiben wie z.B. in C oder in Java. Allgemein werden meistens auf zusätzliche Zeichen im Quelltext verzichtet (wie etwa Klammern bei If-Abfragen). Das macht den Text für Anfänger leserlicher, man büßt aber ein wenig Struktur ein. Das Kompilieren läuft in VB.Net einfach mit F5 oder dem Play-Button. Dadurch wird auch gleichzeitig eine EXE im Debug-Ordner Ihres Projekts erzeugt. Meist können Sie diese Exe aber nicht gleich auf andren PCs benutzen, ohne vorher eine Zusatzsoftware zu Installieren.\nVB.Net ist eine fast komplett objektorientierte Programmiersprache. Allerdings ist es auch möglich linear Zeile für Zeile zu arbeiten. Manchmal ist es aber auch sehr nützlich eine neue Klasse erstellen zu können.\nDas Wichtigste Kommentieren Das Kommentieren einer Zeile funktioniert mit ‘ (Shift +#)\nDas Kommentieren eines größeren Bereichs: Bereich markieren, STG+K+C drücken.\nVariablen Variablen müssen deklariert werden, sonst gibt es Fehlermeldungen. Es muss aber nicht immer der Datentyp angegeben werden. Es können Variablen lokal in einer Prozedur oder einer Klasse Deklariert werden, oder auch global.\nAllgemein :\nDim name As Integer\nPublic name As Integer\nProzeduren Prozeduren müssen nicht Deklariert werden. Es müssen nur Klassenübergreifende Subs mit public definiert werden.\nprivate Sub berechnen()\nIf Abfragen If i \u0026lt;\u0026gt; n Then\nElse\nEnd If\n(oder in einer Zeile ohne End IF)\nSelect Case i\nCase 1\nCase Else\nEnd Select\nSchleifen For n = 1 To anzElem\nNext n\nWhile i = 1\nEnd While\nDo\nLoop Until i = 1\nKlassen Klassen müssen nicht definiert werden. Nur neu Konstruiert.\nClass Elektron\nEnd Class\nKonstruktor:\nDim neuElektron As New Elektron\nKonstruktor Array:\nDim neuElektron As New Elektron\nneuElektron.Zeichnen(0, 0, pb1)\nElektronen(i) = neuElektron\nAllgemeine Syntax Runden Mit Math.Round kann man Zahlen auf eine bestimmte Anzahl von Nachkommastellen runden. Auf wie viele Stellen gibt der zweite Parameter an, z.B.: Math.Round(2.2345, 3).\n","permalink":"https://fkainka.de/vb-net-syntax/","summary":"\u003cp\u003eIn diesem Text werde ich auf die Besonderheiten und die Schreibweisen (Syntax) von VB.Net eingehen. Wenn Sie noch nie Programmiert haben empfehle ich vorher die Artikel über die \u003ca href=\"http://wp.fkainka.de/grundlagen-der-programmierung/\" title=\"Grundlagen der Programmierung\"\u003eGrundlagen der Programmierung\u003c/a\u003e zu lesen. Falls Sie schon andere Programmiersprachen benutzt haben interessiert Sie vielleicht nur, wie die man einzelne Elemente in VB.Net umsetzt. Deswegen werde ich hier in kurzer, übersichtlicher Form die Syntax dieser Programmiersprache erläutern. Auf diese Weise können Sie immer schnell nachschlagen, wenn Sie sich gerade nicht mehr sicher sind, wie man beispielsweise eine Schleife in VB.Net realisiert.\u003c/p\u003e","title":"VB.Net: Syntax"},{"content":"Unter den zahlreichen Steuerelementen in VB.Net gibt esein paar, die sehr häufig in Fenster basierenden Programmen auftauchen:Hier hätten wir u.A.:Button,\nLabel, TextBox, CheckBox und das Formular selbst.\nZu\nBeginn ist es am Einfachsten, wenn man sich auf die Eigenschaften und Ereignisse von Elementen konzentriert. Eigenschaften werden hauptsächlich vor dem Programmstart im Formmanager verändert um ein Startbild zu definieren. Aber auch zur Laufzeit ist es möglich, bestimmte Eigenschaften zu verändern. Man kann z.B. den Titeltext des Formulars verändern um den Benutzer auf einen Fehler hinzuweisen. Aber später mehr dazu.Wenn ein Ereignis (Event) ausgelöst wird überprüft das Programm, ob eine Prozedur zu diesem Ereignis definiert ist. Ist dies der Fall wird diese Prozedur ausgeführt. Eines der häufigsten Events ist der\nButton_Click.\nJetzt juckt es Ihnen wahrscheinlich schon in den Fingern ein wenig auszuprobieren. Das geht auch ganz einfach indem Sie ein neues\nProjekt erstellen, auf das Formular einen Button ziehen und dann doppelt auf\nden Button klicken. Sie landen automatisch in der passenden Button_Click-Prozedur.\nHier können Sie jetzt einfach Me.text = \u0026ldquo;Sie haben Button1 geklickt\u0026rdquo; eingeben.\nMe steht hier für Ihr Form1. Mit F5 starten Sie das Programm und siehe da: wenn Sie auf den Button klicken erscheint die Nachricht oben in der Leiste.\nIm Folgenden habe ich eine kurze Liste über die wichtigsten Eigenschaften und Ereignisse zusammengetragen. Wenn Sie möchten\nkönnen Sie in wenig rumspielen und selber die Möglichkeiten ausprobieren.\nEigenschaften Name:\nName beinhaltet den Namen des Objekts mit dem es zur Laufzeiten angesprochen werden\nkann. Es lohnt sich selbst ein System auszudenken oder anzueignen um nicht mit den Namen durcheinander zu kommen (z.B. alle Buttons fangen mit „bt“ an, alle Label mit „lb“).\nEnable:\nMit dieser Eigenschaft kann man ein Objekt unbenutzbar machen. Im Falle des Buttons\nheißt das, dass der Button bei Trueklickbar und bei False angegraut und\nnicht klickbar ist.\nFont: Diese Eigenschaft beinhaltet eine Reihe von Einstellungen, die sich alle mit der Darstellung des Textes befassen. Wenn Sie im Formeditor\ndoppelt auf diese Eigenschaft klicken wird sich ein Fenster öffnen in dem Sie alles bequem einstellen können.\nText: Diese Eigenschaft behandelt den Text, den das Objekt anzeigt. Beim Button wäre das die Beschriftung, bei der TextBox ein vordefinierter Text, beim\nFormular die Titelleiste.\nVisible: Mit Visible legt man fest, ob ein Objekt zur Laufzeiten zu sehen ist. Dies kann nützlich sein wenn z.B. ein Button erst nach einer bestimmten Eingabe zum Vorschein kommen soll. Ein unsichtbarer Button ist übrigens auch nicht klickbar.\nBackcolor/BackgroundImage:\nMit diesen Eigenschaften können Sie den Hintergrund eines Objekts\ndefinieren. Sie können z.B. ein komplett schwarzes Formular machen. Alternativ könnten Sie auch ein Bild im Hintergrund anzeigen lassen.\nDies sind die wichtigsten Eigenschaften die auf ziemlich\njedes dieser Elemente zutreffen.\nSpeziell für den CheckButton und ähnliche Vertreter gilt\nnoch die Eigenschaft Checked. Sie gibt an, ob der Button ausgewählt ist oder nicht.\nEin weiteres wichtiges Objekt ist der Scrollbar.\nDie speziellen Eigenschaften des Scrollbars sind Value,\nMinimum, Maximum und LargeChange. Valuedefiniert den voreingestellten Wert, Minimumden minimalen und Maximum den maximalen\nWert. LargeChange definiert die kleinste mögliche Änderungsrate.\nEs gibt noch eine Menge anderer Eigenschaften die\ngrößtenteils Objektabhängig sind. Probieren Sie einfach mal ein\nbisschen im Layoutmanger herum, damit Sie ein Gefühl für die Möglichkeiten\nbekommen.\nEigenschaftenverändern zur Laufzeit Unser vorheriges Programm hat uns schon mal die ersten\nSchritte des EVA-Prinzips (Eingabe, Verarbeitung, Ausgabe) näher\ngebracht. Unsere Eingabe bestand aus dem Klicken des Buttons. Das Programm hat diese Eingaben verarbeitet und eine adäquate Ausgabe präsentiert. Eine andere Möglichkeit der Ausgabe wäre z.B. den Text eines Labels zu ändern. Wie bereits gesehen ändert man Eigenschaften von Objekten generell so:\nLabel.Text\n= „HALLO WELT“\nWir sehen den Namen des Labels (hier einfach Label) dann\nPunkt und Eigenschaft (Text wollen wir verändern) und nach dem\nGleichheitszeichen den Text (In Anführungszeichen bei Texten).\nGanz ähnlich können wir nun die Hintergrundfarbe des\nLabels verändern:\nLabel1.BackColor\n= Color.Beige\nKleiner\nTipp: Bei der Auswahl der Eigenschaft hilft das DropDown-Menü.\nDies erscheint, wenn man nach dem Namen eines Objekts einen Punkt\ngesetzt hat. Das erleichtert Ihnen die Arbeit und man entdeckt auch neue\nEigenschaften die man ausprobieren kann.\nEreignisse Wir haben bereits gesehen, dass Ereignisse bestimmte\nProzeduren auslösen. Meist hat das Objekt schon eine Voreinstellung\nwelches Ereignis betrachtet werden soll (z.B. Scrollbar – Change). Wir können das Ereignis aber auch im Quelltext oben rechts\nnach Wunsch verändern.\nKlicken Sie einfach mal doppelt auf einen Button im\nDesingmenü. Sie kommen wieder zu der Prozedur des Klick-Ereignisses.\nWenn Sie nun aber oben rechts gucken, sind dort ein Blitz und das Wort Click. In diesem Drop-Down-Menü befinden sich eine Menge möglicher Ereignisse, die Sie auswählen können. Probieren Sie doch mal das MouseOver Ereignis aus und füllen die entsprechende Prozedur. Und wann wird eigentlich das Form_Load Ereignis ausgeführt?\nDie Wichtigsten Ereignisse im\nÜberblick:\nClick, DoubleClick, MouseClick,\nMouseMove, TextChange,\nKeyPress, Load (für Formulare).\nDie meisten Ereignisse erklären sich mit ein wenig Kenntnis\nder englischen Sprache von selbst. Probieren Sie einfach ein wenig\nherum und bald werden Sie das Wesentliche verstanden haben.\n","permalink":"https://fkainka.de/vb-net-steuerelemente/","summary":"\u003cp\u003eUnter den zahlreichen Steuerelementen in VB.Net gibt esein paar, die sehr häufig in Fenster basierenden Programmen auftauchen:\u003ca href=\"http://wp.fkainka.de/wp-content/uploads/2015/01/elemt0.jpg\"\u003e\u003cimg alt=\"elemt0\" loading=\"lazy\" src=\"http://wp.fkainka.de/wp-content/uploads/2015/01/elemt0.jpg\"\u003e\u003c/a\u003eHier hätten wir u.A.:Button,\u003cbr\u003e\nLabel, TextBox, CheckBox und das Formular selbst.\u003c/p\u003e\n\u003cp\u003eZu\u003cbr\u003e\nBeginn ist es am Einfachsten, wenn man sich auf die Eigenschaften und Ereignisse von Elementen konzentriert. Eigenschaften werden hauptsächlich vor dem Programmstart im Formmanager verändert um ein Startbild zu definieren. Aber auch zur Laufzeit ist es möglich, bestimmte Eigenschaften zu verändern. Man kann z.B. den Titeltext des Formulars verändern um den Benutzer auf einen Fehler hinzuweisen. Aber später mehr dazu.Wenn ein Ereignis (Event) ausgelöst wird überprüft das Programm, ob eine Prozedur zu diesem Ereignis definiert ist. Ist dies der Fall wird diese Prozedur ausgeführt. Eines der häufigsten Events ist der\u003c/p\u003e","title":"VB.Net: Steuerelemente"},{"content":"Wir alle kennen das Problem. Eine einfache aber zeitaufwändige Computer-Aufgabe liegt vor uns. Sei es einen ganzen Ordner Bilder umzubenennen oder eine bestimmte Formel immer wieder neu mit dem Taschenrechner ausrechnen zu müssen. Dafür kann man sich entweder einen Tag Zeit nehmen, oder man entwirft schnell ein Programm, welches die gewünschten Aufgaben selbständig und schnell erledigt. Dafür ist ein PC schließlich da.\nAber welche Programmiersprache eignet sich dafür? Gerade neue und moderne Programmiersprachen wie Java und C++ haben ein breites Spektrum an Möglichkeiten, allerdings wird das Programmieren dadurch auch viel komplizierter. Dazu kommt, dass eine einfache grafische Oberfläche oft mühsam im Quelltext programmiert werden muss, was die Sache nicht einfacher und übersichtlicher macht.\nDa lobt man sich doch das gute alte Visual Basic. Damals noch z.B. das VB6. Die Sprache war nahezu Englisch und Buttons und Text-Boxen hat man sich nach Lust und Laune zusammen geklickt. Heute gibt es VB.Net und obwohl sich einiges geändert hat und nicht mehr alles ganz so einfach ist, kann man sich die Oberfläche immer noch schnell und günstig zusammenstellen und fast auf Englisch setzen. Und das Beste ist: es ist umsonst.\nInstallation Wie gerade erwähnt ist VB.Net umsonst, zumindest die Express Version. Und die gibt es hier: http://www.microsoft.com/visualstudio/eng/products/visual-studio-2010-express\nOder auch wahlweise bei einem Google-Suchergebniss Ihrer Wahl.\nDer Download geht sehr einfach: auf der verlinkten Microsoft Seite durchklicken bis zu der Download-Seite und dann Visual Basic 2010 Express suchen. Dort Sprache auswählen und „Install Now“ klicken.\nNun wird eine kleine Exe-Datei runter geladen, die Sie ausführen müssen. Diese Exe-Datei enthält noch nicht das gesamte Programm sondern startet nur die Installationsroutine, welche dann die notwendigen Dateien runter lädt, weswegen Sie eine ständige Internetverbindung benötigen. Anschließend klicken Sie sich durch die übliche Installationsprozedur.\nDas Programm Nun geht’s endlich los mit dem Programmieren. Das erste Programm nennt man traditioneller Weise „Hello World“. Die Aufgabe ist einfach: eine Ausgabe mit den Worten „Hello world“ zu schreiben.\nDoch zunächst klären wir für diejenigen unter Ihnen, die die komplexe Oberfläche des Programms noch nicht ganz verstanden haben, die wichtigsten Punkte unserer Programmierumgebung.\nDieses Bild in etwa sollten Sie beim ersten Start sehen. Uns interessiert erst mal nur die große Startseite in der Mitte. Dort finden wir neben ersten Tutorials und aktuellen Nachrichten eine Übersicht über die letzten Projekte (bei ihnen evtl. leer) und, was für uns wichtiger ist, die Option „Neues Projekt“. Ein klick darauf sollte uns zu folgendem Bild führen:\nWir entscheiden uns für die erste Option „Windows Forms-Anwendung“ und klicken OK.\nUnd da ist sie schon. Unsere Programmierumgebung. Auf der linken Seite sehen Sie die „Toolbox“, also unseren Werkzeugkasten. Dieser enthält die vielen nützlichen Dinge wie Buttons und Textboxen die wir auf unser Formular klicken oder ziehen können.\nEben erwähntes Formular befindet sich in der Mitte. Das graue Kästchen mit dem Windows typischen „X“ oben rechts ist das Formular, welches wir beim Start unseres Programms sehen können.\nDarunter befindet sich, wie die Überschrift verrät, die Fehlerliste. In diesem steht im Idealfall nichts, im Fehlerfall aber nützliche Infos, wie die Fehlermeldung und die Zeile in der sich der Fehler befindet.\nOben rechts befindet sich die Projektmappe. In dieser Mappe finden Sie am Anfang nur Ihr Formular. Wenn Sie später aber komplexere Projekte angehen, finden Sie dort sicher mehr.\nDarunter befindet sich eine veränderbare Liste der Eigenschaften des ausgewählten Objekts. In unserem Fall nur das Formular. Hier können Sie z.B. die Überschrift des Formulars ändern.\nEine erste Spielerei wäre einfach ein paar Buttons und was auch immer Sie gerade finden können per Drag and Drop auf dem Formular anzuordnen, die Titel (unter Eigenschaften: Text; und nicht Name!) oder Farben zu ändern und das Ganze mit F5 oder dem Klick auf den grünen „play“-Pfeil zu starten. Passieren wird zwar nicht viel, aber es macht Spaß ein erstes Ergebnis zu sehen. Wenn Sie damit fertig sind geht’s jetzt ans Eingemachte.\nHello World Jetzt geht’s an den Quelltext. Der einfachste Weg dorthin ist F7 zu drücken. Eine andere Möglichkeit ist es, doppelt auf das Formular (oder andere Objekte) zu klicken. Sie springen dann automatisch zu der Prozedur, die zu dem doppelgeklickten Objekt gehört. Wenn Sie zum Beispiel einen Button auf dem Formular haben und diesen doppelt klicken, gelangen Sie automatisch zur Button-Klick Prozedur, in der Sie programmieren können, was passieren soll, wenn der Button angeklickt wird.\nZurück zum „Ansicht Designer“ gelangen Sie mit „Umschalt-F7“ oder indem Sie in der Projektmappe auf das Formular (Form1) doppelklicken. Ziehen Sie nun dort einen einsamen Button auf das Formular. Mit Doppelklick gelangen Sie in dessen Klick-Prozedur.\nTippen Sie folgenden Befehl ein:\nMsgBox(\u0026ldquo;Hello World\u0026rdquo;)\nMit Klick auf Play oder Druck auf F5 kompilieren und starten Sie Ihr erstes Programm. Wenn Sie nun auf den Button klicken sollte folgendes passieren:\nHerzlichen Glückwunsch. Ihr erstes Programm war ein Erfolg.\n","permalink":"https://fkainka.de/vb-net-hello-world/","summary":"\u003cp\u003eWir alle kennen das Problem. Eine einfache aber zeitaufwändige Computer-Aufgabe liegt vor uns. Sei es einen ganzen Ordner Bilder umzubenennen oder eine bestimmte Formel immer wieder neu mit dem Taschenrechner ausrechnen zu müssen. Dafür kann man sich entweder einen Tag Zeit nehmen, oder man entwirft schnell ein Programm, welches die gewünschten Aufgaben selbständig und schnell erledigt. Dafür ist ein PC schließlich da.\u003c/p\u003e\n\u003cp\u003eAber welche Programmiersprache eignet sich dafür? Gerade neue und moderne Programmiersprachen wie Java und C++ haben ein breites Spektrum an Möglichkeiten, allerdings wird das Programmieren dadurch auch viel komplizierter. Dazu kommt, dass eine einfache grafische Oberfläche oft mühsam im Quelltext programmiert werden muss, was die Sache nicht einfacher und übersichtlicher macht.\u003c/p\u003e","title":"VB.Net: Hello World"},{"content":"Unabhängig von der gewählten Programmiersprache gibt es einige allgemein gültige Elemente in der Informatik. So ist z.B. eine Integer-Variable überall gleich definiert als ein Container für eine ganze Zahl und besteht aus 16 Bit. Es ist egal ob Sie in Bascom, Arduino, Visual Basic oder Java programmieren, ein Integer bleibt ein Integer. Das Einzige was sich ändert ist der Quelltext, mit dem Sie die Variable initialisieren.\nAn dieser Stelle soll deswegen eine kurze Einleitung zu den wichtigsten Elementen nahezu jeder Programmiersprache stehen. Gerade Anfänger können so immer mal wieder nachgucken wie z.B. eine Schleife, eine Funktion oder eine Variable funktioniert. Den Quelltext müssen Sie dann nur noch der jeweiligen Sprache anpassen.\nInhalt Variablen\nProzeduren/Subs/Funktionen\nSchleifen\nIF-Abfrage\nZahlensysteme\n","permalink":"https://fkainka.de/grundlagen-der-programmierung/","summary":"\u003cp\u003eUnabhängig von der gewählten Programmiersprache gibt es einige allgemein gültige Elemente in der Informatik. So ist z.B. eine Integer-Variable überall gleich definiert als ein Container für eine ganze Zahl und besteht aus 16 Bit. Es ist egal ob Sie in Bascom, Arduino, Visual Basic oder Java programmieren, ein Integer bleibt ein Integer. Das Einzige was sich ändert ist der Quelltext, mit dem Sie die Variable initialisieren.\u003c/p\u003e\n\u003cp\u003eAn dieser Stelle soll deswegen eine kurze Einleitung zu den wichtigsten Elementen nahezu jeder Programmiersprache stehen. Gerade Anfänger können so immer mal wieder nachgucken wie z.B. eine Schleife, eine Funktion oder eine Variable funktioniert. Den Quelltext müssen Sie dann nur noch der jeweiligen Sprache anpassen.\u003c/p\u003e","title":"Grundlagen der Programmierung"},{"content":"In der Informatik gibt es verschiedene Arten der Zahlendarstellung. Aus unserem Alltag kennen wir die Dezimaldarstellung, die auf dem 10er Prinzip beruht (Dezi = 10). Aber auch wenn es und natürlich und selbstverständlich vorkommt, ist dies nicht die einzige Möglichkeit Zahlen zu behandeln. Vielmehr kommt es uns nur wegen unserer 10 Finger selbstverständlich vor das 10er System zu benutzen. Computer sehen das aber anders.\nBinär Computer rechnen viel lieber mit dem Binärsystem (Bi = 2) in dem Binärsystem gibt es nur zwei Zustände die Eins oder Null heißen. Diese Zahl nennen wir mal Bit. 8 Bit ergeben ein Byte. Ein Beispiel für ein Byte : 11110111. Also insgesamt 8-Bits mit jeweiligen Zustand. Für den Computer ist diese Zahl verständlich, wir können uns aber nicht viel darunter vorstellen, es sei denn wir transformieren sie wieder in unser Dezimalsystem. Dazu muss man wissen, das es eine einfache Berechnung gibt. Das niedrigste Bit steht nämlich für die Zahl eins. Das zweite für die Zahl 2, das dritte für 4 und das vierte für 8 und so weiter. Um sich das besser vorzustellen hier eine Tabelle:\nPotenz 7 6 5 4 3 2 1 0 Dezimalzahl 2^7 = 128 2^6 = 64 2^5 = 32 2^4 = 16 2^3 = 8 2^2 = 4 2^1 = 2 2^0 = 1 Beispielzahl 1 1 1 1 0 1 1 1 Also muss man einfach nur die Dezimalstellen zusammenaddieren, wo in der Binärzahl eine Eins steht. In diesem Fall: 1+2+4+16+32+64+128 = 255-8 = 247. Die zweite Rechnung ist natürlich in diesem Fall der schnellere Weg. Diese Rechnung erklärt auch, warum ein Byte nur Zahlen von 0 bis 255 darstellen kann. Wenn man darüber hinaus will muss man schon 2 Bytes nehmen.\nHexadezimal Das Hexadezimalsystem ist eine weiter Möglichkeit der Zahlendarstellung. Es beruht auf der Zahl 16. Jetzt werden sich die meisten wunder, wie man Zahle bis 16 ohne das Dezimalsystem darstellen kann. Das geht indem man einfach Buchstaben dazu nimmt. Ergo: von 0 bis 9 werden normale Zahlen benutzt. Dann aber geht es mit Buchstaben weiter: A=10, B = 11 bis F = 15. Der Vorteil eines Hexadezimalsystem ist, dass man nur zwei Zahlen braucht um ein Byte darzustellen. Unser Beispiel oben, der Zahl 247, ist in der Hexadezimalschreibweise F7. Warum? Schauen wir in die Tabelle:\nPotenz 7 6 5 4 3 2 1 0 Dezimalzahl 2^7 = 128 2^6 = 64 2^5 = 32 2^4 = 16 2^3 = 8 2^2 = 4 2^1 = 2 2^0 = 1 Beispielzahl 1 1 1 1 0 1 1 1 Dezimal Blockweise Erste Block gesamt: 15 Zweiter Block gesamt: 7 Hexadezimal F 7 Mit anderen Worten man Teilt die Binärzahl in vierer Blöcke und rechnet die Dezimalzahl aus. Diese Zahl, die ja maximal von 0 bis 15 gehen kann, ersetzt man dann durch die entsprechende Hexadezimalzahl. Dieser Weg ist übrigens auch der leichtere wenn man eine Dezimalzahl in eine Hexadezimalzahl umwandeln will. Erst Binär schreiben, dann Hexadezimal. Zum Glück finden Sie aber an jeder Stelle Bin-Hex-Dez-Rechner und müssen somit nicht alles mit der Hand umrechnen. Oder Sie schreiben sich ihren eigenen Taschenrechner.\n","permalink":"https://fkainka.de/grundlagen-der-programmierung-zahlensysteme/","summary":"\u003cp\u003eIn der Informatik gibt es verschiedene Arten der Zahlendarstellung. Aus unserem Alltag kennen wir die Dezimaldarstellung, die auf dem 10er Prinzip beruht (Dezi = 10). Aber auch wenn es und natürlich und selbstverständlich vorkommt, ist dies nicht die einzige Möglichkeit Zahlen zu behandeln. Vielmehr kommt es uns nur wegen unserer 10 Finger selbstverständlich vor das 10er System zu benutzen. Computer sehen das aber anders.\u003c/p\u003e\n\u003ch3 id=\"binär\"\u003eBinär\u003c/h3\u003e\n\u003cp\u003eComputer rechnen viel lieber mit dem Binärsystem (Bi = 2) in dem Binärsystem gibt es nur zwei Zustände die Eins oder Null heißen. Diese Zahl nennen wir mal Bit. 8 Bit ergeben ein Byte. Ein Beispiel für ein Byte : 11110111. Also insgesamt 8-Bits mit jeweiligen Zustand. Für den Computer ist diese Zahl verständlich, wir können uns aber nicht viel darunter vorstellen, es sei denn wir transformieren sie wieder in unser Dezimalsystem. Dazu muss man wissen, das es eine einfache Berechnung gibt. Das niedrigste Bit steht nämlich für die Zahl eins. Das zweite für die Zahl 2, das dritte für 4 und das vierte für 8 und so weiter. Um sich das besser vorzustellen hier eine Tabelle:\u003c/p\u003e","title":"Grundlagen der Programmierung: Zahlensysteme"},{"content":"Oft ist es von Nöten, dass ein Programmteil so oft wiederholt wird, bis sich ein bestimmter Zustand geändert hat. Deswegen gibt es Schleifen. Die gängigsten Typen sind: For-Schleifen, While, Until –Schleifen.\nDie For-Schleife ist eine Art Zähler. Sie zählt von einem Startwert zu einem Endwert in einer Bestimmten Schrittweite und führt bei jedem Schritt den Programmcode aus. Hier ein Beispiel aus VB.Net:\nFor i = 1 To 5 Step 1\nNext i\nZwischen diesen Zeilen können Sie ihren Quelltext schreiben. Wenn die Variable i den Wert 5 erreicht hat, wird die Schleife verlassen und es geht normal weiter. Oft ist es auch möglich diese Schleife rückwärts zählen zu lassen indem Sie Step -1 schreiben. Genauso könne Sie die Endbedingung auch festlegen als \u0026lt;5 oder \u0026gt;=5. In jedem Fall sollten Sie aber aufpassen, dass Ihre End Bedingung auch erfüllt wird. Sonst haben Sie eine Endlosschleife.\nDie While-Schleife wird benutzt, wenn Sie eine Schleife ausführen wollen solange ein bestimmter Zustand besteht. Hiermit ist es auch besonders leicht Endlosschleifen zu generieren. Ein Beispiel aus VB.Net:\nWhile I = 1\nEnd While\nDie Until-Schleife wird benutzt, wenn Sie eine Schleife solange ausführen wollen, bis ein bestimmter Zustand hergestellt ist. Ein Beispiel aus VB.Net:\nDo\nLoop Until i \u0026lt; 5\nNatürlich ist auch bei diesen beiden Schleifen wichtig, das der End-Zustand erreicht wird. Deswegen sollten Sie die i Variable innerhalb der Schleife verändern.\nUnter Umständen kann es sein, dass eine Schleife früher beendet werden muss. Dieser Befehl heißt für For-Schleifen in VB.NET z.B. Exit For.\n","permalink":"https://fkainka.de/grundlagen-der-programmierung-schleifen/","summary":"\u003cp\u003eOft ist es von Nöten, dass ein Programmteil so oft wiederholt wird, bis sich ein bestimmter Zustand geändert hat. Deswegen gibt es Schleifen. Die gängigsten Typen sind: For-Schleifen, While, Until –Schleifen.\u003c/p\u003e\n\u003cp\u003eDie For-Schleife ist eine Art Zähler. Sie zählt von einem Startwert zu einem Endwert in einer Bestimmten Schrittweite und führt bei jedem Schritt den Programmcode aus. Hier ein Beispiel aus VB.Net:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eFor\u003c/em\u003e \u003cem\u003ei = 1\u003c/em\u003e \u003cem\u003eTo\u003c/em\u003e \u003cem\u003e5\u003c/em\u003e \u003cem\u003eStep\u003c/em\u003e \u003cem\u003e1\u003c/em\u003e\u003c/p\u003e","title":"Grundlagen der Programmierung: Schleifen"},{"content":"Eine IF-Abfrage ist dazu da, zu einer bestimmten Bedingung einen bestimmten Programmcode auszuführen. Die klassische Struktur solcher Abfragen sind: If – Bedingung Then – Dann mache folgendes, Else – Andernfalls mache folgendes. Hier ein simples Beispiel\nif i = 5 then\n(…)\nElse\n(…)\nend if\nEs ist auch möglich mehrere If-Abfragen ineinander zu verschachteln. Also eine If-Abfrage in einer If-Abfrage. Außerdem kann man mehre if-Then’s hintereinander schreiben bevor das else kommt, oder auch das else weglassen. In manchen Programmiersprachen kann man sogar das End if weglassen, wenn man if .. then.. in eine Zeile schreibt.\nSelect Case Wenn Sie viele verschiedene Möglichkeiten für eine If-Abfrage haben gibt es noch eine praktischere Art: die Select Case Methode. Ein kurzes Beispiel aus V.Net:\nSelect Case i\nCase 1\nCase 2\nCase Else\nEnd Select\nI ist hier die Variable die um die es geht. Der Code nach Case 1 wird ausgeführt, wenn i = 1 ist. Case Else wenn keine dieser Bedingungen zutrifft. Man kann sich mit dieser Variante der If-Abfrage eine Menge Zeit Sparen da man nicht immer if-then-else tippen muss.\n","permalink":"https://fkainka.de/grundlagen-der-programmierung-if-abfragen/","summary":"\u003cp\u003eEine IF-Abfrage ist dazu da, zu einer bestimmten Bedingung einen bestimmten Programmcode auszuführen. Die klassische Struktur solcher Abfragen sind: If – Bedingung Then – Dann mache folgendes, Else – Andernfalls mache folgendes. Hier ein simples Beispiel\u003c/p\u003e\n\u003cp\u003eif i = 5 then\u003c/p\u003e\n\u003cp\u003e(…)\u003c/p\u003e\n\u003cp\u003eElse\u003c/p\u003e\n\u003cp\u003e(…)\u003cbr\u003e\nend if\u003c/p\u003e\n\u003cp\u003eEs ist auch möglich mehrere If-Abfragen ineinander zu verschachteln. Also eine If-Abfrage in einer If-Abfrage. Außerdem kann man mehre if-Then’s hintereinander schreiben bevor das else kommt, oder auch das else weglassen. In manchen Programmiersprachen kann man sogar das End if weglassen, wenn man if .. then.. in eine Zeile schreibt.\u003c/p\u003e","title":"Grundlagen der Programmierung: If-Abfragen"},{"content":"Viele Programmiersprachen erlauben das Aufrufen von Unterprogrammen. Gerade wenn ein Teil des Programms besonders oft durchläuft, z.B. irgendeine Berechnung, kann es hilfreich sein, diesen Teil in einer gesonderten Prozedur auszulagern. Die Vorteile sind vor allem die Übersichtlichkeit, die Platzersparnis und die wieder Verwendbarkeit von Quelltexten.\nEine Prozedur muss meistens zu Beginn eines Programms mit Namen und Parametern deklariert werden. Das funktioniert in Bascom z.B. so:\nDeclare Sub Unterprogramm (Variable as Byte)\nDer Name des Unterprogramms ist hier Unterprogramm was in den Klammern steht sind die sogenannten Parameter. Die Parameter sind Variablen der Prozedur übergeben werden. In der Sub kann dann mit diesen Variablen gearbeitet werden. Der Zusatz as Byte sagt der Sub um welchen Datentyp es sich handelt.\nIm Quelltext selber wir die Prozedure dann wie folgt beschrieben:\n*Sub Unterprogramm(*Variable as byte)\nEnd Sub\nZwischen diesen beiden Zeilen können Sie Ihren Quelltext unterbringen. Eine besondere Form eines Unterprogramms ist die Funktion. Funktionen geben einen Wert zurück. Dabei können Sie den Funktionsnamen wie eine Variable behandeln. Wenn also Unterprogramm eine Funktion wäre, dann könnten Sie folgendes schreiben:\nA = b + Unterprogramm(c)\nDas macht das Leben doch gleich viel leichter.\n","permalink":"https://fkainka.de/grundlagen-der-programmierung-prozeduren/","summary":"\u003cp\u003eViele Programmiersprachen erlauben das Aufrufen von Unterprogrammen. Gerade wenn ein Teil des Programms besonders oft durchläuft, z.B. irgendeine Berechnung, kann es hilfreich sein, diesen Teil in einer gesonderten Prozedur auszulagern. Die Vorteile sind vor allem die Übersichtlichkeit, die Platzersparnis und die wieder Verwendbarkeit von Quelltexten.\u003c/p\u003e\n\u003cp\u003eEine Prozedur muss meistens zu Beginn eines Programms mit Namen und Parametern deklariert werden. Das funktioniert in Bascom z.B. so:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDeclare Sub Unterprogramm (Variable as Byte)\u003c/em\u003e\u003c/p\u003e","title":"Grundlagen der Programmierung: Prozeduren"},{"content":"Variablen muss man sich grundsätzlich als einen Container für einen bestimmten Wert vorstellen. In den meisten Programmiersprachen müssen diese Container zu Beginn des Programms „bestellt“ werden. Das nennt man Initialisieren. Zur Initialisierung müssen Sie meistens auch den Typ der Variable und den Namen angeben. Den Typ, damit das der PC auch weiß, wie groß der Container sein soll, und den Namen, damit Sie den Container auch später wiederfinden. In VB.Net sieht die Initialisierung einer Variablen so aus:\nDim name As Integer\nDim steht hier für Dimensionierung. Name steht hier symbolischer Weise für den Namen der Variablen, as heißt einfach als und Integer ist unser Typ. Wie erwähnt gibt es verschiedene Typen von Variablen die auch verschieden groß sein dürfen. Ein Integer z.B. hat eine Größe von 16 bit = 2 Byte, und das bedeutet im Klartext wir können damit in der Regel Zahlen von 0 bis 65.535 darstellen. Genaueres darüber finden Sie aber in der Tabelle unten.\nTabelle der wichtigsten Variablen Achtung: Die Tabelle dient zur groben Orientierung. Manche Sprachen können Abweichen.\nTyp Speicherplatz Beispiel Wertebereich Geeignet für Integer 2 Byte 1024 0 - 65.535 Mittelgroße Zahlen Byte 1 Byte 255 0 – 255 Binärzahlen Bit 1 Bit 1 1,0 1 oder 0 Boolean 1 Bit True True ,False Wahr oder Falsch Aussagen Char 1 Byte „Z“ Einzelne Zeichen String - „Dies ist ein Text“ Texte Mehr Infos finden Sie hier: http://de.wikipedia.org/wiki/Datentyp\n","permalink":"https://fkainka.de/grundlagen-der-programmierung-variablen/","summary":"\u003cp\u003eVariablen muss man sich grundsätzlich als einen Container für einen bestimmten Wert vorstellen. In den meisten Programmiersprachen müssen diese Container zu Beginn des Programms „bestellt“ werden. Das nennt man Initialisieren. Zur Initialisierung müssen Sie meistens auch den Typ der Variable und den Namen angeben. Den Typ, damit das der PC auch weiß, wie groß der Container sein soll, und den Namen, damit Sie den Container auch später wiederfinden. In VB.Net sieht die Initialisierung einer Variablen so aus:\u003c/p\u003e","title":"Grundlagen der Programmierung: Variablen"},{"content":"Der GMC-4 ist ein programmierbarer Spielecomputer von Franzis. Während Sie bei den meisten anderen Mikrocontrollern einen extra PC und Zusatz-Software benötigen, können Sie mit dem GMC-4 bequem auf dem Sofa programmieren und das Ergebnis gleich ausprobieren. Alles zum GMC-4\nFranzis-Seite zum GMC4\nBefehlsliste des GMC-4\n","permalink":"https://fkainka.de/der-gmc-4/","summary":"\u003cp\u003eDer GMC-4 ist ein programmierbarer Spielecomputer von Franzis. Während Sie bei den meisten anderen Mikrocontrollern einen extra PC und Zusatz-Software benötigen, können Sie mit dem GMC-4 bequem auf dem Sofa programmieren und das Ergebnis gleich ausprobieren.  \u003ca href=\"/tag/gmc-4/\"\u003eAlles zum GMC-4\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFranzis-Seite zum GMC4\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wp.fkainka.de/der-gmc-4-befehlssatz/\" title=\"Der GMC-4 Befehlssatz\"\u003eBefehlsliste des GMC-4\u003c/a\u003e\u003c/p\u003e","title":"Der GMC-4"},{"content":"Der GMC-4 verfügt über einen einfachen Befehlssatz, der an Assembler angelehnt ist, teilweise aber auch höhere Funktionen enthält, hinter denen sich komplexe Unterprogramme des Interpreters verstecken.\nEs gibt vier 4-Bit-Register A, B, Y und Z und einen zusätzlichen zweiten Registersatz A\u0026rsquo;, B\u0026rsquo;, Y\u0026rsquo; und Z\u0026rsquo;. Jedes dieser Register kann eine Zahl zwischen 0 und 15 enthalten. Die meisten Befehle verwenden das Register A.\nZusätzlich gibt es ein Flag, also einen 1-Bit-Merker, der wie eine Flagge hoch- oder runtergesetzt werden kann. Viele Befehle setzen das Flag grundsätzlich auf 1, andere setzen es in Abhängigkeit von der jeweiligen Aktion wahlweise auf Null oder Eins. Der Zustand des Flags wird vom Sprungbefehl ausgewertet. Der Sprung zur angegebenen Adresse wird nur dann ausgeführt, wenn Flag=1 ist.\nCode Befehl Wirkung Flag Kommentar 0 KA A=K 0, 1 Tastendruck nach A übernehmen, Flag = 0 bei Tastendruck, sonst Flag = 1 (KA = Key to A)\n1 AO Op=A 1 A an Siebensegmentanzeige ausgeben (AO = A to Output)\n2 CH A\u0026lt;=\u0026gt;B Y\u0026lt;=\u0026gt;Z 1 | Tausche A und B sowie Y und Z |\n(CH = Change)\n3 CY Ar\u0026lt;=\u0026gt;Yr 1 Austausch der Inhalte von A und Y (CY = Change A and Y)\n4 AM M=A 1 A in RAM-Adr (50+Y) kopieren (AM = A to Memory)\n5 MA A=M 1 RAM-Adr (50+Y) in A zurücklesen (MA = Memory to A)\n6 M+ A=M+A 0, 1 RAM-Adr (50+Y) zu A addieren, bei Überlauf: Flag = 1\n7 M- A=M-A 0, 1 RAM-Adr (50+Y) von A subtrahieren, bei Überlauf: Flag = 1 8 TIA [ ] A=[ ] 1 Konstante in A laden (TIA = Transfer Immediate to A)\n9 AIA [ ] A=A+[ ] 0, 1 Konstante zu A addieren, bei Überlauf: Flag = 1\n(AIA = Add Immediate to A)\nA TIY [ ] Y=[ ] 1 Konstante in Y laden (TIY = Transfer Immediate to Y)\nB AIY [ ] Y=Y+[ ] 0, 1 Konstante zu Y addieren, bei Überlauf: Flag = 1\n(AIY = Add Immediate to Y)\nC CIA [ ] A=[ ] ? 0, 1 A mit Konstante vergleichen, bei Übereinstimmung: Flag =0 (Compare Immediate and A)\nD CIY [ ] Y=[ ] ? 0, 1 Y mit Konstante vergleichen, bei Übereinstimmung: Flag =0 (Compare Immediate and Y)\nE CAL \u0026mdash; \u0026mdash; Unterprogrammaufrufe, Erweiterte Befehle\n(Call)\nF JUMP [ ] [ ] Adr= [ ] [ ] 1 Direkter Sprung zur Adresse [High] [Low] wenn Flag = 1 Unterprogramme:\nCode Befehl Flag Kommentar E 0 CAL RSTO 1 Siebensegmentanzeige löschen E 1 CAL SETR 1 Einzelne LED einschalten. In Y wird die Nummer der LED (0-6) übergeben. E 2 CAL RSTR 1 Einzelne LED ausschalten. In Y wird die Nummer der LED (0-6) übergeben. E4 CAL CMPL 1 Komplement des A-Registers (aus F wird 0) E 5 CAL CHNG 1 Inhalte der Register A,B,Y,Z mit A\u0026rsquo;,B\u0026rsquo;,Y\u0026rsquo;,Z\u0026rsquo; tauschen E 6 CAL SIFT 0, 1 A-Register bitweise nach recht schieben. Flag wird 1 wenn das rechte Bit 0 war. E 7 CAL ENDS 1 Ende-Sound E 8 CAL ERRS 1 Error-Sound E 9 CAL SHTS 1 Kurzer Ton E A CAL LONS 1 Langer Ton E B CAL SUND 1 Note spielen, die im A-Register übergeben wird (1 \u0026hellip; E) E C CAL TIMR 1 (A + 1) * 0,1 Sekunden warten E D CAL DSPR 1 Ausgabe der RAM-Adressen 5F (high) und 5E (low) an die LEDs ","permalink":"https://fkainka.de/der-gmc-4-befehlssatz/","summary":"\u003cp\u003eDer GMC-4 verfügt über einen einfachen Befehlssatz, der an Assembler angelehnt ist, teilweise aber auch höhere Funktionen enthält, hinter denen sich komplexe Unterprogramme des Interpreters verstecken.\u003c/p\u003e\n\u003cp\u003eEs gibt vier 4-Bit-Register A, B, Y und Z und einen zusätzlichen zweiten Registersatz A\u0026rsquo;, B\u0026rsquo;, Y\u0026rsquo; und Z\u0026rsquo;. Jedes dieser Register kann eine Zahl zwischen 0 und 15 enthalten. Die meisten Befehle verwenden das Register A.\u003c/p\u003e\n\u003cp\u003eZusätzlich gibt es ein Flag, also einen 1-Bit-Merker, der wie eine Flagge hoch- oder runtergesetzt werden kann. Viele Befehle setzen das Flag grundsätzlich auf 1, andere setzen es in Abhängigkeit von der jeweiligen Aktion wahlweise auf Null oder Eins. Der Zustand des Flags wird vom Sprungbefehl ausgewertet. Der Sprung zur angegebenen Adresse wird nur dann ausgeführt, wenn Flag=1 ist.\u003c/p\u003e","title":"Der GMC-4 Befehlssatz"},{"content":"Jeder der sich, auch wenn vielleicht nur oberflächlich, mit der Mikrokontroller -Programmierung befasst, wird einem Schlagwort nicht mehr ausweichen können: Arduino. Die Frage ob der Hype um dieses System wirklich berechtigt ist steht natürlich im Raum. Für ausgefuchste Programmierer ist dies vielleicht nicht mehr als ein lustiges Spielzeug. Für den Ottonormal-Menschen aber eine Möglichkeit auch große Projekte auf schnellem Wege zu realisieren. Man kann sicher Tage damit verbringen die vielen ausgefallenen und spannenden Projekte im Internet zu erforschen und kommt auch nicht drum herum sich selbst so seine Gedanken zu machen. Deshalb soll es an dieser Stelle mal einen kleinen Einstieg für diejenigen unter Ihnen geben, die sich noch nicht so intensiv mit der Mikrocontroller Programmierung befasst haben.\nDer Leonardo weist dabei noch eine herausragende Besonderheit auf. Im Gegensatz zu den gängigen Arduino-Boards hat unser Arduino nämlich keinen externen FTDI-Chip, der früher benötigt wurde um über den USB-Anschluss eine Serielle Schnittstelle zu simulieren. Dadurch spart man zum einen eine Menge Hardware, zum anderen wird die Palette von Möglichkeiten dadurch enorm erweitert. Es ist z.B. ein leichtes mit dem Board eine USB-Tastatur zu simulieren. Beispiele dazu werden sogar per Software mitgeliefert. Aber jetzt erst mal die Basics.\nDie Hardware Für meinen ersten Test habe ich den erwähnten Arduino Leonardo benutzt. Es handelt sich um ein kleines, schickes Board mit microUSB-Anschluss.\nBei dem Controller selbst handelt es sich um einen ATmega32u4. Wen’s interessiert: Flash 32 Kb, 44 Pins, 16 MHz, CPU: 8-bit AVR, 13 externe Interrupts, USB on board! Es gibt 7 PWM-Kanäle, 12 ADCs und insgesamt 20 Input/Output Pins, also genug Anschlüsse für alle erdenklichen Projekte.\nBevor wir uns aber völlig in der Ideenwelt verlieren schnell noch die Anleitung zur Installation der benötigten Software am Beispiel eines Win7 PCs.\nDie Software Die Software-Installation ist denkbar unkompliziert. Die aktuelle Version findet man unter:http://www.arduino.cc/en/Main/software. Es handelt sich dabei um einen Zip-Ordner, den man an beliebiger Stelle entpackt. In dem entpackten Ordner findet man eine Exe. Ich empfehle direkt eine Verknüpfung auf dem Desktop zu erstellen. Am leichtesten geht das mit: Rechtsklick – SendenAn - Desktop (Verknüpfung erstellen). Das Programm zu starten würde jetzt aber noch nicht viel bringen, denn wir müssen erst die Treiber des Boards installieren.\nAls ich mein Board per USB mit dem PC verbunden habe, hat mein Rechner versucht den Treiber selber zu finden und zu Installieren. Das ist allerdings gescheitert. Also musste ich unter Start-Systemsteuerung-System-Gerätemanager das Board suchen und dort auf „Treiber Aktualisieren“ klicken. Daraufhin konnte ich unter „auf dem Rechner nach Treibersoftware suchen“ eine Quelle angeben. Diese Quelle ist der Order in dem ich vorher das Arduino- Zip entpackt habe, genauer gesagt dessen Unterorder Drivers. Nach einer Warnung, dass der Treiber aus einer unbekannten Quelle stammt (die ich aber ignoriere), installiert sich der Treiber und das Board wird im Geräte-Manger unter Anschlüsse angezeigt. Hinter dem Board steht noch eine COM-Nummer. Diese sollte man sich merken.\nNachdem die Installation hoffentlich reibungslos über die Bühne gegangen ist, kann man nun das Programm starten.\nOben in der Leiste muss man unter Tools zuerst einmal das Board und den seriellen Port auswählen. Der serielle Port entspricht der COM-Nummer, die man sich gerade gemerkt hat, bei mir COM6.\nJetzt kommt der spannende Moment in dem ich mein erstes Programm uploade. Am einfachsten ist immer ein Blinker. Besonders einfach geht das, indem ich unter Datei – Beispiele - 01.Basics - Blink auswähle. Es öffnet sich ein neues Fenster mit einem der zahlreichen und hilfreichen Beispiele. In diesem Fall der gewünschte Blinker. Mit dem Klick auf den Haken wird das Programm überprüft. Fehler würden im unteren Fenster rot mit Fehlermeldung angezeigt. Wenn alles OK ist steht dort „Kompilierung Abgeschlossen“. Mit dem Pfeil nach rechts, neben dem Haken kann man das Programm nun auf unseren Controller „Uploaden“. Unten wird ein Ladebalken und danach hoffentlich eine Erfolgsmeldung angezeigt.\nIn meinem Fall gab es hier beim ersten Versuch eine Fehlermeldung. Ich musste den Arduino abziehen und das Programm neu starten. Ich glaube aber nicht, dass das der Regelfall ist.\nDas Programm ist nun auf dem Controller und man sieht auch schon das Ergebnis. Die LED mit der Beschriftung „L“ auf dem Board blinkt nämlich. Das liegt daran, dass die im Programm angegebene LED13 (Erste Zeile #define LED 13) dieser LED entspricht. Alternativ kann man auch eine LED zwischen dem Port 13 und GND anschließen (Ja, es funktioniert ohne Vorwiderstand, nur die Polung muss man beachten).\nDas war mein erstes Programm. Ich habe es zwar nicht selbst geschrieben, aber ein Erfolg ist es trotzdem. Man kann nun an dem Programm ein wenig rumbasteln um die Arduino-Entwicklungsumgebung besser zu verstehen.\nWas den gerade den Leonardo als erste Wahl Boards auszeichnet, sind die herausragenden Möglichkeiten, die aus dem Controller eigenen USB ergeben. So ist es z.B. ohne Schwierigkeiten möglich das Board als HID zu benutzen (Human Interface Device, Sammelbegriff für Tastatur, Maus u.A.). Unter den Beispielen findet man unter 09.USB – Keyboard das Programm KeyboardMessage. Mit diesem Programm ist es recht leicht möglich Texte an den PC zu schicken, und so z.B. einen Editor zu füllen. Dazu kann man entweder einen Taster an den Pin 2 Anschließen, oder die Entsprechenden IF-Abfragen rausnehmen. Der zweite weg ist dabei der extreme Quick and Dirty Way, den bei mir war es danach nicht mehr so leicht möglich ein anderes Programm reinzuladen, da der Controller Permanent Texte in meine Programmierumgebung gehauen haut und deswegen ein Kompilieren unmöglich war. Die Lösung war dabei, die Reset Taste gedrückt zu halten, den Controller Anschließen und erst kurz vor dem Programmieren wieder loszulasse.\n","permalink":"https://fkainka.de/schnellstart-arduino-leonardo/","summary":"\u003cp\u003eJeder der sich, auch wenn vielleicht nur oberflächlich, mit der Mikrokontroller -Programmierung befasst, wird einem Schlagwort nicht mehr ausweichen können: Arduino. Die Frage ob der Hype um dieses System wirklich berechtigt ist steht natürlich im Raum. Für ausgefuchste Programmierer ist dies vielleicht nicht mehr als ein lustiges Spielzeug. Für den Ottonormal-Menschen aber eine Möglichkeit auch große Projekte auf schnellem Wege zu realisieren. Man kann sicher Tage damit verbringen die vielen ausgefallenen und spannenden Projekte im Internet zu erforschen und kommt auch nicht drum herum sich selbst so seine Gedanken zu machen. Deshalb soll es an dieser Stelle mal einen kleinen Einstieg für diejenigen unter Ihnen geben, die sich noch nicht so intensiv mit der Mikrocontroller Programmierung befasst haben.\u003c/p\u003e","title":"Schnellstart Arduino Leonardo"}]