Elektroda.de
Elektroda.de
X
This content has been translated flag-pl » flag-de View the original version here.
  • IR-Sender/Empfänger auf ESP8266 (Arduino)
    Verwendungszweck und Funktionsweise
    Es gibt Bibliotheken für Arduino, mit denen Geräte über IR gesteuert werden können. Ich habe mich jedoch entschieden, das Problem anders zu lösen – ich wollte ein lernendes System schaffen, das heißt, es sollte die Codes der originalen Fernbedienung speichern. Dadurch kann man eine ganze Reihe von Geräten wie Klimaanlagen, Lichterketten, Discokugeln usw. steuern. Die Hauptaufgabe der Schaltung bestand auf dem Ein-/Ausschalten, aber natürlich könnte man jede beliebige Sequenz von Impulsen aufzeichnen und abspielen und simulieren so das Drücken einer beliebigen Taste auf der Fernbedienung oder eine Tastenfolge. Die schaltung verfügt außerdem über eine zusätzliche Funktionalität – die Signalisierung, ob das Gerät eingeschaltet ist oder nicht. Manchmal sind wir weit von der kontrollierten Schaltung entfernt und möchten sicher sein, dass beispielsweise die Klimaanlage ausgeschaltet ist. Anlässlich der Entwicklung von Software auf Arduino habe ich beschlossen, den GPT-Chat zu nutzen, um Code zu erstellen. Lesen Sie weiter, um zu sehen, was dabei herausgekommen ist.
    3htm
    Ein bisschen Geschichte oder warum die Schaltung geschaffen wurde?
    Zu Hause habe ich einen Kamin und Warmluftverteilung. Ich habe beschlossen, zusätzliche Kaltluftverteilung nachzurüsten. Zu diesem Zweck habe ich auf dem Dachboden ein Monoblock-Raumklimagerät platziert, das ich an einen Kaminventilator und einen zusätzlichen Ventilator angeschlossen habe, der Luft in die Räume bläst. Die Schaltung wurde über eine Fernbedienung gesteuert, aber ich werde nicht jedes Mal auf den Dachboden gehen, wenn ich die Klimaanlage ein- oder ausschalten muss. Es musste eine Verlängerung angefertigt werden. Die erste Version war verkabelt (TSOP-Empfänger und 38-kHz-Generator). Es funktionierte gut, aber nach dem Wechseln der Möbel sah das Kabel, das den Empfänger mit dem Sender verband, sehr hässlich aus. Die nächste Lösung basierte auf einer fertigen 433-MHz-Funkverlängerung (das in Form eines UFOs). Es hat nicht perfekt funktioniert - manchmal gab es Probleme beim Ausschalten der Klimaanlage, aber das größte Problem war das automatische Einschalten der Klimaanlage (zum Glück im Lüftungsmodus). Schuldig war ein Empfänger auf dem Dachboden, der eine große Anzahl von Funksignalen auffing und ständig etwas im Infrarotbereich sendete. Ich bin diese Schaltung losgeworden und ersetzte sie durch die vorgestellte Lösung – das Senden von Fernbedienungsbefehlen über Wi-Fi und in Verbindung mit der restlichen Smart-Home-Infrastruktur – die Möglichkeit, von jedem Ort mit Internetzugang aus zu steuern.

    Der Bau der Schaltung
    Da ich alles auf ESP8266 und Arduino mache, lag die Wahl der Plattform auf der Hand. Es blieb noch, eine solche Schaltung zu schaffen, und zwar im Grunde zwei Schaltungen – eine zum Lernen (Ablesen) und eine andere zum Senden. Ich habe darüber nachgedacht, es selbst zu bauen oder SONOFF Basic zu modifizieren. Allerdings habe ich dieses Modul gefunden:
    IR-Sender/Empfänger auf ESP8266 (Arduino)
    Es enthält sowohl einen Empfänger als auch einen Sender und ist mit dem ESP8266 verbunden. Die zur Programmierung notwendigen Pins sind leicht zugänglich und gut beschrieben:
    IR-Sender/Empfänger auf ESP8266 (Arduino)
    Also habe ich mich entschieden, ein solches Modul zu kaufen. Ich habe 3 Stück gekauft, weil ich einen Chip in ein Lesegerät und den anderen in einen Sender umbauen wollte (der dritte ist ein Ersatzchip). Später habe ich das Konzept geändert und jedes Modul kann sowohl im Empfänger- als auch im Sendermodus arbeiten. Die Schaltung ist nicht perfekt – die im sichtbaren Licht funktionierende Diode fehlt. Eine solche Diode erweist sich beim Testen als sehr nützlich – man kann beim Selbsttest blinken und während der Übertragung blinken. Man weiß einfach, was los ist. Für mich war das sehr wichtig, denn nach der ersten Programmierung "mit Kabeln" wechsle ich sofort auf OTA und spiele nicht mit RX, TX, weshalb meine Schaltung mit so einer Diode ausgestattet war:
    IR-Sender/Empfänger auf ESP8266 (Arduino) IR-Sender/Empfänger auf ESP8266 (Arduino)
    Ich habe eine rote "helle" 3-mm-LED in einem durchsichtigen Gehäuse verwendet, die über einen 220R-Widerstand mit dem ESP verbunden ist. Ich empfehle solche Dioden – sie leuchten hell bei einem Strom von 1-2 mA und das farblose Gehäuse lässt keinen Zweifel daran, ob die Diode gerade eingeschaltet ist oder nicht.

    Ablesen der Tasten der Fernbedienung
    Die von den Tasten der Fernbedienungen gelesenen Sequenzen mussten irgendwo gespeichert werden. Ich habe beschlossen, dass die "Datenbank" eine einzelne JSON-Datei sein wird, in der einzelne Fernbedienungen und in jeder Fernbedienung Tasten gespeichert werden. Es sieht ungefähr so aus (Zahlenfolgen wurden zur Darstellung gekürzt):
    Code: json
    Melde dich an, um den Code zu sehen


    Jede Fernbedienung (mit Namen gekennzeichnet) verfügt über zwei globale Parameter: Frequenz (in Hz) und Arbeitszyklus (in %), und natürlich eine Liste von Tasten mit Zeiten. Die Zeiteinheit beträgt 10 µs, die Zahl 290 entspricht also 2,9 ms. Die Zahlen dürfen nicht größer als 16 vorzeichenlose Bits sein, also ca. 655 ms. Die erste Zahl ist die Signaldauer, die zweite Zahl ist die Pausedauer und so weiter. Die letzte Zahl ist immer die Signaldauer. Die Zahlenfolge selbst (als 16-Bit-Binärdaten) wird von ESP bereitgestellt. Beim Hinzufügen zur "Basis" ist ein Problem aufgetreten. Zu diesem Zweck wurde eine Hilfssoftware in Form einer Website und eines PHP-Skripts erstellt:
    Datei "przycisk.htm":
    Code: html
    Melde dich an, um den Code zu sehen


    przycisk.php:
    Code: php
    Melde dich an, um den Code zu sehen


    Die Website und das Skript ermöglichen, die erforderlichen Daten in einer temporären irs.json-Datei bequem zu speichern. Diese Datei wird von dem PHP-Skript, das die Daten vom ESP erhält, interpretiert und anschließend gelöscht. Der Ablauf der Programmierung ist also wie folgt: wir geben den Namen der Fernbedienung und den Namen der Taste ein und drücken auf "Senden". Nun richten wir die Fernbedienung auf den TSOP-Empfänger und drücken die richtige Taste der Fernbedienung. Dies ist eine recht einfache Abfolge, mit der sich eine große Anzahl von Tasten bequem programmieren lässt. Es ist am besten, die Fernbedienungen und Tasten nur mit lateinischen Buchstaben und Zahlen zu benennen, um das mühsame Senden der Fernbedienungen und Tastencodes per GET-Abfrage zu vermeiden.
    Ein kleiner Hinweis an dieser Stelle - an vielen Stellen im Code (sowohl PHP als auch C) wird die Sequenz: "192.168" vorkommen. Der Punkt ist, dass die PHP-Skripte auf meinem Server laufen, der auch von außen zugänglich ist, und ich muss mich davor schützen, sie von außerhalb meines Heimnetzwerks aufzurufen.

    Arduino Code
    Code: arduino
    Melde dich an, um den Code zu sehen


    Der Code ist leider ein wenig gewachsen. Das liegt daran, dass darin sowohl Lese- als auch Schreibfunktionalität enthalten ist. Das Gerät wählt den richtigen Modus anhand des Jumpers. Wenn die RX- und TX-Pins beim Start kurzgeschlossen sind, arbeitet die Schaltung als Empfänger, sind sie offen, arbeitet er als Sender. Einmal gestartet, kann der Modus nicht mehr geändert werden. Der für das Auslesen zuständige Code ist relativ einfach: es werden die Sendedauer (Low-Zustand am IR-Empfängerausgang) und die Pausedauer gemessen. Wenn die Pause länger als 0,5 s dauert, wird der Auslesevorgang unterbrochen und die gesamte Sequenz an das Skript IR.php gesendet, das sie in einer Datenbank (json-Datei) speichert.

    Der umgekehrte Vorgang besteht darin, eine Zahlenfolge zu empfangen, die den Tastencode der Fernbedienung darstellt. Wie man sieht, senden die Sendemodule in Form von IR-Blitzen, was sie empfangen haben, und haben kein Gedächtnis, wenn es um die Reihenfolge der Ansteuerung der IR-Diode geht. Ich habe mich entschieden, eine solche Steuerung auf Basis eines Webservers auf ESP durchzuführen. Da ich jedoch zuvor noch keinen ESP-Server zum Lesen der per POST gesendeten Daten eingerichtet hatte, beschloss ich es mit Hilfe von chatGPT zu machen.

    Abenteuer mit chatGPT
    Meine Bitte um Hilfe:
    "Erstelle Arduino-Code für ESP8266, um einen Webserver zu erstellen, der binäre Daten über die POST-Methode empfängt".
    Antwort:
    Code: arduino
    Melde dich an, um den Code zu sehen


    Ich muss zugeben, dass es recht vernünftig aussieht. Ich habe eine weitere Bedingung hinzugefügt:
    Der Server muss noch kontrollieren, ob die Verbindungen aus dem lokalen Netz 192.168.x.x stammen. Verbindungen von außerhalb des lokalen Netzes sollten abgelehnt werden.
    Code: arduino
    Melde dich an, um den Code zu sehen


    Ein Fehler ist sofort sichtbar – Daten werden von einer beliebigen IP empfangen, aber nicht von der eigenen. Ich tadelte den Chat, der sich wie immer entschuldigte und einen überarbeiteten Code anbot:
    Code: arduino
    Melde dich an, um den Code zu sehen


    Funktioniert der vom Bot vorgeschlagene Code? Leider nicht. Es hat einige Zeit gedauert, bis ich Fehler gefunden habe, und ich musste wie üblich Google verwenden.
    Das erste Problem ist das Lesen der Header. Um dies zu ermöglichen, muss man diese im Voraus erklären:
    Code: arduino
    Melde dich an, um den Code zu sehen


    Ohne diese Erklärung funktioniert das Auslesen des Inhalts der Header einfach nicht. Nach der Behebung dieses Fehlers funktionierte die Software jedoch immer noch nicht. Die vorgeschlagene Methode zum Lesen eines Streams gab immer einen leeren String zurück. Um die per POST empfangenen Rohdaten zu lesen, soll man verwenden:
    server.arg("plain")
    Eine sehr seltsame Sequenz – das Lesen des "einfachen" Arguments, das einfach nicht vorhanden ist. Es wundert mich nicht, dass der Bot nicht darauf gekommen ist 😊
    Im Allgemeinen hilft uns chatGPT, wenn wir die Richtigkeit des generierten Codes schnell überprüfen können. Wenn wir jedoch etwas nicht wissen, können wir lange nach Fehlern suchen, und jemand, der sich nicht mit Programmieren auskennt, wird sie einfach nicht finden.
    Nur ein kleiner Exkurs: Auf der Website stackoverflow.com (wahrscheinlich die beste Website für Entwickler) gab es einen Hinweis: "Die Verwendung von von ChatGPT generiertem Text in Inhalten auf Stack Overflow ist vorübergehend verboten."
    Und die Erklärung: "Das Grundproblem besteht darin, dass die von ChatGPT generierten Antworten zwar eine hohe Fehlerquote aufweisen, aber meist gut aussehen."
    Hier ist ein Link zum Original
    Nichts hinzuzufügen, nichts wegzunehmen – genau das ist mir passiert.

    Benachrichtigung über den Status des gesteuerten Geräts
    Der RX-Pin (STATE) dient zusätzlich zur Zustandserkennung des gesteuerten Geräts. Der aktive Zustand ist der Low-Zustand. Dies kann auf viele Arten gelöst werden: Dieser Pin kann mithilfe eines Optokopplers mit Masse kurzgeschlossen werden, wobei die Diode des Optokopplers irgendwo mit dem gesteuerten Gerät verbunden wird (z. B. Elektronik der Klimaanlage, USB-Ausgang des Fernsehgeräts usw.). Die einfachste Lösung besteht jedoch darin, einen Fotowiderstand hinzuzufügen, der von der Power-LED des Gerätes beleuchtet wird. Allerdings ist zu bedenken, dass der Low-Zustand vom ESP richtig erkannt werden muss und der interne Pull-up-Widerstand relativ klein ist (weniger als 50 kΩ). Ein mit Masse verbundener Fotowiderstand "reduziert" nicht genügend Spannung. Die Lösung besteht darin, die Zeile pinMode(STATE, INPUT) auszukommentieren; und Erstellen eines eigenen Pull-Ups zur Versorgungsspannung mit einem Widerstand mit höherem Wert. Anstelle des RX-Pins können wir natürlich auch einen anderen freien verwenden oder sich an den analogen Eingang des ESP anschließen.
    ESP meldet seinen Status alle 30 Sekunden und zusätzlich sofort nach einer Änderung (Aus- und Einschalten). Das IR.php-Skript speichert den Status in der Protokolldatei (fügt Einträge hinzu) und zusätzlich wird der letzte Status mit dem Zeitstempel in einer separaten Datei gespeichert. Diese Datei wird später vom Browser verwendet, um den Status des Geräts anzuzeigen (eingeschaltet/ausgeschaltet).
    Unten ist das IR.php-Skript, das Daten von ESP empfängt und in der Datenbank speichert:
    Code: php
    Melde dich an, um den Code zu sehen


    Das IR.php-Skript ist eine Art Schnittstelle zwischen den Systemen und der "Außenwelt". Nachfolgend eine Beschreibung seiner Verwendung im Test-Fernbedienung und direkt in der GET-Anfrage.

    "Test-Fernbedienung"
    Code: php
    Melde dich an, um den Code zu sehen


    Das Skript fungiert als Demo-Fernbedienung. Wir können jeden Tastencode an jedes ESP senden. Die Funktion send() zeigt, wie der Code gesendet wird. Einer der Parameter ist nrir – das ist der Name der spezifischen Schaltung und des dafür kompilierten Codes. Im gezeigten Beispiel ist es „IRX1“ (mit APname).
    Wenn wir mehrere Schaltungen haben, müssen wir den Code viele Male kompilieren und jedes Mal den AP-Namen in IRX2, IRX3 usw. ändern. Bei mir fragt jede Schaltung beim Start nach einem OTA-Update, aber diese Abfrage zeichnet auch der AP-Name und IP auf der Serverseite auf. Deshalb weiß ich immer, welche IP eine bestimmte Schaltung zu einem bestimmten Zeitpunkt hat:
    Code: php
    Melde dich an, um den Code zu sehen


    All dies kann geändert werden – es reicht den Schaltungen einfach eine bestimmte feste IP zuzuordnen.
    Fernbedienungsbefehle können auch per GET gesendet werden, z.B.:
    http://192.168.1.20/IR.php?akcja=IRget&nrir=IRX1&remote=TV-SONY&button=Power

    Zusammenfassung
    Die vorgeschlagene Lösung ist sehr universell. Ermöglicht die Steuerung mehrerer Geräte durch mehrere IR-Sender. Codes können auch nach dem Start des Ganzen in die Datenbank hochgeladen werden. Jeder der Sender kann eine beliebige Sequenz senden und erfordert hierfür keine Neuprogrammierung. Leider erschwerte diese Vielseitigkeit die Lösung hinsichtlich der Präsentation auf Elektroda. Abschließend noch ein paar Bemerkungen zum vorgestellten Schaltung Sender-/Empfänger. Nun, schon vor dem Kauf ist mir aufgefallen, dass die IR-Diode über einen Transistor ohne strombegrenzenden Widerstand gesteuert wird. Das ist interessant, weil das Ganze von einem Stabilisator gespeist wird, der bis zu 1 A liefern kann, was für eine IR-Diode viel zu viel ist. Die Schaltung funktioniert jedoch und die Diode ist nicht durchgebrannt. Vermutlich ist der Strombegrenzer ein Transistor, dessen Beta mit dem Strom stark abnimmt, was mit einem 1 kΩ-Widerstand an der Basis offenbar ausreicht. Die Schaltung hat noch einen weiteren Nachteil – die Platzierung der IR-Diode. Es ist praktisch unmöglich, es zu verkleiden (die Diode ist niedriger als die ESP-Platine). Deshalb sollte es anders gelöst werden – entweder die Diode auf die andere Seite löten, oder an einem Kabel herausführen. Auf jeden Fall ist ihre ursprüngliche Stelle unglücklich.

    Cool? DIY-Rangliste
    Hast du ein Problem mit Arduino? Stelle bei uns eine Frage. Besuche unser Arduino-Forum.
    Über den Autor
    krzbor
    Niveau 25  
    Offline 
    krzbor hat 1100 Beiträge geschrieben mit der Bewertung 623, und dabei 21 Mal geholfen. Er ist seit 2004 bei uns.
  • #2
    TechEkspert
    Editor
    Interessanterweise kann eine solche IR-Brücke sogar bei einfachen Installationen mit einer Klimaanlage in technischen Räumen eingesetzt werden, in denen die Klimaanlage keine Verbindung zum BMS hat. Man kann im Notfall einen Code zum Einschalten der Klimaanlage / Ändern von Parametern senden. Zu Hause kann man Befehle an Klimaanlagen, Audio- und Videogeräte senden, zumal manchmal auch TV-Fernbedienungen, Set-Top-Boxen, Player usw.
  • #3
    krzbor
    Niveau 25  
    Als klassische Fernbedienung wird die Schaltung wahrscheinlich nicht genutzt – man muss das Telefon nehmen, die Website starten und den Knopf drücken. Hier wird die Fernbedienung immer schneller und komfortabler sein. Es sieht anders aus, wenn wir 2 TV-Geräte und einen SAT-Receiver haben. Wo es SAT gibt, können wir eine klassische Fernbedienung verwenden, und im anderen Raum ist die vorgestellte Lösung ganz gut. Ich habe Versuche gemacht, ob die Signale "durch Reflexion" – also von der gegenüberliegenden Wand (ca. 4 m Entfernung) – empfangen werden. Beim SONY-Fernseher war das möglich, aber der DENON-Verstärker empfing diese Art von Signal nicht mehr. Allerdings hängt alles von der Leistung der IR-Diode und deren Anzahl ab. Die vielleicht interessanteste Lösung ist jedoch die Steuerung aus größerer Entfernung, z. B. bei Klimaanlagen. Solange im Innengerät selbst Platz für ein Miniatur-Netzteil und ESP ist, kann alles eingebaut werden. Es reicht aus, die IR-Diode in die Nähe des Empfängers zu bringen. Man kann einen zusätzlichen Pin verwenden, um einen DS18B20 hinzuzufügen. Dann kann uns unser System auch über der Temperatur melden.
    Es könnte auch interessant sein, diese Schaltung zur Betreuung einer älteren Person zu nutzen. Hier benötigen wir noch eine Kamera, um zu sehen was los ist, beispielsweise auf einem Fernseher.
  • #4
    khoam
    Niveau 42  
    krzbor hat geschrieben:
    Die vielleicht interessanteste Lösung ist jedoch die Steuerung aus größerer Entfernung, z. B. bei Klimaanlagen. Solange im Innengerät selbst Platz für ein Miniatur-Netzteil und ESP ist, kann alles eingebaut werden.

    Und wenn man bedenkt, wie viel sich manche Klimaanlagenhersteller für ein "Wi-Fi-Steuermodul" wünschen, ist die von dir vorgestellte Lösung am besten geeignet. Für die Klimaanlagen in meinem Haus wünscht sich der Verkäufer beispielsweise fast 100 € für ein einzelnes Modul (nach Rabatten für 3 solcher Module).
  • #5
    krzbor
    Niveau 25  
    Hier erzähle ich noch von den Steuercodes. Meine Klimaanlagen-Fernbedienung hat sie nur einmal gesendet. Dies ist eine seltsame Lösung, da die Fernbedienungen die Sequenz normalerweise mehrmals wiederholen. Als ich die Schaltung erstellte, fiel mir auf, dass sich die Klimaanlage nicht immer ein- und ausschaltete. Ich habe es ganz einfach gelöst – die Ein/Aus-Sequenz endet immer mit Ein. Also habe ich am Ende 10000 hinzugefügt (100 ms Pause) und die gesamte Steuersequenz noch einmal kopiert. Jetzt funktioniert es jedes Mal. Auf diese Weise können mehrere Anweisungen zusammengefasst werden, die Gesamtlänge darf jedoch 512 Einträge nicht überschreiten. Bei Bedarf kann man jedoch die Länge des Puffers im Programm erhöhen.

    khoam hat geschrieben:
    Für die Klimaanlagen in meinem Haus wünscht sich der Verkäufer beispielsweise fast 100 € für ein einzelnes Modul (nach Rabatten für 3 solcher Module).

    Für 100 € kann man mehrere "meine" Module erstellen :) Wenn die Klimaanlage jedoch Platz für ein Wi-Fi-Modul bietet, sind wahrscheinlich ein Anschluss und etwas physischer Platz vorhanden. Über einen solchen Anschluss kann man Strom beziehen – bei 12 V reicht ein Miniaturkonverter, bei 5 V reicht ein Linearstabilisator – die Stromleistung sollte ausreichend sein, da alle WLAN-Module mehr oder weniger gleich viel verbrauchen.
  • #6
    weryfany
    Niveau 26  
    Das einzige Argument ist, dass es in der gesamten Steuerung keine „P2P-Cloud“ gibt.
    Kürzlich habe ich bei Aliexpress ein IR-Wi-Fi-Modul gekauft, es hat bis zu 3 € gekostet und wir können es sogar von den Bahamas aus steuern (sofern es Internet gibt). Die Funktionalität liegt hier auf der Smartphone-App-Seite. Zeitpläne für Ein-/Ausschalten/Sequenzen der Signalerzeugung) von verschiedenen Fernbedienungen aus. Es steht eine riesige Datenbank der Fernbedienungen zur Verfügung. Wenn wir eine bestimmte Fernbedienung und einen bestimmten Hersteller vermissen, können wir unsere eigene hinzufügen, vorausgesetzt, wir haben eine physische Fernbedienung.
  • #7
    Yazu
    Niveau 12  
    >>20604370
    Du kannst ein solches Modul selbst herstellen, nur die Bedienung über das Telefon ist nicht bequem.
    Link
  • #8
    gulson
    Forenbetreiber
    Vielen Dank für die Beschreibung einer interessanten Konstruktion. Du hast große Popularität erlangt. Gib mir ein Paketfach an und du erhältst ein Geschenk.
    [F]