mirror of
https://github.com/donl/IR-Commander.git
synced 2026-05-27 06:15:11 -06:00
Working version for Apple remotes
This commit is contained in:
commit
d2adc93cc4
2 changed files with 291 additions and 0 deletions
123
ircodes.h
Normal file
123
ircodes.h
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
/******************* our codes ************/
|
||||
|
||||
int ApplePlaySignal[] = {
|
||||
// ON, OFF (in 10's of microseconds)
|
||||
912, 438,
|
||||
68, 48,
|
||||
68, 158,
|
||||
68, 158,
|
||||
68, 158,
|
||||
68, 48,
|
||||
68, 158,
|
||||
68, 158,
|
||||
68, 158,
|
||||
70, 156,
|
||||
70, 158,
|
||||
68, 158,
|
||||
68, 48,
|
||||
68, 46,
|
||||
70, 46,
|
||||
68, 46,
|
||||
68, 160,
|
||||
68, 158,
|
||||
70, 46,
|
||||
68, 158,
|
||||
68, 46,
|
||||
70, 46,
|
||||
68, 48,
|
||||
68, 46,
|
||||
68, 48,
|
||||
66, 48,
|
||||
68, 48,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 160,
|
||||
66, 50,
|
||||
64, 160,
|
||||
66, 50,
|
||||
66, 3950,
|
||||
908, 214,
|
||||
66, 3012,
|
||||
908, 212,
|
||||
68, 0};
|
||||
|
||||
int AppleForwardSignal[] = {
|
||||
// ON, OFF (in 10's of microseconds)
|
||||
908, 444,
|
||||
64, 50,
|
||||
66, 162,
|
||||
64, 162,
|
||||
64, 162,
|
||||
64, 52,
|
||||
64, 162,
|
||||
64, 162,
|
||||
64, 162,
|
||||
64, 164,
|
||||
62, 164,
|
||||
64, 162,
|
||||
64, 52,
|
||||
62, 52,
|
||||
64, 52,
|
||||
64, 50,
|
||||
64, 164,
|
||||
64, 50,
|
||||
64, 164,
|
||||
64, 162,
|
||||
64, 50,
|
||||
66, 50,
|
||||
66, 50,
|
||||
64, 50,
|
||||
66, 50,
|
||||
64, 52,
|
||||
64, 50,
|
||||
66, 160,
|
||||
66, 50,
|
||||
64, 162,
|
||||
66, 50,
|
||||
64, 162,
|
||||
64, 50,
|
||||
66, 3938,
|
||||
906, 214,
|
||||
66, 3014,
|
||||
906, 214,
|
||||
64, 0};
|
||||
|
||||
int AppleRewindSignal[] = {
|
||||
// ON, OFF (in 10's of microseconds)
|
||||
908, 442,
|
||||
66, 48,
|
||||
66, 162,
|
||||
66, 160,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 160,
|
||||
66, 160,
|
||||
66, 160,
|
||||
68, 158,
|
||||
68, 160,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 48,
|
||||
66, 50,
|
||||
66, 48,
|
||||
66, 162,
|
||||
66, 160,
|
||||
66, 48,
|
||||
68, 48,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 50,
|
||||
66, 48,
|
||||
66, 50,
|
||||
66, 48,
|
||||
68, 48,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 160,
|
||||
66, 50,
|
||||
66, 160,
|
||||
66, 48,
|
||||
68, 3936,
|
||||
906, 214,
|
||||
66, 0};
|
||||
|
||||
168
ircommander.pde
Normal file
168
ircommander.pde
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
/* Raw IR commander
|
||||
|
||||
This sketch/program uses the Arduno and a PNA4602 to
|
||||
decode IR received. It then attempts to match it to a previously
|
||||
recorded IR signal
|
||||
|
||||
Code is public domain, check out www.ladyada.net and adafruit.com
|
||||
for more tutorials!
|
||||
*/
|
||||
|
||||
// We need to use the 'raw' pin reading methods
|
||||
// because timing is very important here and the digitalRead()
|
||||
// procedure is slower!
|
||||
//uint8_t IRpin = 2;
|
||||
// Digital pin #2 is the same as Pin D2 see
|
||||
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
|
||||
#define IRpin_PIN PIND
|
||||
#define IRpin 2
|
||||
|
||||
// the maximum pulse we'll listen for - 65 milliseconds is a long time
|
||||
#define MAXPULSE 65000
|
||||
|
||||
// what our timing resolution should be, larger is better
|
||||
// as its more 'precise' - but too large and you wont get
|
||||
// accurate timing
|
||||
#define RESOLUTION 20
|
||||
|
||||
// What percent we will allow in variation to match the same code
|
||||
#define FUZZINESS 10
|
||||
|
||||
// we will store up to 100 pulse pairs (this is -a lot-)
|
||||
uint16_t pulses[100][2]; // pair is high and low pulse
|
||||
uint8_t currentpulse = 0; // index for pulses we're storing
|
||||
|
||||
#include "ircodes.h"
|
||||
|
||||
void setup(void) {
|
||||
Serial.begin(9600);
|
||||
Serial.println("Ready to decode IR!");
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
int numberpulses;
|
||||
|
||||
numberpulses = listenForIR();
|
||||
|
||||
Serial.print("Heard ");
|
||||
Serial.print(numberpulses);
|
||||
Serial.println("-pulse long IR signal");
|
||||
if (IRcompare(numberpulses, ApplePlaySignal)) {
|
||||
Serial.println("PLAY");
|
||||
}
|
||||
if (IRcompare(numberpulses, AppleRewindSignal)) {
|
||||
Serial.println("REWIND");
|
||||
}
|
||||
if (IRcompare(numberpulses, AppleForwardSignal)) {
|
||||
Serial.println("FORWARD");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
boolean IRcompare(int numpulses, int Signal[]) {
|
||||
|
||||
for (int i=0; i< numpulses-1; i++) {
|
||||
int oncode = pulses[i][1] * RESOLUTION / 10;
|
||||
int offcode = pulses[i+1][0] * RESOLUTION / 10;
|
||||
|
||||
/*
|
||||
Serial.print(oncode); // the ON signal we heard
|
||||
Serial.print(" - ");
|
||||
Serial.print(Signal[i*2 + 0]); // the ON signal we want
|
||||
*/
|
||||
|
||||
// check to make sure the error is less than FUZZINESS percent
|
||||
if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100)) {
|
||||
//Serial.print(" (ok)");
|
||||
} else {
|
||||
//Serial.print(" (x)");
|
||||
// we didn't match perfectly, return a false match
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
Serial.print(" \t"); // tab
|
||||
Serial.print(offcode); // the OFF signal we heard
|
||||
Serial.print(" - ");
|
||||
Serial.print(Signal[i*2 + 1]); // the OFF signal we want
|
||||
*/
|
||||
|
||||
if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100)) {
|
||||
//Serial.print(" (ok)");
|
||||
} else {
|
||||
//Serial.print(" (x)");
|
||||
// we didn't match perfectly, return a false match
|
||||
return false;
|
||||
}
|
||||
|
||||
//Serial.println();
|
||||
}
|
||||
// Everything matched!
|
||||
return true;
|
||||
}
|
||||
|
||||
int listenForIR(void) {
|
||||
currentpulse = 0;
|
||||
|
||||
while (1) {
|
||||
uint16_t highpulse, lowpulse; // temporary storage timing
|
||||
highpulse = lowpulse = 0; // start out with no pulse length
|
||||
|
||||
// while (digitalRead(IRpin)) { // this is too slow!
|
||||
while (IRpin_PIN & (1 << IRpin)) {
|
||||
// pin is still HIGH
|
||||
|
||||
// count off another few microseconds
|
||||
highpulse++;
|
||||
delayMicroseconds(RESOLUTION);
|
||||
|
||||
// If the pulse is too long, we 'timed out' - either nothing
|
||||
// was received or the code is finished, so print what
|
||||
// we've grabbed so far, and then reset
|
||||
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
|
||||
return currentpulse;
|
||||
}
|
||||
}
|
||||
// we didn't time out so lets stash the reading
|
||||
pulses[currentpulse][0] = highpulse;
|
||||
|
||||
// same as above
|
||||
while (! (IRpin_PIN & _BV(IRpin))) {
|
||||
// pin is still LOW
|
||||
lowpulse++;
|
||||
delayMicroseconds(RESOLUTION);
|
||||
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
|
||||
return currentpulse;
|
||||
}
|
||||
}
|
||||
pulses[currentpulse][1] = lowpulse;
|
||||
|
||||
// we read one high-low pulse successfully, continue!
|
||||
currentpulse++;
|
||||
}
|
||||
}
|
||||
|
||||
void printpulses(void) {
|
||||
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
|
||||
for (uint8_t i = 0; i < currentpulse; i++) {
|
||||
Serial.print(pulses[i][0] * RESOLUTION, DEC);
|
||||
Serial.print(" usec, ");
|
||||
Serial.print(pulses[i][1] * RESOLUTION, DEC);
|
||||
Serial.println(" usec");
|
||||
}
|
||||
|
||||
// print it in a 'array' format
|
||||
Serial.println("int IRsignal[] = {");
|
||||
Serial.println("// ON, OFF (in 10's of microseconds)");
|
||||
for (uint8_t i = 0; i < currentpulse-1; i++) {
|
||||
Serial.print("\t"); // tab
|
||||
Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
|
||||
Serial.print(", ");
|
||||
Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
|
||||
Serial.println(",");
|
||||
}
|
||||
Serial.print("\t"); // tab
|
||||
Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
|
||||
Serial.print(", 0};");
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue