Eine Bibliothek, die das Senden und Empfangen von Infrarotsignalen ermöglicht.
Verfügbar als Arduino-Bibliothek „IRremote“.
? Google Translate
Unterstützte IR-Protokolle
Merkmale
Neue Funktionen mit Version 4.x
Neue Funktionen mit Version 3.x
Konvertieren Sie Ihr 2.x-Programm in die 4.x-Version
So konvertieren Sie alte MSB-First-32-Bit-IR-Datencodes in neue LSB-First-32-Bit-IR-Datencodes
Fehler bei der Verwendung der 3.x-Versionen für alte Tutorials
Bleibe bei 2.x
Warum *.hpp statt *.cpp
Verwendung der neuen *.hpp-Dateien
Tutorials
3 Möglichkeiten, einen IR-Code anzugeben
Pinbelegung des IR-Empfängers
Empfang von IR-Codes
Haftungsausschluss
Andere Bibliotheken, die diese Protokolle abdecken können
Protokoll=PULSE_DISTANCE
Protokoll=UNBEKANNT
Umgang mit Protokollen, die von IRremote nicht unterstützt werden
dekodierteIRData-Struktur
Mehrdeutige Protokolle
RAM-Nutzung verschiedener Protokolle
Umgang mit unbekannten Protokollen
Senden von IR-Codes
Liste öffentlicher IR-Code-Datenbanken
Senden von IRDB-IR-Codes
Pin senden
Winziger NEC-Empfänger und -Sender
Das FAST-Protokoll
FAQ und Hinweise
Der Empfang stoppt nach analogWrite() odertone() oder nachdem ein Motor läuft
Beim Empfang wird ein Überlaufflag gesetzt
Probleme mit Neopixeln, FastLed usw.
Funktioniert/kompiliert nicht mit einer anderen Bibliothek
Mehrere IR-Empfänger- und Senderinstanzen
Erhöhen Sie die Stärke des gesendeten Ausgangssignals
Minimale CPU-Taktfrequenz
Bang & Olufsen-Protokoll
Beispiele für diese Bibliothek
WOKWI Online-Beispiele
IR-Steuerung eines Roboterautos
Probleme und Diskussionen
Kompilieren Sie Optionen/Makros für diese Bibliothek
Include-Dateien (*.h) mit der Arduino IDE ändern
Kompilierungsoptionen mit der Sloeber-IDE ändern
Unterstützte Boards
Timer- und Pin-Nutzung
Inkompatibilitäten mit anderen Bibliotheken und Arduino-Befehlen wietone() und analogWrite()
Hardware-PWM-Signalerzeugung zum Senden
Warum verwenden wir zum Senden einen Arbeitszyklus von 30 %?
Wie wir Signale entschlüsseln
NEC-Kodierungsdiagramme
Schneller Vergleich von 5 Arduino IR-Empfangsbibliotheken
Geschichte
Nützliche Links
Mitwirkende
Lizenz
Copyright
NEC / Onkyo / Apple
Denon / Sharp
Panasonic / Kaseikyo
JVC
LG
RC5
RC6
Samsung
Sony
Universal Pulse Distance
Universal Pulse Width
Universal Pulse Distance Width
Hash
Pronto
BoseWave
Bang & Olufsen
Lego
FAST
Whynter
MagiQuest
Protokolle können ein- und ausgeschaltet werden, indem Makros vor der Zeile #include <IRremote.hpp>
definiert werden, wie hier:
#define DECODE_NEC//#define DECODE_DENON#include <IRremote.hpp>
Viele Tutorials und Beispiele.
Aktiv gepflegt.
Ermöglicht das Empfangen und Senden von rohen Timing-Daten .
Da 4.3 IrSender.begin(DISABLE_LED_FEEDBACK)
nicht mehr funktioniert , verwenden Sie stattdessen IrSender.begin(DISABLE_LED_FEEDBACK, 0)
.
Neuer universeller Impulsentfernungs-/Impulsbreiten-/Impulsentfernungsbreite-Decoder hinzugefügt, der viele bisher unbekannte Protokolle abdeckt.
Ausdruck des Codes zum Senden des empfangenen Befehls von IrReceiver.printIRSendUsage(&Serial)
.
Der RawData-Typ ist jetzt 64-Bit für 32-Bit-Plattformen und daher kann decodedIRData.decodedRawData
vollständige Rahmeninformationen für mehr Protokolle enthalten als mit 32-Bit wie zuvor.
Rückruf nach Erhalt eines Befehls – Es ruft Ihren Code auf, sobald eine Nachricht empfangen wurde.
Verbesserte Handhabung der Protokolle PULSE_DISTANCE
+ PULSE_WIDTH
.
Neues FAST-Protokoll.
Automatischer Ausdruck der entsprechenden Sendefunktion mit printIRSendUsage()
.
Sie müssen #define DECODE_DISTANCE
durch #define DECODE_DISTANCE_WIDTH
ersetzen (nur wenn Sie diesen Decoder explizit aktiviert haben).
Der Parameter bool hasStopBit
wird nicht mehr benötigt und z. B. für die Funktion sendPulseDistanceWidth()
entfernt.
Zum Empfangen kann jeder Pin verwendet werden und wenn SEND_PWM_BY_TIMER
nicht definiert ist, auch zum Senden.
Feedback-LED kann zum Senden/Empfangen aktiviert werden.
Zur Dekodierung steht ein 8/16 Bit ** Befehlswert sowie eine 16 Bit Adresse und eine Protokollnummer zur Verfügung (anstelle des alten 32 Bit Werts).
Protokollwerte entsprechen den Protokollstandards .
NEC, Panasonic, Sony, Samsung und JVC dekodieren und senden zuerst LSB.
Unterstützt das Universal Distance-Protokoll , das viele bisher unbekannte Protokolle abdeckt.
Kompatibel mit der Tone() -Bibliothek. Sehen Sie sich das ReceiveDemo-Beispiel an.
Gleichzeitiges Senden und Empfangen. Siehe das SendAndReceive-Beispiel.
Unterstützt mehr Plattformen .
Ermöglicht die Erzeugung eines Nicht-PWM-Signals, um lediglich ein aktives niedriges Empfängersignal zu simulieren und eine direkte Verbindung zu vorhandenen Empfangsgeräten ohne Verwendung von IR herzustellen.
Einfache Protokollkonfiguration direkt in Ihrem Quellcode .
Reduziert den Speicherbedarf und verkürzt die Dekodierungszeit.
Enthält einen sehr kleinen Nur-NEC-Decoder, der keine Timer-Ressourcen benötigt .
-> Funktionsvergleich von 5 Arduino IR-Bibliotheken.
Ab der Version 3.1 erfolgt die Erzeugung von PWM zum Senden per Software , wodurch der Hardware-Timer eingespart und beliebige Ausgangspins zum Senden ermöglicht werden .
Wenn Sie einen (alten) Arduino-Kern verwenden, der zum Kompilieren nicht das Flag -flto
verwendet, können Sie die Zeile #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
in IRRemote.h aktivieren, wenn Sie beim Kompilieren falsche Fehlermeldungen bezüglich begin() erhalten.
IRreceiver- und IRsender- Objekte wurden hinzugefügt und können verwendet werden, ohne sie zu definieren, wie das bekannte Arduino Serial- Objekt.
Entfernen Sie einfach die Zeile IRrecv IrReceiver(IR_RECEIVE_PIN);
und/oder IRsend IrSender;
in Ihrem Programm und ersetzen Sie alle Vorkommen von IRrecv.
oder irrecv.
durch IrReceiver
und ersetzen Sie alle IRsend
oder irsend
durch IrSender
.
Da sich die dekodierten Werte jetzt in IrReceiver.decodedIRData
und nicht mehr in results
befinden, entfernen Sie die Zeile decode_results results
oder ähnliches.
Rufen Sie wie beim Serial-Objekt IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)
oder IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)
anstelle von IrReceiver.enableIRIn()
oder irrecv.enableIRIn()
in setup() auf.
Rufen Sie zum Senden IrSender.begin();
in setup().
Wenn IR_SEND_PIN nicht definiert ist (vor der Zeile #include <IRremote.hpp>
), müssen Sie z. B. IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
verwenden.
Die alte Funktion decode(decode_results *aResults)
wird durch die einfache Funktion decode()
ersetzt. Wenn Sie also eine Anweisung if(irrecv.decode(&results))
haben, ersetzen Sie diese durch if (IrReceiver.decode())
.
Das dekodierte Ergebnis befindet sich jetzt in IrReceiver.decodedIRData
und nicht mehr in results
. Ersetzen Sie daher alle Vorkommen von results.value
und results.decode_type
(und ähnlichem) durch IrReceiver.decodedIRData.decodedRawData
und IrReceiver.decodedIRData.protocol
.
Überlauf-, Wiederholungs- und andere Flags befinden sich jetzt in IrReceiver.receivedIRData.flags
.
Selten verwendet: results.rawbuf
und results.rawlen
müssen durch IrReceiver.decodedIRData.rawDataPtr->rawbuf
und IrReceiver.decodedIRData.rawDataPtr->rawlen
ersetzt werden.
Die 5 Protokolle NEC, Panasonic, Sony, Samsung und JVC wurden zunächst auf LSB umgestellt. Sendefunktionen zum Senden alter MSB-Daten wurden in sendNECMSB
, sendSamsungMSB()
, sendSonyMSB()
und sendJVCMSB()
umbenannt. Die alten MSB-Funktionen sendSAMSUNG()
und sendSony()
sind weiterhin verfügbar. Die alte MSB-Version der sendPanasonic()
Funktion wurde gelöscht, da sie Fehler aufwies, die niemand erkannte, und daher davon ausgegangen wurde, dass sie nie verwendet wurde.
Informationen zur Konvertierung von MSB-Codes in LSB finden Sie weiter unten.
#include <IRremote.h>#define RECV_PIN 2IRrecv irrecv(RECV_PIN); decode_results Ergebnisse;void setup() { ... Serial.begin(115200); // Serielle Kommunikation herstellen irrecv.enableIRIn(); // Den Empfänger starten}void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); ... irrecv.resume(); // Den nächsten Wert erhalten } ... }
#include <IRremote.hpp>#define IR_RECEIVE_PIN 2void setup() { ... Serial.begin(115200); // // Serielle Kommunikation herstellen IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Den Empfänger starten}void loop() { if (IrReceiver.decode()) { Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // „Alte“ Rohdaten ausgeben IrReceiver.printIRResultShort(&Serial); // Vollständige empfangene Daten in einer Zeile ausgeben IrReceiver.printIRSendUsage(&Serial); // Drucken Sie die zum Senden dieser Daten erforderliche Anweisung aus ... IrReceiver.resume(); // Empfang des nächsten Werts aktivieren } ... }
Für die neuen Decoder für NEC, Panasonic, Sony, Samsung und JVC ist das Ergebnis IrReceiver.decodedIRData.decodedRawData
nun LSB-first , wie die Definition dieser Protokolle vermuten lässt!
Um das eine in das andere umzuwandeln, müssen Sie die Byte-/Nibble-Positionen umkehren und dann alle Bitpositionen jedes Bytes/Nibbles umkehren oder es als eine Binärzeichenfolge schreiben und umkehren/spiegeln.
Beispiel: 0xCB 34 01 02
0x20 10 43 BC
nach Nibble-Reverse
0x40 80 2C D3
nach Bitumkehr jedes Nibbles
0->0 1->8 2->4 3->C 4->2 5->A 6->6 7->E 8->1 9->9 A->5 B->D C->3 D->B E->7 F->F
0xCB340102
ist binär 1100 1011 0011 0100 0000 0001 0000 0010
.
0x40802CD3
ist binär 0100 0000 1000 0000 0010 1100 1101 0011
.
Wenn Sie die erste Binärfolge rückwärts (von rechts nach links) lesen , erhalten Sie die zweite Folge. Sie können hierfür bitreverseOneByte()
oder bitreverse32Bit()
verwenden.
Das Senden alter MSB-Codes ohne Konvertierung kann mithilfe von sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
und sendJVCMSB()
erfolgen.
Wenn Sie unter Fehlern mit altem Tutorial-Code einschließlich IRremote.h
anstelle von IRremote.hpp
leiden, versuchen Sie einfach, ein Rollback auf Version 2.4.0 durchzuführen.
Höchstwahrscheinlich wird Ihr Code ausgeführt und Sie werden die neuen Funktionen nicht verpassen.
Erwägen Sie die Verwendung der Originalversion 2.4 aus dem Jahr 2017 oder der letzten abwärtskompatiblen Version 2.8 für Ihr Projekt.
Es kann ausreichend sein und funktioniert einwandfrei mit 32-Bit-IR-Codes.
Wenn dies nicht zu Ihrem Fall passt, können Sie sicher sein, dass 4.x zumindest versucht, abwärtskompatibel zu sein, sodass Ihre alten Beispiele weiterhin einwandfrei funktionieren sollten.
Es stehen nur folgende Decoder zur Verfügung:
NEC
Denon
Panasonic
JVC
LG
RC5
RC6
Samsung
Sony
Der Aufruf von irrecv.decode(&results)
verwendet die alten MSB-First-Decoder wie in 2.x und legt die 32-Bit-Codes in results.value
fest.
Keine Dekodierung in eine aussagekräftigere (konstantere) 8/16-Bit-Adresse und einen 8-Bit-Befehl.
Jede *.cpp-Datei wird separat durch einen Aufruf des Compilers ausschließlich für diese cpp-Datei kompiliert . Diese Aufrufe werden vom IDE/make-System verwaltet. In der Arduino IDE werden die Aufrufe ausgeführt, wenn Sie auf Verify oder Upload klicken.
Und jetzt ist unser Problem mit Arduino:
Wie lege ich Kompilierungsoptionen für alle *.cpp-Dateien fest, insbesondere für die verwendeten Bibliotheken?
IDEs wie Sloeber oder PlatformIO unterstützen dies, indem sie die Angabe einer Reihe von Optionen pro Projekt ermöglichen. Sie fügen diese Optionen bei jedem Compiler-Aufruf hinzu, z. B. -DTRACE
.
Aber Arduino fehlt diese Funktion. Die Problemumgehung besteht also nicht darin, alle Quellen separat zu kompilieren, sondern sie zu einer großen Quelldatei zu verketten, indem Sie sie in Ihre Quelle einbinden.
Dies geschieht zB durch #include "IRremote.hpp"
.
Aber warum nicht #include "IRremote.cpp"
?
Probieren Sie es aus und Sie werden jede Menge Fehler sehen, da jede Funktion der *.cpp-Datei jetzt zweimal kompiliert wird, erstens durch Kompilieren der riesigen Datei und zweitens durch separates Kompilieren der *.cpp-Datei, wie oben beschrieben.
Daher ist die Verwendung der Erweiterung cpp nicht mehr möglich. Eine Lösung besteht darin, hpp als Erweiterung zu verwenden, um zu zeigen, dass es sich um eine enthaltene *.cpp-Datei handelt.
Jede andere Erweiterung, z. B. cinclude, würde genügen, aber hpp scheint gesunder Menschenverstand zu sein.
Um Kompilierungsoptionen einfacher zu unterstützen, müssen Sie in Ihrem Hauptprogramm (auch bekannt als *.ino-Datei mit setup() und loop()) die Anweisung #include <IRremote.hpp>
anstelle von #include <IRremote.h>
verwenden.
In allen anderen Dateien müssen Sie Folgendes verwenden, um Linkerfehler multiple definitions
zu vermeiden :
#define USE_IRREMOTE_HPP_AS_PLAIN_INCLUDE#include <IRremote.hpp>
Stellen Sie sicher, dass alle Makros in Ihrem Hauptprogramm vor jedem #include <IRremote.hpp>
definiert sind.
Die folgenden Makros werden ansonsten definitiv mit Standardwerten überschrieben:
RAW_BUFFER_LENGTH
IR_SEND_PIN
SEND_PWM_BY_TIMER
Eine sehr ausführliche Einführung in IR-Fernbedienungen und die IRremote-Bibliothek von DroneBot Workshop.
Es gibt drei verschiedene Möglichkeiten, einen bestimmten IR-Code anzugeben.
Der Zeitpunkt der einzelnen Markierungen/Impulse und Abstände/Abstände zwischen den Impulsen wird in einer Liste oder einem Array angegeben. Dies ermöglicht die Angabe aller IR-Codes , erfordert jedoch viel Speicher und ist überhaupt nicht lesbar . Eine formale Definition eines solchen Timing-Arrays, einschließlich der Angabe von Häufigkeit und Wiederholungen, ist das Pronto -Format.
Durch die Verwendung einer niedrigeren Zeitauflösung kann Speicherplatz eingespart werden. Für IRremote können Sie eine Auflösung von 50 µs verwenden, was den Speicherbedarf halbiert, indem Byte-Werte anstelle von int16-Werten verwendet werden. Für Empfangszwecke können Sie den vom decodeHash()
Decoder bereitgestellten Hash des Timings verwenden.
Es gibt drei Hauptkodierungsschemata, die einen binären Bitstrom/Hex-Wert kodieren:
PULSE_DISTANCE
. Der Abstand zwischen den Impulsen bestimmt den Bitwert. Dies erfordert immer ein Stoppbit! Beispiele sind NEC- und KASEIKYO-Protokolle. Die Impulsbreite ist bei den meisten Protokollen konstant.
PULSE_WIDTH
. Die Breite eines Impulses bestimmt den Bitwert, der Impulsabstand ist konstant. Dies erfordert kein Stoppbit! Das einzige bekannte Beispiel ist das SONY-Protokoll.
Phasen-/Manchester-Kodierung. Die Zeit des Puls-/Pause-Übergangs (Phase) relativ zum Takt bestimmt den Bitwert. Beispiele sind RC5- und RC6-Protokolle.
Phasenkodierung hat eine konstante Bitlänge , PULSE_DISTANCE
mit konstanter Pulsbreite und PULSE_WIDTH
haben keine konstante Bitlänge !
Ein bekanntes Beispiel für PULSE_DISTANCE
mit nicht konstanter Impulsbreitenkodierung ist die serielle RS232-Kodierung . Hier wird die nicht konstante Pulsbreite genutzt, um eine konstante Bitlänge zu ermöglichen.
Die meisten IR-Signale verfügen über einen speziellen Header, der bei der Einstellung der automatischen Verstärkung der Empfängerschaltung hilft. Dieser Header ist nicht Teil der Kodierung, aber oft für ein spezielles Protokoll von Bedeutung und muss daher reproduzierbar sein.
Beachten Sie, dass es Codes gibt, die eine PULSE_DISTANCE
Codierung verwenden, bei der mehr als eine binäre 0/1 in eine Puls/Pause-Kombination eingefügt wird. Hierzu sind mehr als 2 unterschiedliche Puls- bzw. Pausenlängenkombinationen erforderlich. Das HobToHood-Protokoll verwendet eine solche Kodierung.
Durch die Verwendung von Codierungsschemata wird die Spezifikation eines IR-Codes auf einen Bitstrom-/Hex-Wert reduziert, der standardmäßig LSB ist, und auf Impuls-/Pause-Timings von Header, 0 und 1. Der Hex-Wert ist gut lesbar . Diese Schemata können diesem Bitstrom keine Semantik wie Adresse, Befehl oder Prüfsumme hinzufügen.
Es gibt einige gängige Protokolle, die direkt in IRremote implementiert sind. Sie geben die Häufigkeit, die Zeitpunkte von Header, 0 und 1 sowie andere Werte wie Prüfsumme, Wiederholungsabstand, Wiederholungscodierung, Bitumschaltung usw. an. Die Semantik des Hexadezimalwerts wird ebenfalls angegeben, sodass nur zwei Parameteradressen verwendet werden können und Befehl zur Angabe eines IR-Codes. Das spart Speicherplatz und ist gut lesbar . Oftmals ist auch die Adresse konstant, was den Speicherbedarf weiter reduziert.
Tutorial zum Adafruit IR-Sensor
In Ihrem Programm prüfen Sie, ob ein IR-Frame vollständig empfangen wurde mit:
if (IrReceiver.decode()) {}
Dadurch werden auch die empfangenen Daten dekodiert.
Nach erfolgreicher Dekodierung sind die IR-Daten in der IRData-Struktur enthalten, verfügbar als IrReceiver.decodedIRData
.
struct IRData { decode_type_t Protokoll; // UNBEKANNT, NEC, SONY, RC5, PULSE_DISTANCE, ... uint16_t Adresse; // Decodierte Adresse uint16_t command; // Dekodierter Befehl uint16_t extra; // Wird für die unbekannte Anbieter-ID von Kaseikyo verwendet. Ticks, die zur Dekodierung des Distanzprotokolls verwendet werden. uint16_t numberOfBits; // Anzahl der für Daten empfangenen Bits (Adresse + Befehl + Parität) – zur Bestimmung der Protokolllänge, wenn unterschiedliche Längen möglich sind. uint8_t Flags; // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW usw. Siehe IRDATA_FLAGS_*-Definitionen IRRawDataType decodedRawData; // Bis zu 32 (64 Bit für 32-Bit-CPU-Architekturen) Bit dekodierte Rohdaten, die für sendRaw-Funktionen verwendet werden. uint32_t decodedRawDataArray[RAW_DATA_ARRAY_SIZE]; // 32 Bit dekodierte Rohdaten, zur Verwendung für die Sendefunktion. irparams_struct *rawDataPtr; // Zeiger auf die rohen Timing-Daten, die dekodiert werden sollen. Hauptsächlich wird der Datenpuffer durch den Empfang von ISR gefüllt.};
Dies ist die Liste der im Flags-Feld enthaltenen Flags.
Überprüfen Sie es beispielsweise mit if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
.
Flaggenname | Beschreibung |
---|---|
IRDATA_FLAGS_IS_REPEAT | Die Lücke zwischen dem vorhergehenden Frame ist kleiner als die maximale Lücke, die für eine Wiederholung erwartet wird. !!!Wir prüfen nicht auf geänderte Befehle oder Adressen, da es fast nicht möglich ist, innerhalb von etwa 100 ms zwei verschiedene Tasten auf der Fernbedienung zu drücken!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | Der aktuelle Wiederholungsrahmen ist eine Wiederholung, die immer nach einem regulären Rahmen gesendet wird und nicht vermieden werden kann. Nur für die Protokolle DENON und LEGO spezifiziert. |
IRDATA_FLAGS_PARITY_FAILED | Der aktuelle Frame (Autorepeat) hat die Paritätsprüfung verletzt. |
IRDATA_FLAGS_TOGGLE_BIT | Wird gesetzt, wenn das Umschaltbit RC5 oder RC6 gesetzt ist. |
IRDATA_FLAGS_EXTRA_INFO | Es gibt zusätzliche Informationen, die nicht in der Adresse und den Daten enthalten sind (z. B. die unbekannte Anbieter-ID von Kaseikyo oder im decodedRawDataArray). |
IRDATA_FLAGS_WAS_OVERFLOW | Zu viele Markierungen und Leerzeichen für die angegebene RAW_BUFFER_LENGTH . Um eine endlose Meldung eines Überlaufs zu vermeiden, wird irparams.rawlen in diesem Fall auf 0 gesetzt. |
IRDATA_FLAGS_IS_MSB_FIRST | Dieser Wert wird hauptsächlich durch das (bekannte) Protokoll bestimmt. |
auto myRawdata= IrReceiver.decodedIRData.decodedRawData;
Die Definitionen für die IrReceiver.decodedIRData.flags
werden hier beschrieben.
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);`
Die Rohdaten hängen vom internen Zustand des Arduino-Timers im Verhältnis zum empfangenen Signal ab und können daher jedes Mal leicht unterschiedlich sein. (Auflösungsproblem). Die dekodierten Werte sind die interpretierten Werte, die solche geringfügigen Unterschiede tolerieren!
IrReceiver.printIRSendUsage(&Serial);
Das NEC-Protokoll ist als 8-Bit-Adresse und 8-Bit-Befehl definiert. Die physikalischen Adress- und Datenfelder sind jedoch jeweils 16 Bit breit. Die zusätzlichen 8 Bits werden zum Senden der invertierten Adresse oder des Befehls zur Paritätsprüfung verwendet.
Das erweiterte NEC-Protokoll verwendet die zusätzlichen 8 Paritätsbits der Adresse für eine 16-Bit-Adresse und deaktiviert somit die Paritätsprüfung für die Adresse.
Das ONKYO-Protokoll wiederum verwendet die zusätzlichen 8 Paritätsbits von Adresse und Befehl für eine 16-Bit-Adresse und einen Befehl.
Der Decoder reduziert die 16-Bit-Werte auf 8-Bit-Werte, wenn die Parität korrekt ist. Wenn die Parität nicht korrekt ist, wird davon ausgegangen, dass kein Paritätsfehler vorliegt, sondern die Werte als 16-Bit-Werte ohne Parität angenommen werden, wobei ein erweitertes NEC- oder erweitertes NEC-Protokollprotokoll vorausgesetzt wird.
Aber jetzt haben wir ein Problem, wenn wir zB die 16-Bit -Adresse 0x00FF oder 0x32CD erhalten wollen! Der Decoder interpretiert dies als NEC-8-Bit-Adresse 0x00 / 0x32 mit korrekter Parität von 0xFF / 0xCD und reduziert sie auf 0x00 / 0x32.
Eine Möglichkeit, damit umzugehen, besteht darin, die Bibliothek zu zwingen, immer die ONKYO-Protokollinterpretation zu verwenden, indem #define DECODE_ONKYO
verwendet wird. Eine andere Möglichkeit besteht darin, zu überprüfen, ob IrReceiver.decodedIRData.protocol
NEC und nicht ONKYO ist, und die Paritätsreduzierung manuell rückgängig zu machen.
Bei einem langen Tastendruck wiederholt das NEC-Protokoll seinen Frame nicht, sondern sendet einen speziellen kurzen Wiederholungsframe. Dies ermöglicht eine einfache Unterscheidung zwischen langem Drücken und wiederholtem Drücken und spart etwas Batterieenergie. Dieses Verhalten ist für NEC und seine abgeleiteten Protokolle wie LG und Samsung ziemlich einzigartig.
Aber natürlich gibt es auch Fernsteuerungssysteme, die das NEC-Protokoll verwenden, aber bei einem langen Tastendruck nur den ersten Frame wiederholen, anstatt den speziellen kurzen Wiederholungsframe zu senden. Wir haben dies das NEC2- Protokoll genannt und es wird mit sendNEC2()
gesendet.
Aber Vorsicht, das NEC2-Protokoll kann vom NEC-Bibliotheksdecoder erst nach dem ersten Frame und bei langem Drücken erkannt werden!
Bei einem langen Druck wiederholt das SamsungLG-Protokoll seinen Frame nicht, sondern sendet einen speziellen kurzen Wiederholungsframe.
RAW_BUFFER_LENGTH
bestimmt die Länge des Bytepuffers , in dem die empfangenen IR-Timing-Daten vor der Dekodierung gespeichert werden.
Für Standardprotokolle bis 48 Bit ist 100 ausreichend, wobei 1 Bit aus einem Zeichen und einem Leerzeichen besteht. Wir benötigen immer zusätzlich 4 Bytes, 1 Byte für die Anfangslücke, 2 Bytes für den Header und 1 Byte für das Stoppbit.
48- Bit-Protokolle sind PANASONIC, KASEIKYO, SAMSUNG48, RC6.
32- Bit-Protokolle wie NEC, SAMSUNG, WHYNTER, SONY(20), LG(28) erfordern eine Pufferlänge von 68 .
16- Bit-Protokolle wie BOSEWAVE, DENON, FAST, JVC, LEGO_PF, RC5, SONY (12 oder 15) erfordern eine Pufferlänge von 36 .
MAGIQUEST erfordert eine Pufferlänge von 112 .
Klimaanlagen senden häufig einen längeren Protokolldatenstrom mit bis zu 750 Bit .
Wenn die durch RECORD_GAP_MICROS
ermittelte Datensatzlücke von den standardmäßigen 8 ms auf mehr als 20 ms geändert wird, ist der Puffer kein Byte mehr, sondern ein uint16_t-Puffer, der doppelt so viel RAM benötigt.
Diese Bibliothek wurde so konzipiert, dass sie in MCUs mit relativ geringen Ressourcen passt und als Bibliothek zusammen mit anderen Anwendungen arbeiten soll, für deren Betrieb ebenfalls einige Ressourcen der MCU erforderlich sind.
Nutzen Sie das Beispiel „ReceiveDemo“, um alle Informationen zu Ihrem IR-Protokoll auszudrucken.
Das Beispiel „ReceiveDump“ liefert Ihnen mehr Informationen, weist jedoch aufgrund der zum Drucken der Informationen benötigten Zeit eine schlechte Wiederholungserkennung auf.
Wenn Ihr Protokoll von dieser Bibliothek nicht unterstützt wird, können Sie die IRMP-Bibliothek ausprobieren, die insbesondere Manchester-Protokolle viel besser unterstützt.
Für Klimaanlagen können Sie die IRremoteESP8266-Bibliothek ausprobieren, die eine beeindruckende Reihe von Protokollen und viele Klimaanlagen unterstützt und auch auf ESP32 funktioniert.
Raw-IR-decoder-for-Arduino ist keine Bibliothek, sondern eine Arduino-Beispielskizze, die viele Methoden zur Dekodierung, insbesondere von Klimaanlagenprotokollen , bereitstellt. Das Senden dieser Protokolle kann über die Arduino-Bibliothek HeatpumpIR erfolgen.
Wenn Sie so etwas bekommen:
PULSE_DISTANCE: HeaderMarkMicros=8900 HeaderSpaceMicros=4450 MarkMicros=550 OneSpaceMicros=1700 ZeroSpaceMicros=600 NumberOfBits=56 0x43D8613C 0x3BC3BC
Dann haben Sie einen Code bestehend aus 56 Bits , der wahrscheinlich von einer Klimaanlagen-Fernbedienung stammt.
Sie können es mit sendPulseDistanceWidth()
senden.
uint32_t tRawData[] = { 0xB02002, 0xA010 }; IrSender.sendPulseDistance(38, 3450, 1700, 450, 1250, 450, 400, &tRawData[0], 48, false, 0, 0);
Sie können es senden, indem Sie sendPulseDistanceWidthData()
zweimal aufrufen, einmal für die ersten 32 Bit und dann für die restlichen 24 Bit.
Der PULSE_DISTANCE
/ PULSE_WIDTH
Decoder dekodiert lediglich einen Timing-Stream in einen als Hex-Werte gespeicherten Bitstream. Diese Decoder können diesem Bitstrom keine Semantik wie Adresse, Befehl oder Prüfsumme hinzufügen. Aber der Bitstream ist viel besser lesbar als ein Timing-Stream. Dieser Bitstrom wird standardmäßig zuerst im LSB gelesen. Sollte LSB für weitere Untersuchungen nicht geeignet sein, können Sie es hier ändern.
Wenn der RAM nicht größer als 2 KB ist, akzeptiert der Decoder nur Markierungs- oder Leerzeichendauern bis zu 2500 Mikrosekunden, um RAM-Speicherplatz zu sparen, andernfalls akzeptiert er Dauern bis zu 10 ms.
Wenn Sie etwas wie Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
als Ausgabe z. B. des „ReceiveDemo“-Beispiels sehen, liegt entweder ein Problem mit der Dekodierung eines Protokolls vor oder es handelt sich um ein nicht unterstütztes Protokoll.
Wenn Sie eine ungerade Anzahl empfangener Bits haben, liegt wahrscheinlich ein Problem mit Ihrer Empfängerschaltung vor. Vielleicht weil das IR-Signal zu schwach ist.
Wenn Sie Timings wie + 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
sehen, dann wurde ein 450-µs-Raum in zwei 150- und 100-µs-Räume mit einem Spitzen-/Fehlersignal von 200 µs dazwischen aufgeteilt. Möglicherweise liegt es an einem defekten Empfänger oder einem schwachen Signal in Verbindung mit einer anderen Lichtquelle in der Nähe.
Wenn Sie Zeitangaben wie + 500,- 550 + 450,- 550 + 450,- 500 + 500,-1550
sehen, sind Markierungen im Allgemeinen kürzer als Leerzeichen und daher sollte MARK_EXCESS_MICROS
(in Ihrer Ino-Datei angegeben) negativ sein, um dies auszugleichen bei der Dekodierung.
Wenn Protocol=UNKNOWN Hash=0x0 1 bits received
angezeigt wird, kann es sein, dass das Leerzeichen nach der Anfangsmarkierung länger als RECORD_GAP_MICROS
ist. Dies wurde bei einigen LG-Klimaanlagenprotokollen beobachtet. Versuchen Sie es erneut mit einer Zeile, z. B. #define RECORD_GAP_MICROS 12000
, vor der Zeile #include <IRremote.hpp>
in Ihrer .ino-Datei.
Um weitere Informationen zu erhalten, die Sie dabei unterstützen, den Grund für Ihr UNBEKANNTES Protokoll zu finden, müssen Sie die Zeile //#define DEBUG
in IRremoteInt.h aktivieren.
Wenn Sie nicht wissen, welches Protokoll Ihr IR-Sender verwendet, haben Sie mehrere Möglichkeiten.
Verwenden Sie einfach den Hashwert, um zu entscheiden, welcher Befehl empfangen wurde. Siehe das SimpleReceiverForHashCodes-Beispiel.
Verwenden Sie das IRreceiveDemo-Beispiel oder das IRreceiveDump-Beispiel, um das IR-Timing auszugeben. Sie können dieses Timing dann mit dem SendRawDemo-Beispiel reproduzieren/senden.
Das IRMP AllProtocol-Beispiel druckt das Protokoll und die Daten für eines der 40 unterstützten Protokolle . Zum Senden dieser Codes kann dieselbe Bibliothek verwendet werden.
Wenn Sie ein größeres Arduino-Board zur Hand haben (> 100 kByte Programmspeicher), können Sie das IRremoteDecode-Beispiel der Arduino-Bibliothek DecodeIR ausprobieren.
Verwenden Sie IrScrutinizer. Durch den Export als „Arduino Raw“ kann automatisch eine Sendeskizze für Ihr Protokoll generiert werden. Es unterstützt IRremote, die alte IRLib und Infrarot4Arduino.
Wenn Sie ein Gerät zur Hand haben, das die IR-Codes erzeugen kann, mit denen Sie arbeiten möchten (auch bekannt als IR-Fernbedienung), empfiehlt es sich, die Codes mit dem Beispiel „ReceiveDemo“ zu empfangen, das Ihnen am seriellen Ausgang sagt, wie Sie sie senden sollen.
Protocol=LG Address=0x2 Command=0x3434 Raw-Data=0x23434E 28 bits MSB first Send with: IrSender.sendLG(0x2, 0x3434, <numberOfRepeats>);
Sie werden feststellen, dass die Adresse eine Konstante ist und die Befehle manchmal sinnvoll gruppiert sind.
Wenn Sie unsicher sind, wie viele Wiederholungen Sie zum Senden verwenden sollen, ist 3 ein guter Ausgangspunkt. Wenn dies funktioniert, können Sie anschließend niedrigere Werte überprüfen.
Wenn Sie DECODE_DISTANCE_WIDTH
aktiviert haben, unterscheidet sich der von printIRSendUsage()
gedruckte Code zwischen 8- und 32-Bit-Plattformen . Daher ist es am besten, das empfangende Programm auf derselben Plattform wie das sendende Programm auszuführen.
Alle Sendefunktionen unterstützen bei Bedarf das Senden von Wiederholungen . Wiederholungsrahmen werden in einem festen, durch das Protokoll festgelegten Zeitraum gesendet. zB 110 ms von Start zu Start für NEC.
Beachten Sie, dass es nach der letzten Sendemarkierung keine Verzögerung gibt . Wenn Sie das Senden von Wiederholungsrahmen selbst übernehmen, müssen Sie vor den Wiederholungsrahmen sinnvolle Verzögerungen einfügen, um eine korrekte Decodierung zu ermöglichen.
Das Senden alter MSB-Codes ohne Konvertierung kann mithilfe von sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
und sendJVCMSB()
erfolgen.
Die in der Flipper-IRDB-Datenbank gefundenen Codes lassen sich recht einfach konvertieren, da sie ebenfalls das Adress-/Befehlsschema verwenden.
Protokollabgleich ist NECext -> NECext (oder Onkyo), Samsung32 -> Samsung, SIRC20 -> Sony mit 20 Bit usw.
Die in der irdb-Datenbank gefundenen Codes spezifizieren ein Gerät , ein Untergerät und eine Funktion . In den meisten Fällen können Gerät und Untergerät als oberes und unteres Byte des Adressparameters verwendet werden, und die Funktion ist der Befehlsparameter für die neuen strukturierten Funktionen mit Adress-, Befehls- und Wiederholungszählerparametern wie z. B. IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
.
Eine genaue Zuordnung finden Sie in den IRP-Definitionsdateien für IR-Protokolle. „D“ und „S“ bezeichnen Gerät und Untergerät und „F“ bezeichnet die Funktion.
Als Sendepin kann jeder beliebige Pin gewählt werden, da das PWM-Signal standardmäßig per Software-Bitbanging erzeugt wird, da SEND_PWM_BY_TIMER
nicht aktiv ist.
Beim ESP32 wird LEDC-Kanal 0 zur Erzeugung der IR-PWM verwendet.
Wenn IR_SEND_PIN
angegeben wird (als C-Makro), reduziert es die Programmgröße und verbessert das Sende-Timing für AVR. Wenn Sie eine Variable verwenden möchten, um den Sende-Pin anzugeben, z. B. mit setSendPin(uint8_t aSendPinNumber)
, müssen Sie dieses IR_SEND_PIN
-Makro deaktivieren. Dann können Sie die Sende-PIN jederzeit ändern, bevor Sie einen IR-Frame senden. Siehe auch Kompilierungsoptionen/Makros für diese Bibliothek.
http://www.harctoolbox.org/IR-resources.html
Flipper IRDB-Datenbank
Flipper-Dekodierung | IR-Ferndekodierung |
---|---|
Samsung32 | Samsung |
NEC | NEC |
NECext | ONKYO |
<Startbit><VendorID:16><VendorID Parität:4><Genre1:4><Genre2:4><Befehl:10><ID:2><Parität:8><Stoppbit> und ID ist das MSB der Adresse. Adresse: 8A 02 20 00 Befehl: 56 03 00 00 -> IRremote: Adresse 0x6A8, sendPanasonic (für 02 20) und Befehl 0x35 | <Startbit><VendorID:16><VendorID-Parität:4><Adresse:12><Befehl:8><Parität von VendorID-Parität, Adresse und Befehl:8><Stoppbit> |
Für Anwendungen, die nur NEC, NEC-Varianten oder das FAST-Protokoll (siehe unten) erfordern, ist ein spezieller Empfänger/Sender enthalten, der eine sehr kleine Codegröße von 500 Bytes hat und KEINEN Timer erfordert .
Anstatt den Eingang alle 50 µs abzutasten, wie es bei IRremote der Fall ist, verwendet der TinyReceiver-Empfänger einen Pin-Change-Interrupt für die On-the-Fly-Dekodierung, was die Auswahl an Protokollen einschränkt.
Bei jeder Ebenenänderung werden die Ebene und die Zeit seit der letzten Änderung verwendet, um das Protokoll schrittweise zu dekodieren.
Mit diesem Funktionsprinzip können wir nicht auf eine Zeitüberschreitung warten und dann das Protokoll dekodieren, wie es IRremote tut.
Stattdessen müssen wir wissen, welches das letzte Bit (Ebenenwechsel) eines Protokolls ist, um die endgültige Dekodierung und den Aufruf der optionalen , vom Benutzer bereitgestellten Rückruffunktion handleTinyReceivedIRData()
durchzuführen.
Das heißt, wir müssen die Anzahl der Bits in einem Protokoll und damit das Protokoll (Familie) kennen .
Schauen Sie sich die TinyReceiver- und IRDispatcherDemo-Beispiele an.
Achten Sie darauf, TinyIRReceiver.hpp
oder TinyIRSender.hpp
anstelle von IRremote.hpp
einzuschließen.
//#define USE_ONKYO_PROTOCOL // Wie NEC, aber nehmen Sie die 16-Bit-Adresse und den Befehl jeweils als einen 16-Bit-Wert und nicht als 8-Bit-Normalwert und 8-Bit-invertierten Wert.//#define USE_FAST_PROTOCOL // FAST-Protokoll anstelle von NEC verwenden / ONKYO#include "TinyIRReceiver.hpp"void setup() { initPCIInterruptForTinyReceiver(); // Aktiviert die Interrupt-Generierung bei Änderung des IR-Eingangssignals}void loop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // Kein resume() erforderlich :-)}
#include "TinyIRSender.hpp"void setup() { sendNEC(3, 0, 11, 2); // Adresse 0 und Befehl 11 an Pin 3 mit 2 Wiederholungen senden.}void loop() {}
Ein weiterer kleiner Empfänger und Sender, der weitere Protokolle unterstützt, finden Sie hier.
Das FAST-Protokoll ist ein proprietäres modifiziertes JVC-Protokoll ohne Adresse, mit Parität und mit kürzerem Header . Es soll eine schnelle Reaktion auf das Ereignis ermöglichen, das den Protokollrahmen an eine andere Karte gesendet hat. FAST benötigt zum Senden 21 ms und wird im Abstand von 50 ms gesendet. Es verfügt über volle 8-Bit-Parität zur Fehlererkennung.
Bit-Timing ist wie bei JVC
Der Header ist kürzer, 3156 µs gegenüber 12500 µs
Keine Adresse und 16-Bit-Daten, interpretiert als 8-Bit-Befehl und 8-Bit-invertierter Befehl, was zu einer festen Protokolllänge von (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 Mikrosekunden oder 29 ms führt.
Wiederholungen werden als vollständige Frames gesendet, jedoch in einem Zeitraum von 50 ms / mit einem Abstand von 21 ms.
#define IR_SEND_PIN 3#include <IRremote.hpp>void setup() { sendFAST(11, 2); // Befehl 11 an Pin 3 mit 2 Wiederholungen senden.}void loop() {}
#define USE_FAST_PROTOCOL // FAST-Protokoll verwenden. Keine Adresse und 16-Bit-Daten, interpretiert als 8-Bit-Befehl und 8-Bit-invertierter Befehl#include "TinyIRSender.hpp"void setup() { sendFAST(3, 11, 2); // Befehl 11 an Pin 3 mit 2 Wiederholungen senden.}void loop() {}
Das FAST-Protokoll kann von IRremote und TinyIRReceiver empfangen werden.
Das Empfänger-Abtastintervall von 50 µs wird von einem Timer generiert. In vielen Boards muss dies ein Hardware -Timer sein. In einigen Boards, in denen ein Software -Timer verfügbar ist, wird der Software -Timer verwendet.
Beachten Sie, dass der für das Empfangen verwendete Hardware -Timer nicht für analogWrite()
verwendet werden sollte.
Insbesondere die Motorsteuerung verwendet häufig die Funktion analogWrite()
und stoppt daher das Empfang, wenn sie auf den hier angegebenen Stiften verwendet werden.
Auf der UNO und anderen AVR -Boards ist der Empfängertimer gleich wie der Ton -Timer. So wird das Empfangen nach einem Befehl tone()
aufhören. Siehe empfangenes Beispiel, wie man damit umgeht, dh wie man IrReceiver.restartTimer()
verwendet.
Das Flag IRDATA_FLAGS_WAS_OVERFLOW
ist festgelegt, wenn RAW_BUFFER_LENGTH
für alle Markierungen und Räume des Protokolls zu klein ist. Dies kann bei langen Protokollrahmen wie den von Klimaanlagen geschehen. Es kann auch passieren, wenn RECORD_GAP_MICROS
kleiner als die reale Lücke zwischen einem Rahmen und THR -Wiederholungsrahmen ist, wodurch beide als ein aufeinanderfolgender Rahmen interpretiert werden. Am besten ist es, das Timing zu entsorgen, um zu sehen, welcher Grund gilt.
Istremote funktioniert nicht richtig, wenn Sie Neopixel (auch bekannt als WS2811/WS2812/WS2812B) oder andere Bibliotheken verwenden, die Interrupts für eine längere Zeit blockieren (> 50 µs).
Unabhängig davon, ob Sie die Adafruit Neopixel LIB oder schnelllebige Interrupts verwenden, werden bei vielen CPUs im unteren Ende wie die Basis -Arduinos länger als 50 µs deaktiviert. Dies veraltet den IR -Interrupt -Handler wiederum daran, zu laufen, wenn er muss. Siehe auch dieses Video.
Eine Problemumgehung besteht darin, darauf zu warten, dass der IR -Empfänger im Leerlauf ist, bevor Sie die Neopixel -Daten mit if (IrReceiver.isIdle()) { strip.show();}
senden.
Dies verhindert, dass zumindest eine laufende IR -Übertragung verstößt und die Aktualisierungsrate des Neopixel -Kandidaten recht gut funktionieren.
Es gibt einige andere Lösungen für leistungsfähigere Prozessoren. Siehe diese Seite von Marc Merlin
Eine andere Bibliothek arbeitet nur dann, wenn Sie die Zeile IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
.
Dies ist häufig auf Timer -Ressourcenkonflikte mit der anderen Bibliothek zurückzuführen. Bitte sehen Sie unten.
Diese Bibliothek unterstützt nur einen IR -Empfänger und ein IR -Absenderobjekt (IRRECV und IRSend) pro CPU.
Da es jedoch eine serielle Aufgabe ist, können Sie setSendPin()
zum Senden des PINs umstellen und so mehrere Absender emulieren.
Der Empfänger verwendet eine spezielle Timer -ausgelöste Funktion, die den digitalen IR -Signalwert alle 50 µs von einem Pin liest.
Daher können mehrere IR -Empfänger nur verwendet werden, indem die Ausgangsstifte mehrerer IR -Empfänger miteinander verbunden werden. Die IR -Empfängermodule verwenden intern einen NPN -Transistor als Ausgangsgerät mit nur 30.000 Widerstand gegen VCC. Dies ist im Grunde genommen ein "offener Kollektor" und ermöglicht es, dass mehrere Ausgangsnadeln an einen Arduino -Eingangspin angeschlossen werden.
Beachten Sie jedoch, dass ein schwaches / gestörtes Signal eines der Empfänger auch ein gutes Signal eines anderen Empfängers beeinträchtigt.
Der beste Weg, um die IR -Leistung kostenlos zu erhöhen, besteht darin, 2 oder 3 IR -Dioden in Reihe zu verwenden. Eine Diode benötigt 1,2 Volt bei 20 mA oder 1,5 Volt bei 100 mA, sodass Sie bis zu 3 Dioden mit einem 5 -Volt -Ausgang liefern können.
Um 2 Dioden mit 1,2 V und 20 mA und einer 5 -V -Versorgung zu betreiben, stellen Sie den Widerstand auf: (5 V - 2,4 V) -> 2,6 V / 20 mA = 130 Ω .
Für 3 Dioden benötigt es 1,4 V / 20 mA = 70 Ω .
Der tatsächliche Strom kann seit dem Verlust am AVR -Pin niedriger sein. ZB 0,3 V bei 20 mA.
Wenn Sie nicht mehr Strom als 20 Ma benötigen, müssen Sie keinen externen Transistor verwenden (zumindest für AVR -Chips).
Auf meinen Arduino -Nanos verwende ich immer einen Resistor der 100 Ω -Serie und eine IR -LED?.
Für den Empfang beträgt die minimale CPU -Taktfrequenz 4 MHz , da der 50 µs Timer ISR (Interrupt -Service -Routine) auf einem 16 -MHz -ATMega etwa 12 µs dauert.
Der Tinyreceiver, der keine Umfrage erfordert, läuft mit 1 MHz.
Für das Senden hat die Standardsoftware PWM bei AVR mit 8 MHz Probleme . Die PWM -Frequenz beträgt etwa 30 anstelle von 38 kHz und RC6 ist nicht zuverlässig. Sie können zur Timer -PWM -Generation durch #define SEND_PWM_BY_TIMER
wechseln.
Der Bang & Olufsen -Protokoll -Decoder ist standardmäßig nicht aktiviert, dh, wenn kein Protokoll von #define DECODE_<XYZ>
explizit aktiviert wird. Es muss immer explizit von #define DECODE_BEO
aktiviert werden. Dies liegt daran, dass es eine IR -Übertragungsfrequenz von 455 kHz hat und daher eine andere Empfängerhardware (TSOP7000) erfordert.
Und da das Generieren eines 455 -kHz -PWM -Signals derzeit nur für SEND_PWM_BY_TIMER
implementiert ist , funktioniert das Senden SEND_PWM_BY_TIMER
oder USE_NO_SEND_PWM
definiert.
Weitere Informationen finden Sie in ir_bangolufsen.hpp.
Die Beispiele sind unter Datei> Beispiele> Beispiele aus benutzerdefinierten Bibliotheken / Istremote verfügbar.
Um die Beispiele an den 8K -Blitz von Attiny85 und Attiny88 anzupassen, ist für diese CPUs die Arduino Library Attinyserialout erforderlich.
Siehe auch DroneBot Workshop SimpleReceiver und Simplesender.
Die Beispiele für simpleReceiver und Simplesender sind ein guter Ausgangspunkt. Ein einfaches Beispiel kann online mit Wokwi getestet werden.
Die SimpleReCeiverForHashCodes verwenden nur den Hash -Decoder. Es wandelt alle IR -Rahmen länger als 6 in einen 32 -Bit -Hash -Code um und ermöglicht so den Empfang unbekannter Protokolle.
Siehe: http://www.righto.com/2010/01/using-fryrary-remotes-with-duduino.html
Wenn Codegröße oder Timer -Nutzung wichtig ist, sehen Sie sich diese Beispiele an.
Das Beispiel von Tinyreceiver verwendet die TinyirReciver -Bibliothek, die nur NEC, Extended NEC, Onkyo und schnelle Protokolle empfangen kann, aber keinen Timer benötigt . Sie verwenden Pin Change Interrupt für die Fliegendecodierung, was der Grund für die Auswahl des eingeschränkten Protokolls ist.
Tinyreceiver kann online mit Wokwi getestet werden.
Das Beispiel von Tinysender verwendet die Tinyirsender -Bibliothek, die nur NEC, Onkyo und schnelle Protokolle senden kann.
Es sendet NEC -Protokollcodes im Standardformat mit 8 -Bit -Adresse und 8 -Bit -Befehl wie im Beispiel von Simplesender. Es verfügt über Optionen, die Sie mit Extended NEC, Onkyo und Fast -Protokollen senden können. Speichert 780 Bytes -Programmspeicher und 26 Bytes -RAM im Vergleich zu Simplesender, was dieselbe tut, aber die Istremote -Bibliothek verwendet (und ist daher viel flexibler).
Wenn das Protokoll keine NEC- und Codegröße ist, sehen Sie sich dieses Beispiel an.
Empfangen erhält alle Protokolle und erzeugt mit der empfangenen Paket einen Piepton mit der Funktion arduino tone () .
Langes Drücken einer IR -Taste (Empfangen mehrerer Wiederholungen für einen Befehl) wird erkannt.
AllProtocolsonLCD zeigt zusätzlich das kurze Ergebnis auf einem 1602 LCD an . Das LCD kann parallel oder seriell (I2C) angeschlossen werden.
Durch das Verbinden von Debug -Pin mit Masse können Sie für jeden Frame den Druck der Rohwerte erzwingen. Die PIN -Nummer des Debug -Pin wird während des Setups gedruckt, da sie vom Typ Bord und LCD -Verbindung abhängt.
Dieses Beispiel dient auch als Beispiel, wie IRRemote und Tone () zusammen verwendet werden .
Empfängt alle Protokolle und entpackt das empfangene Signal in verschiedenen Geschmacksrichtungen, einschließlich Pronto -Format. Da der Druck viel Zeit dauert, können wiederholte Signale als unbekannt übersprungen oder interpretiert werden.
Sendet alle verfügbaren Protokolle mindestens einmal.
Demonstriert das Empfangen beim Senden .
Nehmen Sie auf und spielen Sie das letzte Empfang von IR -Signal beim Drücken der Taste auf . IR -Rahmen bekannter Protokolle werden vom entsprechenden Protokollcodierer gesendet. UNKNOWN
Protokollrahmen werden als Rohdaten gespeichert und mit sendRaw()
gesendet.
Versuchen Sie, jeden IR -Rahmen mit dem universellen Distanzdecodierer zu dekodieren, die Daten zu speichern und auf Taste zu senden. Drücken Sie mit sendPulseDistanceWidthFromArray()
.
Wenn RAM nicht mehr als 2K ist, akzeptiert der Decoder nur Mark- oder Space -Dauern bis zu 2500 Mikrosekunden, um den RAM -Speicherplatz zu sparen, andernfalls akzeptiert er Dauer von bis zu 10 ms.
Das Speichern von Daten für das Protokoll der Entfernungsbreite erfordert 17 Bytes. Das ReceiveAndsend -Beispiel erfordert 16 Bytes für bekannte Protokolldaten und 37 Bytes für Rohdaten des EGNEC -Protokolls.
Dient als IR Remote -Makro -Expander . Empfängt das Samsung32 -Protokoll und sendet beim Empfangen eines angegebenen Eingangsrahmens mehrere Samsung32 -Frames mit geeigneten Verzögerungen dazwischen. Dies dient als Netflix-Key-Emulation für meinen alten Samsung H5273-Fernseher.
Framework zum Aufrufen verschiedener Funktionen Ihres Programms für verschiedene IR -Codes.
Steuern Sie ein Relais (an einen Ausgangsstift angeschlossen) mit Ihrer Fernbedienung.
Beispiel für eine benutzerdefinierte Klasse, die selbst die IRRECV -Klasse von Istremote verwendet.
Beispiel zum Senden von LG -Klimaanlagen -IR -Codes, die durch serielle Eingabe gesteuert werden.
Durch die Verwendung der Funktion bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
können Sie die Klimaanlage durch jede andere Befehlsquelle steuern.
Die Datei ACLG.H enthält die Befehlsdokumentation des IR -Protokolls des LG -Klimaanlagens. Basierend auf der Reverse Engineering der LG AKB73315611 -Fernbedienung.
Die Ireceifertiminganalyse kann online mit Wokwi getestet werden, um auf den Empfänger zu klicken, während die Simulation ausgeführt wird, um einzelne IR -Codes anzugeben.
Beispiel zum Empfangen und Senden von AEG / Elektrolux HOB2HOOD -Protokoll.
In diesem Beispiel wird das von Ihrem IR -Empfängermodul gelieferte Signal analysiert. Werte können verwendet werden, um die Stabilität des empfangenen Signals sowie einen Hinweis zur Bestimmung des Protokolls zu bestimmen.
Es berechnet auch den Wert MARK_EXCESS_MICROS
, der die Erweiterung der vom IR -Empfängermodul eingeführten Marke (Pulse) ist.
Es kann online mit Wokwi getestet werden. Klicken Sie auf den Empfänger, während die Simulation ausgeführt wird, um einzelne NEC -IR -Codes anzugeben.
Empfangene + senddemo in einem Programm. Demonstriert das Empfangen beim Senden . Hier sehen Sie die Verzögerung des Empfängerausgangs (blau) aus der IR -Diodeneingabe (gelb).
Einfacher Empfänger
Einfacher Umschalten von IR Key 5
Tinyreceiver
Empfängerunganalyse
Empfänger mit LCD -Ausgangs- und Switch -Anweisung
Dieses Beispiel der Arduino PWMMotorControl -Bibliothek steuert die Grundfunktionen eines Roboterautos mithilfe der Istremote -Bibliothek.
Es steuert 2 PWM -Motorkanäle und 2 Motoren an jedem Kanal.
Hier finden Sie das anweisbare für die Automauigkeit und den Code.
IR_ROBOTCAR mit TL1838 IR -Empfänger, der an die Expansionsplatine angeschlossen ist.
Eröffnen Sie kein Problem, ohne zuerst einige der Beispiele zu testen!
Wenn Sie ein Problem haben, veröffentlichen Sie bitte den MCVE (minimal vollständig überprüfbares Beispiel), das dieses Problem zeigt. Meine Erfahrung ist, dass Sie das Problem in den meisten Fällen beim Erstellen dieses MCVE finden.
Codeblöcke verwenden; Es hilft uns, Ihnen zu helfen, wenn wir Ihren Code lesen können!
Um die Bibliothek an unterschiedliche Anforderungen anzupassen, stehen einige Kompilieroptionen / Makros zur Verfügung.
Diese Makros müssen in Ihrem Programm vor der Zeile #include <IRremote.hpp>
definiert werden, um wirksam zu werden.
Ändern Sie sie, indem Sie sie aktivieren / deaktivieren, oder ändern Sie gegebenenfalls die Werte.
Name | Standardwert | Beschreibung |
---|---|---|
RAW_BUFFER_LENGTH | 200 | Puffergröße des Roheingangs UINT16_T -Puffer. Muss gerade sein! Wenn es zu klein ist, wird das Überlaufflagge eingestellt. 100 reicht für regelmäßige Protokolle von bis zu 48 Bit aus, aber für die meisten Klimaanlagenprotokolle ist ein Wert von bis zu 750 erforderlich. Verwenden Sie das empfangene Beispiel, um den kleinsten Wert für Ihre Anforderungen zu finden. Ein Wert von 200 erfordert 200 Bytes -RAM. |
EXCLUDE_UNIVERSAL_PROTOCOLS | deaktiviert | Ausschließend den Universal -Decoder für Protokolle und Decodehash (Spezialdecoder für alle Protokolle) von decode() ausgeschlossen. Speichert bis zu 1000 Bytes -Programmspeicher. |
DECODE_<Protocol name> | alle | Auswahl einzelner Protokoll (en) zu dekodiert werden. Sie können mehrere Protokolle angeben. Siehe hier |
DECODE_STRICT_CHECKS | deaktiviert | Überprüfen Sie, ob zusätzliche Eigenschaften des Protokolltimings wie der Markierungslänge für ein Protokoll mit konstanter Markierung, wobei die Raumlänge den Bitwert bestimmt. Erfordert bis zu 194 zusätzliche Bytes des Programmspeichers. |
IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK | deaktiviert | Speichert bis zu 60 Bytes Programmspeicher und 2 Bytes RAM. |
MARK_EXCESS_MICROS | 20 | Mark_excess_micros wird vor der Dekodierung von allen Markierungen abzugs und zu allen Räumen hinzugefügt, um die Signalformung verschiedener IR -Empfängermodule auszugleichen. |
RECORD_GAP_MICROS | 5000 | Mindestlücke zwischen IR -Übertragungen, um das Ende eines Protokolls zu erkennen. Muss größer sein als jeder Raum eines Protokolls, z. B. der NEC -Headerraum von 4500 µs. Muss kleiner als jede Lücke zwischen einem Befehl und einer Wiederholung; z. B. die Rückübertragungslücke für Sony beträgt etwa 24 ms. Denken Sie daran, dass dies die Verzögerung zwischen dem Ende des empfangenen Befehls und dem Beginn der Dekodierung ist. |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | 50 wenn RAM <= 2k, sonst 200 | Ein Wert von 200 ermöglicht es, Mark- oder Raumdauer von bis zu 10 ms zu dekodieren. |
IR_INPUT_IS_ACTIVE_HIGH | deaktiviert | Aktivieren Sie es, wenn Sie einen HF -Empfänger verwenden, der ein aktives Hochausgangssignal hat. |
IR_SEND_PIN | deaktiviert | Wenn angegeben, verringert es die Programmgröße und verbessert das Send -Timing für AVR. Wenn Sie eine Variable verwenden möchten, um die PIN -PIN mit setSendPin(uint8_t aSendPinNumber) anzugeben, dürfen Sie dieses Makro in Ihrer Quelle nicht verwenden / deaktivieren. |
SEND_PWM_BY_TIMER | deaktiviert | Deaktivieren Sie die PWM -Generation der Carrier in Software und verwenden Sie Hardware PWM (nach Timer). Hat den Vorteil einer genaueren PWM -Generation, insbesondere des Dienstes Cyc
Expandieren
Zusätzliche Informationen
Ähnliche Anwendungen
Empfohlen für Sie
Ähnliche Nachrichten
Alle
|