Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

WiFi IR Blaster

Komponenten und Verbrauchsmaterialien

Espressif ESP8266 ESP-01
Sie könnten dies stattdessen mit einem Standard-ESP8266 oder dem NodeMCU-Entwicklungskit tun
× 1
Arduino Nano R3
× 1
Allzwecktransistor NPN
× 1
Adafruit IR-LEDs
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE
NodeMCU-Firmware

Über dieses Projekt

Zwei Schritte vorwärts...

Es scheint, als würden sich die großen Telefonhersteller von integrierten IR-Blastern entfernen, daher suche ich nach einer Möglichkeit, meine "dummen" Geräte zukunftssicher zu machen, die derzeit nicht in meine IoT-Infrastruktur integriert sind. Ich habe ein vernetztes Smart Home, aber ich brauche eine physische Fernbedienung, um meinen Fernseher einzuschalten? Es muss einen besseren Weg geben.

Ich habe vor kurzem einen IR-Blaster gebaut, der eigenständige Klimaanlagen in meinem Haus steuert, und ein weiteres früheres Projekt war eine vernetzte HLK-Entlüftung mit einer mit Android verbundenen Webapp. Im Wesentlichen muss ich diese beiden Dinge nur zu einem mit dem Internet verbundenen IR-Blaster mit einem Webapp-Frontend kombinieren, damit ich Tasten auf meinem Telefon drücken und IR-Signale an meine Mediacenter senden kann. Diese können in jedem Raum bereitgestellt und von überall aus über eine einzige Schnittstelle gesteuert werden, sodass die Anwendungen dafür extrem breit sind.

Rapid Prototyping

Ich habe mir ungenutzte Hardware geschnappt und alles verkabelt, was ich brauche, um mich mit meinem WLAN zu verbinden, HTTP-Verbindungen zu akzeptieren und IR-Signale zu senden.

Dies funktionierte insofern gut, als ich eine bestimmte URL auf der dem ESP8266 zugewiesenen IP anfordern und das Arduino ein "Power" -Signal an die IR-LED ausgeben konnte. Ich musste nur herausfinden, wo die Webapp gehostet werden soll, die URLs an den IR-Blaster senden und diese Anfragen dann in bestimmte IR-Codes analysieren lassen. Dies war mit dem ESP8266 mit AT-Befehlen sehr mühsam, und es gab etwas, das eine 1-2-Sekunden-Verzögerung zwischen dem Senden der Anfrage und dem Blinken der LED verursachte.

NodeMCU

Ich habe das NodeMCU ESP8266-Entwicklungsboard verwendet, da es über eine integrierte Stromregelung, eine USB-zu-Seriell-Schnittstelle und viele I / O-Pins in diesem kleinen Paket verfügt (es ist auch Breadboard-freundlich). Es stellte sich heraus, dass es bereits eine ESP8266 WebServer-Bibliothek gibt, die GET-Anfragen akzeptiert, die ich zum Senden von IR-Codes anpassen konnte, und die reguläre IRremote-Bibliothek funktioniert sofort.

Der ESP8266 auf der NodeMCU ist nicht leistungsstark genug, um die Webapp selbst zu hosten, daher werde ich sie auf einem nicht ausgelasteten C.H.I.P. Computer im Wert von 9 $, der bereits mit meinem Heimnetzwerk verbunden ist. Eine weitere Einschränkung besteht darin, dass der ESP8266 eine 3,3-V-Platine ist, sodass die direkt von einem I / O-Pin angesteuerten IR-LEDs sehr schwach waren und sich direkt neben dem Gerät befinden mussten, an das ein Signal gesendet wurde. Ich habe stattdessen den I/O-Pin verwendet, um einen npn-Transistor anzusteuern, um die 5-V-Versorgungsspannung ein- / auszuschalten.

RUHE...ish

Nach einigen Recherchen fand ich ein großartiges Tutorial zur Implementierung einer REST-API für Arduino zur Steuerung von LEDs auf Adafruit. Ich habe ihre JavaScript- und PHP-Dateien verwendet, um die cURL-Anfragen zu senden, und diese auf den CHIP geladen, der bereits Apache ausführt, aber genauso einfach in der Cloud gehostet werden könnte. Nachdem ich eine einfache HTML-Seite für die Fernbedienung erstellt hatte, fügte ich die Dateien manifest.json und icon hinzu, damit sie als native Webapp auf einem Android-Telefon ausgeführt werden kann.

Auf der Arduino-Seite habe ich den Webserver so gekürzt, dass er nur eine GET-Anfrage akzeptiert, die URL analysiert, ein 200 OK sendet und dann die Verbindung trennt. Basierend auf der URL sendete das Arduino den IR-Code, der der gedrückten Taste zugeordnet war.

Universelles Remonster

Alles funktioniert einwandfrei ohne Verzögerung. Ich habe festgestellt, dass die von mir verwendeten IR-LEDs einen sehr engen Winkel haben, daher muss ich aufpassen, dass sie richtig ausgerichtet sind. Mit einem industriellen Klettverschluss kann ich es unter einem Regal außer Sichtweite montieren und stellt sicher, dass es auf die IR-Empfänger am anderen Ende gerichtet bleibt. Ich habe den LED-Kabeln etwas dickeres Kabel hinzugefügt, damit sie fein abgestimmt werden können.

Die Widerstände für die IR-LEDs machten sie fast unbrauchbar, sodass der Transistor sie mit ungeregelten 5 V versorgt. Dadurch kann ich IR von Wänden abprallen und den Blaster quer durch den Raum montieren, wirkt sich jedoch definitiv auf die Langlebigkeit aus. Ich hoffe, dass ich die LEDs für einige Zeit nicht ersetzen muss, da sie sehr selten verwendet werden und die IR-Signale superkurze Impulse sind (niedrigeres Tastverhältnis als die meisten schwachen PWM-Signale). Ich habe für Version 2 einige Weitwinkel-IR-LEDs mit höherer Leistung bestellt. Wenn diese endlich sterben, werde ich sie zusammen mit einem Inline-Widerstand ersetzen.

3-Monats-Update und zukünftige Funktionen

Ich benutze es täglich und es hat einwandfrei funktioniert. Ich habe sogar ein zweites Gerät in unserem Familienzimmer hinzugefügt, um unsere Fensterklimaanlage und einen weiteren Fernseher zu steuern.

Pläne für die Zukunft:

  • Migrieren Sie die Web-Benutzeroberfläche zu einem Cloud-Dienst
  • Integrieren mit Amazon Echo für Sprachbefehle (Fertig)
  • Die nächste Hardware-Iteration wird auch einen DHT22-Temperatursensor haben und ich untersuche Möglichkeiten, HF für meine Deckenventilatoren zu übertragen
  • Fügen Sie einen IR-Empfänger für eine Lernfunktion hinzu, damit Sie die IR-Blaster-Befehle von vorhandenen Fernbedienungen "beibringen" können
  • Integration in meine Heimautomatisierung/-sicherheit, um Geräte auszuschalten, wenn sie nicht verwendet werden

Dieser kleine vernetzte IR-Blaster füllt langsam die Lücke zwischen meinem Smart Home und älteren Geräten.

Code

  • WiFi IR Blaster für ESP8266 Arduino Sketch
  • script.js
  • index.html
  • curl.php
  • manifest.json
WiFi IR Blaster für ESP8266 Arduino SketchC/C++
Sie benötigen die WLAN-Bibliothek ESP8266 und IRremote.h. Sie sollten sich auch dafür entscheiden, die Raw-IR-Codes nicht zu verwenden, wenn Ihre Fernbedienung in der Bibliothek unterstützt wird. Ich habe diese Skizze von einer Klimaanlagensteuerung angepasst, die ich gebaut habe, die nicht standardmäßige IR-Codes verwendet an eine angeschlossene IR-LED basierend auf diesen Anforderungen. * Dies funktioniert am besten mit einem anderen Webserver, der als Front-End agiert, * das cURL-Anfragen basierend auf den gedrückten Tasten sendet. * cURL-Format:http://ESP8266/IRcode */#include #include #include const char* ssid ="AP_SSID";const char* password ="AP_Pass ";MDNSResponder mdns;int khz =38; // 38kHz Trägerfrequenz für NEC und SamsungIRsend irsend (4); // eine IR-LED ist an GPIO4 angeschlossen (Pin D2 auf NodeMCU) // RAW-IR-Signal für "TV Power" einfügen unsigned int irTVpwr[] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450 , 650.500, 600.500, 600.500, 600.550, 550.1700, 550.1650, 600.1650, 550.550, 600.500, 600.550, 550.550, 600.500, 600.550, 550.1650, 600.550, 550.550, 600.500, 600.550, 550.550, 600.500, 600 ,1650, 600,500, 600,1650, 550.1700, 550.1650, 600,1650, 550.1650, 600,1650, 600}; // SAMSUNG E0E040BF // RAW-IR-Signal für "TV Source" einfügen unsigned int irTVsrc[] ={4600,4300, 700,1550, 650,1550, 650,1600, 650,450, 650,450, 600,550, 550,550, 600,500, 600, 1650, 550.1650, 600.1650, 550.550, 600.500, 600.550, 550.550, 550.550, 600.1650, 550.550, 550.550, 600.500, 600.500, 600.550, 550.550, 600.500, 600.550, 550.1650, 550.1700, 550, 1650, 600.1600, 600,1650, 600.1600, 600,1650, 550}; // SAMSUNG E0E0807F // RAW-IR-Signal für "TV Mute" einfügen unsigned int irTVmute[] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450, 650,500, 600,500, 600,500, 600,500, 600, 1650, 600.1600, 600.1650, 550.550, 600.500, 600.550, 550.550, 600.500, 600.1650, 550.1650, 600.1650, 550.1650, 600.550, 550.550, 550.550, 600.500, 600.550, 550.550, 550.550, 600,500, 600,1650, 550.1650, 600,1650, 550.1650, 600}; // SAMSUNG E0E0F00F // RAW-IR-Signal für "TV Volume Down" einfügen unsigned int irTVvdn[] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450, 650,450, 650,450, 600,550, 550,550, 600 ,1650, 550.1650, 550.1650, 600.550, 550.550, 550.550, 600.500, 600.500, 600.1650, 600.1600, 600.500, 600.1650, 550.550, 600.500, 600.500, 600.550, 550.550, 600.500, 600.1650 , 550,550, 550.1650, 600,1650, 550.1650, 600,1650, 550}; // SAMSUNG E0E0D02F // RAW-IR-Signal für "TV Volume Up" einfügen unsigned int irTVvup[] ={4600,4300, 650.1600, 650,1550, 650.1600, 600.500, 600.550, 600.500, 600.550, 550.550, 550 ,1700, 550.1650, 600.1650, 550.550, 600.500, 600.550, 550.550, 600.500, 600.1650, 600.1650, 550.1650, 600.550, 550.550, 600.500, 600.550, 550.550, 600.500, 600.550, 550.550, 600 ,1600, 600,1650, 600,1650, 550.1650, 600,1650, 600}; // SAMSUNG E0E0E01F // RAW-IR-Signal für "TV Channel Up" einfügen unsigned int irTVchup[] ={4650,4250, 700,1550, 650,1600, 650,1550, 650,500, 600,500, 600,500, 650,500, 600,500, 600 ,1650, 550.1650, 600.1650, 600.500, 600.500, 600.550, 550.550, 600.550, 550.550, 550.1650, 600.550, 600.500, 600.1650, 550.550, 600.500, 600.550, 550.1650, 600.550, 550.1650 , 600,1650, 600,500, 600,1650, 600.1600, 600,1650, 600}; // SAMSUNG E0E048B7 // RAW-IR-Signal für "TV Channel Down" einfügen unsigned int irTVchdn[] ={4600.4350, 650.1550, 650.1600, 650.1600, 600.500, 600.500, 600.550, 550.550, 600.550, 550 ,1650, 600.1650, 550.1700, 550.550, 550.550, 600.500, 600.550, 550.550, 600.500, 600.550, 550.550, 550.550, 600.1650, 600.500, 600.500, 600.550, 550.1650, 600.1650, 600.1650 , 550.1650, 600.550, 550.1650, 600.1650, 600.1650, 550}; // SAMSUNG E0E008F7 // RAW-IR-Signal für "Receiver Power" einfügen unsigned int irRECpwr[] ={9050,4350, 650,500, 600.1600, 600,500, 650,500, 600.1600, 600.550, 600.1600, 600.1650, 550.550, 600.500, 600.1600, 650.1600, 600.500, 600.1650, 600.1600, 600.500, 600.1650, 600.1600, 600.550, 600.1600, 600.500, 600.550, 600.1600, 600.1600, 650.500, 600.500, 600.1600, 650.500, 600.1600, 600.1650, 600.500, 600.500, 600}; // NEC 4B36D32C // RAW-IR-Signal für "Receiver Power On" einfügen unsigned int irRECpwrON[] ={9000.4400, 600.550, 600.1600, 600.500, 600.550, 600.1600, 600.500, 600.1600, 650.1600 , 600.1600, 600.500, 650.1600, 600.1600, 600.500, 650.1600, 600.1600, 600.500, 600.550, 600.500, 600.1600, 600.550, 600.500, 600.500, 650.500, 600.500, 600.1600, 650 ,1600, 600,500, 600.1600, 650.1600, 600.1600, 600.1600, 600.1600, 650}; // NEC 4BB620DF // RAW-IR-Signal für "Receiver Power Off" einfügen unsigned int irRECpwrOFF[] ={9000.4400, 600.550, 550.1650, 600.550, 550.550, 600.1650, 550.550, 600.1650, 550.1650 , 600.550, 550.550, 550.1650, 600.1650, 600.550, 550.1650, 600.1650, 550.550, 600.1650, 550.1650, 600.1650, 600.500, 600.550, 550.550, 600.1650, 550.550, 600.500 , 600.550, 550.550, 550.1700, 550.1650, 600.1650, 550.550, 600.1650, 550}; // NEC 4B36E21D // RAW-IR-Signal für "Receiver Mute" einfügen unsigned int irRECmute[] ={9000,4400, 650,450, 650,1600, 600,500, 600,500, 650,1600, 600,500, 600.1650, 600.1600, 600.1600, 650.500, 600.1600, 650.1600, 600.500, 600.1600, 650.1600, 600.500, 600.1650, 600.500, 600.1600, 650.500, 600.500, 600.500, 600.500, 650.500, 600.500, 600, 1600, 650,500, 600.1600, 600.1600, 650.1600, 600.1650, 600.1600, 600}; // NEC 4BB6A05F // RAW-IR-Signal für "Receiver Volume Down" einfügen unsigned int irRECvdn[] ={9150,4250, 750,350, 700,1550, 700,400, 700,450, 650,1550, 700,450, 600.1600, 650,1600 , 600.1650, 600.500, 600.1650, 600.1600, 600.550, 600.1600, 600.1650, 600.500, 600.1650, 600.1600, 650.500, 600.500, 600.500, 650.500, 600.500, 600.500, 600.550, 600.500 , 600,1650, 600.1600, 600,1650, 600,1650, 600.1600, 600,1650, 600}; // NEC 4BB6C03F // RAW-IR-Signal für "Receiver Volume Up" einfügen unsigned int irRECvup[] ={9050.4400, 650.500, 600.1600, 600.550, 600.500, 600.1650, 600.500, 600.1600, 650.1600 , 600.1600, 600.550, 600.1600, 600.1600, 650.500, 600.1600, 650.1600, 600.500, 600.550, 600.1600, 600.550, 600.500, 600.550, 600.500, 600.550, 600.500, 600.1600, 650.500 , 600.1600, 600.1650, 600.1600, 600.1650, 600.1600, 600.1600, 600}; // NEC 4BB640BF // RAW-IR-Signal für "Receiver Source CBL/SAT" einfügen unsigned int irRECsrc[] ={8950,4450, 600,500, 600,1650, 600,500, 600,500, 600,1650, 600,500, 600,1600, 600 ,1650, 600.1600, 600.550, 600.1600, 600.1650, 600.500, 600.1600, 600.1650, 600.500, 600.500, 600.1650, 600.1600, 600.1650, 600.500, 600.500, 600.500, 650.500 , 600.1600, 600.500, 600.550, 600.500, 600.1600, 600.1650, 600.1600, 600.1650, 600}; // NEC 4BB6708F// Erstellen Sie eine Instanz des Servers // geben Sie den Port an, auf dem als Argument lauschen sollWiFiServer server(80);void setup() { Serial.begin(115200); Verzögerung(10); irsend.begin(); // Mit dem WiFi-Netzwerk verbinden Serial.println (); Serial.println(); Serial.print ("Verbinden mit"); Serial.println (ssid); WiFi.begin(ssid, Passwort); Während (WiFi.status () !=WL_CONNECTED) { Verzögerung (500); Serial.print("."); } Serial.println(""); Serial.println ("WiFi verbunden"); // Server starten server.begin(); Serial.println ("HTTP-Server gestartet"); // Drucken Sie die IP-Adresse Serial.print ("IP-Adresse:"); Serial.println (WiFi.localIP()); if (mdns.begin ("IRBlasterLR", WiFi.localIP())) {Serial.println ("MDNS-Responder gestartet"); } Serial.println(); Serial.println ();}void loop () {// Prüfen, ob ein Client eine Verbindung mit WiFiClient hergestellt hat client =server.available (); if (!client) { return; } // Warten Sie, bis der Client einige Daten sendet Serial.println ("new client"); while(!client.available()){ delay(1); } // Erste Zeile der Anfrage lesen String req =client.readStringUntil('\r'); Serial.println (req); client.flush(); // Übereinstimmung mit der Anfrage if (req.indexOf("/irTVpwr") !=-1){ irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); Serial.println ( "IRreq irTVpwr gesendet"); } else if (req.indexOf("/irTVsrc") !=-1){ irsend.sendRaw(irTVsrc, sizeof(irTVsrc) / sizeof(irTVsrc[0]), khz); Serial.println ( "IRreq irTVsrc gesendet"); } else if (req.indexOf("/irTVmute") !=-1){ irsend.sendRaw(irTVmute, sizeof(irTVmute) / sizeof(irTVmute[0]), khz); Serial.println ( "IRreq irTVmute gesendet"); } else if (req.indexOf("/irTVvdn") !=-1){ irsend.sendRaw(irTVvdn, sizeof(irTVvdn) / sizeof(irTVvdn[0]), khz); Serial.println ( "IRreq irTVvdn gesendet"); } else if (req.indexOf("/irTVvup") !=-1){ irsend.sendRaw(irTVvup, sizeof(irTVvup) / sizeof(irTVvup[0]), khz); Serial.println ( "IRreq irTVvup gesendet"); } else if (req.indexOf("/irTVchup") !=-1){ irsend.sendRaw(irTVchup, sizeof(irTVchup) / sizeof(irTVchup[0]), khz); Serial.println ( "IRreq irTVchup gesendet"); } else if (req.indexOf("/irTVchdn") !=-1){ irsend.sendRaw(irTVchdn, sizeof(irTVchdn) / sizeof(irTVchdn[0]), khz); Serial.println ( "IRreq irTVchdn gesendet"); } else if (req.indexOf("/irALLpwr") !=-1){irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); Verzögerung (2000); irsend.sendRaw(irRECsrc, sizeof(irRECsrc) / sizeof(irRECsrc[0]), khz); Serial.println ( "IRreq irALLpwr gesendet"); } else if (req.indexOf("/irRECpwr") !=-1){ irsend.sendRaw(irRECpwr, sizeof(irRECpwr) / sizeof(irRECpwr[0]), khz); Serial.println ( "IRreq irRECpwr gesendet"); } else if (req.indexOf("/irRECpwrON") !=-1){ irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); Serial.println ( "IRreq irRECpwrON gesendet"); aufrechtzuerhalten. Sonst if (req.indexOf("/irRECpwrOFF") !=-1){ irsend.sendRaw(irRECpwrOFF, sizeof(irRECpwrOFF) / sizeof(irRECpwrOFF[0]), khz); Serial.println ( "IRreq irRECpwrOFF gesendet"); } else if (req.indexOf("/irRECmute") !=-1){irsend.sendRaw(irRECmute, sizeof(irRECmute) / sizeof(irRECmute[0]), khz); Serial.println ( "IRreq irRECmute gesendet"); } else if (req.indexOf("/irRECvdn") !=-1){ irsend.sendRaw(irRECvdn, sizeof(irRECvdn) / sizeof(irRECvdn[0]), khz); Serial.println ( "IRreq irRECvdn gesendet"); } else if (req.indexOf("/irRECvup") !=-1){ irsend.sendRaw(irRECvup, sizeof(irRECvup) / sizeof(irRECvup[0]), khz); Serial.println ( "IRreq irRECvup gesendet"); } else {Serial.println ("ungültige Anfrage"); client.stop(); Rückkehr; } client.flush(); // Antwort an den Client senden //client.print(s); client.print("HTTP/1.1 200 OK\r\n"); Verzögerung (1); Serial.println ("Client getrennt"); Serial.println(); // Der Client wird tatsächlich getrennt, // wenn die Funktion zurückkehrt und das 'Client'-Objekt zerstört wird}
script.jsJavaScript
Javascript für Webapp (erfordert jquery)
// Funktion zum Senden von IR-Befehlenfunction buttonClick(clicked_id){ if (clicked_id =="irTVpwr"){ $.get( "curl.php", { room:"192.168.1.62" , Schaltfläche:"irTVpwr"} ); } if (clicked_id =="irTVsrc"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVsrc"} ); } if (clicked_id =="irTVmute"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVmute"} ); } if (clicked_id =="irTVvdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVvdn"} ); } if (clicked_id =="irTVvup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVvup"} ); } if (clicked_id =="irTVchup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVchup"} ); } if (clicked_id =="irTVchdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVchdn"} ); } if (clicked_id =="irRECpwr"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwr"} ); } if (clicked_id =="irALLpwr"){ $.get( "curl.php", { room:"192.168.1.62", button:"irALLpwr"} ); } if (clicked_id =="irRECpwrON"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwrON"} ); } if (clicked_id =="irRECpwrOFF"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwrOFF"} ); } if (clicked_id =="irRECmute"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECmute"} ); } if (clicked_id =="irRECvdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECvdn"} ); } if (clicked_id =="irRECvup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECvup"} ); } }
index.htmlHTML
Einfaches HTML zum Anzeigen von Schaltflächen.
 



Fernseher





     


Empfänger





curl.phpPHP
php-Skript zum Senden von GET-Anfragen an ESP8266
manifest.jsonJSON
Dadurch kann die Webseite als native Webapp in Android ausgeführt werden.
{ "name":"WiFi Remote", "icons":[ { "src":"remote_icon_36.png", "sizes":"36x36" , "type":"image/png", "density":0.75 }, { "src":"remote_icon_48.png", "sizes":"48x48", "type":"image/png", "density" :1.0 }, { "src":"remote_icon_128.png", "sizes":"128x128", "type":"image/png", "density":1.0 }, { "src":"remote_icon_192.png" , "sizes":"192x192", "type":"image/png", "density":1.0 } ], "scope":"/remote/", "start_url":"/remote/index.html", "display":"fullscreen", "orientation":"portrait"}

Schaltpläne

Nichts wirklich, nur Strom und ein einzelner Pin, der mit einem NPN-Transistor verbunden ist, um zwei IR-LEDs in Reihe (ohne Widerstände) von der 5-V-Versorgungsspannung zu treiben. Wenn Sie zusätzliche LEDs betreiben möchten oder weniger Spannungsabfall von einer 3,3-V-Quelle benötigen, können Sie einen NPN verwenden Transistor zum Schalten mehrerer PNP-Transistoren (einer pro LED). Mit dieser Konfiguration können Sie so viele LEDs verwenden, wie Ihre Quellenspannung Strom liefern kann.

Herstellungsprozess

  1. Die Mängel von WLAN-RTLS
  2. Neue drahtlose Technologie 2015
  3. So installieren Sie einen sicheren eingebetteten Webserver auf einem 3 USD-WLAN-Gerät
  4. MQTT-Kommunikation zwischen NodeMCU und Raspberry Pi 3 B+
  5. RASPBERRY PI WIFI-ROBOTER, KONTROLLIERT VON ANDROID SMART PHONE
  6. WLAN-gesteuerter Roboter mit Raspberry Pi
  7. Was sind WLAN-Anrufe? Wie funktioniert es?
  8. IOT - Smart Jar mit ESP8266, Arduino und Ultraschallsensor
  9. Smart Door Lock mit WLAN-Anmeldeseite von Arduino &ESP8266
  10. Was ist eine Perlenexplosion? Ein Leitfaden zum Perlenstrahlen