Installieren Sie die IRremote-Bibliotheksdatei.
Öffnen Sie das IRrecord-Beispiel. Der
Schaltplan sieht wie folgt aus:
Sie können den erfolgreich dekodierten Infrarotcode im Überwachungsfenster des seriellen Anschlusses sehen
und Sie können die Ausgabe des Infrarotcodes über den Schalter steuern
Code-Anhang:
/*
* IRrecord: minimal IR-Signale aufzeichnen und wiedergeben
* Am Eingang RECV_PIN muss ein IR-Detektor/Demodulator angeschlossen werden.
* Eine IR-LED muss an den Ausgang PWM Pin 3 angeschlossen werden.
* Eine Taste muss an den Eingang BUTTON_PIN angeschlossen werden; dies ist der
*-Senden-Button.
* Eine sichtbare LED kann mit STATUS_PIN verbunden werden, um den Status anzuzeigen.
*
* Die Logik ist:
* Wenn die Taste gedrückt wird, senden Sie den IR-Code.
* Wenn ein IR-Code empfangen wird, zeichnen Sie ihn auf.
*
* Version 0.11 September 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
#include <IRremote.h>
int RECV_PIN = 11;
int BUTTON_PIN = 12;
int STATUS_PIN = 13;
IRrecv irrev(RECV_PIN);
IRsend irsend;
decode_results-Ergebnisse;
void setup ()
{ Serial.begin (9600); irrecv.enableIRIn(); // Empfänger starten pinMode (BUTTON_PIN, INPUT); PinMode (STATUS_PIN, AUSGANG); }
// Speicher für den aufgezeichneten Code
int codeType = -1; // Der Typ des Codes
unsigned long codeValue; // Der Codewert, wenn nicht roh
unsigned int rawCodes[RAWBUF]; // Die Dauer if raw
int codeLen; // Die Länge des Codes
int toggle = 0; // Der RC5/6 Umschaltzustand
// Speichert den Code für die spätere Wiedergabe
// Der größte Teil dieses Codes protokolliert nur
void storeCode(decode_results *results) { codeType = results->decode_type; int count = Ergebnisse->rawlen; if (codeType == UNKNOWN) { Serial.println ("Unbekannter Code empfangen, als Rohdaten speichern"); codeLen = Ergebnisse->rawlen - 1; // So speichern Sie Rohcodes: // Ersten Wert (Lücke) löschen // Konvertieren von Ticks in Mikrosekunden // Passen Sie die Markierungen kürzer und die Leerzeichen länger an, um die Verzerrung des IR-Empfängers auszugleichen für (int i = 1; i <= codeLen; i++ ) { if (i % 2) { // Markiere rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
Serial.print ("m");
}
else { // Space rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS; Serial.print("s"); } Serial.print (rawCodes [i - 1], DEC); } Serial.println (""); } Else { If (codeType == NEC) { Serial.print ("Received NEC:"); if (results->value == REPEAT) { // Keinen NEC-Wiederholungswert aufzeichnen, da dies nutzlos ist. Serial.println ("wiederholen; ignorieren."); zurückkehren; } } else if (codeType == SONY) {
Serial.print ("Empfangen SONY: ");
}
Else if (codeType == PANASONIC) { Serial.print ( "PANASONIC erhalten: "); } Else if (codeType == JVC) { Serial.print ("Received JVC:"); } Else if (codeType == RC5) { Serial.print ("Received RC5:"); } Else if (codeType == RC6) { Serial.print ("Received RC6:"); } Else { Serial.print ("Unerwarteter Codetyp"); Serial.print (codeType, DEC); Serial.println (""); } Serial.println (Ergebnisse -> Wert, HEX);
codeLen = Ergebnisse -> Bits;
}
}
void sendCode (int repeat) { if (codeType == NEC) { if (repeat) { irsend.sendNEC (REPEAT, codeLen); Serial.println ("Gesendete NEC-Wiederholung"); } sonst { irsend.sendNEC (codeValue, codeLen); Serial.print ("Gesendet NEC"); Serial.println (codeValue, HEX); } } Else if (codeType == SONY) { irsend.sendSony (codeValue, codeLen); Serial.print ("Gesendet Sony"); Serial.println (codeValue, HEX); } Else if (codeType == PANASONIC) { irsend.sendPanasonic (codeValue, codeLen); Serial.print ("Gesendet Panasonic");
Serial.println (codeValue, HEX);
}
Else if (codeType == JVC) { irsend.sendJVC (codeValue, codeLen, false); Serial.print ("JVC gesendet"); Serial.println (codeValue, HEX); } Else if (codeType == RC5 || codeType == RC6) { if (!repeat) { // Drehe das Toggle-Bit für eine neue Schaltfläche um press toggle = 1 - toggle; } // Setzen Sie das Toggle-Bit in den zu sendenden Code codeValue = codeValue & ~(1 << (codeLen - 1)); CodeWert = CodeWert | (umschalten << (codeLen - 1)); If (codeType == RC5) { Serial.print ("Sent RC5"); Serial.println (codeValue, HEX);
irsend.sendRC5 (codeValue, codeLen);
}
sonst { irsend.sendRC6 (codeValue, codeLen); Serial.print ("RC6 gesendet"); Serial.println (codeValue, HEX); } } else if (codeType == UNKNOWN /* dh raw */) { // 38 KHz annehmen irsend.sendRaw (rawCodes, codeLen, 38); Serial.println ("Roh gesendet"); } }
int lastButtonState;
void loop() { // Wenn die Taste gedrückt wird, senden Sie den Code. int buttonState = digitalRead (BUTTON_PIN); If (lastButtonState == HIGH && buttonState == LOW) { Serial.println ("Freigegeben"); irrecv.enableIRIn(); // Empfänger wieder aktivieren }
If (buttonState) { Serial.println ( "Gedrückt, Senden"); digitalWrite (STATUS_PIN, HOCH); sendCode (lastButtonState == buttonState); digitalWrite (STATUS_PIN, NIEDRIG); Verzögerung (50); // Warten Sie ein bisschen zwischen den Neuübertragungen aufrechtzuerhalten . Sonst, wenn (irrecv.decode (& Ergebnisse)) { digitalWrite (STATUS_PIN, HIGH); storeCode(&results); irrecv.resume(); // Empfänger wieder aufnehmen digitalWrite (STATUS_PIN, LOW); } lastButtonState = buttonState; }