mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2026-01-04 20:42:49 +00:00
Initial commit from Irremote.zip
This commit is contained in:
174
examples/IRrecord/IRrecord.pde
Normal file
174
examples/IRrecord/IRrecord.pde
Normal file
@@ -0,0 +1,174 @@
|
||||
/*
|
||||
* IRrecord: record and play back IR signals as a minimal
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* An IR LED must be connected to the output PWM pin 3.
|
||||
* A button must be connected to the input BUTTON_PIN; this is the
|
||||
* send button.
|
||||
* A visible LED can be connected to STATUS_PIN to provide status.
|
||||
*
|
||||
* The logic is:
|
||||
* If the button is pressed, send the IR code.
|
||||
* If an IR code is received, record it.
|
||||
*
|
||||
* 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 irrecv(RECV_PIN);
|
||||
IRsend irsend;
|
||||
|
||||
decode_results results;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
pinMode(BUTTON_PIN, INPUT);
|
||||
pinMode(STATUS_PIN, OUTPUT);
|
||||
}
|
||||
|
||||
// Storage for the recorded code
|
||||
int codeType = -1; // The type of code
|
||||
unsigned long codeValue; // The code value if not raw
|
||||
unsigned int rawCodes[RAWBUF]; // The durations if raw
|
||||
int codeLen; // The length of the code
|
||||
int toggle = 0; // The RC5/6 toggle state
|
||||
|
||||
// Stores the code for later playback
|
||||
// Most of this code is just logging
|
||||
void storeCode(decode_results *results) {
|
||||
codeType = results->decode_type;
|
||||
int count = results->rawlen;
|
||||
if (codeType == UNKNOWN) {
|
||||
Serial.println("Received unknown code, saving as raw");
|
||||
codeLen = results->rawlen - 1;
|
||||
// To store raw codes:
|
||||
// Drop first value (gap)
|
||||
// Convert from ticks to microseconds
|
||||
// Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
|
||||
for (int i = 1; i <= codeLen; i++) {
|
||||
if (i % 2) {
|
||||
// Mark
|
||||
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) {
|
||||
// Don't record a NEC repeat value as that's useless.
|
||||
Serial.println("repeat; ignoring.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (codeType == SONY) {
|
||||
Serial.print("Received SONY: ");
|
||||
}
|
||||
else if (codeType == RC5) {
|
||||
Serial.print("Received RC5: ");
|
||||
}
|
||||
else if (codeType == RC6) {
|
||||
Serial.print("Received RC6: ");
|
||||
}
|
||||
else {
|
||||
Serial.print("Unexpected codeType ");
|
||||
Serial.print(codeType, DEC);
|
||||
Serial.println("");
|
||||
}
|
||||
Serial.println(results->value, HEX);
|
||||
codeValue = results->value;
|
||||
codeLen = results->bits;
|
||||
}
|
||||
}
|
||||
|
||||
void sendCode(int repeat) {
|
||||
if (codeType == NEC) {
|
||||
if (repeat) {
|
||||
irsend.sendNEC(REPEAT, codeLen);
|
||||
Serial.println("Sent NEC repeat");
|
||||
}
|
||||
else {
|
||||
irsend.sendNEC(codeValue, codeLen);
|
||||
Serial.print("Sent NEC ");
|
||||
Serial.println(codeValue, HEX);
|
||||
}
|
||||
}
|
||||
else if (codeType == SONY) {
|
||||
irsend.sendSony(codeValue, codeLen);
|
||||
Serial.print("Sent Sony ");
|
||||
Serial.println(codeValue, HEX);
|
||||
}
|
||||
else if (codeType == RC5 || codeType == RC6) {
|
||||
if (!repeat) {
|
||||
// Flip the toggle bit for a new button press
|
||||
toggle = 1 - toggle;
|
||||
}
|
||||
// Put the toggle bit into the code to send
|
||||
codeValue = codeValue & ~(1 << (codeLen - 1));
|
||||
codeValue = codeValue | (toggle << (codeLen - 1));
|
||||
if (codeType == RC5) {
|
||||
Serial.print("Sent RC5 ");
|
||||
Serial.println(codeValue, HEX);
|
||||
irsend.sendRC5(codeValue, codeLen);
|
||||
}
|
||||
else {
|
||||
irsend.sendRC6(codeValue, codeLen);
|
||||
Serial.print("Sent RC6 ");
|
||||
Serial.println(codeValue, HEX);
|
||||
}
|
||||
}
|
||||
else if (codeType == UNKNOWN /* i.e. raw */) {
|
||||
// Assume 38 KHz
|
||||
irsend.sendRaw(rawCodes, codeLen, 38);
|
||||
Serial.println("Sent raw");
|
||||
}
|
||||
}
|
||||
|
||||
int lastButtonState;
|
||||
|
||||
void loop() {
|
||||
// If button pressed, send the code.
|
||||
int buttonState = digitalRead(BUTTON_PIN);
|
||||
if (lastButtonState == HIGH && buttonState == LOW) {
|
||||
Serial.println("Released");
|
||||
irrecv.enableIRIn(); // Re-enable receiver
|
||||
}
|
||||
|
||||
if (buttonState) {
|
||||
Serial.println("Pressed, sending");
|
||||
digitalWrite(STATUS_PIN, HIGH);
|
||||
sendCode(lastButtonState == buttonState);
|
||||
digitalWrite(STATUS_PIN, LOW);
|
||||
delay(50); // Wait a bit between retransmissions
|
||||
}
|
||||
else if (irrecv.decode(&results)) {
|
||||
digitalWrite(STATUS_PIN, HIGH);
|
||||
storeCode(&results);
|
||||
irrecv.resume(); // resume receiver
|
||||
digitalWrite(STATUS_PIN, LOW);
|
||||
}
|
||||
lastButtonState = buttonState;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
28
examples/IRrecvDemo/IRrecvDemo.pde
Normal file
28
examples/IRrecvDemo/IRrecvDemo.pde
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* Version 0.1 July, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
|
||||
int RECV_PIN = 11;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
|
||||
decode_results results;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (irrecv.decode(&results)) {
|
||||
Serial.println(results.value, HEX);
|
||||
irrecv.resume(); // Receive the next value
|
||||
}
|
||||
}
|
||||
74
examples/IRrecvDump/IRrecvDump.pde
Normal file
74
examples/IRrecvDump/IRrecvDump.pde
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* Version 0.1 July, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
|
||||
int RECV_PIN = 11;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
|
||||
decode_results results;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
}
|
||||
|
||||
// Dumps out the decode_results structure.
|
||||
// Call this after IRrecv::decode()
|
||||
// void * to work around compiler issue
|
||||
//void dump(void *v) {
|
||||
// decode_results *results = (decode_results *)v
|
||||
void dump(decode_results *results) {
|
||||
int count = results->rawlen;
|
||||
if (results->decode_type == UNKNOWN) {
|
||||
Serial.println("Could not decode message");
|
||||
}
|
||||
else {
|
||||
if (results->decode_type == NEC) {
|
||||
Serial.print("Decoded NEC: ");
|
||||
}
|
||||
else if (results->decode_type == SONY) {
|
||||
Serial.print("Decoded SONY: ");
|
||||
}
|
||||
else if (results->decode_type == RC5) {
|
||||
Serial.print("Decoded RC5: ");
|
||||
}
|
||||
else if (results->decode_type == RC6) {
|
||||
Serial.print("Decoded RC6: ");
|
||||
}
|
||||
Serial.print(results->value, HEX);
|
||||
Serial.print(" (");
|
||||
Serial.print(results->bits, DEC);
|
||||
Serial.println(" bits)");
|
||||
}
|
||||
Serial.print("Raw (");
|
||||
Serial.print(count, DEC);
|
||||
Serial.print("): ");
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if ((i % 2) == 1) {
|
||||
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
else {
|
||||
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
if (irrecv.decode(&results)) {
|
||||
Serial.println(results.value, HEX);
|
||||
dump(&results);
|
||||
irrecv.resume(); // Receive the next value
|
||||
}
|
||||
}
|
||||
85
examples/IRrelay/IRrelay.pde
Normal file
85
examples/IRrelay/IRrelay.pde
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* Version 0.1 July, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
|
||||
int RECV_PIN = 11;
|
||||
int RELAY_PIN = 4;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
decode_results results;
|
||||
|
||||
// Dumps out the decode_results structure.
|
||||
// Call this after IRrecv::decode()
|
||||
// void * to work around compiler issue
|
||||
//void dump(void *v) {
|
||||
// decode_results *results = (decode_results *)v
|
||||
void dump(decode_results *results) {
|
||||
int count = results->rawlen;
|
||||
if (results->decode_type == UNKNOWN) {
|
||||
Serial.println("Could not decode message");
|
||||
}
|
||||
else {
|
||||
if (results->decode_type == NEC) {
|
||||
Serial.print("Decoded NEC: ");
|
||||
}
|
||||
else if (results->decode_type == SONY) {
|
||||
Serial.print("Decoded SONY: ");
|
||||
}
|
||||
else if (results->decode_type == RC5) {
|
||||
Serial.print("Decoded RC5: ");
|
||||
}
|
||||
else if (results->decode_type == RC6) {
|
||||
Serial.print("Decoded RC6: ");
|
||||
}
|
||||
Serial.print(results->value, HEX);
|
||||
Serial.print(" (");
|
||||
Serial.print(results->bits, DEC);
|
||||
Serial.println(" bits)");
|
||||
}
|
||||
Serial.print("Raw (");
|
||||
Serial.print(count, DEC);
|
||||
Serial.print("): ");
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if ((i % 2) == 1) {
|
||||
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
else {
|
||||
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
pinMode(RELAY_PIN, OUTPUT);
|
||||
pinMode(13, OUTPUT);
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
}
|
||||
|
||||
int on = 0;
|
||||
unsigned long last = millis();
|
||||
|
||||
void loop() {
|
||||
if (irrecv.decode(&results)) {
|
||||
// If it's been at least 1/4 second since the last
|
||||
// IR received, toggle the relay
|
||||
if (millis() - last > 250) {
|
||||
on = !on;
|
||||
digitalWrite(RELAY_PIN, on ? HIGH : LOW);
|
||||
digitalWrite(13, on ? HIGH : LOW);
|
||||
dump(&results);
|
||||
}
|
||||
last = millis();
|
||||
irrecv.resume(); // Receive the next value
|
||||
}
|
||||
}
|
||||
26
examples/IRsendDemo/IRsendDemo.pde
Normal file
26
examples/IRsendDemo/IRsendDemo.pde
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
|
||||
* An IR LED must be connected to Arduino PWM pin 3.
|
||||
* Version 0.1 July, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
|
||||
IRsend irsend;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (Serial.read() != -1) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
irsend.sendSony(0xa90, 12); // Sony TV power code
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
190
examples/IRtest/IRtest.pde
Normal file
190
examples/IRtest/IRtest.pde
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* IRremote: IRtest unittest
|
||||
* Version 0.1 July, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*
|
||||
* Note: to run these tests, edit IRremote/IRremote.h to add "#define TEST"
|
||||
* You must then recompile the library by removing IRremote.o and restarting
|
||||
* the arduino IDE.
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
#include <IRremoteInt.h>
|
||||
|
||||
// Dumps out the decode_results structure.
|
||||
// Call this after IRrecv::decode()
|
||||
// void * to work around compiler issue
|
||||
//void dump(void *v) {
|
||||
// decode_results *results = (decode_results *)v
|
||||
void dump(decode_results *results) {
|
||||
int count = results->rawlen;
|
||||
if (results->decode_type == UNKNOWN) {
|
||||
Serial.println("Could not decode message");
|
||||
}
|
||||
else {
|
||||
if (results->decode_type == NEC) {
|
||||
Serial.print("Decoded NEC: ");
|
||||
}
|
||||
else if (results->decode_type == SONY) {
|
||||
Serial.print("Decoded SONY: ");
|
||||
}
|
||||
else if (results->decode_type == RC5) {
|
||||
Serial.print("Decoded RC5: ");
|
||||
}
|
||||
else if (results->decode_type == RC6) {
|
||||
Serial.print("Decoded RC6: ");
|
||||
}
|
||||
Serial.print(results->value, HEX);
|
||||
Serial.print(" (");
|
||||
Serial.print(results->bits, DEC);
|
||||
Serial.println(" bits)");
|
||||
}
|
||||
Serial.print("Raw (");
|
||||
Serial.print(count, DEC);
|
||||
Serial.print("): ");
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if ((i % 2) == 1) {
|
||||
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
else {
|
||||
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
IRrecv irrecv(0);
|
||||
decode_results results;
|
||||
|
||||
class IRsendDummy :
|
||||
public IRsend
|
||||
{
|
||||
public:
|
||||
// For testing, just log the marks/spaces
|
||||
#define SENDLOG_LEN 128
|
||||
int sendlog[SENDLOG_LEN];
|
||||
int sendlogcnt;
|
||||
IRsendDummy() :
|
||||
IRsend() {
|
||||
}
|
||||
void reset() {
|
||||
sendlogcnt = 0;
|
||||
}
|
||||
void mark(int time) {
|
||||
sendlog[sendlogcnt] = time;
|
||||
if (sendlogcnt < SENDLOG_LEN) sendlogcnt++;
|
||||
}
|
||||
void space(int time) {
|
||||
sendlog[sendlogcnt] = -time;
|
||||
if (sendlogcnt < SENDLOG_LEN) sendlogcnt++;
|
||||
}
|
||||
// Copies the dummy buf into the interrupt buf
|
||||
void useDummyBuf() {
|
||||
int last = SPACE;
|
||||
irparams.rcvstate = STATE_STOP;
|
||||
irparams.rawlen = 1; // Skip the gap
|
||||
for (int i = 0 ; i < sendlogcnt; i++) {
|
||||
if (sendlog[i] < 0) {
|
||||
if (last == MARK) {
|
||||
// New space
|
||||
irparams.rawbuf[irparams.rawlen++] = (-sendlog[i] - MARK_EXCESS) / USECPERTICK;
|
||||
last = SPACE;
|
||||
}
|
||||
else {
|
||||
// More space
|
||||
irparams.rawbuf[irparams.rawlen - 1] += -sendlog[i] / USECPERTICK;
|
||||
}
|
||||
}
|
||||
else if (sendlog[i] > 0) {
|
||||
if (last == SPACE) {
|
||||
// New mark
|
||||
irparams.rawbuf[irparams.rawlen++] = (sendlog[i] + MARK_EXCESS) / USECPERTICK;
|
||||
last = MARK;
|
||||
}
|
||||
else {
|
||||
// More mark
|
||||
irparams.rawbuf[irparams.rawlen - 1] += sendlog[i] / USECPERTICK;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (irparams.rawlen % 2) {
|
||||
irparams.rawlen--; // Remove trailing space
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
IRsendDummy irsenddummy;
|
||||
|
||||
void verify(unsigned long val, int bits, int type) {
|
||||
irsenddummy.useDummyBuf();
|
||||
irrecv.decode(&results);
|
||||
Serial.print("Testing ");
|
||||
Serial.print(val, HEX);
|
||||
if (results.value == val && results.bits == bits && results.decode_type == type) {
|
||||
Serial.println(": OK");
|
||||
}
|
||||
else {
|
||||
Serial.println(": Error");
|
||||
dump(&results);
|
||||
}
|
||||
}
|
||||
|
||||
void testNEC(unsigned long val, int bits) {
|
||||
irsenddummy.reset();
|
||||
irsenddummy.sendNEC(val, bits);
|
||||
verify(val, bits, NEC);
|
||||
}
|
||||
void testSony(unsigned long val, int bits) {
|
||||
irsenddummy.reset();
|
||||
irsenddummy.sendSony(val, bits);
|
||||
verify(val, bits, SONY);
|
||||
}
|
||||
void testRC5(unsigned long val, int bits) {
|
||||
irsenddummy.reset();
|
||||
irsenddummy.sendRC5(val, bits);
|
||||
verify(val, bits, RC5);
|
||||
}
|
||||
void testRC6(unsigned long val, int bits) {
|
||||
irsenddummy.reset();
|
||||
irsenddummy.sendRC6(val, bits);
|
||||
verify(val, bits, RC6);
|
||||
}
|
||||
|
||||
void test() {
|
||||
Serial.println("NEC tests");
|
||||
testNEC(0x00000000, 32);
|
||||
testNEC(0xffffffff, 32);
|
||||
testNEC(0xaaaaaaaa, 32);
|
||||
testNEC(0x55555555, 32);
|
||||
testNEC(0x12345678, 32);
|
||||
Serial.println("Sony tests");
|
||||
testSony(0xfff, 12);
|
||||
testSony(0x000, 12);
|
||||
testSony(0xaaa, 12);
|
||||
testSony(0x555, 12);
|
||||
testSony(0x123, 12);
|
||||
Serial.println("RC5 tests");
|
||||
testRC5(0xfff, 12);
|
||||
testRC5(0x000, 12);
|
||||
testRC5(0xaaa, 12);
|
||||
testRC5(0x555, 12);
|
||||
testRC5(0x123, 12);
|
||||
Serial.println("RC6 tests");
|
||||
testRC6(0xfffff, 20);
|
||||
testRC6(0x00000, 20);
|
||||
testRC6(0xaaaaa, 20);
|
||||
testRC6(0x55555, 20);
|
||||
testRC6(0x12345, 20);
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
test();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
Reference in New Issue
Block a user